#include #include #include "rays.h" #include "runner.h" #include "transformations.h" static bool rays_test_0(const char ** scenario) { *scenario = "Creating and querying a ray"; struct tuple origin = point(1.0f, 2.0f, 3.0f); struct tuple direction = vector(4.0f, 5.0f, 6.0f); struct ray r = ray(origin, direction); return tuple_equal(r.origin, origin) && tuple_equal(r.direction, direction); } static bool rays_test_1(const char ** scenario) { *scenario = "Computing a point from a distance"; struct ray r = ray(point(2.0f, 3.0f, 4.0f), vector(1.0f, 0.0f, 0.0f)); return tuple_equal(ray_position(r, 0.0f), point(2.0f, 3.0f, 4.0f)) && tuple_equal(ray_position(r, 1.0f), point(3.0f, 3.0f, 4.0f)) && tuple_equal(ray_position(r, -1.0f), point(1.0f, 3.0f, 4.0f)) && tuple_equal(ray_position(r, 2.5f), point(4.5f, 3.0f, 4.0f)); } static bool rays_test_2(const char ** scenario) { *scenario = "Translating a ray"; struct ray r = ray(point(1.0f, 2.0f, 3.0f), vector(0.0f, 1.0f, 0.0f)); struct mat4x4 m = translation(3.0f, 4.0f, 5.0f); struct ray r2 = ray_transform(r, &m); return tuple_equal(r2.origin, point(4.0f, 6.0f, 8.0f)) && tuple_equal(r2.direction, vector(0.0f, 1.0f, 0.0f)); } static bool rays_test_3(const char ** scenario) { *scenario = "Scaling a ray"; struct ray r = ray(point(1.0f, 2.0f, 3.0f), vector(0.0f, 1.0f, 0.0f)); struct mat4x4 m = scaling(2.0f, 3.0f, 4.0f); struct ray r2 = ray_transform(r, &m); return tuple_equal(r2.origin, point(2.0f, 6.0f, 12.0f)) && tuple_equal(r2.direction, vector(0.0f, 3.0f, 0.0f)); } test_t rays_tests[] = { rays_test_0, rays_test_1, rays_test_2, rays_test_3, }; RUNNER(rays_tests);