From 107b612130e4be147207eddba23f8135c25c66d0 Mon Sep 17 00:00:00 2001 From: Godzil Date: Wed, 4 Mar 2020 13:35:09 +0000 Subject: [PATCH] Added planar mapping --- README.md | 5 ++- output/uvmap_checkeredplane.png | Bin 0 -> 11630 bytes source/pattern/texturemap.h | 8 +++++ tests/CMakeLists.txt | 4 +++ tests/pattern_test.cpp | 36 ++++++++++++++++++++++ tests/uvmap_checkeredplane.cpp | 53 ++++++++++++++++++++++++++++++++ 6 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 output/uvmap_checkeredplane.png create mode 100644 tests/uvmap_checkeredplane.cpp diff --git a/README.md b/README.md index 758ec2c..6923803 100644 --- a/README.md +++ b/README.md @@ -84,4 +84,7 @@ With jitter: **Bonus chapter - Texture mapping** Spherical mapping: -![Spherical mapping](output/uvmap_checkeredsphere.png) \ No newline at end of file +![Spherical mapping](output/uvmap_checkeredsphere.png) + +Planar mapping: +![Planar mapping](output/uvmap_checkeredplane.png) \ No newline at end of file diff --git a/output/uvmap_checkeredplane.png b/output/uvmap_checkeredplane.png new file mode 100644 index 0000000000000000000000000000000000000000..2df528455c26e3320b27d51a1b682e13c19e1b79 GIT binary patch literal 11630 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 literal 0 HcmV?d00001 diff --git a/source/pattern/texturemap.h b/source/pattern/texturemap.h index 832d1ca..0daf3ae 100644 --- a/source/pattern/texturemap.h +++ b/source/pattern/texturemap.h @@ -66,6 +66,11 @@ public: v = 1 - phi / M_PI; } + static void planarMap(Tuple point, double &u, double &v) { + u = fmod(point.x, 1); + v = fmod(point.z, 1); + } + Colour patternAt(Tuple point) { double u,v; @@ -75,6 +80,9 @@ public: case SPHERICAL_MAP: this->sphericalMap(point, u, v); break; + case PLANAR_MAP: + this->planarMap(point, u, v); + break; } return this->pattern->uvPatternAt(u, v); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 5a92534..e080d50 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -77,6 +77,9 @@ target_sources(christmasball_render PRIVATE christmasball_render.cpp) add_executable(uvmap_checkeredsphere) target_sources(uvmap_checkeredsphere PRIVATE uvmap_checkeredsphere.cpp) +add_executable(uvmap_checkeredplane) +target_sources(uvmap_checkeredplane PRIVATE uvmap_checkeredplane.cpp) + add_test(NAME Chapter05_Test COMMAND $) add_test(NAME Chapter06_Test COMMAND $) add_test(NAME Chapter07_Test COMMAND $) @@ -91,6 +94,7 @@ add_test(NAME Chapter13_ConeBonus COMMAND $) add_test(NAME Chapter14_Test COMMAND $) add_test(NAME AreaLight_Test COMMAND $) add_test(NAME UVMap_CheckeredSphere COMMAND $) +add_test(NAME UVMap_CheckeredPlane COMMAND $) add_test(NAME Test_Rendering COMMAND $) add_test(NAME Triangle_RenderTest COMMAND $) add_test(NAME ChristmasBall_Rendering COMMAND $) diff --git a/tests/pattern_test.cpp b/tests/pattern_test.cpp index 9f9d529..3878ca2 100644 --- a/tests/pattern_test.cpp +++ b/tests/pattern_test.cpp @@ -351,4 +351,40 @@ TEST(PatternTest, Using_a_texture_map_with_a_spherical_map) Colour ret = tm.patternAt(testList[i]); EXPECT_EQ(ret, testResults[i]); } +} + +TEST(PatternTest, Using_a_planar_mapping_on_a_3d_point) +{ + Point testList[] = { + Point(0.25, 0.0, 0.5), + Point(0.25, 0.0, -0.25), + Point(0.25, 0.5, -0.25), + Point(1.25, 0.0, 0.5), + Point(0.25, 0.0, -1.75), + Point(1.00, 0.0, -1.0), + Point(0.00, 0.0, 0.0), + }; + + double testResults[][2] { + {0.25, 0.50}, + {0.25, 0.75}, + {0.25, 0.75}, + {0.25, 0.50}, + {0.25, 0.25}, + {0.00, 0.00}, + {0.00, 0.00}, + }; + + int testCount = sizeof(testList)/sizeof((testList)[0]); + int i; + + TextureMap tm = TextureMap(PLANAR_MAP, nullptr); + + for(i = 0; i < testCount; i++) + { + double u, v; + tm.planarMap(testList[i], u, v); + ASSERT_TRUE(double_equal(u, testResults[i][0])); + ASSERT_TRUE(double_equal(v, testResults[i][1])); + } } \ No newline at end of file diff --git a/tests/uvmap_checkeredplane.cpp b/tests/uvmap_checkeredplane.cpp new file mode 100644 index 0000000..ee2b356 --- /dev/null +++ b/tests/uvmap_checkeredplane.cpp @@ -0,0 +1,53 @@ +/* + * DoRayMe - a quick and dirty Raytracer + * Render test for chapter 10 + * + * Created by Manoƫl Trapier + * Copyright (c) 2020 986-Studio. + * + */ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include + +int main() +{ + World w = World(); + + Light light = Light(POINT_LIGHT, Point(-10, 10, -10), Colour(1, 1, 1)); + w.addLight(&light); + + Plane sp = Plane(); + UVCheckers checkers = UVCheckers(2, 2, Colour(0, 0.5, 0), Colour(1, 1, 1)); + TextureMap tm = TextureMap(PLANAR_MAP, &checkers); + sp.material.pattern = &tm; + sp.material.ambient = 0.1; + sp.material.specular = 0; + sp.material.diffuse = 0.9; + + w.addObject(&sp); + + /* Set the camera */ + Camera camera = Camera(400, 400, 0.5); + camera.setTransform(viewTransform(Point(1, 2, -5), + Point(0, 0, 0), + Vector(0, 1, 0))); + + /* Now render it */ + Canvas image = camera.render(w); + + image.SaveAsPNG("uvmap_checkeredplane.png"); + + return 0; +} \ No newline at end of file