assimp_sys/
mesh.rs

1use std::os::raw::{c_float, c_uint};
2
3use types::*;
4
5pub const AI_MAX_FACE_INDICES: usize = 0x7fff;
6pub const AI_MAX_BONE_WEIGHTS: usize = 0x7fffffff;
7pub const AI_MAX_VERTICES: usize = 0x7fffffff;
8pub const AI_MAX_FACES: usize = 0x7fffffff;
9pub const AI_MAX_NUMBER_OF_COLOR_SETS: usize = 0x8;
10pub const AI_MAX_NUMBER_OF_TEXTURECOORDS: usize = 0x8;
11
12#[repr(C)]
13pub struct AiFace {
14    pub num_indices: c_uint,
15    pub indices: *mut c_uint,
16}
17
18#[repr(C)]
19#[derive(Clone, Copy, Debug)]
20pub struct AiVertexWeight {
21    pub vertex_id: c_uint,
22    pub weight: c_float,
23}
24
25#[repr(C)]
26pub struct AiBone {
27    pub name: AiString,
28    pub num_weights: c_uint,
29    pub weights: *mut AiVertexWeight,
30    pub offset_matrix: AiMatrix4x4,
31}
32
33bitflags! {
34    #[repr(C)]
35    pub struct AiPrimitiveType: c_uint {
36        const AIPRIMITIVETYPE_POINT = 0x1;
37        const AIPRIMITIVETYPE_LINE = 0x2;
38        const AIPRIMITIVETYPE_TRIANGLE = 0x4;
39        const AIPRIMITIVETYPE_POLYGON = 0x8;
40    }
41}
42
43#[repr(C)]
44pub struct AiAnimMesh {
45    pub vertices: *mut AiVector3D,
46    pub normals: *mut AiVector3D,
47    pub tangents: *mut AiVector3D,
48    pub bitangents: *mut AiVector3D,
49    pub colors: [*mut AiColor4D; AI_MAX_NUMBER_OF_COLOR_SETS],
50    pub texture_coords: [*mut AiVector3D; AI_MAX_NUMBER_OF_TEXTURECOORDS],
51    pub num_vertices: c_uint,
52    pub weight: c_float,
53}
54
55impl AiAnimMesh {
56    pub fn has_positions(&self) -> bool {
57        !self.vertices.is_null()
58    }
59    pub fn has_normals(&self) -> bool {
60        !self.normals.is_null()
61    }
62    pub fn has_tangents_and_bitangents(&self) -> bool {
63        !self.tangents.is_null()
64    }
65    pub fn has_vertex_colors(&self, index: usize) -> bool {
66        index < AI_MAX_NUMBER_OF_COLOR_SETS && !self.colors[index].is_null()
67    }
68    pub fn has_texture_coords(&self, index: usize) -> bool {
69        index < AI_MAX_NUMBER_OF_TEXTURECOORDS && !self.texture_coords[index].is_null()
70    }
71}
72
73#[repr(C)]
74#[derive(Clone, Copy, Debug, Eq, PartialEq)]
75pub enum AiMorphingMethod {
76    VertexBlend = 0x1,
77    MorphNormalized = 0x2,
78    MorphRelative = 0x3,
79}
80
81#[repr(C)]
82pub struct AiMesh {
83    pub primitive_types: c_uint,
84    pub num_vertices: c_uint,
85    pub num_faces: c_uint,
86    pub vertices: *mut AiVector3D,
87    pub normals: *mut AiVector3D,
88    pub tangents: *mut AiVector3D,
89    pub bitangents: *mut AiVector3D,
90    pub colors: [*mut AiColor4D; AI_MAX_NUMBER_OF_COLOR_SETS],
91    pub texture_coords: [*mut AiVector3D; AI_MAX_NUMBER_OF_TEXTURECOORDS],
92    pub num_uv_components: [c_uint; AI_MAX_NUMBER_OF_TEXTURECOORDS],
93    pub faces: *mut AiFace,
94    pub num_bones: c_uint,
95    pub bones: *mut *mut AiBone,
96    pub material_index: c_uint,
97    pub name: AiString,
98    pub num_anim_meshes: c_uint,
99    pub anim_meshes: *mut *mut AiAnimMesh,
100    pub method: c_uint,
101}
102
103impl AiMesh {
104    pub fn has_positions(&self) -> bool {
105        !self.vertices.is_null() && self.num_vertices > 0
106    }
107    pub fn has_faces(&self) -> bool {
108        !self.faces.is_null() && self.num_faces > 0
109    }
110    pub fn has_normals(&self) -> bool {
111        !self.normals.is_null() && self.num_vertices > 0
112    }
113    pub fn has_tangents_and_bitangents(&self) -> bool {
114        !self.tangents.is_null() && self.num_vertices > 0
115    }
116    pub fn has_vertex_colors(&self, index: usize) -> bool {
117        index < AI_MAX_NUMBER_OF_COLOR_SETS && !self.colors[index].is_null() &&
118        self.num_vertices > 0
119    }
120    pub fn has_texture_coords(&self, index: usize) -> bool {
121        index < AI_MAX_NUMBER_OF_TEXTURECOORDS && !self.texture_coords[index].is_null() &&
122        self.num_vertices > 0
123    }
124    pub fn get_num_uv_channels(&self) -> usize {
125        let mut n = 0;
126        while n < AI_MAX_NUMBER_OF_TEXTURECOORDS && !self.texture_coords[n].is_null() {
127            n += 1;
128        }
129        n
130    }
131    pub fn get_num_color_channels(&self) -> usize {
132        let mut n = 0;
133        while n < AI_MAX_NUMBER_OF_COLOR_SETS && !self.colors[n].is_null() {
134            n += 1;
135        }
136        n
137    }
138    pub fn has_bones(&self) -> bool {
139        !self.bones.is_null() && self.num_bones > 0
140    }
141}