commit 4352361876637c3dbc28e40118b5232c983690f7
parent e3e536e1a075572a6c01b8262151950cf7be963d
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Fri, 8 Jul 2016 14:28:59 +0200
Add instance transformation API calls. Version is now 0.4
Diffstat:
4 files changed, 61 insertions(+), 1 deletion(-)
diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt
@@ -57,7 +57,7 @@ rcmake_append_runtime_dirs(_runtime_dirs RSys Embree)
# Configure and define targets
################################################################################
set(VERSION_MAJOR 0)
-set(VERSION_MINOR 3)
+set(VERSION_MINOR 4)
set(VERSION_PATCH 0)
set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH})
diff --git a/src/s3d.h b/src/s3d.h
@@ -518,6 +518,17 @@ s3d_instance_translate
const enum s3d_transform_space space,
const float translation[3]);
+S3D_API res_T
+s3d_instance_set_transform
+ (struct s3d_shape* shape,
+ const float transform[12]); /* 3x4 column major matrix */
+
+S3D_API res_T
+s3d_instance_transform
+ (struct s3d_shape* shape,
+ const enum s3d_transform_space space,
+ const float transform[12]); /* 3x4 column major matrix */
+
END_DECLS
#endif /* S3D_H */
diff --git a/src/s3d_shape.c b/src/s3d_shape.c
@@ -245,6 +245,37 @@ s3d_instance_translate
}
res_T
+s3d_instance_set_transform
+ (struct s3d_shape* shape,
+ const float transform[12])
+{
+ if(!shape || shape->type != GEOM_INSTANCE || !transform)
+ return RES_BAD_ARG;
+ memcpy(shape->data.instance->transform, transform, 12 * sizeof(float));
+ return RES_OK;
+}
+
+res_T
+s3d_instance_transform
+ (struct s3d_shape* shape,
+ const enum s3d_transform_space space,
+ const float transform[12])
+{
+ if(!shape || shape->type != GEOM_INSTANCE || !transform)
+ return RES_BAD_ARG;
+ if(space == S3D_LOCAL_TRANSFORM)
+ f33_mulf33(shape->data.instance->transform,
+ transform, shape->data.instance->transform);
+ else if(space == S3D_WORLD_TRANSFORM)
+ f33_mulf33(shape->data.instance->transform,
+ shape->data.instance->transform, transform);
+ else
+ return RES_BAD_ARG;
+
+ return RES_OK;
+}
+
+res_T
s3d_mesh_setup_indexed_vertices
(struct s3d_shape* shape,
const unsigned ntris,
diff --git a/src/test_s3d_shape.c b/src/test_s3d_shape.c
@@ -63,6 +63,7 @@ main(int argc, char** argv)
unsigned nverts, ntris;
unsigned ids[3];
float pos[3];
+ float trans[12];
const unsigned cbox_ntris = sizeof(cbox_walls_ids) / sizeof(unsigned[3]);
const unsigned cbox_nverts = sizeof(cbox_walls) / sizeof(float[3]);
unsigned id;
@@ -340,6 +341,23 @@ main(int argc, char** argv)
CHECK(s3d_instance_translate(inst, S3D_WORLD_TRANSFORM, pos), RES_OK);
CHECK(s3d_instance_translate(shape, S3D_WORLD_TRANSFORM, pos), RES_BAD_ARG);
+ CHECK(s3d_instance_transform(NULL, -1, NULL), RES_BAD_ARG);
+ CHECK(s3d_instance_transform(inst, -1, NULL), RES_BAD_ARG);
+ CHECK(s3d_instance_transform(NULL, S3D_LOCAL_TRANSFORM, NULL), RES_BAD_ARG);
+ CHECK(s3d_instance_transform(inst, S3D_LOCAL_TRANSFORM, NULL), RES_BAD_ARG);
+ CHECK(s3d_instance_transform(NULL, -1, trans), RES_BAD_ARG);
+ CHECK(s3d_instance_transform(inst, -1, trans), RES_BAD_ARG);
+ CHECK(s3d_instance_transform(NULL, S3D_LOCAL_TRANSFORM, trans), RES_BAD_ARG);
+ CHECK(s3d_instance_transform(inst, S3D_LOCAL_TRANSFORM, trans), RES_OK);
+ CHECK(s3d_instance_transform(inst, S3D_WORLD_TRANSFORM, trans), RES_OK);
+ CHECK(s3d_instance_transform(shape, S3D_LOCAL_TRANSFORM, trans), RES_BAD_ARG);
+
+ CHECK(s3d_instance_set_transform(NULL, NULL), RES_BAD_ARG);
+ CHECK(s3d_instance_set_transform(inst, NULL), RES_BAD_ARG);
+ CHECK(s3d_instance_set_transform(NULL, trans), RES_BAD_ARG);
+ CHECK(s3d_instance_set_transform(shape, trans), RES_BAD_ARG);
+ CHECK(s3d_instance_set_transform(inst, trans), RES_OK);
+
CHECK(s3d_shape_flip_surface(inst), RES_OK);
CHECK(s3d_shape_create_mesh(dev, &shape_copy), RES_OK);