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