69 lines
1.7 KiB
C
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);
|