2024-08-05 21:26:31 -05:00

69 lines
1.7 KiB
C

#include <stdbool.h>
#include <stdio.h>
#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);