1#![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 #[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}