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}