From a511f602496f952f8cbae2f11c80542e0fa8bc68 Mon Sep 17 00:00:00 2001 From: Max Rigout <71095568+maxrigout@users.noreply.github.com> Date: Mon, 31 Jul 2023 21:23:40 -0400 Subject: [PATCH 1/6] added support for colored vertices (issue #28) --- fast_obj.h | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/fast_obj.h b/fast_obj.h index c0cbb95..b19dd18 100644 --- a/fast_obj.h +++ b/fast_obj.h @@ -90,6 +90,7 @@ typedef struct fastObjUInt p; fastObjUInt t; fastObjUInt n; + fastObjUInt c; } fastObjIndex; @@ -123,6 +124,9 @@ typedef struct unsigned int normal_count; float* normals; + unsigned int color_count; + float* colors; + /* Face data: one element for each face */ unsigned int face_count; unsigned int* face_vertices; @@ -655,6 +659,19 @@ const char* parse_vertex(fastObjData* data, const char* ptr) array_push(data->mesh->positions, v); } + // extract color data + for (ii = 0; ii < 3; ii++) + { + const char* tmp = parse_float(ptr, &v); + // if there's no data, we default to white + if (tmp == ptr) + { + v = 1.0f; + } + ptr = tmp; + array_push(data->mesh->colors, v); + } + return ptr; } @@ -745,6 +762,8 @@ const char* parse_face(fastObjData* data, const char* ptr) else vn.n = 0; + vn.c = vn.p; + array_push(data->mesh->indices, vn); count++; @@ -1346,6 +1365,7 @@ void fast_obj_destroy(fastObjMesh* m) array_clean(m->positions); array_clean(m->texcoords); array_clean(m->normals); + array_clean(m->colors); array_clean(m->face_vertices); array_clean(m->face_materials); array_clean(m->indices); @@ -1400,6 +1420,7 @@ fastObjMesh* fast_obj_read_with_callbacks(const char* path, const fastObjCallbac m->positions = 0; m->texcoords = 0; m->normals = 0; + m->colors = 0; m->face_vertices = 0; m->face_materials = 0; m->indices = 0; @@ -1420,6 +1441,9 @@ fastObjMesh* fast_obj_read_with_callbacks(const char* path, const fastObjCallbac array_push(m->normals, 0.0f); array_push(m->normals, 1.0f); + array_push(m->colors, 0.0f); + array_push(m->colors, 0.0f); + array_push(m->colors, 0.0f); /* Data needed during parsing */ data.mesh = m; @@ -1507,6 +1531,7 @@ fastObjMesh* fast_obj_read_with_callbacks(const char* path, const fastObjCallbac m->position_count = array_size(m->positions) / 3; m->texcoord_count = array_size(m->texcoords) / 2; m->normal_count = array_size(m->normals) / 3; + m->color_count = array_size(m->colors) / 3; m->face_count = array_size(m->face_vertices); m->index_count = array_size(m->indices); m->material_count = array_size(m->materials); From 9037820f3014bd39a1f18b79fb27cdc7fa4da179 Mon Sep 17 00:00:00 2001 From: Max Rigout <71095568+maxrigout@users.noreply.github.com> Date: Wed, 2 Aug 2023 16:59:18 -0400 Subject: [PATCH 2/6] improved color parsing --- fast_obj.h | 61 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 42 insertions(+), 19 deletions(-) diff --git a/fast_obj.h b/fast_obj.h index b19dd18..f1e3695 100644 --- a/fast_obj.h +++ b/fast_obj.h @@ -206,6 +206,9 @@ typedef struct /* Final mesh */ fastObjMesh* mesh; + /* Position index goes to color index map */ + unsigned int* vertex_color_index; + /* Current object/group */ fastObjGroup object; fastObjGroup group; @@ -652,25 +655,27 @@ const char* parse_vertex(fastObjData* data, const char* ptr) unsigned int ii; float v; - for (ii = 0; ii < 3; ii++) { ptr = parse_float(ptr, &v); array_push(data->mesh->positions, v); } - // extract color data - for (ii = 0; ii < 3; ii++) +#ifdef FAST_OBJ_ENABLE_COLOURS + /* Default the vertex color to the default color index */ + array_push(data->vertex_color_index, 0); + ptr = skip_whitespace(ptr); + if (!is_newline(*ptr)) { - const char* tmp = parse_float(ptr, &v); - // if there's no data, we default to white - if (tmp == ptr) + /* We associate the current vertex position with the vertex color */ + data->vertex_color_index[array_size(data->vertex_color_index) - 1] = array_size(data->mesh->colors) / 3; + for (ii = 0; ii < 3; ++ii) { - v = 1.0f; + ptr = parse_float(ptr, &v); + array_push(data->mesh->colors, v); } - ptr = tmp; - array_push(data->mesh->colors, v); } +#endif return ptr; } @@ -762,7 +767,11 @@ const char* parse_face(fastObjData* data, const char* ptr) else vn.n = 0; - vn.c = vn.p; +#ifdef FAST_OBJ_ENABLE_COLOURS + vn.c = data->vertex_color_index[vn.p]; +#else + vn.c = 0; +#endif array_push(data->mesh->indices, vn); count++; @@ -1365,7 +1374,9 @@ void fast_obj_destroy(fastObjMesh* m) array_clean(m->positions); array_clean(m->texcoords); array_clean(m->normals); +#ifdef FAST_OBJ_ENABLE_COLOURS array_clean(m->colors); +#endif array_clean(m->face_vertices); array_clean(m->face_materials); array_clean(m->indices); @@ -1420,7 +1431,9 @@ fastObjMesh* fast_obj_read_with_callbacks(const char* path, const fastObjCallbac m->positions = 0; m->texcoords = 0; m->normals = 0; +#ifdef FAST_OBJ_ENABLE_COLOURS m->colors = 0; +#endif m->face_vertices = 0; m->face_materials = 0; m->indices = 0; @@ -1441,17 +1454,24 @@ fastObjMesh* fast_obj_read_with_callbacks(const char* path, const fastObjCallbac array_push(m->normals, 0.0f); array_push(m->normals, 1.0f); - array_push(m->colors, 0.0f); - array_push(m->colors, 0.0f); - array_push(m->colors, 0.0f); +#ifdef FAST_OBJ_ENABLE_COLOURS + /* Default white color */ + array_push(m->colors, 1.0f); + array_push(m->colors, 1.0f); + array_push(m->colors, 1.0f); +#endif /* Data needed during parsing */ - data.mesh = m; - data.object = object_default(); - data.group = group_default(); - data.material = 0; - data.line = 1; - data.base = 0; + data.mesh = m; + data.vertex_color_index = 0; + data.object = object_default(); + data.group = group_default(); + data.material = 0; + data.line = 1; + data.base = 0; + + /* Dummy position is assigned to the dummy color */ + array_push(data.vertex_color_index, 0); /* Find base path for materials/textures */ @@ -1531,7 +1551,9 @@ fastObjMesh* fast_obj_read_with_callbacks(const char* path, const fastObjCallbac m->position_count = array_size(m->positions) / 3; m->texcoord_count = array_size(m->texcoords) / 2; m->normal_count = array_size(m->normals) / 3; +#ifdef FAST_OBJ_ENABLE_COLOURS m->color_count = array_size(m->colors) / 3; +#endif m->face_count = array_size(m->face_vertices); m->index_count = array_size(m->indices); m->material_count = array_size(m->materials); @@ -1542,6 +1564,7 @@ fastObjMesh* fast_obj_read_with_callbacks(const char* path, const fastObjCallbac /* Clean up */ memory_dealloc(buffer); memory_dealloc(data.base); + array_clean(data.vertex_color_index); callbacks->file_close(file, user_data); From 2c91cb2993eb11e1c4dc50a694467c2ec1833cc3 Mon Sep 17 00:00:00 2001 From: Max Rigout <71095568+maxrigout@users.noreply.github.com> Date: Wed, 2 Aug 2023 22:18:31 -0400 Subject: [PATCH 3/6] added lazy fill for vertex_color_index --- fast_obj.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/fast_obj.h b/fast_obj.h index f1e3695..ea3958a 100644 --- a/fast_obj.h +++ b/fast_obj.h @@ -662,11 +662,19 @@ const char* parse_vertex(fastObjData* data, const char* ptr) } #ifdef FAST_OBJ_ENABLE_COLOURS +#ifndef FAST_OBJ_LAZY_FILL /* Default the vertex color to the default color index */ array_push(data->vertex_color_index, 0); +#endif ptr = skip_whitespace(ptr); if (!is_newline(*ptr)) { +#ifdef FAST_OBJ_LAZY_FILL + unsigned int oldSz = array_size(data->vertex_color_index); + _array_grow(data->vertex_color_index, array_size(data->mesh->positions) / 3); + _array_size(data->vertex_color_index) = array_size(data->mesh->positions) / 3; + memset(data->vertex_color_index + oldSz, 0, array_size(data->vertex_color_index) - oldSz); +#endif /* We associate the current vertex position with the vertex color */ data->vertex_color_index[array_size(data->vertex_color_index) - 1] = array_size(data->mesh->colors) / 3; for (ii = 0; ii < 3; ++ii) @@ -1354,6 +1362,15 @@ void parse_buffer(fastObjData* data, const char* ptr, const char* end, const fas data->line++; } +#ifdef FAST_OBJ_LAZY_FILL + if (array_size(data->vertex_color_index) < array_size(data->mesh->positions) / 3) + { + unsigned int oldSz = array_size(data->vertex_color_index); + _array_grow(data->vertex_color_index, array_size(data->mesh->positions) / 3); + _array_size(data->vertex_color_index) = array_size(data->mesh->positions) / 3; + memset(data->vertex_color_index + oldSz, 0, array_size(data->vertex_color_index) - oldSz); + } +#endif } From 27803406d76406d3415f96bde3dbf3c2fb538591 Mon Sep 17 00:00:00 2001 From: Max Rigout <71095568+maxrigout@users.noreply.github.com> Date: Thu, 3 Aug 2023 08:31:16 -0400 Subject: [PATCH 4/6] reverted color parsing to original approach --- fast_obj.h | 63 ++++++++++++------------------------------------------ 1 file changed, 14 insertions(+), 49 deletions(-) diff --git a/fast_obj.h b/fast_obj.h index ea3958a..0758d34 100644 --- a/fast_obj.h +++ b/fast_obj.h @@ -90,7 +90,6 @@ typedef struct fastObjUInt p; fastObjUInt t; fastObjUInt n; - fastObjUInt c; } fastObjIndex; @@ -206,9 +205,6 @@ typedef struct /* Final mesh */ fastObjMesh* mesh; - /* Position index goes to color index map */ - unsigned int* vertex_color_index; - /* Current object/group */ fastObjGroup object; fastObjGroup group; @@ -661,29 +657,22 @@ const char* parse_vertex(fastObjData* data, const char* ptr) array_push(data->mesh->positions, v); } -#ifdef FAST_OBJ_ENABLE_COLOURS -#ifndef FAST_OBJ_LAZY_FILL - /* Default the vertex color to the default color index */ - array_push(data->vertex_color_index, 0); -#endif + ptr = skip_whitespace(ptr); if (!is_newline(*ptr)) { -#ifdef FAST_OBJ_LAZY_FILL - unsigned int oldSz = array_size(data->vertex_color_index); - _array_grow(data->vertex_color_index, array_size(data->mesh->positions) / 3); - _array_size(data->vertex_color_index) = array_size(data->mesh->positions) / 3; - memset(data->vertex_color_index + oldSz, 0, array_size(data->vertex_color_index) - oldSz); -#endif - /* We associate the current vertex position with the vertex color */ - data->vertex_color_index[array_size(data->vertex_color_index) - 1] = array_size(data->mesh->colors) / 3; + /* Fill the colors array until it matches the size of the positions array */ + for (ii = array_size(data->mesh->colors); ii < array_size(data->mesh->positions) - 3; ++ii) + { + array_push(data->mesh->colors, 1.0f); + } + for (ii = 0; ii < 3; ++ii) { ptr = parse_float(ptr, &v); array_push(data->mesh->colors, v); } } -#endif return ptr; } @@ -775,12 +764,6 @@ const char* parse_face(fastObjData* data, const char* ptr) else vn.n = 0; -#ifdef FAST_OBJ_ENABLE_COLOURS - vn.c = data->vertex_color_index[vn.p]; -#else - vn.c = 0; -#endif - array_push(data->mesh->indices, vn); count++; @@ -1362,15 +1345,15 @@ void parse_buffer(fastObjData* data, const char* ptr, const char* end, const fas data->line++; } -#ifdef FAST_OBJ_LAZY_FILL - if (array_size(data->vertex_color_index) < array_size(data->mesh->positions) / 3) + if (array_size(data->mesh->colors) > 0) { - unsigned int oldSz = array_size(data->vertex_color_index); - _array_grow(data->vertex_color_index, array_size(data->mesh->positions) / 3); - _array_size(data->vertex_color_index) = array_size(data->mesh->positions) / 3; - memset(data->vertex_color_index + oldSz, 0, array_size(data->vertex_color_index) - oldSz); + /* Fill the remaining slots in the colors array */ + unsigned int ii; + for (ii = array_size(data->mesh->colors); ii < array_size(data->mesh->positions); ++ii) + { + array_push(data->mesh->colors, 1.0f); + } } -#endif } @@ -1391,9 +1374,7 @@ void fast_obj_destroy(fastObjMesh* m) array_clean(m->positions); array_clean(m->texcoords); array_clean(m->normals); -#ifdef FAST_OBJ_ENABLE_COLOURS array_clean(m->colors); -#endif array_clean(m->face_vertices); array_clean(m->face_materials); array_clean(m->indices); @@ -1447,10 +1428,7 @@ fastObjMesh* fast_obj_read_with_callbacks(const char* path, const fastObjCallbac m->positions = 0; m->texcoords = 0; - m->normals = 0; -#ifdef FAST_OBJ_ENABLE_COLOURS m->colors = 0; -#endif m->face_vertices = 0; m->face_materials = 0; m->indices = 0; @@ -1471,25 +1449,15 @@ fastObjMesh* fast_obj_read_with_callbacks(const char* path, const fastObjCallbac array_push(m->normals, 0.0f); array_push(m->normals, 1.0f); -#ifdef FAST_OBJ_ENABLE_COLOURS - /* Default white color */ - array_push(m->colors, 1.0f); - array_push(m->colors, 1.0f); - array_push(m->colors, 1.0f); -#endif /* Data needed during parsing */ data.mesh = m; - data.vertex_color_index = 0; data.object = object_default(); data.group = group_default(); data.material = 0; data.line = 1; data.base = 0; - /* Dummy position is assigned to the dummy color */ - array_push(data.vertex_color_index, 0); - /* Find base path for materials/textures */ { @@ -1568,9 +1536,7 @@ fastObjMesh* fast_obj_read_with_callbacks(const char* path, const fastObjCallbac m->position_count = array_size(m->positions) / 3; m->texcoord_count = array_size(m->texcoords) / 2; m->normal_count = array_size(m->normals) / 3; -#ifdef FAST_OBJ_ENABLE_COLOURS m->color_count = array_size(m->colors) / 3; -#endif m->face_count = array_size(m->face_vertices); m->index_count = array_size(m->indices); m->material_count = array_size(m->materials); @@ -1581,7 +1547,6 @@ fastObjMesh* fast_obj_read_with_callbacks(const char* path, const fastObjCallbac /* Clean up */ memory_dealloc(buffer); memory_dealloc(data.base); - array_clean(data.vertex_color_index); callbacks->file_close(file, user_data); From cd5be148c3db952a3738ec8ff37687e29407ad36 Mon Sep 17 00:00:00 2001 From: Max Rigout <71095568+maxrigout@users.noreply.github.com> Date: Thu, 3 Aug 2023 08:40:58 -0400 Subject: [PATCH 5/6] re-added mesh normal initialization that was accidently removed) --- fast_obj.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fast_obj.h b/fast_obj.h index 0758d34..c2455f7 100644 --- a/fast_obj.h +++ b/fast_obj.h @@ -651,6 +651,7 @@ const char* parse_vertex(fastObjData* data, const char* ptr) unsigned int ii; float v; + for (ii = 0; ii < 3; ii++) { ptr = parse_float(ptr, &v); @@ -1428,6 +1429,7 @@ fastObjMesh* fast_obj_read_with_callbacks(const char* path, const fastObjCallbac m->positions = 0; m->texcoords = 0; + m->normals = 0; m->colors = 0; m->face_vertices = 0; m->face_materials = 0; From 491efbbb597d976e875ee429201c49acdf5661c4 Mon Sep 17 00:00:00 2001 From: Max Rigout <71095568+maxrigout@users.noreply.github.com> Date: Thu, 3 Aug 2023 10:17:31 -0400 Subject: [PATCH 6/6] removed extra white spaces --- fast_obj.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/fast_obj.h b/fast_obj.h index c2455f7..b39c0f6 100644 --- a/fast_obj.h +++ b/fast_obj.h @@ -1453,12 +1453,12 @@ fastObjMesh* fast_obj_read_with_callbacks(const char* path, const fastObjCallbac /* Data needed during parsing */ - data.mesh = m; - data.object = object_default(); - data.group = group_default(); - data.material = 0; - data.line = 1; - data.base = 0; + data.mesh = m; + data.object = object_default(); + data.group = group_default(); + data.material = 0; + data.line = 1; + data.base = 0; /* Find base path for materials/textures */