bevy_mesh/
lib.rs

1// FIXME(15321): solve CI failures, then replace with `#![expect()]`.
2#![allow(missing_docs, reason = "Not all docs are written yet, see #3492.")]
3#![allow(unsafe_code)]
4
5extern crate alloc;
6extern crate core;
7
8mod conversions;
9mod index;
10mod mesh;
11mod mikktspace;
12pub mod morph;
13pub mod primitives;
14pub mod skinning;
15mod vertex;
16use bitflags::bitflags;
17pub use index::*;
18pub use mesh::*;
19pub use mikktspace::*;
20pub use primitives::*;
21pub use vertex::*;
22
23bitflags! {
24    /// Our base mesh pipeline key bits start from the highest bit and go
25    /// downward. The PBR mesh pipeline key bits start from the lowest bit and
26    /// go upward. This allows the PBR bits in the downstream crate `bevy_pbr`
27    /// to coexist in the same field without any shifts.
28    #[derive(Clone, Debug)]
29    pub struct BaseMeshPipelineKey: u64 {
30        const MORPH_TARGETS = 1 << (u64::BITS - 1);
31    }
32}
33
34impl BaseMeshPipelineKey {
35    pub const PRIMITIVE_TOPOLOGY_MASK_BITS: u64 = 0b111;
36    pub const PRIMITIVE_TOPOLOGY_SHIFT_BITS: u64 =
37        (u64::BITS - 1 - Self::PRIMITIVE_TOPOLOGY_MASK_BITS.count_ones()) as u64;
38
39    pub fn from_primitive_topology(primitive_topology: PrimitiveTopology) -> Self {
40        let primitive_topology_bits = ((primitive_topology as u64)
41            & Self::PRIMITIVE_TOPOLOGY_MASK_BITS)
42            << Self::PRIMITIVE_TOPOLOGY_SHIFT_BITS;
43        Self::from_bits_retain(primitive_topology_bits)
44    }
45
46    pub fn primitive_topology(&self) -> PrimitiveTopology {
47        let primitive_topology_bits = (self.bits() >> Self::PRIMITIVE_TOPOLOGY_SHIFT_BITS)
48            & Self::PRIMITIVE_TOPOLOGY_MASK_BITS;
49        match primitive_topology_bits {
50            x if x == PrimitiveTopology::PointList as u64 => PrimitiveTopology::PointList,
51            x if x == PrimitiveTopology::LineList as u64 => PrimitiveTopology::LineList,
52            x if x == PrimitiveTopology::LineStrip as u64 => PrimitiveTopology::LineStrip,
53            x if x == PrimitiveTopology::TriangleList as u64 => PrimitiveTopology::TriangleList,
54            x if x == PrimitiveTopology::TriangleStrip as u64 => PrimitiveTopology::TriangleStrip,
55            _ => PrimitiveTopology::default(),
56        }
57    }
58}