commit 1219563e93d695ab07744ae34880dba33bef8999
parent f6f0aad6daa6f46570b5be1be665074a735559d7
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Thu, 19 Mar 2015 10:33:45 +0100
Test the s3d_shape_instance_<set_position|translate> functions
Diffstat:
3 files changed, 29 insertions(+), 5 deletions(-)
diff --git a/src/s3d.h b/src/s3d.h
@@ -183,7 +183,7 @@ s3d_scene_ref_put
S3D_API res_T
s3d_scene_instantiate
(struct s3d_scene* scn,
- struct s3d_shape* shape);
+ struct s3d_shape** shape);
/* Attach the shape to the scene. If the shape is already attached to the same
* or another scene, nothing is performed and a RES_BAD_ARG error is returned.
diff --git a/src/s3d_shape.c b/src/s3d_shape.c
@@ -238,6 +238,7 @@ shape_release_data(struct s3d_shape* shape)
switch(shape->type) {
case SHAPE_MESH: mesh_release(&shape->data.mesh); break;
case SHAPE_NONE: /* Do nothing */ break;
+ case SHAPE_INSTANCE: S3D(scene_ref_put(shape->data.scene)); break;
default: FATAL("Unreachable code\n"); break;
}
shape->type = SHAPE_NONE;
@@ -387,13 +388,13 @@ s3d_shape_instance_set_position
mutex_rw_wlock(shape->lock);
shape->transform[9] = -f3_dot(f33_row(axis, shape->transform, 0), position);
shape->transform[10] = -f3_dot(f33_row(axis, shape->transform, 1), position);
- shape->transform[12] = -f3_dot(f33_row(axis, shape->transform, 2), position);
+ shape->transform[11] = -f3_dot(f33_row(axis, shape->transform, 2), position);
mutex_rw_unlock(shape->lock);
return RES_OK;
}
res_T
-s3d_shape_translate
+s3d_shape_instance_translate
(struct s3d_shape* shape,
const enum s3d_transform_space space,
const float translation[3])
@@ -413,7 +414,7 @@ s3d_shape_translate
} else {
return RES_BAD_ARG;
}
- return RES_BAD_ARG;
+ return RES_OK;
}
res_T
diff --git a/src/test_s3d_shape.c b/src/test_s3d_shape.c
@@ -40,8 +40,10 @@ main(int argc, char** argv)
struct mem_allocator allocator;
struct s3d_device* dev;
struct s3d_shape* shape;
+ struct s3d_shape* inst;
struct s3d_scene* scn;
struct s3d_vertex_data attribs[4];
+ float pos[3];
char c;
(void)argc, (void)argv;
@@ -199,12 +201,33 @@ main(int argc, char** argv)
CHECK(s3d_shape_mesh_setup_indexed_vertices
(shape, cbox_ntris, S3D_KEEP, cbox_nverts, attribs, NULL), RES_OK);
+ CHECK(s3d_scene_attach_shape(scn, shape), RES_OK);
+
+ CHECK(s3d_scene_instantiate(scn, &inst), RES_OK);
+
+ CHECK(s3d_shape_instance_set_position(NULL, NULL), RES_BAD_ARG);
+ CHECK(s3d_shape_instance_set_position(inst, NULL), RES_BAD_ARG);
+ CHECK(s3d_shape_instance_set_position(NULL, pos), RES_BAD_ARG);
+ CHECK(s3d_shape_instance_set_position(inst, pos), RES_OK);
+ CHECK(s3d_shape_instance_set_position(shape, pos), RES_BAD_ARG);
+
+ CHECK(s3d_shape_instance_translate(NULL, -1, NULL), RES_BAD_ARG);
+ CHECK(s3d_shape_instance_translate(inst, -1, NULL), RES_BAD_ARG);
+ CHECK(s3d_shape_instance_translate(NULL, S3D_LOCAL_TRANSFORM, NULL), RES_BAD_ARG);
+ CHECK(s3d_shape_instance_translate(inst, S3D_LOCAL_TRANSFORM, NULL), RES_BAD_ARG);
+ CHECK(s3d_shape_instance_translate(NULL, -1, pos), RES_BAD_ARG);
+ CHECK(s3d_shape_instance_translate(inst, -1, pos), RES_BAD_ARG);
+ CHECK(s3d_shape_instance_translate(NULL, S3D_LOCAL_TRANSFORM, pos), RES_BAD_ARG);
+ CHECK(s3d_shape_instance_translate(inst, S3D_LOCAL_TRANSFORM, pos), RES_OK);
+ CHECK(s3d_shape_instance_translate(inst, S3D_WORLD_TRANSFORM, pos), RES_OK);
+ CHECK(s3d_shape_instance_translate(shape, S3D_WORLD_TRANSFORM, pos), RES_BAD_ARG);
+
CHECK(s3d_shape_ref_get(NULL), RES_BAD_ARG);
CHECK(s3d_shape_ref_get(shape), RES_OK);
CHECK(s3d_shape_ref_put(NULL), RES_BAD_ARG);
CHECK(s3d_shape_ref_put(shape), RES_OK);
CHECK(s3d_shape_ref_put(shape), RES_OK);
-
+ CHECK(s3d_shape_ref_put(inst), RES_OK);
CHECK(s3d_scene_ref_put(scn), RES_OK);
CHECK(s3d_device_ref_put(dev), RES_OK);;