Skip to content

Commit

Permalink
[obj2c] add ability to delete several components
Browse files Browse the repository at this point in the history
  • Loading branch information
rexim committed Sep 23, 2024
1 parent 76ff00a commit 0a50aa7
Showing 1 changed file with 23 additions and 9 deletions.
32 changes: 23 additions & 9 deletions tools/obj2c.c
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand All @@ -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]);
}
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand All @@ -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;
Expand Down

0 comments on commit 0a50aa7

Please sign in to comment.