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:
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);
}
}