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 a590a61a31834a49abf7424aab8a0338a2dad409
parent 4352361876637c3dbc28e40118b5232c983690f7
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed, 13 Jul 2016 15:02:47 +0200

Add and test the s3d_primitive_has_attrib function

Define whether or not the attribute is defined for the primitive.

Diffstat:
Msrc/s3d.h | 7+++++++
Msrc/s3d_primitive.c | 21+++++++++++++++++++++
Msrc/test_s3d_primitive.c | 15+++++++++++++++
3 files changed, 43 insertions(+), 0 deletions(-)

diff --git a/src/s3d.h b/src/s3d.h @@ -428,6 +428,13 @@ s3d_primitive_get_attrib const float st[2], /* Parametric coordinates of `attr' on `iprim' */ struct s3d_attrib* attrib); /* Resulting attrib */ +/* Retrieve if the primitive `iprim' has the attribute `attr' */ +S3D_API res_T +s3d_primitive_has_attrib + (const struct s3d_primitive* prim, + const enum s3d_attrib_usage attr, + char* has_attrib); + /* Uniform sampling of the primitive */ S3D_API res_T s3d_primitive_sample diff --git a/src/s3d_primitive.c b/src/s3d_primitive.c @@ -158,6 +158,27 @@ error: } res_T +s3d_primitive_has_attrib + (const struct s3d_primitive* prim, + const enum s3d_attrib_usage attr, + char* has_attrib) +{ + if(!prim + || !has_attrib + || (attr != S3D_GEOMETRY_NORMAL && (unsigned)attr >= S3D_ATTRIBS_COUNT__)) + return RES_BAD_ARG; + + if(attr == S3D_GEOMETRY_NORMAL) { + *has_attrib = 1; + } else { + struct geometry* geom_mesh = (struct geometry*)prim->mesh__; + ASSERT(geom_mesh->type == GEOM_MESH); + *has_attrib = geom_mesh->data.mesh->attribs[attr] != NULL; + } + return RES_OK; +} + +res_T s3d_primitive_sample (const struct s3d_primitive *prim, const float u, diff --git a/src/test_s3d_primitive.c b/src/test_s3d_primitive.c @@ -97,6 +97,7 @@ main(int argc, char** argv) float area; unsigned ntris, nverts; unsigned walls_id; + char b; (void)argc, (void)argv; mem_init_proxy_allocator(&allocator, &mem_default_allocator); @@ -152,6 +153,20 @@ main(int argc, char** argv) CHECK(s3d_primitive_get_attrib(&prim, S3D_ATTRIB_0, uv, &attr), RES_BAD_ARG); CHECK(s3d_primitive_get_attrib(&S3D_PRIMITIVE_NULL, S3D_POSITION, uv, &attr), RES_BAD_ARG); + CHECK(s3d_primitive_has_attrib(NULL, S3D_ATTRIBS_COUNT__, NULL), RES_BAD_ARG); + CHECK(s3d_primitive_has_attrib(&prim, S3D_ATTRIBS_COUNT__, NULL), RES_BAD_ARG); + CHECK(s3d_primitive_has_attrib(NULL, S3D_POSITION, NULL), RES_BAD_ARG); + CHECK(s3d_primitive_has_attrib(&prim, S3D_POSITION, NULL), RES_BAD_ARG); + CHECK(s3d_primitive_has_attrib(NULL, S3D_ATTRIBS_COUNT__, &b), RES_BAD_ARG); + CHECK(s3d_primitive_has_attrib(&prim, S3D_ATTRIBS_COUNT__, &b), RES_BAD_ARG); + CHECK(s3d_primitive_has_attrib(NULL, S3D_POSITION, &b), RES_BAD_ARG); + CHECK(s3d_primitive_has_attrib(&prim, S3D_POSITION, &b), RES_OK); + CHECK(b, 1); + CHECK(s3d_primitive_has_attrib(&prim, S3D_GEOMETRY_NORMAL, &b), RES_OK); + CHECK(b, 1); + CHECK(s3d_primitive_has_attrib(&prim, S3D_ATTRIB_0, &b), RES_OK); + CHECK(b, 0); + CHECK(s3d_scene_clear(scn), RES_OK); CHECK(s3d_scene_attach_shape(scn, plane), RES_OK); CHECK(s3d_scene_begin_session(scn, S3D_GET_PRIMITIVE), RES_OK);