Shape is now an abstract class and can't be instanciated.
Change derived shape to only deal with local calculation they don't need anymore to deal with how they've been transformed.
This commit is contained in:
@@ -9,6 +9,7 @@
|
||||
#include <ray.h>
|
||||
#include <transformation.h>
|
||||
#include <shape.h>
|
||||
#include <testshape.h>
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
|
||||
@@ -38,7 +39,7 @@ TEST(RayTest, Translating_a_ray)
|
||||
Ray r = Ray(Point(1, 2, 3), Vector(0, 1, 0));
|
||||
|
||||
Matrix m = translation(3, 4, 5);
|
||||
Shape o = Shape();
|
||||
TestShape o = TestShape();
|
||||
|
||||
o.setTransform(m);
|
||||
|
||||
@@ -53,7 +54,7 @@ TEST(RayTest, Scaling_a_ray)
|
||||
Ray r = Ray(Point(1, 2, 3), Vector(0, 1, 0));
|
||||
|
||||
Matrix m = scaling(2, 3, 4);
|
||||
Shape o = Shape();
|
||||
TestShape o = TestShape();
|
||||
|
||||
o.setTransform(m);
|
||||
|
||||
|
||||
@@ -7,19 +7,20 @@
|
||||
*
|
||||
*/
|
||||
#include <shape.h>
|
||||
#include <testshape.h>
|
||||
#include <matrix.h>
|
||||
#include <transformation.h>
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
TEST(ShapeTest, The_default_transformation)
|
||||
{
|
||||
Shape s = Shape();
|
||||
TestShape s = TestShape();
|
||||
ASSERT_EQ(s.transformMatrix, Matrix4().identity());
|
||||
}
|
||||
|
||||
TEST(ShapeTest, Assigning_a_transformation)
|
||||
{
|
||||
Shape s = Shape();
|
||||
TestShape s = TestShape();
|
||||
|
||||
s.setTransform(translation(2, 3, 4));
|
||||
|
||||
@@ -28,18 +29,70 @@ TEST(ShapeTest, Assigning_a_transformation)
|
||||
|
||||
TEST(ShapeTest, The_default_material)
|
||||
{
|
||||
Shape s = Shape();
|
||||
TestShape s = TestShape();
|
||||
|
||||
ASSERT_EQ(s.material, Material());
|
||||
}
|
||||
|
||||
TEST(ShapeTest, Assigning_a_material)
|
||||
{
|
||||
Shape s = Shape();
|
||||
TestShape s = TestShape();
|
||||
Material m = Material();
|
||||
m.ambient = 1;
|
||||
|
||||
s.material = m;
|
||||
|
||||
ASSERT_EQ(s.material, m);
|
||||
}
|
||||
|
||||
TEST(ShapeTest, Intersecting_a_scaled_shape_with_a_ray)
|
||||
{
|
||||
Ray r = Ray(Point(0, 0, -5), Vector(0, 0, 1));
|
||||
TestShape s = TestShape();
|
||||
|
||||
s.setTransform(scaling(2, 2, 2));
|
||||
Intersect xs = s.intersect(r);
|
||||
|
||||
ASSERT_EQ(s.localRay.origin, Point(0, 0, -2.5));
|
||||
ASSERT_EQ(s.localRay.direction, Vector(0, 0, 0.5));
|
||||
}
|
||||
|
||||
TEST(ShapeTest, Intersecting_a_translated_shape_with_a_ray)
|
||||
{
|
||||
Ray r = Ray(Point(0, 0, -5), Vector(0, 0, 1));
|
||||
TestShape s = TestShape();
|
||||
|
||||
s.setTransform(translation(5, 0, 0));
|
||||
Intersect xs = s.intersect(r);
|
||||
|
||||
ASSERT_EQ(s.localRay.origin, Point(-5, 0, -5));
|
||||
ASSERT_EQ(s.localRay.direction, Vector(0, 0, 1));
|
||||
}
|
||||
|
||||
TEST(ShapeTest, Computing_the_normal_on_a_translated_shape)
|
||||
{
|
||||
TestShape s = TestShape();
|
||||
s.setTransform(translation(0, 1, 0));
|
||||
Tuple n = s.normalAt(Point(0, 1.70711, -0.70711));
|
||||
|
||||
/* Temporary lower the precision */
|
||||
set_equal_precision(0.00001);
|
||||
|
||||
ASSERT_EQ(n, Vector(0, 0.70711, -0.70711));
|
||||
|
||||
set_equal_precision(FLT_EPSILON);
|
||||
}
|
||||
|
||||
TEST(ShapeTest, Computing_the_normal_on_a_tranformed_shape)
|
||||
{
|
||||
TestShape s = TestShape();
|
||||
s.setTransform(scaling(1, 0.5, 1) * rotationZ(M_PI / 5));
|
||||
Tuple n = s.normalAt(Point(0, sqrt(2)/2, -sqrt(2)/2));
|
||||
|
||||
/* Temporary lower the precision */
|
||||
set_equal_precision(0.00001);
|
||||
|
||||
ASSERT_EQ(n, Vector(0, 0.97014, -0.24254));
|
||||
|
||||
set_equal_precision(FLT_EPSILON);
|
||||
}
|
||||
Reference in New Issue
Block a user