summaryrefslogtreecommitdiff
path: root/src/extend/mesh.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/extend/mesh.c')
-rw-r--r--src/extend/mesh.c42
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;