Adding shadows!

This commit is contained in:
Godzil
2020-02-20 17:46:03 +00:00
parent 5198888df6
commit cf5597ad6d
11 changed files with 145 additions and 24 deletions

View File

@@ -9,9 +9,9 @@
#include <intersect.h>
#include <intersection.h>
#include <sphere.h>
#include <transformation.h>
#include <gtest/gtest.h>
TEST(IntersectTest, Creating_an_intersect_and_do_some_check)
{
Intersect i;
@@ -173,4 +173,20 @@ TEST(IntersectTest, The_hit_when_an_intersection_occurs_on_the_inside)
/* Normal vector would have been (0, 0, 1); but is inverted ! */
ASSERT_EQ(comps.normalVector, Vector(0, 0, -1));
}
TEST(IntersectTest, The_hit_should_offset_the_point)
{
Ray r = Ray(Point(0, 0, -5), Vector(0, 0, 1));
Sphere shape = Sphere();
shape.setTransform(translation(0, 0, 1));
Intersection i = Intersection(5, &shape);
Computation comps = i.prepareComputation(r);
/* Normal vector would have been (0, 0, 1); but is inverted ! */
ASSERT_LT(comps.overHitPoint.z, -getEpsilon() / 2);
ASSERT_GT(comps.hitPoint.z, comps.overHitPoint.z);
}

View File

@@ -86,5 +86,17 @@ TEST(MaterialTest, Lighting_with_the_light_behind_the_surface)
Colour result = m.lighting(light, position, eyev, normalv);
ASSERT_EQ(result, Colour(0.1, 0.1, 0.1));
}
TEST(MaterialTest, Lighting_with_the_surface_in_shadow)
{
Vector eyev = Vector(0, 0, -1);
Vector normalv = Vector(0, 0, -1);
Light light = Light(POINT_LIGHT, Point(0, 0, -10), Colour(1, 1, 1));
bool inShadow = true;
Colour result = m.lighting(light, position, eyev, normalv, inShadow);
ASSERT_EQ(result, Colour(0.1, 0.1, 0.1));
}

View File

@@ -111,4 +111,60 @@ TEST(WorldTest, The_colour_with_an_intersection_behind_the_ray)
Tuple c = w.colourAt(r);
ASSERT_EQ(c, inner->material.colour);
}
}
TEST(WorldTest, There_is_no_shadow_when_nothing_is_collinear_with_point_and_light)
{
World w = DefaultWorld();
Tuple p = Point(0, 10, 0);
ASSERT_FALSE(w.isShadowed(p));
}
TEST(WorldTest, The_shadow_when_an_object_is_between_the_point_and_the_light)
{
World w = DefaultWorld();
Tuple p = Point(10, -10, 10);
ASSERT_TRUE(w.isShadowed(p));
}
TEST(WorldTest, There_is_no_shadow_whne_an_object_is_behing_the_light)
{
World w = DefaultWorld();
Tuple p = Point(-20, 20, -20);
ASSERT_FALSE(w.isShadowed(p));
}
TEST(WorldTest, There_is_no_shadow_when_an_object_is_behing_the_point)
{
World w = DefaultWorld();
Tuple p = Point(-2, 2, -2);
ASSERT_FALSE(w.isShadowed(p));
}
TEST(WorldTest, Shade_hit_is_given_an_intersection_in_shadow)
{
World w = World();
Light l = Light(POINT_LIGHT, Point(0, 0, -10), Colour(1, 1, 1));
w.addLight(&l);
Sphere s1 = Sphere();
w.addObject(&s1);
Sphere s2 = Sphere();
s2.setTransform(translation(0, 0, 10));
w.addObject(&s2);
Ray r = Ray(Point(0, 0, 5), Vector(0, 0, 1));
Intersection i = Intersection(4, &s2);
Computation comps = i.prepareComputation(r);
Tuple c = w.shadeHit(comps);
ASSERT_EQ(c, Colour(0.1, 0.1, 0.1));
};