From 7209244f488da1bd82112f45526e697ad6abb44b Mon Sep 17 00:00:00 2001 From: Godzil Date: Wed, 4 Mar 2020 16:16:35 +0000 Subject: [PATCH] Add cylindrical mapping! --- README.md | 5 ++- output/uvmap_checkeredcylinder.png | Bin 0 -> 7815 bytes source/pattern/texturemap.h | 17 ++++++++- tests/CMakeLists.txt | 4 ++ tests/pattern_test.cpp | 42 +++++++++++++++++++++ tests/uvmap_checkeredcylinder.cpp | 58 +++++++++++++++++++++++++++++ 6 files changed, 123 insertions(+), 3 deletions(-) create mode 100644 output/uvmap_checkeredcylinder.png create mode 100644 tests/uvmap_checkeredcylinder.cpp diff --git a/README.md b/README.md index 6923803..d076a69 100644 --- a/README.md +++ b/README.md @@ -87,4 +87,7 @@ Spherical mapping: ![Spherical mapping](output/uvmap_checkeredsphere.png) Planar mapping: -![Planar mapping](output/uvmap_checkeredplane.png) \ No newline at end of file +![Planar mapping](output/uvmap_checkeredplane.png) + +Cylindrical mapping: +![Cylindrical mapping](output/uvmap_checkeredcylinder.png) \ No newline at end of file diff --git a/output/uvmap_checkeredcylinder.png b/output/uvmap_checkeredcylinder.png new file mode 100644 index 0000000000000000000000000000000000000000..8bc0836ac1b74d6ed6e3bf98173d99cb427b170f GIT binary patch literal 7815 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 Z$Y58L`kplanarMap(point, u, v); break; + + case CYLINDRICAL_MAP: + this->cylindricalMap(point, u, v); + break; } return this->pattern->uvPatternAt(u, v); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index e080d50..2e6222f 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -80,6 +80,9 @@ target_sources(uvmap_checkeredsphere PRIVATE uvmap_checkeredsphere.cpp) add_executable(uvmap_checkeredplane) target_sources(uvmap_checkeredplane PRIVATE uvmap_checkeredplane.cpp) +add_executable(uvmap_checkeredcylinder) +target_sources(uvmap_checkeredcylinder PRIVATE uvmap_checkeredcylinder.cpp) + add_test(NAME Chapter05_Test COMMAND $) add_test(NAME Chapter06_Test COMMAND $) add_test(NAME Chapter07_Test COMMAND $) @@ -95,6 +98,7 @@ 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 UVMap_CheckeredCylinder 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 3878ca2..5044c5e 100644 --- a/tests/pattern_test.cpp +++ b/tests/pattern_test.cpp @@ -387,4 +387,46 @@ TEST(PatternTest, Using_a_planar_mapping_on_a_3d_point) ASSERT_TRUE(double_equal(u, testResults[i][0])); ASSERT_TRUE(double_equal(v, testResults[i][1])); } +} + +TEST(PatternTest, Using_a_cylindrical_mapping_on_a_3d_point) +{ + Point testList[] = { + Point( 0.00000, 0.00, -1.00000), + Point( 0.00000, 0.50, -1.00000), + Point( 0.00000, 1.00, -1.00000), + Point( 0.70711, 0.50, -0.70711), + Point( 1.00000, 0.50, -0.00000), + Point( 0.70711, 0.50, 0.70711), + Point( 0.00000, -0.25, 1.00000), + Point(-0.70711, 0.50, 0.70711), + Point(-1.00000, 1.25, 0.00000), + Point(-0.70711, 0.50, -0.70711), + }; + + double testResults[][2] { + {0.000, 0.00}, + {0.000, 0.50}, + {0.000, 0.00}, + {0.125, 0.50}, + {0.250, 0.50}, + {0.375, 0.50}, + {0.500, 0.75}, + {0.625, 0.50}, + {0.750, 0.25}, + {0.875, 0.50}, + }; + + int testCount = sizeof(testList)/sizeof((testList)[0]); + int i; + + TextureMap tm = TextureMap(CYLINDRICAL_MAP, nullptr); + + for(i = 0; i < testCount; i++) + { + double u, v; + tm.cylindricalMap(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_checkeredcylinder.cpp b/tests/uvmap_checkeredcylinder.cpp new file mode 100644 index 0000000..c88d998 --- /dev/null +++ b/tests/uvmap_checkeredcylinder.cpp @@ -0,0 +1,58 @@ +/* + * 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 + +#include + +int main() +{ + World w = World(); + + Light light = Light(POINT_LIGHT, Point(-10, 10, -10), Colour(1, 1, 1)); + w.addLight(&light); + + Cylinder sp = Cylinder(); + sp.minCap = 0; + sp.maxCap = 1; + sp.setTransform(scaling(1, 3.1415, 1) * translation(0, -0.5, 0)); + UVCheckers checkers = UVCheckers(16, 8, Colour(0, 0.5, 0), Colour(1, 1, 1)); + TextureMap tm = TextureMap(CYLINDRICAL_MAP, &checkers); + sp.material.pattern = &tm; + sp.material.ambient = 0.1; + sp.material.specular = 0.6; + sp.material.shininess = 15; + sp.material.diffuse = 0.8; + + w.addObject(&sp); + + /* Set the camera */ + Camera camera = Camera(400, 400, 0.5); + camera.setTransform(viewTransform(Point(0, 0, -10), + Point(0, 0, 0), + Vector(0, 1, 0))); + + /* Now render it */ + Canvas image = camera.render(w); + + image.SaveAsPNG("uvmap_checkeredcylinder.png"); + + return 0; +} \ No newline at end of file