MCPcopy Create free account
hub / github.com/crownengine/crown / convert_mesh_part

Function convert_mesh_part

src/resource/mesh_obj.cpp:101–157  ·  view source on GitHub ↗

See: https://ufbx.github.io/elements/meshes/#example

Source from the content-addressed store, hash-verified

99
100 /// See: https://ufbx.github.io/elements/meshes/#example
101 static size_t convert_mesh_part(Geometry &g, const ufbx_mesh *mesh, const ufbx_mesh_part *part)
102 {
103 size_t num_triangles = part->num_triangles;
104
105 // Reserve space for the maximum triangle indices.
106 size_t num_tri_indices = mesh->max_face_triangles * 3;
107 uint32_t *tri_indices = (uint32_t *)calloc(num_tri_indices, sizeof(uint32_t));
108
109 // Iterate over each face using the specific material.
110 for (size_t face_ix = 0; face_ix < part->num_faces; face_ix++) {
111 ufbx_face face = mesh->faces.data[part->face_indices.data[face_ix]];
112
113 // Triangulate the face into `tri_indices[]`.
114 uint32_t num_tris = ufbx_triangulate_face(tri_indices, num_tri_indices, mesh, face);
115
116 // Iterate over each triangle corner contiguously.
117 for (size_t i = 0; i < num_tris * 3; i++) {
118 uint32_t index = tri_indices[i];
119
120 ufbx_vec3 v = ufbx_get_vertex_vec3(&mesh->vertex_position, index);
121 array::push_back(g._positions, (f32)v.x);
122 array::push_back(g._positions, (f32)v.y);
123 array::push_back(g._positions, (f32)v.z);
124
125 if (mesh->vertex_normal.exists) {
126 ufbx_vec3 v = ufbx_get_vertex_vec3(&mesh->vertex_normal, index);
127 array::push_back(g._normals, (f32)v.x);
128 array::push_back(g._normals, (f32)v.y);
129 array::push_back(g._normals, (f32)v.z);
130 }
131
132 if (mesh->vertex_tangent.exists) {
133 ufbx_vec3 v = ufbx_get_vertex_vec3(&mesh->vertex_tangent, index);
134 array::push_back(g._tangents, (f32)v.x);
135 array::push_back(g._tangents, (f32)v.y);
136 array::push_back(g._tangents, (f32)v.z);
137 }
138
139 if (mesh->vertex_bitangent.exists) {
140 ufbx_vec3 v = ufbx_get_vertex_vec3(&mesh->vertex_bitangent, index);
141 array::push_back(g._bitangents, (f32)v.x);
142 array::push_back(g._bitangents, (f32)v.y);
143 array::push_back(g._bitangents, (f32)v.z);
144 }
145
146 if (mesh->vertex_uv.exists) {
147 ufbx_vec2 v = ufbx_get_vertex_vec2(&mesh->vertex_uv, index);
148 array::push_back(g._uvs, (f32)v.x);
149 array::push_back(g._uvs, 1.0f - (f32)v.y);
150 }
151 }
152 }
153
154 free(tri_indices);
155
156 return num_triangles * 3;
157 }
158

Callers 1

parse_geometryFunction · 0.70

Calls 4

ufbx_triangulate_faceFunction · 0.85
ufbx_get_vertex_vec3Function · 0.85
ufbx_get_vertex_vec2Function · 0.85
freeFunction · 0.50

Tested by

no test coverage detected