loader_aw

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

commit 35fa61731b78a04536d6783526198eb9ae485a93
parent bcbc33e5e86cde4eb0bd47bdfdf90ee5b7df2be8
Author: vaplv <vaplv@free.fr>
Date:   Sat,  5 Jul 2014 16:07:57 +0200

Add and test the mtl getter

Diffstat:
Msrc/obj.c | 18++++++++++++++++--
Msrc/obj.h | 12++++++++++++
Msrc/test_obj.c | 31+++++++++++++++++++++++++++++--
3 files changed, 57 insertions(+), 4 deletions(-)

diff --git a/src/obj.c b/src/obj.c @@ -650,7 +650,7 @@ obj_face_get(const struct obj* obj, const size_t iface, struct obj_face* face) enum obj_result obj_group_get(const struct obj* obj, const size_t igroup, struct obj_group* grp) { - const struct named_group* group = NULL; + const struct named_group* group; if(!obj || !grp || igroup >= darray_named_group_size_get(&obj->groups)) return OBJ_BAD_ARGUMENT; group = darray_named_group_cdata_get(&obj->groups) + igroup; @@ -667,8 +667,22 @@ obj_smooth_group_get struct obj_smooth_group* group) { if(!obj || !group - || ismooth_group>= darray_smooth_group_size_get(&obj->smooth_groups)) + || ismooth_group >= darray_smooth_group_size_get(&obj->smooth_groups)) return OBJ_BAD_ARGUMENT; *group = darray_smooth_group_cdata_get(&obj->smooth_groups)[ismooth_group]; return OBJ_OK; } + +enum obj_result +obj_mtl_get(const struct obj* obj, const size_t imtl, struct obj_mtl* mtl) +{ + const struct named_group* group; + if(!obj || !mtl || imtl >= darray_named_group_size_get(&obj->usemtls)) + return OBJ_BAD_ARGUMENT; + group = darray_named_group_cdata_get(&obj->usemtls) + imtl; + mtl->name = str_cget(&group->name); + mtl->face_id = group->iface; + mtl->faces_count = group->nfaces; + return OBJ_OK; +} + diff --git a/src/obj.h b/src/obj.h @@ -54,6 +54,12 @@ struct obj_smooth_group { size_t faces_count; }; +struct obj_mtl { + const char* name; + size_t face_id; + size_t faces_count; +}; + struct obj; struct mem_allocator; @@ -100,6 +106,12 @@ obj_smooth_group_get const size_t smooth_group_id, struct obj_smooth_group* smooth_group); +OBJ_API enum obj_result +obj_mtl_get + (const struct obj* obj, + const size_t mtl_id, + struct obj_mtl* mtl); + END_DECLS #endif /* OBJ_H */ diff --git a/src/test_obj.c b/src/test_obj.c @@ -23,6 +23,7 @@ test_plane(struct obj* obj) "# 1 element\n"; struct obj_desc desc; struct obj_face face; + struct obj_mtl mtl; FILE* file; NCHECK(obj, NULL); @@ -61,6 +62,18 @@ test_plane(struct obj* obj) CHECK(face.group_id, OBJ_ID_NONE); CHECK(face.smooth_group_id, OBJ_ID_NONE); CHECK(face.mtl_id, 0); + + CHECK(obj_mtl_get(NULL, OBJ_ID_NONE, NULL), OBJ_BAD_ARGUMENT); + CHECK(obj_mtl_get(obj, OBJ_ID_NONE, NULL), OBJ_BAD_ARGUMENT); + CHECK(obj_mtl_get(NULL, 0, NULL), OBJ_BAD_ARGUMENT); + CHECK(obj_mtl_get(obj, 0, NULL), OBJ_BAD_ARGUMENT); + CHECK(obj_mtl_get(NULL, OBJ_ID_NONE, &mtl), OBJ_BAD_ARGUMENT); + CHECK(obj_mtl_get(obj, OBJ_ID_NONE, &mtl), OBJ_BAD_ARGUMENT); + CHECK(obj_mtl_get(NULL, 0, &mtl), OBJ_BAD_ARGUMENT); + CHECK(obj_mtl_get(obj, 0, &mtl), OBJ_OK); + CHECK(strcmp(mtl.name, "wood"), 0); + CHECK(mtl.face_id, 0); + CHECK(mtl.faces_count, 1); } static void @@ -92,6 +105,7 @@ test_squares(struct obj* obj) struct obj_face face; struct obj_group group; struct obj_smooth_group sgroup; + struct obj_mtl mtl; FILE* file; NCHECK(obj, NULL); @@ -146,6 +160,8 @@ test_squares(struct obj* obj) CHECK(sgroup.is_smoothed, 1); CHECK(sgroup.face_id, 0); CHECK(sgroup.faces_count, 2); + + CHECK(obj_mtl_get(obj, 0, &mtl), OBJ_BAD_ARGUMENT); } static void @@ -184,9 +200,9 @@ test_cube(struct obj* obj) "# 6 elements\n"; const char* group_names[6] = { "front", "back", "right", "top", "left", "bottom" }; + const char* mtl_names[6] = + { "red", "blue", "green", "gold", "orange", "purple" }; struct obj_desc desc; - struct obj_face face; - struct obj_group group; FILE* file; size_t i; @@ -206,6 +222,7 @@ test_cube(struct obj* obj) CHECK(desc.mtllibs_count, 1); FOR_EACH(i, 0, 6) { + struct obj_face face; CHECK(obj_face_get(obj, i, &face), OBJ_OK); CHECK(face.vertex_id, i*4); CHECK(face.vertices_count, 4); @@ -215,11 +232,20 @@ test_cube(struct obj* obj) } FOR_EACH(i, 0, 6) { + struct obj_group group; CHECK(obj_group_get(obj, i, &group), OBJ_OK); CHECK(strcmp(group.name, group_names[i]), 0); CHECK(group.face_id, i); CHECK(group.faces_count, 1); } + + FOR_EACH(i, 0, 6) { + struct obj_mtl mtl; + CHECK(obj_mtl_get(obj, i, &mtl), OBJ_OK); + CHECK(strcmp(mtl.name, mtl_names[i]), 0); + CHECK(mtl.face_id, i); + CHECK(mtl.faces_count, 1); + } } int @@ -259,3 +285,4 @@ main(int argc, char** argv) CHECK(mem_allocated_size(), 0); return 0; } +