[WIP] Refraction Wip
This commit is contained in:
@@ -256,7 +256,7 @@ SCENARIO("The reflected color at the maximum recursive depth", "[features/world.
|
||||
AND_GIVEN("shape is added to w")
|
||||
{
|
||||
w.add_object(&shape);
|
||||
AND_GIVEN("ray(point(0, 0, -3), vector(0, -sqrt(2) / 2, sqrt(2) / 2)")
|
||||
AND_GIVEN("r <- ray(point(0, 0, -3), vector(0, -sqrt(2) / 2, sqrt(2) / 2)")
|
||||
{
|
||||
Ray r(Tuple::Point(0, 0, -3), Tuple::Vector(0, -sqrt(2) / 2, sqrt(2) / 2));
|
||||
AND_GIVEN("i <- intersection(sqrt(2), shape)")
|
||||
@@ -320,3 +320,93 @@ SCENARIO("A helper for producing a sphere with a glassy material", "[features/sp
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
struct TestData
|
||||
{
|
||||
Intersection i;
|
||||
double n1;
|
||||
double n2;
|
||||
};
|
||||
|
||||
void fill_test_various(TestData *a_test, const Intersection &an_in, double a_n1, double a_n2)
|
||||
{
|
||||
a_test->i = an_in;
|
||||
a_test->n1 = a_n1;
|
||||
a_test->n2 = a_n2;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
SCENARIO("Finding n1 and n2 at various intersections", "[features/intersections.feature]")
|
||||
{
|
||||
|
||||
TestData the_tests[6];
|
||||
|
||||
GIVEN("A <- glass_sphere() with:")
|
||||
// | transform | scaling(2, 2, 2) |
|
||||
// | material.refractive_index | 1.5 |
|
||||
{
|
||||
Sphere A = Sphere::Glass();
|
||||
A.set_transform(Matrix::scaling(2, 2, 2));
|
||||
A.material().set_refractive_index(1.5);
|
||||
GIVEN("B <- glass_sphere() with:")
|
||||
// | transform | translation(0, 0, -0.25) |
|
||||
// | material.refractive_index | 2.0 |
|
||||
{
|
||||
Sphere B = Sphere::Glass();
|
||||
B.set_transform(Matrix::translation(0, 0, -0.25));
|
||||
B.material().set_refractive_index(2.0);
|
||||
GIVEN("C <- glass_sphere() with:")
|
||||
// | transform | translation(0, 0, 0.25) |
|
||||
// | material.refractive_index | 2.5 |
|
||||
{
|
||||
Sphere C = Sphere::Glass();
|
||||
C.set_transform(Matrix::translation(0, 0, 0.25));
|
||||
C.material().set_refractive_index(2.5);
|
||||
AND_GIVEN("r <- ray(point(0, 0, -4), vector(0, 0, 1)")
|
||||
{
|
||||
Ray r(Tuple::Point(0, 0, -4), Tuple::Vector(0, 0, 1));
|
||||
|
||||
AND_GIVEN("xs <- intersections(2:A, 2.75:B, 3.25:C, 4.75:B, 5.25:C, 6:A)")
|
||||
{
|
||||
// Examples:
|
||||
// | index | n1 | n2 |
|
||||
// | 0 |1.0 |1.5 |
|
||||
// | 1 |1.5 |2.0 |
|
||||
// | 2 |2.0 |2.5 |
|
||||
// | 3 |2.5 |2.5 |
|
||||
// | 4 |2.5 |1.5 |
|
||||
// | 5 |1.5 |1.0 |
|
||||
fill_test_various(&the_tests[0], Intersection(2.0, &A), 1.0, 1.5);
|
||||
fill_test_various(&the_tests[1], Intersection(2.75, &B), 1.5, 2.0);
|
||||
fill_test_various(&the_tests[2], Intersection(3.25, &C), 2.0, 2.5);
|
||||
fill_test_various(&the_tests[3], Intersection(4.75, &B), 2.5, 2.5);
|
||||
fill_test_various(&the_tests[4], Intersection(5.25, &C), 2.5, 1.5);
|
||||
fill_test_various(&the_tests[5], Intersection(6.0, &A), 1.5, 1.0);
|
||||
|
||||
Intersections xs = Intersections({the_tests[0].i, the_tests[1].i, the_tests[2].i, the_tests[3].i,
|
||||
the_tests[4].i, the_tests[5].i});
|
||||
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
WHEN("comps <- prepare_computations(xs[index], r, xs)")
|
||||
{
|
||||
IntersectionData comps = the_tests[i].i.prepare_computations(r, &xs);
|
||||
THEN("comps.n1 = <n1>")
|
||||
{
|
||||
REQUIRE(comps.n1() == the_tests[i].n1);
|
||||
}
|
||||
AND_THEN("comps.n2 = <n2>")
|
||||
{
|
||||
REQUIRE(comps.n2() == the_tests[i].n2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user