commit 899597781ef5455d59e4652dfe50c30a24928623
parent cff10c94996d0dbd0203c90a922fb420af489aac
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Wed, 31 Aug 2016 16:13:01 +0200
Ensure that the filter input parameters are expressed in world space
Diffstat:
2 files changed, 37 insertions(+), 8 deletions(-)
diff --git a/src/s3d_scene_view.c b/src/s3d_scene_view.c
@@ -44,6 +44,8 @@
struct ray_extended : public RTCRay {
struct s3d_scene_view* scnview;
+ float ws_org[3]; /* World space ray origin */
+ float ws_dir[3]; /* World space ray direction */
void* data; /* User defined data */
};
@@ -203,7 +205,7 @@ filter_wrapper(void* user_ptr, RTCRay& ray)
struct ray_extended* ray_ex = static_cast<struct ray_extended*>(&ray);
hit_setup(ray_ex->scnview, &ray, &hit);
- if(filter->func(&hit, ray_ex->org, ray_ex->dir, ray_ex->data, filter->data)) {
+ if(filter->func(&hit, ray_ex->ws_org, ray_ex->ws_dir, ray_ex->data, filter->data)) {
/* Discard the intersection */
ray.geomID = RTC_INVALID_GEOMETRY_ID;
}
@@ -999,8 +1001,8 @@ s3d_scene_view_trace_ray
return RES_OK;
}
- f3_set(ray_ex.org, org);
- f3_set(ray_ex.dir, dir);
+ f3_set(ray_ex.org, f3_set(ray_ex.ws_org, org));
+ f3_set(ray_ex.dir, f3_set(ray_ex.ws_dir, dir));
ray_ex.tnear = range[0];
ray_ex.tfar = range[1];
ray_ex.geomID = RTC_INVALID_GEOMETRY_ID;
diff --git a/src/test_s3d_trace_ray_instance.c b/src/test_s3d_trace_ray_instance.c
@@ -47,6 +47,30 @@ static const unsigned quad_nverts = sizeof(quad_verts)/sizeof(float[3]);
static const unsigned quad_ids[] = { 0, 1, 3, 3, 1, 2 };
static const unsigned quad_ntris = sizeof(quad_ids)/sizeof(unsigned[3]);
+struct ray {
+ float org[3];
+ float dir[3];
+};
+
+static int
+filter(const struct s3d_hit* hit,
+ const float ray_org[3],
+ const float ray_dir[3],
+ void* ray_data,
+ void* filter_data)
+{
+ struct ray* ray = ray_data;
+
+ NCHECK(hit, NULL);
+ NCHECK(ray_org, NULL);
+ NCHECK(ray_dir, NULL);
+ NCHECK(ray_data, NULL);
+ CHECK(filter_data, NULL);
+ CHECK(f3_eq(ray_org, ray->org), 1);
+ CHECK(f3_eq(ray_dir, ray->dir), 1);
+ return 0;
+}
+
static void
quad_get_ids(const unsigned itri, unsigned ids[3], void* data)
{
@@ -75,6 +99,7 @@ int
main(int argc, char** argv)
{
struct mem_allocator allocator;
+ struct ray ray;
struct s3d_attrib attr;
struct s3d_device* dev;
struct s3d_hit hit[2];
@@ -86,7 +111,6 @@ main(int argc, char** argv)
unsigned quad_id;
unsigned quad_inst_id;
float transform[12];
- float org[3];
float dir[3];
float range[2];
(void)argc, (void)argv;
@@ -101,6 +125,7 @@ main(int argc, char** argv)
vdata.usage = S3D_POSITION;
vdata.get = quad_get_pos;
CHECK(s3d_shape_create_mesh(dev, &quad), RES_OK);
+ CHECK(s3d_mesh_set_hit_filter_function(quad, filter, NULL), RES_OK);
CHECK(s3d_mesh_setup_indexed_vertices
(quad, quad_ntris, quad_get_ids, quad_nverts, &vdata, 1, NULL), RES_OK);
@@ -121,11 +146,13 @@ main(int argc, char** argv)
CHECK(s3d_shape_get_id(quad, &quad_id), RES_OK);
CHECK(s3d_shape_get_id(quad_inst, &quad_inst_id), RES_OK);
- f3(org, 0.f, 0.5f, -1.f);
- f3(dir, 0.f, 0.f, 1.f);
+ f3(ray.org, 0.f, 0.5f, -1.f);
+ f3(ray.dir, 0.f, 0.f, 1.f);
f2(range, 0.f, FLT_MAX);
- CHECK(s3d_scene_view_trace_ray(view[0], org, dir, range, NULL, &hit[0]), RES_OK);
- CHECK(s3d_scene_view_trace_ray(view[1], org, dir, range, NULL, &hit[1]), RES_OK);
+ CHECK(s3d_scene_view_trace_ray
+ (view[0], ray.org, ray.dir, range, &ray, &hit[0]), RES_OK);
+ CHECK(s3d_scene_view_trace_ray
+ (view[1], ray.org, ray.dir, range, &ray, &hit[1]), RES_OK);
CHECK(hit[0].prim.prim_id, 0);
CHECK(hit[1].prim.prim_id, 1);