Pārlūkot izejas kodu

[obj2c] add ability to delete several components

rexim 1 gadu atpakaļ
vecāks
revīzija
0a50aa7437
1 mainītis faili ar 23 papildinājumiem un 9 dzēšanām
  1. 23 9
      tools/obj2c.c

+ 23 - 9
tools/obj2c.c

@@ -165,17 +165,26 @@ typedef struct {
         (da)->items[(da)->count++] = (item);                                \
     } while (0)
 
-bool is_deleted_face(Vertices vertices, Face face, int delete_component)
+typedef struct {
+    int *items;
+    size_t count;
+    size_t capacity;
+} Component_Indices;
+
+bool is_deleted_face(Vertices vertices, Face face, Component_Indices delete_components)
 {
     for (size_t i = 0; i < VERTICES_PER_FACE; ++i) {
-        if (vertices.items[face.v[i]].component == delete_component) {
-            return true;
+        // TODO: @perf if this is too slow due to too many deleted components you can always just pre-sort the indices and do a binary search
+        for (size_t j = 0; j < delete_components.count; ++j) {
+            if (vertices.items[face.v[i]].component == delete_components.items[j]) {
+                return true;
+            }
         }
     }
     return false;
 }
 
-void generate_code(FILE *out, Vertices vertices, Faces faces, int delete_component)
+void generate_code(FILE *out, Vertices vertices, Faces faces, Component_Indices delete_components)
 {
     fprintf(out, "#ifndef OBJ_H_\n");
     fprintf(out, "#define OBJ_H_\n");
@@ -189,14 +198,14 @@ void generate_code(FILE *out, Vertices vertices, Faces faces, int delete_compone
 
     size_t visible_faces_count = 0;
     for (size_t i = 0; i < faces.count; ++i) {
-        if (!is_deleted_face(vertices, faces.items[i], delete_component)) {
+        if (!is_deleted_face(vertices, faces.items[i], delete_components)) {
             visible_faces_count += 1;
         }
     }
 
     fprintf(out, "static const int faces[%zu][3] = {\n", visible_faces_count);
     for (size_t i = 0; i < faces.count; ++i) {
-        if (!is_deleted_face(vertices, faces.items[i], delete_component)) {
+        if (!is_deleted_face(vertices, faces.items[i], delete_components)) {
             Face f = faces.items[i];
             fprintf(out, "    {%d, %d, %d},\n", f.v[0], f.v[1], f.v[2]);
         }
@@ -268,7 +277,7 @@ int main(int argc, char **argv)
     const char *output_file_path = NULL;
     const char *input_file_path = NULL;
     float scale = 0.75;
-    int delete_component = 0;
+    Component_Indices delete_components = {0};
 
     // TODO: consider using https://github.com/tsoding/flag.h in here
     while (argc > 0) {
@@ -304,7 +313,7 @@ int main(int argc, char **argv)
             }
 
             const char *value = shift(&argc, &argv);
-            delete_component = atoi(value);
+            da_append(&delete_components, atoi(value));
         } else {
             if (input_file_path != NULL) {
                 usage(program_name);
@@ -470,6 +479,11 @@ int main(int argc, char **argv)
     printf("Faces:               %zu (index: %d..%d)\n", faces.count, lf, hf);
     printf("Faces per vertex:    %d..%d\n", min_faces, max_faces);
     printf("Components Count:    %zu\n", comp_count);
+    printf("Deleted Components:  ");
+    for (size_t i = 0; i < delete_components.count; ++i) {
+        printf("%d ", delete_components.items[i]);
+    }
+    printf("\n");
 
     for (size_t i = 0; i < vertices.count; ++i) {
         vertices.items[i].position = remap_object(vertices.items[i].position, scale, lx, hx, ly, hy, lz, hz);
@@ -480,7 +494,7 @@ int main(int argc, char **argv)
         fprintf(stderr, "ERROR: Could not write file %s: %s\n", output_file_path, strerror(errno));
         return_defer(1);
     }
-    generate_code(out, vertices, faces, delete_component);
+    generate_code(out, vertices, faces, delete_components);
 
 defer:
     return result;