triangle_test.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. /*
  2. * DoRayMe - a quick and dirty Raytracer
  3. * Triangle unit tests
  4. *
  5. * Created by Manoël Trapier
  6. * Copyright (c) 2020 986-Studio.
  7. *
  8. */
  9. #include <triangle.h>
  10. #include <math.h>
  11. #include <gtest/gtest.h>
  12. TEST(TriangleTest, Construcring_a_triangle)
  13. {
  14. Point p1 = Point(0, 1, 0);
  15. Point p2 = Point(-1, 0, 0);
  16. Point p3 = Point(1, 0, 0);
  17. Triangle t = Triangle(p1, p2, p3);
  18. ASSERT_EQ(t.p1, p1);
  19. ASSERT_EQ(t.p2, p2);
  20. ASSERT_EQ(t.p3, p3);
  21. ASSERT_EQ(t.e1, Vector(-1, -1, 0));
  22. ASSERT_EQ(t.e2, Vector(1, -1, 0));
  23. ASSERT_EQ(t.normal, Vector(0, 0, -1));
  24. }
  25. TEST(TriangleTest, Finding_the_normal_on_a_triangle)
  26. {
  27. Triangle t = Triangle(Point(0, 1, 0), Point(-1, 0, 0), Point(1, 0, 0));
  28. Tuple n1 = t.normalAt(Point(0, 0.5, 0));
  29. Tuple n2 = t.normalAt(Point(-0.5, 0.75, 0));
  30. Tuple n3 = t.normalAt(Point(0.5, 0.25, 0));
  31. ASSERT_EQ(n1, t.normal);
  32. ASSERT_EQ(n2, t.normal);
  33. ASSERT_EQ(n3, t.normal);
  34. }
  35. TEST(TriangleTest, Intersecting_a_ray_parallel_to_the_triangle)
  36. {
  37. Triangle t = Triangle(Point(0, 1, 0), Point(-1, 0, 0), Point(1, 0, 0));
  38. Ray r = Ray(Point(0, -1, -2), Vector(0, 1, 0));
  39. Intersect xs; t.intersect(r, xs);
  40. ASSERT_EQ(xs.count(), 0);
  41. }
  42. TEST(TriangleTest, A_ray_miss_the_p1_p3_edge)
  43. {
  44. Triangle t = Triangle(Point(0, 1, 0), Point(-1, 0, 0), Point(1, 0, 0));
  45. Ray r = Ray(Point(1, 1, -2), Vector(0, 0, 1));
  46. Intersect xs; t.intersect(r, xs);
  47. ASSERT_EQ(xs.count(), 0);
  48. }
  49. TEST(TriangleTest, A_ray_miss_the_p1_p2_edge)
  50. {
  51. Triangle t = Triangle(Point(0, 1, 0), Point(-1, 0, 0), Point(1, 0, 0));
  52. Ray r = Ray(Point(-1, 1, -2), Vector(0, 0, 1));
  53. Intersect xs; t.intersect(r, xs);
  54. ASSERT_EQ(xs.count(), 0);
  55. }
  56. TEST(TriangleTest, A_ray_miss_the_p2_p3_edge)
  57. {
  58. Triangle t = Triangle(Point(0, 1, 0), Point(-1, 0, 0), Point(1, 0, 0));
  59. Ray r = Ray(Point(0, -1, -2), Vector(0, 0, 1));
  60. Intersect xs; t.intersect(r, xs);
  61. ASSERT_EQ(xs.count(), 0);
  62. }
  63. TEST(TriangleTest, A_ray_strikes_a_triangle)
  64. {
  65. Triangle t = Triangle(Point(0, 1, 0), Point(-1, 0, 0), Point(1, 0, 0));
  66. Ray r = Ray(Point(0, .5, -2), Vector(0, 0, 1));
  67. Intersect xs; t.intersect(r, xs);
  68. ASSERT_EQ(xs.count(), 1);
  69. EXPECT_EQ(xs[0].t, 2);
  70. }
  71. TEST(TriangleTest, A_triangle_has_a_bounding_box)
  72. {
  73. Triangle t = Triangle(Point(-3, 7, 2), Point(6, 2, -4), Point(2, -1, -1));
  74. BoundingBox res = t.getBounds();
  75. ASSERT_EQ(res.min, Point(-3, -1, -4));
  76. ASSERT_EQ(res.max, Point(6, 7, 2));
  77. }