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:
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);