From 7bbe5e843b2ba4e7a9d36cc1b463966ba6f67e81 Mon Sep 17 00:00:00 2001 From: Godzil Date: Mon, 24 Feb 2020 17:25:54 +0000 Subject: [PATCH] Group should work now. --- source/include/shape.h | 2 +- source/intersect.cpp | 1 + source/pattern.cpp | 2 +- source/shapes/shape.cpp | 19 +++++++++++++------ tests/shape_test.cpp | 26 ++++++++++++++++++++++++-- 5 files changed, 40 insertions(+), 10 deletions(-) diff --git a/source/include/shape.h b/source/include/shape.h index 3c19999..65b1ee2 100644 --- a/source/include/shape.h +++ b/source/include/shape.h @@ -58,7 +58,7 @@ public: void updateTransform(); Tuple worldToObject(Tuple point) { return this->inverseTransform * point; }; - Tuple normalToWorld(Tuple normalVector) { return (this->transposedInverseTransform * normalVector).normalise(); }; + Tuple normalToWorld(Tuple normalVector); void setTransform(Matrix transform); void setMaterial(Material material) { this->material = material; }; diff --git a/source/intersect.cpp b/source/intersect.cpp index 26c3274..af01aa5 100644 --- a/source/intersect.cpp +++ b/source/intersect.cpp @@ -24,6 +24,7 @@ Intersect::Intersect() Intersect::~Intersect() { /* Free stuff */ + free(this->list); } void Intersect::add(Intersection i) diff --git a/source/pattern.cpp b/source/pattern.cpp index ceaeafb..74eda2e 100644 --- a/source/pattern.cpp +++ b/source/pattern.cpp @@ -18,7 +18,7 @@ Pattern::Pattern(Colour a, Colour b): a(a), b(b) Colour Pattern::patternAtObject(Shape *object, Tuple worldPoint) { - Tuple objectPoint = object->inverseTransform * worldPoint; + Tuple objectPoint = object->worldToObject(worldPoint); Tuple patternPoint = this->inverseTransform * objectPoint; return this->patternAt(patternPoint); diff --git a/source/shapes/shape.cpp b/source/shapes/shape.cpp index f12f326..dcf73a0 100644 --- a/source/shapes/shape.cpp +++ b/source/shapes/shape.cpp @@ -27,18 +27,25 @@ Intersect Shape::intersect(Ray r) return this->localIntersect(this->invTransform(r)); }; -Tuple Shape::normalAt(Tuple point) +Tuple Shape::normalToWorld(Tuple normalVector) { - Tuple local_point = this->inverseTransform * point; - - Tuple local_normal = this->localNormalAt(local_point); - - Tuple world_normal = this->transposedInverseTransform * local_normal; + Tuple world_normal = this->transposedInverseTransform * normalVector; /* W may get wrong, so hack it. This is perfectly normal as we are using a 4x4 matrix instead of a 3x3 */ world_normal.w = 0; return world_normal.normalise(); +}; + +Tuple Shape::normalAt(Tuple point) +{ + Tuple local_point = this->worldToObject(point); + + Tuple local_normal = this->localNormalAt(local_point); + + Tuple world_normal = this->normalToWorld(local_normal); + + return world_normal; } void Shape::updateTransform() diff --git a/tests/shape_test.cpp b/tests/shape_test.cpp index 1a2a7af..29d2011 100644 --- a/tests/shape_test.cpp +++ b/tests/shape_test.cpp @@ -133,12 +133,34 @@ TEST(TestShape, Converting_a_normal_form_object_to_world_space) s.setTransform(translation(5, 0, 0)); g2.addObject(&s); - Tuple p = s.normalToWorld(Point(sqrt(3)/3, sqrt(3)/3, sqrt(3)/3)); + Tuple p = s.normalToWorld(Vector(sqrt(3)/3, sqrt(3)/3, sqrt(3)/3)); /* Temporary lower the precision */ set_equal_precision(0.0001); - ASSERT_EQ(p, Point(0.2857, 0.4286, -0.8571)); + ASSERT_EQ(p, Vector(0.2857, 0.4286, -0.8571)); + + set_equal_precision(FLT_EPSILON); +} + + +TEST(TestShape, Finding_the_normal_on_a_child_object) +{ + Group g1 = Group(); + g1.setTransform(rotationY(M_PI / 2)); + Group g2 = Group(); + g2.setTransform(scaling(1, 2, 3)); + g1.addObject(&g2); + Sphere s = Sphere(); + s.setTransform(translation(5, 0, 0)); + g2.addObject(&s); + + Tuple p = s.normalAt(Point(1.7321, 1.1547, -5.5774)); + + /* Temporary lower the precision */ + set_equal_precision(0.0001); + + ASSERT_EQ(p, Vector(0.2857, 0.4286, -0.8571)); set_equal_precision(FLT_EPSILON); } \ No newline at end of file