star-3d

Surface structuring for efficient 3D geometric queries
git clone git://git.meso-star.fr/star-3d.git
Log | Files | Refs | README | LICENSE

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:
Mcmake/CMakeLists.txt | 2+-
Msrc/s3d.h | 11+++++++++++
Msrc/s3d_shape.c | 31+++++++++++++++++++++++++++++++
Msrc/test_s3d_shape.c | 18++++++++++++++++++
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);