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 cff10c94996d0dbd0203c90a922fb420af489aac
parent 49d6eabe7f123ff0c0b1df9e8b8621a83abfae45
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Wed, 31 Aug 2016 15:57:21 +0200

Ensure that the hit attribs are expressed in world space

Diffstat:
Msrc/s3d_scene_view.c | 3+++
Msrc/test_s3d_trace_ray_instance.c | 11+++++++++--
2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/src/s3d_scene_view.c b/src/s3d_scene_view.c @@ -182,6 +182,9 @@ hit_setup(struct s3d_scene_view* scnview, const RTCRay* ray, struct s3d_hit* hit flip_surface = geom_inst->flip_surface; ASSERT(hit->prim.inst__); ASSERT(((struct geometry*)hit->prim.inst__)->type == GEOM_INSTANCE); + + /* Transform the normal in world space */ + f33_mulf3(hit->normal, geom_inst->data.instance->transform, hit->normal); } ASSERT(hit->prim.mesh__); ASSERT(((struct geometry*)hit->prim.mesh__)->type == GEOM_MESH); diff --git a/src/test_s3d_trace_ray_instance.c b/src/test_s3d_trace_ray_instance.c @@ -44,7 +44,7 @@ static const float quad_verts[] = { 1.f, -1.f, 0.f }; static const unsigned quad_nverts = sizeof(quad_verts)/sizeof(float[3]); -static const unsigned quad_ids[] = { 0, 1, 3, 3, 2, 1 }; +static const unsigned quad_ids[] = { 0, 1, 3, 3, 1, 2 }; static const unsigned quad_ntris = sizeof(quad_ids)/sizeof(unsigned[3]); static void @@ -75,6 +75,7 @@ int main(int argc, char** argv) { struct mem_allocator allocator; + struct s3d_attrib attr; struct s3d_device* dev; struct s3d_hit hit[2]; struct s3d_scene* scn; @@ -133,9 +134,15 @@ main(int argc, char** argv) CHECK(hit[0].prim.inst_id, quad_inst_id); CHECK(hit[1].prim.inst_id, S3D_INVALID_ID); CHECK(f3_eq_eps(hit[0].normal, f3_minus(dir, hit[1].normal), 1.e-6f), 1); - CHECK(f2_eq_eps(hit[0].uv, hit[1].uv, 1.e-6f), 1); CHECK(eq_epsf(hit[0].distance, hit[1].distance, 1.e-6f), 1); + CHECK(s3d_primitive_get_attrib + (&hit[0].prim, S3D_GEOMETRY_NORMAL, hit[0].uv, &attr), RES_OK); + CHECK(f3_eq_eps(hit[0].normal, attr.value, 1.e-6f), 1); + CHECK(s3d_primitive_get_attrib + (&hit[1].prim, S3D_GEOMETRY_NORMAL, hit[1].uv, &attr), RES_OK); + CHECK(f3_eq_eps(hit[1].normal, attr.value, 1.e-6f), 1); + CHECK(s3d_scene_view_ref_put(view[0]), RES_OK); CHECK(s3d_scene_view_ref_put(view[1]), RES_OK);