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 55b1acf320f0c193fbb309e5310c60d3fd922ae1
parent a6f79a578c164efef05dede0c938547b0ce9c30d
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Thu, 28 Jul 2016 12:07:14 +0200

Push further the sample tests on multiple sessions

Diffstat:
Msrc/test_s3d_session.c | 304+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 290 insertions(+), 14 deletions(-)

diff --git a/src/test_s3d_session.c b/src/test_s3d_session.c @@ -97,6 +97,14 @@ static const unsigned plane_ntris = sizeof(plane_ids) / sizeof(unsigned[3]); /******************************************************************************* * helper function ******************************************************************************/ +static float +rand_canonic(void) +{ + int r; + while((r = rand()) == RAND_MAX); + return (float)r / (float)RAND_MAX; +} + static void get_ids(const unsigned itri, unsigned ids[3], void* data) { @@ -183,8 +191,8 @@ test_trace_ray struct s3d_session* session; struct s3d_session* session2; struct s3d_session* session3; - struct s3d_shape* inst_cube0; - struct s3d_shape* inst_cube1; + struct s3d_shape* inst0; + struct s3d_shape* inst1; struct s3d_hit hit, hit2; float org[3], dir[3], range[2]; unsigned icube; @@ -288,19 +296,19 @@ test_trace_ray CHECK(s3d_session_ref_put(session), RES_OK); CHECK(s3d_session_ref_put(session2), RES_OK); - CHECK(s3d_scene_instantiate(scn2, &inst_cube0), RES_OK); - CHECK(s3d_scene_instantiate(scn2, &inst_cube1), RES_OK); - CHECK(s3d_shape_get_id(inst_cube0, &iinst0), RES_OK); - CHECK(s3d_shape_get_id(inst_cube1, &iinst1), 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 - (inst_cube0, S3D_WORLD_TRANSFORM, f3(org,-2.f, 0.f, 0.f)), RES_OK); + (inst0, S3D_WORLD_TRANSFORM, f3(org,-2.f, 0.f, 0.f)), RES_OK); CHECK(s3d_instance_translate - (inst_cube1, S3D_WORLD_TRANSFORM, f3(org, 2.f, 0.f, 0.f)), RES_OK); + (inst1, S3D_WORLD_TRANSFORM, f3(org, 2.f, 0.f, 0.f)), RES_OK); - CHECK(s3d_scene_attach_shape(scn3, inst_cube0), RES_OK); - CHECK(s3d_scene_attach_shape(scn3, inst_cube1), RES_OK); - CHECK(s3d_scene_attach_shape(scn, inst_cube0), RES_OK); - CHECK(s3d_scene_attach_shape(scn, inst_cube1), RES_OK); + CHECK(s3d_scene_attach_shape(scn3, inst0), RES_OK); + CHECK(s3d_scene_attach_shape(scn3, inst1), RES_OK); + CHECK(s3d_scene_attach_shape(scn, inst0), RES_OK); + CHECK(s3d_scene_attach_shape(scn, inst1), RES_OK); CHECK(s3d_session_create(scn, S3D_TRACE, &session), RES_OK); CHECK(s3d_session_create(scn3, S3D_TRACE, &session3), RES_OK); @@ -465,11 +473,278 @@ test_trace_ray CHECK(s3d_session_ref_put(session), RES_OK); CHECK(s3d_session_ref_put(session3), RES_OK); - CHECK(s3d_shape_ref_put(inst_cube0), RES_OK); - CHECK(s3d_shape_ref_put(inst_cube1), 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); +} + +static void +test_sample + (struct s3d_device* dev, + struct s3d_shape* cube, + struct s3d_shape* plane) +{ + #define NSAMPS 512 + 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 prims[NSAMPS]; + float u, v, w, st[2]; + float pos[3]; + unsigned icube; + unsigned iplane; + unsigned iinst0; + unsigned iinst1; + int nsamps_cube; + int nsamps_plane; + int nsamps_inst0; + int nsamps_inst1; + int i; + + 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_sample(session, 0.f, 0.f, 0.f, &prims[0], st), RES_BAD_OP); + CHECK(s3d_session_ref_put(session), RES_OK); + + CHECK(s3d_session_create(scn, S3D_SAMPLE, &session), RES_OK); + CHECK(s3d_session_sample(session, 0.f, 0.f, 0.f, &prims[0], st), RES_OK); + CHECK(prims[0].inst_id, S3D_INVALID_ID); + CHECK(prims[0].geom_id == icube || prims[0].geom_id == iplane, 1); + + nsamps_cube = 0; + nsamps_plane = 0; + srand(0); + FOR_EACH(i, 0, NSAMPS) { + u = rand_canonic(), v = rand_canonic(), w = rand_canonic(); + CHECK(s3d_session_sample(session, u, v, w, &prims[i], st), RES_OK); + CHECK(prims[i].inst_id, S3D_INVALID_ID); + if(prims[i].geom_id == icube) { + ++nsamps_cube; + } else { + CHECK(prims[i].geom_id, iplane); + ++nsamps_plane; + } + } + NCHECK(nsamps_cube, 0); + NCHECK(nsamps_plane, 0); + + CHECK(s3d_shape_enable(cube, 0), RES_OK); + srand(0); + FOR_EACH(i, 0, NSAMPS) { + struct s3d_primitive prim; + u = rand_canonic(), v = rand_canonic(), w = rand_canonic(); + CHECK(s3d_session_sample(session, u, v, w, &prim, st), RES_OK); + CHECK(S3D_PRIMITIVE_EQ(&prim, &prims[i]), 1); + } + + CHECK(s3d_session_ref_put(session), RES_OK); + CHECK(s3d_session_create(scn, S3D_SAMPLE, &session), RES_OK); + + srand(0); + FOR_EACH(i, 0, NSAMPS) { + u = rand_canonic(), v = rand_canonic(), w = rand_canonic(); + CHECK(s3d_session_sample(session, u, v, w, &prims[i], st), RES_OK); + CHECK(prims[i].inst_id, S3D_INVALID_ID); + CHECK(prims[i].geom_id, iplane); + } + + CHECK(s3d_session_ref_put(session), RES_OK); + + CHECK(s3d_shape_enable(cube, 1), RES_OK); + CHECK(s3d_scene_attach_shape(scn2, cube), 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(scn, inst1), 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_SAMPLE, &session), RES_OK); + CHECK(s3d_session_create(scn3, S3D_SAMPLE, &session3), RES_OK); + + CHECK(s3d_scene_detach_shape(scn2, cube), RES_OK); + + nsamps_cube = 0; + nsamps_inst0 = 0; + nsamps_inst1 = 0; + nsamps_plane = 0; + srand(0); + FOR_EACH(i, 0, NSAMPS) { + u = rand_canonic(), v = rand_canonic(), w = rand_canonic(); + CHECK(s3d_session_sample(session, u, v, w, &prims[i], st), RES_OK); + if(prims[i].inst_id != S3D_INVALID_ID) { + CHECK(prims[i].geom_id, icube); + if(prims[i].inst_id == iinst0) { + ++nsamps_inst0; + } else { + CHECK(prims[i].inst_id, iinst1); + ++nsamps_inst1; + } + } else { + if(prims[i].geom_id == icube) { + ++nsamps_cube; + } else { + CHECK(prims[i].geom_id, iplane); + ++nsamps_plane; + } + } + + } + NCHECK(nsamps_cube, 0); + NCHECK(nsamps_inst0, 0); + NCHECK(nsamps_inst1, 0); + NCHECK(nsamps_plane, 0); + + nsamps_inst0 = 0; + nsamps_inst1 = 0; + srand(0); + FOR_EACH(i, 0, NSAMPS) { + u = rand_canonic(), v = rand_canonic(), w = rand_canonic(); + CHECK(s3d_session_sample(session3, u, v, w, &prims[i], st), RES_OK); + CHECK(prims[i].geom_id, icube); + if(prims[i].inst_id == iinst0) { + ++nsamps_inst0; + } else { + CHECK(prims[i].inst_id, iinst1); + ++nsamps_inst1; + } + } + NCHECK(nsamps_inst0, 0); + NCHECK(nsamps_inst1, 0); + + CHECK(s3d_session_ref_put(session), RES_OK); + CHECK(s3d_session_create(scn, S3D_SAMPLE, &session), RES_OK); + + nsamps_cube = 0; + nsamps_plane = 0; + srand(0); + FOR_EACH(i, 0, NSAMPS) { + u = rand_canonic(), v = rand_canonic(), w = rand_canonic(); + CHECK(s3d_session_sample(session, u, v, w, &prims[i], st), RES_OK); + CHECK(prims[i].inst_id, S3D_INVALID_ID); + if(prims[i].geom_id == icube) { + ++nsamps_cube; + } else { + CHECK(prims[i].geom_id, iplane); + ++nsamps_plane; + } + } + NCHECK(nsamps_cube, 0); + NCHECK(nsamps_plane, 0); + + nsamps_inst0 = 0; + nsamps_inst1 = 0; + srand(0); + FOR_EACH(i, 0, NSAMPS) { + u = rand_canonic(), v = rand_canonic(), w = rand_canonic(); + CHECK(s3d_session_sample(session3, u, v, w, &prims[i], st), RES_OK); + CHECK(prims[i].geom_id, icube); + if(prims[i].inst_id == iinst0) { + ++nsamps_inst0; + } else { + CHECK(prims[i].inst_id, iinst1); + ++nsamps_inst1; + } + } + NCHECK(nsamps_inst0, 0); + NCHECK(nsamps_inst1, 0); + + CHECK(s3d_scene_attach_shape(scn2, plane), RES_OK); + + CHECK(s3d_session_ref_put(session), RES_OK); + CHECK(s3d_session_create(scn, S3D_SAMPLE, &session), RES_OK); + + FOR_EACH(i, 0, NSAMPS) { + u = rand_canonic(), v = rand_canonic(), w = rand_canonic(); + CHECK(s3d_session_sample(session, u, v, w, &prims[i], st), RES_OK); + if(prims[i].inst_id != S3D_INVALID_ID) { + CHECK(prims[i].geom_id, iplane); + if(prims[i].inst_id == iinst0) { + ++nsamps_inst0; + } else { + CHECK(prims[i].inst_id, iinst1); + ++nsamps_inst1; + } + } else { + if(prims[i].geom_id == icube) { + ++nsamps_cube; + } else { + CHECK(prims[i].geom_id, iplane); + ++nsamps_plane; + } + } + + } + NCHECK(nsamps_cube, 0); + NCHECK(nsamps_inst0, 0); + NCHECK(nsamps_inst1, 0); + NCHECK(nsamps_plane, 0); + + nsamps_inst0 = 0; + nsamps_inst1 = 0; + srand(0); + FOR_EACH(i, 0, NSAMPS) { + u = rand_canonic(), v = rand_canonic(), w = rand_canonic(); + CHECK(s3d_session_sample(session3, u, v, w, &prims[i], st), RES_OK); + CHECK(prims[i].geom_id, icube); + if(prims[i].inst_id == iinst0) { + ++nsamps_inst0; + } else { + CHECK(prims[i].inst_id, iinst1); + ++nsamps_inst1; + } + } + NCHECK(nsamps_inst0, 0); + NCHECK(nsamps_inst1, 0); + + CHECK(s3d_session_ref_put(session), RES_OK); + CHECK(s3d_session_ref_put(session3), RES_OK); + + CHECK(s3d_session_create(scn3, S3D_SAMPLE, &session3), RES_OK); + nsamps_inst0 = 0; + nsamps_inst1 = 0; + srand(0); + FOR_EACH(i, 0, NSAMPS) { + u = rand_canonic(), v = rand_canonic(), w = rand_canonic(); + CHECK(s3d_session_sample(session3, u, v, w, &prims[i], st), RES_OK); + CHECK(prims[i].geom_id, iplane); + if(prims[i].inst_id == iinst0) { + ++nsamps_inst0; + } else { + CHECK(prims[i].inst_id, iinst1); + ++nsamps_inst1; + } + } + NCHECK(nsamps_inst0, 0); + NCHECK(nsamps_inst1, 0); + + CHECK(s3d_session_ref_put(session3), 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); + CHECK(s3d_shape_ref_put(inst0), RES_OK); + CHECK(s3d_shape_ref_put(inst1), RES_OK); } /******************************************************************************* @@ -508,6 +783,7 @@ main(int argc, char** argv) test_miscellaneous(dev, cube, plane); test_trace_ray(dev, cube, plane); + test_sample(dev, cube, plane); CHECK(s3d_shape_ref_put(cube), RES_OK); CHECK(s3d_shape_ref_put(plane), RES_OK);