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