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