MobileRT  1.0
A multi platform C++ CPU progressive Ray Tracer.
Triangle.hpp
Go to the documentation of this file.
1 #ifndef MOBILERT_SHAPES_TRIANGLE_HPP
2 #define MOBILERT_SHAPES_TRIANGLE_HPP
3 
6 #include "MobileRT/Ray.hpp"
7 #include <glm/glm.hpp>
8 
9 namespace MobileRT {
13  class Triangle final {
14  public:
15  class Builder;
16 
17  private:
18  ::glm::vec3 AC_ {};
19  ::glm::vec3 AB_ {};
20  ::glm::vec3 pointA_ {};
21  ::glm::vec3 normalA_ {};
22  ::glm::vec3 normalB_ {};
23  ::glm::vec3 normalC_ {};
24  ::glm::vec2 texCoordA_ {-1};
25  ::glm::vec2 texCoordB_ {-1};
26  ::glm::vec2 texCoordC_ {-1};
27  ::std::int32_t materialIndex_ {-1};
28 
29  private:
30  explicit Triangle(const Triangle::Builder &builder) noexcept;
31 
32  void checkArguments() const;
33 
34  static bool isNearFarInvalid(float near, float far);
35 
36  public:
37  explicit Triangle() = delete;
38 
39  Triangle(const Triangle &triangle) = default;
40 
41  Triangle(Triangle &&triangle) noexcept = default;
42 
43  ~Triangle() = default;
44 
45  Triangle &operator=(const Triangle &triangle) = default;
46 
47  Triangle &operator=(Triangle &&triangle) noexcept = default;
48 
49  Intersection intersect(Intersection intersection) const;
50 
51  AABB getAABB() const;
52 
53  bool intersect(const AABB &box) const;
54 
55  ::glm::vec3 getAC() const;
56 
57  ::glm::vec3 getAB() const;
58 
59  ::glm::vec3 getA() const;
60 
61  ::glm::vec3 getNormalA () const;
62 
63  ::glm::vec3 getNormalB () const;
64 
65  ::glm::vec3 getNormalC () const;
66 
67  ::glm::vec2 getTexCoordA () const;
68 
69  ::glm::vec2 getTexCoordB () const;
70 
71  ::glm::vec2 getTexCoordC () const;
72 
73  ::std::int32_t getMaterialIndex () const;
74 
75  friend ::std::ostream& operator << (::std::ostream &os, const Triangle& triangle);
76 
77  class Builder final {
78  private:
79  ::glm::vec3 AC_ {};
80  ::glm::vec3 AB_ {};
81  ::glm::vec3 pointA_ {};
82  ::glm::vec3 normalA_ {};
83  ::glm::vec3 normalB_ {};
84  ::glm::vec3 normalC_ {};
85  ::glm::vec2 texCoordA_ {-1};
86  ::glm::vec2 texCoordB_ {-1};
87  ::glm::vec2 texCoordC_ {-1};
88  ::std::int32_t materialIndex_ {-1};
89  friend class Triangle;
90 
91  public:
92  explicit Builder(
93  const ::glm::vec3 &pointA,
94  const ::glm::vec3 &pointB,
95  const ::glm::vec3 &pointC
96  ) noexcept;
97 
99  const ::glm::vec3 &normalA,
100  const ::glm::vec3 &normalB,
101  const ::glm::vec3 &normalC
102  );
103 
105  const ::glm::vec2 &texCoordA,
106  const ::glm::vec2 &texCoordB,
107  const ::glm::vec2 &texCoordC
108  );
109 
110  Builder withMaterialIndex(::std::int32_t materialIndex);
111 
112  Triangle build();
113  };
114  };
115 
116  ::std::ostream& operator << (::std::ostream &os, const Triangle& triangle);
117 }//namespace MobileRT
118 
119 #endif //MOBILERT_SHAPES_TRIANGLE_HPP
::glm::vec2 texCoordA_
Definition: Triangle.hpp:85
::glm::vec2 getTexCoordA() const
Definition: Triangle.cpp:290
::glm::vec3 getA() const
Definition: Triangle.cpp:254
::glm::vec3 pointA_
Definition: Triangle.hpp:81
::glm::vec2 texCoordA_
Definition: Triangle.hpp:24
::glm::vec2 texCoordB_
Definition: Triangle.hpp:25
::glm::vec3 normalC_
Definition: Triangle.hpp:84
::glm::vec3 AC_
Definition: Triangle.hpp:79
AABB getAABB() const
Definition: Triangle.cpp:116
::glm::vec3 pointA_
Definition: Triangle.hpp:20
Intersection intersect(Intersection intersection) const
Definition: Triangle.cpp:63
::glm::vec3 normalC_
Definition: Triangle.hpp:23
Builder withMaterialIndex(::std::int32_t materialIndex)
Definition: Triangle.cpp:383
::std::int32_t materialIndex_
Definition: Triangle.hpp:88
::glm::vec3 normalB_
Definition: Triangle.hpp:22
::glm::vec2 texCoordC_
Definition: Triangle.hpp:87
::glm::vec3 normalA_
Definition: Triangle.hpp:21
::std::int32_t getMaterialIndex() const
Definition: Triangle.cpp:317
Definition: Intersection.hpp:14
Triangle build()
Definition: Triangle.cpp:393
void checkArguments() const
Definition: Triangle.cpp:31
static bool isNearFarInvalid(float near, float far)
Definition: Triangle.cpp:132
::glm::vec3 normalA_
Definition: Triangle.hpp:82
::glm::vec2 texCoordB_
Definition: Triangle.hpp:86
Triangle & operator=(const Triangle &triangle)=default
Builder(const ::glm::vec3 &pointA, const ::glm::vec3 &pointB, const ::glm::vec3 &pointC) noexcept
Definition: Triangle.cpp:328
::glm::vec2 getTexCoordB() const
Definition: Triangle.cpp:299
::glm::vec3 getNormalB() const
Definition: Triangle.cpp:272
Definition: AABB.hpp:18
friend ::std::ostream & operator<<(::std::ostream &os, const Triangle &triangle)
::glm::vec3 AB_
Definition: Triangle.hpp:80
::glm::vec3 AC_
Definition: Triangle.hpp:18
::glm::vec2 getTexCoordC() const
Definition: Triangle.cpp:308
::glm::vec3 getNormalA() const
Definition: Triangle.cpp:263
::glm::vec3 getAB() const
Definition: Triangle.cpp:245
::glm::vec3 normalB_
Definition: Triangle.hpp:83
::glm::vec3 AB_
Definition: Triangle.hpp:19
Definition: Triangle.hpp:13
Definition: Triangle.hpp:77
::std::int32_t materialIndex_
Definition: Triangle.hpp:27
::glm::vec3 getAC() const
Definition: Triangle.cpp:236
Builder withTexCoords(const ::glm::vec2 &texCoordA, const ::glm::vec2 &texCoordB, const ::glm::vec2 &texCoordC)
Definition: Triangle.cpp:367
Builder withNormals(const ::glm::vec3 &normalA, const ::glm::vec3 &normalB, const ::glm::vec3 &normalC)
Definition: Triangle.cpp:349
::glm::vec3 getNormalC() const
Definition: Triangle.cpp:281
::glm::vec2 texCoordC_
Definition: Triangle.hpp:26
const AABB box
Definition: TestPlane.cpp:26
Definition: AABB.cpp:105