diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 918d133..420bba0 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -8,7 +8,8 @@ endif() # First most is build as a library add_library(rayonnement STATIC) -file(GLOB RAY_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/*.h ${CMAKE_CURRENT_SOURCE_DIR}/pattern/*.h) +file(GLOB RAY_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/*.h ${CMAKE_CURRENT_SOURCE_DIR}/pattern/*.h + ${CMAKE_CURRENT_SOURCE_DIR}/uvpattern/*.h) file(GLOB RAY_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/shapes/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/worldbuilder/*.cpp) diff --git a/source/include/uv_pattern.h b/source/include/uv_pattern.h new file mode 100644 index 0000000..1ed60fa --- /dev/null +++ b/source/include/uv_pattern.h @@ -0,0 +1,28 @@ +/* + * DoRayMe - a quick and dirty Raytracer + * UV Pattern header + * + * Created by Manoël Trapier + * Copyright (c) 2020 986-Studio. + * + */ +#ifndef DORAYME_UV_PATTERN_H +#define DORAYME_UV_PATTERN_H + +#include + +class UVPattern +{ +public: + Colour a; + Colour b; + double width; + double height; + + UVPattern(double width, double height, Colour a, Colour b) : a(a), b(b), + width(width), height(height) {}; + + virtual Colour uvPatternAt(double u, double v) = 0; +}; + +#endif /* DORAYME_UV_PATTERN_H */ diff --git a/source/uvpattern/uv_checkers.h b/source/uvpattern/uv_checkers.h new file mode 100644 index 0000000..739d387 --- /dev/null +++ b/source/uvpattern/uv_checkers.h @@ -0,0 +1,32 @@ +/* + * DoRayMe - a quick and dirty Raytracer + * UV Checkers header + * + * Created by Manoël Trapier + * Copyright (c) 2020 986-Studio. + * + */ +#ifndef DORAYME_UV_CHECKERS_H +#define DORAYME_UV_CHECKERS_H + +#include +#include + +class UVCheckers : public UVPattern +{ +public: + UVCheckers(double width, double height, Colour a, Colour b) : UVPattern(width, height, a, b) {}; + + Colour uvPatternAt(double u, double v) { + double u2 = floor(u * this->width); + double v2 = floor(v * this->width); + + if (fmod((u2 + v2), 2) == 0) + { + return this->a; + } + return this->b; + }; +}; + +#endif /* DORAYME_UV_CHECKERS_H */ diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index be6f850..a2ef76b 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -10,7 +10,7 @@ set(TESTS_SRC math_test.cpp tuple_test.cpp colour_test.cpp canvas_test.cpp matri add_executable(testMyRays) target_include_directories(testMyRays PUBLIC ${gtest_SOURCE_DIR}/include ${gtest_SOURCE_DIR}) -target_include_directories(testMyRays PUBLIC ../source/include) +target_include_directories(testMyRays PUBLIC ../source/include ../source/patter ../source/uvpattern) target_sources(testMyRays PRIVATE ${TESTS_SRC}) target_link_libraries(testMyRays gtest gtest_main rayonnement Threads::Threads) diff --git a/tests/pattern_test.cpp b/tests/pattern_test.cpp index 57e6315..e84eb60 100644 --- a/tests/pattern_test.cpp +++ b/tests/pattern_test.cpp @@ -18,6 +18,8 @@ #include #include #include +#include +#include #ifdef ENABLE_LUA_SUPPORT extern "C" { @@ -260,4 +262,15 @@ TEST(PatternTest, Simple_test_of_a_lua_pattern) lua_close(L); } -#endif \ No newline at end of file +#endif + +TEST(PatternTest, Checkers_pattern_in_2D) +{ + UVCheckers checkers = UVCheckers(2, 2, black, white); + + ASSERT_EQ(checkers.uvPatternAt(0.0, 0.0), black); + ASSERT_EQ(checkers.uvPatternAt(0.5, 0.0), white); + ASSERT_EQ(checkers.uvPatternAt(0.0, 0.5), white); + ASSERT_EQ(checkers.uvPatternAt(0.5, 0.5), black); + ASSERT_EQ(checkers.uvPatternAt(1.0, 1.0), black); +} \ No newline at end of file