See: https://ufbx.github.io/elements/meshes/#example
| 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 |
no test coverage detected