loader_aw

Load OBJ/MTL file formats
git clone git://git.meso-star.fr/loader_aw.git
Log | Files | Refs | README | LICENSE

commit 25ad7eb30c7319c11f82f3269252f35c474b3ea5
parent 2933f8aacae2b40fcda89f85a76e6deb69679e66
Author: vaplv <vaplv@free.fr>
Date:   Tue, 11 Apr 2023 14:43:45 +0200

Add the and test the aw_obj_get_<positions|texcoords|normals> functions

They return a pointer to the loaded positions, texture coordinates and
normals as they are internally stored, i.e. as lists of doubles.

Diffstat:
Msrc/aw.h | 15+++++++++++++++
Msrc/aw_obj.c | 24++++++++++++++++++++++++
Msrc/test_aw_obj.c | 72++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 111 insertions(+), 0 deletions(-)

diff --git a/src/aw.h b/src/aw.h @@ -225,6 +225,21 @@ aw_obj_get_vertex_data const struct aw_obj_vertex* vertex, struct aw_obj_vertex_data* vertex_data); +AW_API res_T +aw_obj_get_positions + (const struct aw_obj* obj, + const double** positions); /* List of double 4 */ + +AW_API res_T +aw_obj_get_texcoords + (const struct aw_obj* obj, + const double** texcoords); /* List of double 3 */ + +AW_API res_T +aw_obj_get_normals + (const struct aw_obj* obj, + const double** normals); /* List of double 3 */ + /******************************************************************************* * Mtl functions ******************************************************************************/ diff --git a/src/aw_obj.c b/src/aw_obj.c @@ -973,6 +973,30 @@ error: goto exit; } +res_T +aw_obj_get_positions(const struct aw_obj* obj, const double** positions) +{ + if(!obj || !positions) return RES_BAD_ARG; + *positions = darray_double_cdata_get(&obj->positions); + return RES_OK; +} + +res_T +aw_obj_get_texcoords(const struct aw_obj* obj, const double** texcoords) +{ + if(!obj || !texcoords) return RES_BAD_ARG; + *texcoords = darray_double_cdata_get(&obj->texcoords); + return RES_OK; +} + +res_T +aw_obj_get_normals(const struct aw_obj* obj, const double** normals) +{ + if(!obj || !normals) return RES_BAD_ARG; + *normals = darray_double_cdata_get(&obj->normals); + return RES_OK; +} + #ifdef COMPILER_CL #pragma warning(pop) #endif diff --git a/src/test_aw_obj.c b/src/test_aw_obj.c @@ -50,6 +50,7 @@ test_plane(struct aw_obj* obj) struct aw_obj_named_group mtl; struct aw_obj_vertex vertex; struct aw_obj_vertex_data vdata; + const double* data = NULL; FILE* file; const char* mtllib; @@ -146,6 +147,22 @@ test_plane(struct aw_obj* obj) CHK(!strcmp(group.name, "default")); CHK(group.face_id == 0); CHK(group.faces_count == 1); + + CHK(aw_obj_get_positions(NULL, &data) == RES_BAD_ARG); + CHK(aw_obj_get_positions(obj, NULL) == RES_BAD_ARG); + CHK(aw_obj_get_positions(obj, &data) == RES_OK); + CHK(d4_eq(data+0, d4(v4,0,2,0,1))); + CHK(d4_eq(data+4, d4(v4,0,0,0,1))); + CHK(d4_eq(data+8, d4(v4,2,0,0,1))); + CHK(d4_eq(data+12, d4(v4,2,2,0,1))); + + CHK(aw_obj_get_texcoords(NULL, &data) == RES_BAD_ARG); + CHK(aw_obj_get_texcoords(obj, NULL) == RES_BAD_ARG); + CHK(aw_obj_get_texcoords(obj, &data) == RES_OK); + CHK(d3_eq(data+0, d3(v4,0,1,0))); + CHK(d3_eq(data+3, d3(v4,0,0,0))); + CHK(d3_eq(data+6, d3(v4,1,0,0))); + CHK(d3_eq(data+9, d3(v4,1,1,0))); } static void @@ -181,6 +198,7 @@ test_squares(struct aw_obj* obj) struct aw_obj_smooth_group sgroup; struct aw_obj_vertex vertex; struct aw_obj_vertex_data vdata; + const double* data = NULL; FILE* file; CHK(obj != NULL); @@ -266,6 +284,24 @@ test_squares(struct aw_obj* obj) CHK(sgroup.faces_count == 2); CHK(aw_obj_get_mtl(obj, 0, &mtl) == RES_BAD_ARG); + + CHK(aw_obj_get_positions(obj, &data) == RES_OK); + CHK(d4_eq(data+0, d4(v4,0,2,0,1))); + CHK(d4_eq(data+4, d4(v4,0,0,0,1))); + CHK(d4_eq(data+8, d4(v4,2,0,0,1))); + CHK(d4_eq(data+12, d4(v4,2,2,0,1))); + CHK(d4_eq(data+16, d4(v4,4,0,-1.255298,1))); + CHK(d4_eq(data+20, d4(v4,4,2,-1.255298,1))); + + CHK(aw_obj_get_normals(NULL, &data) == RES_BAD_ARG); + CHK(aw_obj_get_normals(obj, NULL) == RES_BAD_ARG); + CHK(aw_obj_get_normals(obj, &data) == RES_OK); + CHK(d3_eq(data+0, d3(v4,0,0,1))); + CHK(d3_eq(data+3, d3(v4,0,0,1))); + CHK(d3_eq(data+6, d3(v4,0.276597,0,0.960986))); + CHK(d3_eq(data+9, d3(v4,0.276597,0,0.960986))); + CHK(d3_eq(data+12, d3(v4,0.531611,0,0.846988))); + CHK(d3_eq(data+15, d3(v4,0.531611,0,0.846988))); } static void @@ -303,6 +339,7 @@ test_cube(struct aw_obj* obj) "usemtl purple\n" "f 2 6 7 3\n" "# 6 elements\n"; + double v4[4]; const char* group_names[6] = { "front", "back", "right", "top", "left", "bottom" }; const char* mtl_names[6] = @@ -310,6 +347,7 @@ test_cube(struct aw_obj* obj) struct aw_obj_desc desc; FILE* file; const char* mtllib; + const double* data; size_t i; CHK(obj != NULL); @@ -380,6 +418,16 @@ test_cube(struct aw_obj* obj) CHK(!strcmp(mtllib, "my.mtl")); CHK(aw_obj_get_mtllib(obj, 3, &mtllib) == RES_BAD_ARG); + CHK(aw_obj_get_positions(obj, &data) == RES_OK); + CHK(d4_eq(data+0, d4(v4,0,2,2,1))); + CHK(d4_eq(data+4, d4(v4,0,0,2,1))); + CHK(d4_eq(data+8, d4(v4,2,0,2,1))); + CHK(d4_eq(data+12, d4(v4,2,2,2,1))); + CHK(d4_eq(data+16, d4(v4,0,2,0,1))); + CHK(d4_eq(data+20, d4(v4,0,0,0,1))); + CHK(d4_eq(data+24, d4(v4,2,0,0,1))); + CHK(d4_eq(data+28, d4(v4,2,2,0,1))); + CHK(aw_obj_purge(NULL) == RES_BAD_ARG); CHK(aw_obj_purge(obj) == RES_OK); CHK(aw_obj_get_desc(obj, &desc) == RES_OK); @@ -442,7 +490,9 @@ test_cbox(struct aw_obj* obj) struct aw_obj_vertex_data vdata; struct aw_obj_named_group group; struct aw_obj_named_group mtl; + double v4[4]; double tmp[3]; + const double* data; FILE* file; CHK(obj != NULL); @@ -550,6 +600,28 @@ test_cbox(struct aw_obj* obj) CHK(aw_obj_get_vertex(obj, 19, &vertex) == RES_OK); CHK(aw_obj_get_vertex_data(obj, &vertex, &vdata) == RES_OK); CHK(d3_eq_eps(vdata.position, d3(tmp, -1.02, 1.99, 0.99), 1.e-6)); + + CHK(aw_obj_get_positions(obj, &data) == RES_OK); + CHK(d4_eq(data+0, d4(v4,-1.01,0,0.99,1))); + CHK(d4_eq(data+4, d4(v4,1,0,0.99,1))); + CHK(d4_eq(data+8, d4(v4,1,0,-1.04,1))); + CHK(d4_eq(data+12, d4(v4,-0.99,0,-1.04,1))); + CHK(d4_eq(data+16, d4(v4,-1.02,1.99,0.99,1))); + CHK(d4_eq(data+20, d4(v4,-1.02,1.99,-1.04,1))); + CHK(d4_eq(data+24, d4(v4,1,1.99,-1.04,1))); + CHK(d4_eq(data+28, d4(v4,1,1.99,0.99,1))); + CHK(d4_eq(data+32, d4(v4,-0.99,0,-1.04,1))); + CHK(d4_eq(data+36, d4(v4,1,0,-1.04,1))); + CHK(d4_eq(data+40, d4(v4,1,1.99,-1.04,1))); + CHK(d4_eq(data+44, d4(v4,-1.02,1.99,-1.04,1))); + CHK(d4_eq(data+48, d4(v4,1,0,-1.04,1))); + CHK(d4_eq(data+52, d4(v4,1,0,0.99,1))); + CHK(d4_eq(data+56, d4(v4,1,1.99,0.99,1))); + CHK(d4_eq(data+60, d4(v4,1,1.99,-1.04,1))); + CHK(d4_eq(data+64, d4(v4,-1.01,0,0.99,1))); + CHK(d4_eq(data+68, d4(v4,-0.99,0,-1.04,1))); + CHK(d4_eq(data+72, d4(v4,-1.02,1.99,-1.04,1))); + CHK(d4_eq(data+76, d4(v4,-1.02,1.99,0.99,1))); } int