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 33e91495fd3f5db1d379b5944a6b90be0c4b15dd
parent b97c95bbfbb089052a2e3ac65083d49fcf1528ef
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Tue, 16 Jun 2015 15:44:20 +0200

Fix the hit normal attribute

The flip_surface flag of the intersected shapes was not taken into
account to fill the hit normal.

Diffstat:
Msrc/s3d_scene.c | 6++++++
1 file changed, 6 insertions(+), 0 deletions(-)

diff --git a/src/s3d_scene.c b/src/s3d_scene.c @@ -628,6 +628,7 @@ s3d_scene_trace_ray *hit = S3D_HIT_NULL; } else { float w; + char flip_surface = 0; f3_set(hit->normal, ray.Ng); hit->distance = ray.tfar; @@ -652,6 +653,7 @@ s3d_scene_trace_ray hit->prim.mesh__ = darray_mesh_data_get(&scn->meshes)[ray.geomID]; hit->prim.inst__ = NULL; hit->prim.iprim__ = ray.primID; + } else { /* The hit shape is instantiated */ /* Retrieve the hit instance */ struct instance* instance; @@ -660,7 +662,11 @@ s3d_scene_trace_ray hit->prim.mesh__ = scene_get_mesh(instance->scene, ray.geomID); hit->prim.inst__ = instance; hit->prim.iprim__ = ray.primID; + flip_surface = instance->flip_surface; } + flip_surface ^= ((struct mesh*)hit->prim.mesh__)->flip_surface; + if(flip_surface) + f3_minus(hit->normal, hit->normal); } return RES_OK; }