pattern_test.cpp 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. /*
  2. * DoRayMe - a quick and dirty Raytracer
  3. * Pattern unit tests
  4. *
  5. * Created by Manoël Trapier
  6. * Copyright (c) 2020 986-Studio.
  7. *
  8. */
  9. #include <pattern.h>
  10. #include <strippattern.h>
  11. #include <gradientpattern.h>
  12. #include <ringpattern.h>
  13. #include <checkerspattern.h>
  14. #include <testpattern.h>
  15. #include <transformation.h>
  16. #include <colour.h>
  17. #include <sphere.h>
  18. #include <gtest/gtest.h>
  19. #include <material.h>
  20. Colour black = Colour(0, 0, 0);
  21. Colour white = Colour(1, 1, 1);
  22. TEST(PatternTest, Creating_a_stripe_pattern)
  23. {
  24. StripPattern p = StripPattern(white, black);
  25. ASSERT_EQ(p.a, white);
  26. ASSERT_EQ(p.b, black);
  27. }
  28. TEST(PatternTest, A_strip_pattern_is_constant_in_y)
  29. {
  30. StripPattern p = StripPattern(white, black);
  31. ASSERT_EQ(p.patternAt(Point(0, 0, 0)), white);
  32. ASSERT_EQ(p.patternAt(Point(0, 1, 0)), white);
  33. ASSERT_EQ(p.patternAt(Point(0, 2, 0)), white);
  34. }
  35. TEST(PatternTest, A_strip_pattern_is_constant_in_z)
  36. {
  37. StripPattern p = StripPattern(white, black);
  38. ASSERT_EQ(p.patternAt(Point(0, 0, 0)), white);
  39. ASSERT_EQ(p.patternAt(Point(0, 0, 1)), white);
  40. ASSERT_EQ(p.patternAt(Point(0, 0, 2)), white);
  41. }
  42. TEST(PatternTest, A_strip_pattern_alternate_in_x)
  43. {
  44. StripPattern p = StripPattern(white, black);
  45. ASSERT_EQ(p.patternAt(Point(0, 0, 0)), white);
  46. ASSERT_EQ(p.patternAt(Point(0.9, 0, 0)), white);
  47. ASSERT_EQ(p.patternAt(Point(1, 0, 0)), black);
  48. ASSERT_EQ(p.patternAt(Point(-0.1, 0, 0)), black);
  49. ASSERT_EQ(p.patternAt(Point(-1, 0, 0)), black);
  50. ASSERT_EQ(p.patternAt(Point(-1.1, 0, 0)), white);
  51. }
  52. TEST(PatternTest, Lightning_with_a_pattern_applied)
  53. {
  54. Sphere s = Sphere();
  55. Material m;
  56. StripPattern p = StripPattern(white, black);
  57. m.pattern = &p;
  58. m.ambient = 1;
  59. m.diffuse = 0;
  60. m.specular = 0;
  61. Tuple eyev = Vector(0, 0, -1);
  62. Tuple normalv = Vector(0, 0, -1);
  63. Light light = Light(POINT_LIGHT, Point(0, 0, -10), Colour(1, 1, 1));
  64. Colour c1 = m.lighting(light, Point(0, 9, 0), eyev, normalv, &s, false);
  65. Colour c2 = m.lighting(light, Point(1, 1, 0), eyev, normalv, &s, false);
  66. ASSERT_EQ(c1, Colour(1, 1, 1));
  67. ASSERT_EQ(c2, Colour(0, 0, 0));
  68. }
  69. TEST(PatternTest, Stripe_with_an_object_transformation)
  70. {
  71. Sphere s = Sphere();
  72. s.setTransform(scaling(2, 2, 2));
  73. StripPattern pattern = StripPattern(white, black);
  74. Colour c = pattern.patternAtObject(&s, Point(1.5, 0, 0));
  75. ASSERT_EQ(c, white);
  76. }
  77. TEST(PatternTest, Stripe_with_a_pattern_transformation)
  78. {
  79. Sphere s = Sphere();
  80. StripPattern pattern = StripPattern(white, black);
  81. pattern.setTransform(scaling(2, 2, 2));
  82. Colour c = pattern.patternAtObject(&s, Point(1.5, 0, 0));
  83. ASSERT_EQ(c, white);
  84. }
  85. TEST(PatternTest, Stripe_with_both_an_object_and_a_pattern_transformation)
  86. {
  87. Sphere s = Sphere();
  88. s.setTransform(scaling(2, 2, 2));
  89. StripPattern pattern = StripPattern(white, black);
  90. pattern.setTransform(translation(0.5, 0, 0));
  91. Colour c = pattern.patternAtObject(&s, Point(2.5, 0, 0));
  92. ASSERT_EQ(c, white);
  93. }
  94. TEST(PatternTest, The_default_pattern_transformation)
  95. {
  96. TestPattern pattern = TestPattern();
  97. ASSERT_EQ(pattern.transformMatrix, Matrix4().identity());
  98. }
  99. TEST(PatternTest, Assigning_a_transformation)
  100. {
  101. TestPattern pattern = TestPattern();
  102. pattern.setTransform(translation(1, 2, 3));
  103. ASSERT_EQ(pattern.transformMatrix, translation(1, 2, 3));
  104. }
  105. TEST(PatternTest, A_pattern_with_an_object_transformation)
  106. {
  107. Sphere s = Sphere();
  108. s.setTransform(scaling(2, 2, 2));
  109. TestPattern pattern = TestPattern();
  110. Colour c = pattern.patternAtObject(&s, Point(2, 3, 4));
  111. ASSERT_EQ(c, Colour(1, 1.5, 2));
  112. }
  113. TEST(PatternTest, A_pattern_with_a_pattern_transformation)
  114. {
  115. Sphere s = Sphere();
  116. TestPattern pattern = TestPattern();
  117. pattern.setTransform(scaling(2, 2, 2));
  118. Colour c = pattern.patternAtObject(&s, Point(2, 3, 4));
  119. ASSERT_EQ(c, Colour(1, 1.5, 2));
  120. }
  121. TEST(PatternTest, A_pattern_with_an_object_and_a_pattern_transformation)
  122. {
  123. Sphere s = Sphere();
  124. s.setTransform(scaling(2, 2, 2));
  125. TestPattern pattern = TestPattern();
  126. pattern.setTransform(translation(0.5, 1, 1.5));
  127. Colour c = pattern.patternAtObject(&s, Point(2.5, 3, 3.5));
  128. ASSERT_EQ(c, Colour(0.75, 0.5, 0.25));
  129. }
  130. TEST(PatternTest, A_gradient_linearly_interpolates_betweens_colors)
  131. {
  132. GradientPattern pattern = GradientPattern(white, black);
  133. ASSERT_EQ(pattern.patternAt(Point(0.25, 0, 0)), Colour(0.75, 0.75, 0.75));
  134. ASSERT_EQ(pattern.patternAt(Point(0.5, 0, 0)), Colour(0.5, 0.5, 0.5));
  135. ASSERT_EQ(pattern.patternAt(Point(0.75, 0, 0)), Colour(0.25, 0.25, 0.25));
  136. }
  137. TEST(PatternTest, A_ring_should_extend_in_both_x_and_z)
  138. {
  139. RingPattern pattern = RingPattern(white, black);
  140. ASSERT_EQ(pattern.patternAt(Point(0, 0, 0)), white);
  141. ASSERT_EQ(pattern.patternAt(Point(1, 0, 0)), black);
  142. ASSERT_EQ(pattern.patternAt(Point(0, 0, 1)), black);
  143. /* 0.708 is just bit more than sqrt(2)/2 */
  144. ASSERT_EQ(pattern.patternAt(Point(0.708, 0, 0.708)), black);
  145. }
  146. TEST(PatternTest, Checkers_should_repeat_in_x)
  147. {
  148. CheckersPattern pattern = CheckersPattern(white, black);
  149. ASSERT_EQ(pattern.patternAt(Point(0, 0, 0)), white);
  150. ASSERT_EQ(pattern.patternAt(Point(0.99, 0, 0)), white);
  151. ASSERT_EQ(pattern.patternAt(Point(1.01, 0, 0)), black);
  152. }
  153. TEST(PatternTest, Checkers_should_repeat_in_y)
  154. {
  155. CheckersPattern pattern = CheckersPattern(white, black);
  156. ASSERT_EQ(pattern.patternAt(Point(0, 0, 0)), white);
  157. ASSERT_EQ(pattern.patternAt(Point(0, 0.99, 0)), white);
  158. ASSERT_EQ(pattern.patternAt(Point(0, 1.01, 0)), black);
  159. }
  160. TEST(PatternTest, Checkers_should_repeat_in_z)
  161. {
  162. CheckersPattern pattern = CheckersPattern(white, black);
  163. ASSERT_EQ(pattern.patternAt(Point(0, 0, 0)), white);
  164. ASSERT_EQ(pattern.patternAt(Point(0, 0, 0.99)), white);
  165. ASSERT_EQ(pattern.patternAt(Point(0, 0, 1.01)), black);
  166. }