commit 72f1dc3257b802d92be9670f0439ef78c1c43594
parent 21d12e901b3176357819bb80633e2ae39865506c
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Wed, 31 Aug 2016 15:27:22 +0200
Add a trace ray instance test
Ensure that the returned normal attribute is expressed in world space
Diffstat:
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/src/test_s3d_trace_ray_instance.c b/src/test_s3d_trace_ray_instance.c
@@ -35,6 +35,7 @@
#include <rsys/float2.h>
#include <rsys/float3.h>
+#include <rsys/float33.h>
static const float quad_verts[] = {
-1.f, -1.f, 0.f,
@@ -83,6 +84,7 @@ main(int argc, char** argv)
struct s3d_vertex_data vdata;
unsigned quad_id;
unsigned quad_inst_id;
+ float transform[12];
float org[3];
float dir[3];
float range[2];
@@ -91,6 +93,9 @@ main(int argc, char** argv)
mem_init_proxy_allocator(&allocator, &mem_default_allocator);
CHECK(s3d_device_create(NULL, &allocator, 1, &dev), RES_OK);
+ f33_rotation_pitch(transform, (float)PI);
+ f3_splat(transform+9, 0);
+
vdata.type = S3D_FLOAT3;
vdata.usage = S3D_POSITION;
vdata.get = quad_get_pos;
@@ -101,6 +106,7 @@ main(int argc, char** argv)
CHECK(s3d_scene_create(dev, &scn), RES_OK);
CHECK(s3d_scene_attach_shape(scn, quad), RES_OK);
CHECK(s3d_scene_instantiate(scn, &quad_inst), RES_OK);
+ CHECK(s3d_instance_set_transform(quad_inst, transform), RES_OK);
CHECK(s3d_scene_ref_put(scn), RES_OK);
CHECK(s3d_scene_create(dev, &scn), RES_OK);
@@ -120,13 +126,13 @@ main(int argc, char** argv)
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(hit[0].prim.prim_id, 1);
+ CHECK(hit[0].prim.prim_id, 0);
CHECK(hit[1].prim.prim_id, 1);
CHECK(hit[0].prim.geom_id, quad_id);
CHECK(hit[1].prim.geom_id, quad_id);
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, hit[1].normal, 1.e-6f), 1);
+ 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);