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 a6f79a578c164efef05dede0c938547b0ce9c30d
parent 0376c8923ecbbb65a456052cf190a8c46a2b2ad1
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Thu, 28 Jul 2016 11:20:59 +0200

Push further the trace tests on multiple sessions

Diffstat:
Msrc/test_s3d_session.c | 327+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------
1 file changed, 279 insertions(+), 48 deletions(-)

diff --git a/src/test_s3d_session.c b/src/test_s3d_session.c @@ -41,6 +41,19 @@ struct mesh_context { const unsigned* ids; }; +static int +filter + (const struct s3d_hit* hit, + const float org[3], + const float dir[3], + void* ray_data, + void* filter_data) +{ + (void)org, (void)dir, (void)ray_data, (void)filter_data; + CHECK(S3D_HIT_NONE(hit), 0); + return hit->prim.prim_id % 2 == 0; +} + /******************************************************************************* * Cube data ******************************************************************************/ @@ -108,53 +121,17 @@ get_pos(const unsigned ivert, float pos[3], void* data) pos[2] = ctx->verts[i + 2]; } -/******************************************************************************* - * Main test function - ******************************************************************************/ -int -main(int argc, char** argv) +static void +test_miscellaneous + (struct s3d_device* dev, + struct s3d_shape* cube, + struct s3d_shape* plane) { - struct mem_allocator allocator; - struct mesh_context ctx; - struct s3d_device* dev; - struct s3d_hit hit, hit2; struct s3d_scene* scn; - struct s3d_scene* scn2; struct s3d_session* session; - struct s3d_session* session2; - struct s3d_shape* cube; - struct s3d_shape* plane; - struct s3d_vertex_data vdata; - float org[3], dir[3], range[2]; - unsigned icube; - unsigned iplane; int mask; - (void)argc, (void)argv; - - mem_init_proxy_allocator(&allocator, &mem_default_allocator); - CHECK(s3d_device_create(NULL, &allocator, 1, &dev), RES_OK); CHECK(s3d_scene_create(dev, &scn), RES_OK); - CHECK(s3d_scene_create(dev, &scn2), RES_OK); - - vdata.type = S3D_FLOAT3; - vdata.usage = S3D_POSITION; - vdata.get = get_pos; - - ctx.ids = cube_ids; - ctx.verts = cube_verts; - CHECK(s3d_shape_create_mesh(dev, &cube), RES_OK); - CHECK(s3d_shape_get_id(cube, &icube), RES_OK); - CHECK(s3d_mesh_setup_indexed_vertices - (cube, cube_ntris, get_ids, cube_nverts, &vdata, 1, &ctx), RES_OK); - - ctx.ids = plane_ids; - ctx.verts = plane_verts; - CHECK(s3d_shape_create_mesh(dev, &plane), RES_OK); - CHECK(s3d_shape_get_id(plane, &iplane), RES_OK); - CHECK(s3d_mesh_setup_indexed_vertices - (plane, plane_ntris, get_ids, plane_nverts, &vdata, 1, &ctx), RES_OK); - CHECK(s3d_scene_attach_shape(scn, cube), RES_OK); CHECK(s3d_scene_attach_shape(scn, plane), RES_OK); @@ -189,6 +166,44 @@ main(int argc, char** argv) CHECK(s3d_session_get_mask(session, &mask), RES_OK); CHECK(mask & S3D_SAMPLE, S3D_SAMPLE); CHECK(mask & S3D_GET_PRIMITIVE, S3D_GET_PRIMITIVE); + CHECK(s3d_session_ref_put(session), RES_OK); + + CHECK(s3d_scene_ref_put(scn), RES_OK); +} + +static void +test_trace_ray + (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* session2; + struct s3d_session* session3; + struct s3d_shape* inst_cube0; + struct s3d_shape* inst_cube1; + struct s3d_hit hit, hit2; + float org[3], dir[3], range[2]; + unsigned icube; + unsigned iplane; + unsigned iinst0; + unsigned iinst1; + + CHECK(s3d_shape_get_id(cube, &icube), RES_OK); + CHECK(s3d_shape_get_id(plane, &iplane), RES_OK); + + 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, plane), RES_OK); + CHECK(s3d_scene_attach_shape(scn, cube), RES_OK); + CHECK(s3d_scene_attach_shape(scn2, cube), RES_OK); + CHECK(s3d_scene_attach_shape(scn2, plane), RES_OK); + + CHECK(s3d_session_create(scn, S3D_SAMPLE|S3D_GET_PRIMITIVE, &session), RES_OK); f3(org, 0.5f, 0.25f, 0.25f); f3(dir, 0.f, 0.f, 1.f); @@ -202,18 +217,18 @@ main(int argc, char** argv) CHECK(hit.prim.geom_id, iplane); CHECK(hit.prim.prim_id, 0); - f3_minus(dir, dir); + f3(dir, 0.f, 0.f, -1.f); CHECK(s3d_session_trace_ray(session2, org, dir, range, NULL, &hit), RES_OK); CHECK(S3D_HIT_NONE(&hit), 0); CHECK(hit.prim.inst_id, S3D_INVALID_ID); CHECK(hit.prim.geom_id, icube); CHECK(hit.prim.prim_id, 0); + f3(dir, 0.f, 0.f, 1.f); CHECK(s3d_shape_enable(plane, 0), RES_OK); CHECK(s3d_session_ref_put(session), RES_OK); CHECK(s3d_session_create(scn, S3D_TRACE, &session), RES_OK); - f3_minus(dir, dir); CHECK(s3d_session_trace_ray(session2, org, dir, range, NULL, &hit), RES_OK); CHECK(S3D_HIT_NONE(&hit), 0); CHECK(hit.prim.inst_id, S3D_INVALID_ID); @@ -230,9 +245,6 @@ main(int argc, char** argv) CHECK(s3d_session_ref_put(session2), RES_OK); CHECK(s3d_shape_enable(plane, 1), RES_OK); - CHECK(s3d_scene_attach_shape(scn2, cube), RES_OK); - CHECK(s3d_scene_attach_shape(scn2, plane), RES_OK); - CHECK(s3d_session_create(scn, S3D_TRACE, &session), RES_OK); CHECK(s3d_session_create(scn2, S3D_TRACE, &session2), RES_OK); @@ -276,10 +288,229 @@ main(int argc, char** argv) CHECK(s3d_session_ref_put(session), RES_OK); CHECK(s3d_session_ref_put(session2), RES_OK); - CHECK(s3d_shape_ref_put(cube), RES_OK); - CHECK(s3d_shape_ref_put(plane), 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_instance_translate + (inst_cube0, 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); + + 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_session_create(scn, S3D_TRACE, &session), RES_OK); + CHECK(s3d_session_create(scn3, S3D_TRACE, &session3), RES_OK); + + f3(org, 0.5f, 0.25f, 0.25f); + f3(dir, 0.f, 0.f, 1.f); + CHECK(s3d_session_trace_ray(session, org, dir, range, NULL, &hit), RES_OK); + CHECK(hit.prim.inst_id, S3D_INVALID_ID); + CHECK(hit.prim.geom_id, iplane); + CHECK(hit.prim.prim_id, 0); + + CHECK(s3d_session_trace_ray(session3, org, dir, range, NULL, &hit), RES_OK); + CHECK(S3D_HIT_NONE(&hit), 1); + + f3(org, -1.5f, 0.25f, 0.25f); + CHECK(s3d_session_trace_ray(session, org, dir, range, NULL, &hit), RES_OK); + CHECK(hit.prim.inst_id, iinst0); + CHECK(hit.prim.geom_id, icube); + CHECK(hit.prim.prim_id, 4); + + CHECK(s3d_session_trace_ray(session3, org, dir, range, NULL, &hit2), RES_OK); + CHECK(hit2.prim.inst_id, iinst0); + CHECK(hit2.prim.geom_id, icube); + CHECK(hit2.prim.prim_id, 4); + + CHECK(f3_eq(hit.normal, hit2.normal), 1); + CHECK(f2_eq(hit.uv, hit2.uv), 1); + CHECK(hit.distance, hit2.distance); + + CHECK(s3d_scene_clear(scn2), RES_OK); + + f3(org, 2.5f, 0.25f, 0.25f); + + CHECK(s3d_session_trace_ray(session, org, dir, range, NULL, &hit), RES_OK); + CHECK(hit.prim.inst_id, iinst1); + CHECK(hit.prim.geom_id, icube); + CHECK(hit.prim.prim_id, 4); + + CHECK(s3d_session_trace_ray(session3, org, dir, range, NULL, &hit2), RES_OK); + CHECK(hit2.prim.inst_id, iinst1); + CHECK(hit2.prim.geom_id, icube); + CHECK(hit2.prim.prim_id, 4); + + CHECK(f3_eq(hit.normal, hit2.normal), 1); + CHECK(f2_eq(hit.uv, hit2.uv), 1); + CHECK(hit.distance, hit2.distance); + + CHECK(s3d_session_ref_put(session), RES_OK); + CHECK(s3d_session_create(scn, S3D_TRACE, &session), RES_OK); + + f3(org, -1.5f, 0.25f, 0.25f); + CHECK(s3d_session_trace_ray(session, org, dir, range, NULL, &hit), RES_OK); + CHECK(S3D_HIT_NONE(&hit), 1); + CHECK(s3d_session_trace_ray(session3, org, dir, range, NULL, &hit), RES_OK); + CHECK(hit.prim.inst_id, iinst0); + CHECK(hit.prim.geom_id, icube); + CHECK(hit.prim.prim_id, 4); + + f3(org, 2.5f, 0.25f, 0.25f); + CHECK(s3d_session_trace_ray(session, org, dir, range, NULL, &hit), RES_OK); + CHECK(S3D_HIT_NONE(&hit), 1); + CHECK(s3d_session_trace_ray(session3, org, dir, range, NULL, &hit), RES_OK); + CHECK(hit.prim.inst_id, iinst1); + CHECK(hit.prim.geom_id, icube); + CHECK(hit.prim.prim_id, 4); + + f3(org, 0.5f, 0.25f, 0.25f); + CHECK(s3d_session_trace_ray(session, org, dir, range, NULL, &hit), RES_OK); + CHECK(hit.prim.inst_id, S3D_INVALID_ID); + CHECK(hit.prim.geom_id, iplane); + CHECK(hit.prim.prim_id, 0); + CHECK(s3d_session_trace_ray(session3, org, dir, range, NULL, &hit), RES_OK); + CHECK(S3D_HIT_NONE(&hit), 1); + + CHECK(s3d_scene_attach_shape(scn2, plane), RES_OK); + CHECK(s3d_mesh_set_hit_filter_function(plane, filter, NULL), RES_OK); + + f3(org, 0.5f, 0.25f, 0.25f); + CHECK(s3d_session_trace_ray(session, org, dir, range, NULL, &hit), RES_OK); + CHECK(hit.prim.inst_id, S3D_INVALID_ID); + CHECK(hit.prim.geom_id, iplane); + CHECK(hit.prim.prim_id, 0); + + CHECK(s3d_session_ref_put(session3), RES_OK); + CHECK(s3d_session_create(scn3, S3D_TRACE, &session3), RES_OK); + + f3(org, -1.5f, 0.25f, 0.25f); + CHECK(s3d_session_trace_ray(session, org, dir, range, NULL, &hit), RES_OK); + CHECK(S3D_HIT_NONE(&hit), 1); + CHECK(s3d_session_trace_ray(session3, org, dir, range, NULL, &hit), RES_OK); + CHECK(S3D_HIT_NONE(&hit), 1); + + f3(org, -1.5f, 0.75f, 0.25f); + CHECK(s3d_session_trace_ray(session, org, dir, range, NULL, &hit), RES_OK); + CHECK(S3D_HIT_NONE(&hit), 1); + CHECK(s3d_session_trace_ray(session3, org, dir, range, NULL, &hit), RES_OK); + CHECK(hit.prim.inst_id, iinst0); + CHECK(hit.prim.geom_id, iplane); + CHECK(hit.prim.prim_id, 1); + + f3(org, 2.5f, 0.25f, 0.25f); + CHECK(s3d_session_trace_ray(session, org, dir, range, NULL, &hit), RES_OK); + CHECK(S3D_HIT_NONE(&hit), 1); + CHECK(s3d_session_trace_ray(session3, org, dir, range, NULL, &hit), RES_OK); + CHECK(S3D_HIT_NONE(&hit), 1); + + f3(org, 2.5f, 0.75f, 0.25f); + CHECK(s3d_session_trace_ray(session, org, dir, range, NULL, &hit), RES_OK); + CHECK(S3D_HIT_NONE(&hit), 1); + CHECK(s3d_session_trace_ray(session3, org, dir, range, NULL, &hit), RES_OK); + CHECK(hit.prim.inst_id, iinst1); + CHECK(hit.prim.geom_id, iplane); + CHECK(hit.prim.prim_id, 1); + + f3(org, 0.5f, 0.25f, 0.25f); + CHECK(s3d_session_trace_ray(session, org, dir, range, NULL, &hit), RES_OK); + CHECK(hit.prim.inst_id, S3D_INVALID_ID); + CHECK(hit.prim.geom_id, iplane); + CHECK(hit.prim.prim_id, 0); + CHECK(s3d_session_trace_ray(session3, org, dir, range, NULL, &hit), RES_OK); + CHECK(S3D_HIT_NONE(&hit), 1); + + f3(org, 0.5f, 0.75f, 0.25f); + CHECK(s3d_session_trace_ray(session, org, dir, range, NULL, &hit), RES_OK); + CHECK(hit.prim.inst_id, S3D_INVALID_ID); + CHECK(hit.prim.geom_id, iplane); + CHECK(hit.prim.prim_id, 1); + CHECK(s3d_session_trace_ray(session3, org, dir, range, NULL, &hit), RES_OK); + CHECK(S3D_HIT_NONE(&hit), 1); + + CHECK(s3d_session_ref_put(session), RES_OK); + CHECK(s3d_session_create(scn, S3D_TRACE, &session), RES_OK); + f3(org, 0.5f, 0.25f, 0.25f); + CHECK(s3d_session_trace_ray(session, org, dir, range, NULL, &hit), RES_OK); + CHECK(hit.prim.inst_id, S3D_INVALID_ID); + CHECK(hit.prim.geom_id, icube); + CHECK(hit.prim.prim_id, 4); + f3(org, 0.5f, 0.75f, 0.25f); + CHECK(s3d_session_trace_ray(session, org, dir, range, NULL, &hit), RES_OK); + CHECK(hit.prim.inst_id, S3D_INVALID_ID); + CHECK(hit.prim.geom_id, iplane); + CHECK(hit.prim.prim_id, 1); + + f3(org, -1.5f, 0.25f, 0.25f); + CHECK(s3d_session_trace_ray(session, org, dir, range, NULL, &hit), RES_OK); + CHECK(S3D_HIT_NONE(&hit), 1); + f3(org, -1.5f, 0.75f, 0.25f); + CHECK(s3d_session_trace_ray(session, org, dir, range, NULL, &hit), RES_OK); + CHECK(hit.prim.inst_id, iinst0); + CHECK(hit.prim.geom_id, iplane); + CHECK(hit.prim.prim_id, 1); + + f3(org, 2.5f, 0.25f, 0.25f); + CHECK(s3d_session_trace_ray(session, org, dir, range, NULL, &hit), RES_OK); + CHECK(S3D_HIT_NONE(&hit), 1); + f3(org, 2.5f, 0.75f, 0.25f); + CHECK(s3d_session_trace_ray(session, org, dir, range, NULL, &hit), RES_OK); + CHECK(hit.prim.inst_id, iinst1); + CHECK(hit.prim.geom_id, iplane); + CHECK(hit.prim.prim_id, 1); + + 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_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 + ******************************************************************************/ +int +main(int argc, char** argv) +{ + struct mem_allocator allocator; + struct mesh_context ctx; + struct s3d_device* dev; + struct s3d_shape* cube; + struct s3d_shape* plane; + struct s3d_vertex_data vdata; + (void)argc, (void)argv; + + mem_init_proxy_allocator(&allocator, &mem_default_allocator); + + CHECK(s3d_device_create(NULL, &allocator, 1, &dev), RES_OK); + + vdata.type = S3D_FLOAT3; + vdata.usage = S3D_POSITION; + vdata.get = get_pos; + + ctx.ids = cube_ids; + ctx.verts = cube_verts; + CHECK(s3d_shape_create_mesh(dev, &cube), RES_OK); + CHECK(s3d_mesh_setup_indexed_vertices + (cube, cube_ntris, get_ids, cube_nverts, &vdata, 1, &ctx), RES_OK); + + ctx.ids = plane_ids; + ctx.verts = plane_verts; + CHECK(s3d_shape_create_mesh(dev, &plane), RES_OK); + CHECK(s3d_mesh_setup_indexed_vertices + (plane, plane_ntris, get_ids, plane_nverts, &vdata, 1, &ctx), RES_OK); + + test_miscellaneous(dev, cube, plane); + test_trace_ray(dev, cube, plane); + + CHECK(s3d_shape_ref_put(cube), RES_OK); + CHECK(s3d_shape_ref_put(plane), RES_OK); CHECK(s3d_device_ref_put(dev), RES_OK); check_memory_allocator(&allocator);