loader_aw

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

commit d58ec87faf10344d7979bfcbb92b4b9508bb4bd0
parent 95c780728ce0366819c1ba9f7fab3c9064c84663
Author: vaplv <vaplv@free.fr>
Date:   Sat,  5 Jul 2014 15:44:55 +0200

Add and test the group getter

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

diff --git a/src/obj.c b/src/obj.c @@ -653,4 +653,16 @@ obj_face_get(const struct obj* obj, const size_t iface, struct obj_face* face) return OBJ_OK; } +enum obj_result +obj_group_get(const struct obj* obj, const size_t igroup, struct obj_group* grp) +{ + const struct named_group* group = NULL; + if(!obj || !grp || igroup >= darray_named_group_size_get(&obj->groups)) + return OBJ_BAD_ARGUMENT; + group = darray_named_group_cdata_get(&obj->groups) + igroup; + grp->name = str_cget(&group->name); + grp->face_id = group->iface; + grp->faces_count = group->nfaces; + return OBJ_OK; +} diff --git a/src/obj.h b/src/obj.h @@ -42,6 +42,12 @@ struct obj_face { size_t mtl_id; /* Index of the face material */ }; +struct obj_group { + const char* name; + size_t face_id; /* Index of the first group face */ + size_t faces_count; +}; + struct obj; struct mem_allocator; @@ -76,6 +82,12 @@ obj_face_get const size_t face_id, struct obj_face* face); +OBJ_API enum obj_result +obj_group_get + (const struct obj* obj, + const size_t group_id, + struct obj_group* group); + END_DECLS #endif /* OBJ_H */ diff --git a/src/test_obj.c b/src/test_obj.c @@ -48,12 +48,12 @@ test_plane(struct obj* obj) CHECK(desc.usemtls_count, 1); CHECK(desc.mtllibs_count, 1); - CHECK(obj_face_get(NULL, SIZE_MAX, NULL), OBJ_BAD_ARGUMENT); - CHECK(obj_face_get(obj, SIZE_MAX, NULL), OBJ_BAD_ARGUMENT); + CHECK(obj_face_get(NULL, OBJ_ID_NONE, NULL), OBJ_BAD_ARGUMENT); + CHECK(obj_face_get(obj, OBJ_ID_NONE, NULL), OBJ_BAD_ARGUMENT); CHECK(obj_face_get(NULL, 0, NULL), OBJ_BAD_ARGUMENT); CHECK(obj_face_get(obj, 0, NULL), OBJ_BAD_ARGUMENT); - CHECK(obj_face_get(NULL, SIZE_MAX, &face), OBJ_BAD_ARGUMENT); - CHECK(obj_face_get(obj, SIZE_MAX, &face), OBJ_BAD_ARGUMENT); + CHECK(obj_face_get(NULL, OBJ_ID_NONE, &face), OBJ_BAD_ARGUMENT); + CHECK(obj_face_get(obj, OBJ_ID_NONE, &face), OBJ_BAD_ARGUMENT); CHECK(obj_face_get(NULL, 0, &face), OBJ_BAD_ARGUMENT); CHECK(obj_face_get(obj, 0, &face), OBJ_OK); CHECK(face.vertex_id, 0); @@ -90,6 +90,7 @@ test_squares(struct obj* obj) "# 2 elements\n"; struct obj_desc desc; struct obj_face face; + struct obj_group group; FILE* file; NCHECK(obj, NULL); @@ -120,6 +121,18 @@ test_squares(struct obj* obj) CHECK(face.group_id, 0); CHECK(face.smooth_group_id, 0); CHECK(face.mtl_id, OBJ_ID_NONE); + + CHECK(obj_group_get(NULL, OBJ_ID_NONE, NULL), OBJ_BAD_ARGUMENT); + CHECK(obj_group_get(obj, OBJ_ID_NONE, NULL), OBJ_BAD_ARGUMENT); + CHECK(obj_group_get(NULL, 0, NULL), OBJ_BAD_ARGUMENT); + CHECK(obj_group_get(obj, 0, NULL), OBJ_BAD_ARGUMENT); + CHECK(obj_group_get(NULL, OBJ_ID_NONE, &group), OBJ_BAD_ARGUMENT); + CHECK(obj_group_get(obj, OBJ_ID_NONE, &group), OBJ_BAD_ARGUMENT); + CHECK(obj_group_get(NULL, 0, &group), OBJ_BAD_ARGUMENT); + CHECK(obj_group_get(obj, 0, &group), OBJ_OK); + CHECK(strcmp(group.name, "all"), 0); + CHECK(group.face_id, 0); + CHECK(group.faces_count, 2); } static void @@ -156,10 +169,13 @@ test_cube(struct obj* obj) "usemtl purple\n" "f 2 6 7 3\n" "# 6 elements\n"; + const char* group_names[6] = + { "front", "back", "right", "top", "left", "bottom" }; struct obj_desc desc; struct obj_face face; + struct obj_group group; FILE* file; - size_t iface; + size_t i; NCHECK(obj, NULL); @@ -176,13 +192,20 @@ test_cube(struct obj* obj) CHECK(desc.usemtls_count, 6); CHECK(desc.mtllibs_count, 1); - FOR_EACH(iface, 0, 6) { - CHECK(obj_face_get(obj, iface, &face), OBJ_OK); - CHECK(face.vertex_id, iface*4); + FOR_EACH(i, 0, 6) { + CHECK(obj_face_get(obj, i, &face), OBJ_OK); + CHECK(face.vertex_id, i*4); CHECK(face.vertices_count, 4); - CHECK(face.group_id, iface); + CHECK(face.group_id, i); CHECK(face.smooth_group_id, OBJ_ID_NONE); - CHECK(face.mtl_id, iface); + CHECK(face.mtl_id, i); + } + + FOR_EACH(i, 0, 6) { + 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); } }