diff options
Diffstat (limited to 'src/extend/mesh.c')
-rw-r--r-- | src/extend/mesh.c | 42 |
1 files changed, 30 insertions, 12 deletions
diff --git a/src/extend/mesh.c b/src/extend/mesh.c index e7685e6..90e8bf5 100644 --- a/src/extend/mesh.c +++ b/src/extend/mesh.c @@ -203,9 +203,19 @@ typedef struct { Triangle* triangles; // triangles list } MeshInfo; +void free_mesh_info(MeshInfo* mesh) { + for (int i = 0; i < darray_size(mesh->vertices); ++i) { + darray_free(mesh->vertices[i].related_triangles); + } + darray_free(mesh->vertices); + darray_free(mesh->triangles); +} + void calc_face_tanget(MeshInfo* mesh); void calc_vertex_tangnet(MeshInfo* mesh); +Mesh* build_mesh(MeshInfo* mesh_info); + Mesh* mesh_loadfromobj(const char* path) { Vec3* position_list = NULL; Vec3* normal_list = NULL; @@ -268,7 +278,6 @@ Mesh* mesh_loadfromobj(const char* path) { int vert_count = 0; - //Mesh temp_mesh = {0}; MeshInfo mesh_info = {0}; for (int i = 0; i < darray_size(face_list); ++i) @@ -322,26 +331,35 @@ Mesh* mesh_loadfromobj(const char* path) { darray_push(mesh_info.triangles, triangle); } +#ifdef GENERATE_TANGNET calc_face_tanget(&mesh_info); calc_vertex_tangnet(&mesh_info); +#endif + + Mesh* mesh = build_mesh(&mesh_info); + + free_mesh_info(&mesh_info); + return mesh; +} + +Mesh* build_mesh(MeshInfo* mesh_info) { Mesh* mesh = malloc(sizeof(Mesh)); - int num_of_face = darray_size(mesh_info.triangles) ; + int num_of_face = darray_size(mesh_info->triangles); mesh->triangles = malloc(num_of_face * 3 * sizeof(uint)); - for (int i = 0; i < darray_size(mesh_info.triangles); ++i) { - mesh->triangles[3 * i] = mesh_info.triangles[i].vertices[0]; - mesh->triangles[3 * i + 1] = mesh_info.triangles[i].vertices[1]; - mesh->triangles[3 * i + 2] = mesh_info.triangles[i].vertices[2]; + for (int i = 0; i < darray_size(mesh_info->triangles); ++i) { + mesh->triangles[3 * i] = mesh_info->triangles[i].vertices[0]; + mesh->triangles[3 * i + 1] = mesh_info->triangles[i].vertices[1]; + mesh->triangles[3 * i + 2] = mesh_info->triangles[i].vertices[2]; } mesh->tris_count = num_of_face; - mesh->vertices = malloc(sizeof(Vert) * darray_size(mesh_info.vertices)); - for (int i = 0; i < darray_size(mesh_info.vertices); ++i) { - mesh->vertices[i] = mesh_info.vertices[i].props; + mesh->vertices = malloc(sizeof(Vert) * darray_size(mesh_info->vertices)); + for (int i = 0; i < darray_size(mesh_info->vertices); ++i) { + mesh->vertices[i] = mesh_info->vertices[i].props; } - mesh->vert_count = darray_size(mesh_info.vertices); - + mesh->vert_count = darray_size(mesh_info->vertices); return mesh; -} +} void calc_face_tanget(MeshInfo* mesh) { MeshVertexInfo* vertices = mesh->vertices; |