commit 5bf5129029df4565e5ae26ef5628c626a3ae7f26
parent 55b1acf320f0c193fbb309e5310c60d3fd922ae1
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Thu, 28 Jul 2016 14:48:43 +0200
Push further the get primitive tests on multiple sessions
Diffstat:
2 files changed, 253 insertions(+), 2 deletions(-)
diff --git a/src/s3d.h b/src/s3d.h
@@ -184,8 +184,8 @@ typedef int
/* Forward declaration of s3d opaque data types */
struct s3d_device; /* Entry point of the library */
struct s3d_scene; /* Collection of shapes */
-struct s3d_shape; /* Untyped geometry */
-struct s3d_session; /* TODO comment */
+struct s3d_shape; /* Surfacic geometry */
+struct s3d_session; /* Scene state */
/* Forward declaration of external data types */
struct logger;
diff --git a/src/test_s3d_session.c b/src/test_s3d_session.c
@@ -36,6 +36,8 @@
#include <rsys/float3.h>
#include <rsys/float2.h>
+#include <string.h>
+
struct mesh_context {
const float* verts;
const unsigned* ids;
@@ -747,6 +749,254 @@ test_sample
CHECK(s3d_shape_ref_put(inst1), RES_OK);
}
+static void
+test_get_primitive
+ (struct s3d_device* dev,
+ struct s3d_shape* cube,
+ struct s3d_shape* plane)
+{
+ struct s3d_scene* scn;
+ struct s3d_scene* scn2;
+ struct s3d_scene* scn3;
+ struct s3d_session* session;
+ struct s3d_session* session3;
+ struct s3d_shape* inst0;
+ struct s3d_shape* inst1;
+ struct s3d_primitive prim;
+ size_t nprims;
+ unsigned i;
+ unsigned icube;
+ unsigned iplane;
+ unsigned iinst0;
+ unsigned iinst1;
+ float pos[3];
+ int cube_prims[12];
+ int plane_prims[2];
+ int inst0_prims[12];
+ int inst1_prims[12];
+
+ CHECK(s3d_scene_create(dev, &scn), RES_OK);
+ CHECK(s3d_scene_create(dev, &scn2), RES_OK);
+ CHECK(s3d_scene_create(dev, &scn3), RES_OK);
+ CHECK(s3d_scene_attach_shape(scn, cube), RES_OK);
+ CHECK(s3d_scene_attach_shape(scn, plane), RES_OK);
+ CHECK(s3d_shape_get_id(cube, &icube), RES_OK);
+ CHECK(s3d_shape_get_id(plane, &iplane), RES_OK);
+
+ CHECK(s3d_session_create(scn, S3D_TRACE, &session), RES_OK);
+ CHECK(s3d_session_get_primitive(session, 0, &prim), RES_BAD_OP);
+ CHECK(s3d_session_primitives_count(session, &nprims), RES_OK);
+ CHECK(nprims, 14);
+ CHECK(s3d_session_ref_put(session), RES_OK);
+
+ CHECK(s3d_session_create(scn, S3D_GET_PRIMITIVE, &session), RES_OK);
+ CHECK(s3d_session_primitives_count(session, &nprims), RES_OK);
+ CHECK(nprims, 14);
+
+ memset(cube_prims, 0, sizeof(cube_prims));
+ memset(plane_prims, 0, sizeof(plane_prims));
+ FOR_EACH(i, 0, nprims) {
+ CHECK(s3d_session_get_primitive(session, i, &prim), RES_OK);
+ CHECK(prim.inst_id, S3D_INVALID_ID);
+ CHECK(prim.scene_prim_id, i);
+ if(prim.geom_id == icube) {
+ cube_prims[prim.prim_id] = 1;
+ } else {
+ CHECK(prim.geom_id, iplane);
+ plane_prims[prim.prim_id] = 1;
+ }
+ }
+ FOR_EACH(i, 0, 12) CHECK(cube_prims[i], 1);
+ FOR_EACH(i, 0, 2) CHECK(plane_prims[i], 1);
+
+ CHECK(s3d_scene_detach_shape(scn, cube), RES_OK);
+ CHECK(s3d_session_primitives_count(session, &nprims), RES_OK);
+ CHECK(nprims, 14);
+ memset(cube_prims, 0, sizeof(cube_prims));
+ memset(plane_prims, 0, sizeof(plane_prims));
+ FOR_EACH(i, 0, nprims) {
+ CHECK(s3d_session_get_primitive(session, i, &prim), RES_OK);
+ CHECK(prim.inst_id, S3D_INVALID_ID);
+ CHECK(prim.scene_prim_id, i);
+ if(prim.geom_id == icube) {
+ cube_prims[prim.prim_id] = 1;
+ } else {
+ CHECK(prim.geom_id, iplane);
+ plane_prims[prim.prim_id] = 1;
+ }
+ }
+ FOR_EACH(i, 0, 12) CHECK(cube_prims[i], 1);
+ FOR_EACH(i, 0, 2) CHECK(plane_prims[i], 1);
+
+ CHECK(s3d_session_ref_put(session), RES_OK);
+ CHECK(s3d_session_create(scn, S3D_GET_PRIMITIVE, &session), RES_OK);
+ CHECK(s3d_session_primitives_count(session, &nprims), RES_OK);
+ CHECK(nprims, 2);
+ memset(plane_prims, 0, sizeof(plane_prims));
+ FOR_EACH(i, 0, nprims) {
+ CHECK(s3d_session_get_primitive(session, i, &prim), RES_OK);
+ CHECK(prim.inst_id, S3D_INVALID_ID);
+ CHECK(prim.scene_prim_id, i);
+ CHECK(prim.geom_id, iplane);
+ plane_prims[prim.prim_id] = 1;
+ }
+ FOR_EACH(i, 0, 2) CHECK(plane_prims[i], 1);
+
+ CHECK(s3d_session_ref_put(session), RES_OK);
+
+ CHECK(s3d_scene_attach_shape(scn, cube), RES_OK);
+
+ CHECK(s3d_scene_attach_shape(scn2, plane), RES_OK);
+ CHECK(s3d_scene_instantiate(scn2, &inst0), RES_OK);
+ CHECK(s3d_scene_instantiate(scn2, &inst1), RES_OK);
+ CHECK(s3d_shape_get_id(inst0, &iinst0), RES_OK);
+ CHECK(s3d_shape_get_id(inst1, &iinst1), RES_OK);
+ CHECK(s3d_instance_translate
+ (inst0, S3D_WORLD_TRANSFORM, f3(pos,-2.f, 0.f, 0.f)), RES_OK);
+ CHECK(s3d_instance_translate
+ (inst1, S3D_WORLD_TRANSFORM, f3(pos, 2.f, 0.f, 0.f)), RES_OK);
+
+ CHECK(s3d_scene_attach_shape(scn, inst0), RES_OK);
+ CHECK(s3d_scene_attach_shape(scn3, inst0), RES_OK);
+ CHECK(s3d_scene_attach_shape(scn3, inst1), RES_OK);
+
+ CHECK(s3d_session_create(scn, S3D_GET_PRIMITIVE, &session), RES_OK);
+ CHECK(s3d_session_create(scn3, S3D_GET_PRIMITIVE, &session3), RES_OK);
+
+ CHECK(s3d_scene_clear(scn2), RES_OK);
+
+ CHECK(s3d_session_primitives_count(session, &nprims), RES_OK);
+ CHECK(nprims, 16);
+ memset(plane_prims, 0, sizeof(plane_prims));
+ memset(cube_prims, 0, sizeof(cube_prims));
+ memset(inst0_prims, 0, sizeof(inst0_prims));
+ FOR_EACH(i, 0, nprims) {
+ CHECK(s3d_session_get_primitive(session, i, &prim), RES_OK);
+ if(prim.inst_id != S3D_INVALID_ID) {
+ CHECK(prim.inst_id, iinst0);
+ CHECK(prim.geom_id, iplane);
+ inst0_prims[prim.prim_id] = 1;
+ } else {
+ if(prim.geom_id == icube) {
+ cube_prims[prim.prim_id] = 1;
+ } else {
+ CHECK(prim.geom_id, iplane);
+ plane_prims[prim.prim_id] = 1;
+ }
+ }
+ }
+ FOR_EACH(i, 0, 12) CHECK(cube_prims[i], 1);
+ FOR_EACH(i, 0, 2) CHECK(plane_prims[i], 1);
+ FOR_EACH(i, 0, 2) CHECK(inst0_prims[i], 1);
+
+ CHECK(s3d_session_primitives_count(session3, &nprims), RES_OK);
+ CHECK(nprims, 4);
+ memset(inst0_prims, 0, sizeof(inst0_prims));
+ memset(inst1_prims, 0, sizeof(inst1_prims));
+ FOR_EACH(i, 0, nprims) {
+ CHECK(s3d_session_get_primitive(session3, i, &prim), RES_OK);
+ NCHECK(prim.inst_id, S3D_INVALID_ID);
+ CHECK(prim.geom_id, iplane);
+ if(prim.inst_id == iinst0) {
+ inst0_prims[prim.prim_id] = 1;
+ } else {
+ CHECK(prim.inst_id, iinst1);
+ inst1_prims[prim.prim_id] = 1;
+ }
+ }
+ FOR_EACH(i, 0, 2) CHECK(inst1_prims[i], 1);
+ FOR_EACH(i, 0, 2) CHECK(inst1_prims[i], 1);
+
+ CHECK(s3d_session_ref_put(session3), RES_OK);
+
+ CHECK(s3d_session_create(scn3, S3D_GET_PRIMITIVE, &session3), RES_OK);
+ CHECK(s3d_session_primitives_count(session3, &nprims), RES_OK);
+ CHECK(nprims, 0);
+ CHECK(s3d_session_ref_put(session3), RES_OK);
+
+ CHECK(s3d_scene_attach_shape(scn2, cube), RES_OK);
+ CHECK(s3d_session_create(scn3, S3D_GET_PRIMITIVE, &session3), RES_OK);
+
+ CHECK(s3d_session_primitives_count(session, &nprims), RES_OK);
+ CHECK(nprims, 16);
+ memset(plane_prims, 0, sizeof(plane_prims));
+ memset(cube_prims, 0, sizeof(cube_prims));
+ memset(inst0_prims, 0, sizeof(inst0_prims));
+ FOR_EACH(i, 0, nprims) {
+ CHECK(s3d_session_get_primitive(session, i, &prim), RES_OK);
+ if(prim.inst_id != S3D_INVALID_ID) {
+ CHECK(prim.inst_id, iinst0);
+ CHECK(prim.geom_id, iplane);
+ inst0_prims[prim.prim_id] = 1;
+ } else {
+ if(prim.geom_id == icube) {
+ cube_prims[prim.prim_id] = 1;
+ } else {
+ CHECK(prim.geom_id, iplane);
+ plane_prims[prim.prim_id] = 1;
+ }
+ }
+ }
+ FOR_EACH(i, 0, 12) CHECK(cube_prims[i], 1);
+ FOR_EACH(i, 0, 2) CHECK(plane_prims[i], 1);
+ FOR_EACH(i, 0, 2) CHECK(inst0_prims[i], 1);
+
+ CHECK(s3d_session_primitives_count(session3, &nprims), RES_OK);
+ CHECK(nprims, 24);
+ memset(inst0_prims, 0, sizeof(inst0_prims));
+ memset(inst1_prims, 0, sizeof(inst1_prims));
+ FOR_EACH(i, 0, nprims) {
+ CHECK(s3d_session_get_primitive(session3, i, &prim), RES_OK);
+ NCHECK(prim.inst_id, S3D_INVALID_ID);
+ CHECK(prim.geom_id, icube);
+ if(prim.inst_id == iinst0) {
+ inst0_prims[prim.prim_id] = 1;
+ } else {
+ CHECK(prim.inst_id, iinst1);
+ inst1_prims[prim.prim_id] = 1;
+ }
+ }
+ FOR_EACH(i, 0, 12) CHECK(inst1_prims[i], 1);
+ FOR_EACH(i, 0, 12) CHECK(inst1_prims[i], 1);
+
+ CHECK(s3d_session_ref_put(session), RES_OK);
+ CHECK(s3d_session_ref_put(session3), RES_OK);
+
+ CHECK(s3d_session_create(scn, S3D_GET_PRIMITIVE, &session), RES_OK);
+
+ CHECK(s3d_session_primitives_count(session, &nprims), RES_OK);
+ CHECK(nprims, 26);
+ memset(plane_prims, 0, sizeof(plane_prims));
+ memset(cube_prims, 0, sizeof(cube_prims));
+ memset(inst0_prims, 0, sizeof(inst0_prims));
+ FOR_EACH(i, 0, nprims) {
+ CHECK(s3d_session_get_primitive(session, i, &prim), RES_OK);
+ if(prim.inst_id != S3D_INVALID_ID) {
+ CHECK(prim.inst_id, iinst0);
+ CHECK(prim.geom_id, icube);
+ inst0_prims[prim.prim_id] = 1;
+ } else {
+ if(prim.geom_id == icube) {
+ cube_prims[prim.prim_id] = 1;
+ } else {
+ CHECK(prim.geom_id, iplane);
+ plane_prims[prim.prim_id] = 1;
+ }
+ }
+ }
+ FOR_EACH(i, 0, 12) CHECK(cube_prims[i], 1);
+ FOR_EACH(i, 0, 2) CHECK(plane_prims[i], 1);
+ FOR_EACH(i, 0, 12) CHECK(inst0_prims[i], 1);
+
+ CHECK(s3d_session_ref_put(session), RES_OK);
+
+ CHECK(s3d_shape_ref_put(inst0), RES_OK);
+ CHECK(s3d_shape_ref_put(inst1), RES_OK);
+ CHECK(s3d_scene_ref_put(scn), RES_OK);
+ CHECK(s3d_scene_ref_put(scn2), RES_OK);
+ CHECK(s3d_scene_ref_put(scn3), RES_OK);
+}
+
/*******************************************************************************
* Main test function
******************************************************************************/
@@ -784,6 +1034,7 @@ main(int argc, char** argv)
test_miscellaneous(dev, cube, plane);
test_trace_ray(dev, cube, plane);
test_sample(dev, cube, plane);
+ test_get_primitive(dev, cube, plane);
CHECK(s3d_shape_ref_put(cube), RES_OK);
CHECK(s3d_shape_ref_put(plane), RES_OK);