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 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:
Msrc/s3d_scene_view.c | 8+++++---
Msrc/test_s3d_trace_ray_instance.c | 37++++++++++++++++++++++++++++++++-----
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);