loader_aw

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

commit 90b7dc71d9f65c1d2c76cdda8739b785db370da9
parent 6dd73f8d48cac7f162e4d30418662dcac26a7b8d
Author: vaplv <vaplv@free.fr>
Date:   Tue, 16 Dec 2014 09:36:51 +0100

Add and test the aw_<obj|mtl>_clear functions

Diffstat:
Msrc/aw.h | 8++++++++
Msrc/aw_mtl.c | 9+++++++++
Msrc/aw_obj.c | 37++++++++++++++++++-------------------
Msrc/test_aw_mtl.c | 7+++++++
Msrc/test_aw_obj.c | 13+++++++++++++
5 files changed, 55 insertions(+), 19 deletions(-)

diff --git a/src/aw.h b/src/aw.h @@ -164,6 +164,10 @@ aw_obj_load_stream FILE* stream); AW_API res_T +aw_obj_clear + (struct aw_obj* obj); + +AW_API res_T aw_obj_desc_get (struct aw_obj* obj, struct aw_obj_desc* desc); @@ -232,6 +236,10 @@ aw_mtl_load_stream FILE* stream); AW_API res_T +aw_mtl_clear + (struct aw_mtl* mtl); + +AW_API res_T aw_mtl_materials_count_get (struct aw_mtl* mtl, size_t* materials_count); diff --git a/src/aw_mtl.c b/src/aw_mtl.c @@ -668,6 +668,15 @@ error: } res_T +aw_mtl_clear(struct aw_mtl* mtl) +{ + if(!mtl) return RES_BAD_ARG; + darray_material_clear(&mtl->materials); + mtl->newmtl = NULL; + return RES_OK; +} + +res_T aw_mtl_materials_count_get(struct aw_mtl* mtl, size_t* nmtls) { if(!mtl || !nmtls) diff --git a/src/aw_obj.c b/src/aw_obj.c @@ -483,22 +483,6 @@ error: } static void -obj_clear(struct aw_obj* obj) -{ - ASSERT(obj); - darray_float_clear(&obj->positions); - darray_float_clear(&obj->normals); - darray_float_clear(&obj->texcoords); - darray_vertex_clear(&obj->vertices); - darray_face_clear(&obj->faces); - darray_named_group_clear(&obj->groups); - darray_named_group_clear(&obj->usemtls); - darray_smooth_group_clear(&obj->smooth_groups); - darray_mtllib_clear(&obj->mtllibs); - obj->igroups_active = 0; -} - -static void obj_release(ref_T* ref) { struct aw_obj* obj = CONTAINER_OF(ref, struct aw_obj, ref); @@ -621,7 +605,7 @@ aw_obj_load_stream(struct aw_obj* obj, FILE* stream) if(!obj->filename) obj->filename = "stream"; obj->iline = 1; - obj_clear(obj); + AW(obj_clear(obj)); while((line = fgets (darray_char_data_get(&buf), (int)darray_char_size_get(&buf), stream))) { size_t last_char; @@ -653,11 +637,26 @@ exit: darray_char_release(&buf); return res; error: - if(obj) - obj_clear(obj); + if(obj) AW(obj_clear(obj)); goto exit; } +res_T +aw_obj_clear(struct aw_obj* obj) +{ + if(!obj) return RES_BAD_ARG; + darray_float_clear(&obj->positions); + darray_float_clear(&obj->normals); + darray_float_clear(&obj->texcoords); + darray_vertex_clear(&obj->vertices); + darray_face_clear(&obj->faces); + darray_named_group_clear(&obj->groups); + darray_named_group_clear(&obj->usemtls); + darray_smooth_group_clear(&obj->smooth_groups); + darray_mtllib_clear(&obj->mtllibs); + obj->igroups_active = 0; + return RES_OK; +} res_T aw_obj_desc_get(struct aw_obj* obj, struct aw_obj_desc* desc) diff --git a/src/test_aw_mtl.c b/src/test_aw_mtl.c @@ -73,6 +73,13 @@ test_common(struct aw_mtl* mtl) CHECK(nmtls, 1); + CHECK(aw_mtl_clear(NULL), RES_BAD_ARG); + CHECK(aw_mtl_clear(mtl), RES_OK); + CHECK(aw_mtl_materials_count_get(mtl, &nmtls), RES_OK); + CHECK(nmtls, 0); + + CHECK(aw_mtl_load(mtl, "test_mtl_common.mtl"), RES_OK); + CHECK(aw_material_init(NULL), RES_BAD_ARG); CHECK(aw_material_init(&mtr), RES_OK); CHECK(aw_mtl_material_get(NULL, SIZE_MAX, NULL), RES_BAD_ARG); diff --git a/src/test_aw_obj.c b/src/test_aw_obj.c @@ -309,6 +309,19 @@ test_cube(struct aw_obj* obj) CHECK(desc.usemtls_count, 6); CHECK(desc.mtllibs_count, 3); + CHECK(aw_obj_clear(NULL), RES_BAD_ARG); + CHECK(aw_obj_clear(obj), RES_OK); + CHECK(aw_obj_desc_get(obj, &desc), RES_OK); + CHECK(desc.faces_count, 0); + CHECK(desc.groups_count, 0); + CHECK(desc.smooth_groups_count, 0); + CHECK(desc.usemtls_count, 0); + CHECK(desc.mtllibs_count, 0); + + CHECK(fseek(file, 0, SEEK_SET), 0); + CHECK(aw_obj_load_stream(obj, file), RES_OK); + CHECK(aw_obj_desc_get(obj, &desc), RES_OK); + FOR_EACH(i, 0, 6) { struct aw_obj_face face; CHECK(aw_obj_face_get(obj, i, &face), RES_OK);