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 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:
Msrc/s3d.h | 4++--
Msrc/test_s3d_session.c | 251+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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);