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