Leonetienne/Eule
Homemade math library, mainly targetted towards computer graphics
TrapazoidalPrismCollider.cpp
Go to the documentation of this file.
2 
3 using namespace Eule;
4 
6 {
7  return;
8 }
9 
11 {
12  vertices = other.vertices;
13  faceNormals = other.faceNormals;
14 
15  return;
16 }
17 
19 {
20  vertices = std::move(other.vertices);
21  faceNormals = std::move(other.faceNormals);
22 
23  return;
24 }
25 
26 const Vector3d& TrapazoidalPrismCollider::GetVertex(std::size_t index) const
27 {
28  return vertices[index];
29 }
30 
31 void TrapazoidalPrismCollider::SetVertex(std::size_t index, const Vector3d value)
32 {
33  vertices[index] = value;
34  GenerateNormalsFromVertices();
35  return;
36 }
37 
38 void TrapazoidalPrismCollider::GenerateNormalsFromVertices()
39 {
40  faceNormals[(std::size_t)FACE_NORMALS::LEFT] =
41  (vertices[BACK|LEFT|BOTTOM] - vertices[FRONT|LEFT|BOTTOM])
42  .CrossProduct(vertices[FRONT|LEFT|TOP] - vertices[FRONT|LEFT|BOTTOM]);
43 
44  faceNormals[(std::size_t)FACE_NORMALS::RIGHT] =
45  (vertices[FRONT|RIGHT|TOP] - vertices[FRONT|RIGHT|BOTTOM])
46  .CrossProduct(vertices[BACK|RIGHT|BOTTOM] - vertices[FRONT|RIGHT|BOTTOM]);
47 
48  faceNormals[(std::size_t)FACE_NORMALS::FRONT] =
49  (vertices[FRONT|LEFT|TOP] - vertices[FRONT|LEFT|BOTTOM])
50  .CrossProduct(vertices[FRONT|RIGHT|BOTTOM] - vertices[FRONT|LEFT|BOTTOM]);
51 
52  faceNormals[(std::size_t)FACE_NORMALS::BACK] =
53  (vertices[BACK|RIGHT|BOTTOM] - vertices[BACK|LEFT|BOTTOM])
54  .CrossProduct(vertices[BACK|LEFT|TOP] - vertices[BACK|LEFT|BOTTOM]);
55 
56  faceNormals[(std::size_t)FACE_NORMALS::TOP] =
57  (vertices[BACK|LEFT|TOP] - vertices[FRONT|LEFT|TOP])
58  .CrossProduct(vertices[FRONT|RIGHT|TOP] - vertices[FRONT|LEFT|TOP]);
59 
60  faceNormals[(std::size_t)FACE_NORMALS::BOTTOM] =
61  (vertices[FRONT|RIGHT|BOTTOM] - vertices[FRONT|LEFT|BOTTOM])
62  .CrossProduct(vertices[BACK|LEFT|BOTTOM] - vertices[FRONT|LEFT|BOTTOM]);
63 
64  return;
65 }
66 
67 double TrapazoidalPrismCollider::FaceDot(FACE_NORMALS face, const Vector3d& point) const
68 {
69  // This vertex is the one being used twice to calculate the normals
70  std::size_t coreVertexIdx;
71  switch (face)
72  {
73  case FACE_NORMALS::LEFT:
74  coreVertexIdx = FRONT|LEFT|BOTTOM;
75  break;
76 
77  case FACE_NORMALS::RIGHT:
78  coreVertexIdx = FRONT|RIGHT|BOTTOM;
79  break;
80 
81  case FACE_NORMALS::FRONT:
82  coreVertexIdx = FRONT|LEFT|BOTTOM;
83  break;
84 
85  case FACE_NORMALS::BACK:
86  coreVertexIdx = BACK|LEFT|BOTTOM;
87  break;
88 
89  case FACE_NORMALS::TOP:
90  coreVertexIdx = FRONT|LEFT|TOP;
91  break;
92 
93  case FACE_NORMALS::BOTTOM:
94  coreVertexIdx = FRONT|LEFT|BOTTOM;
95  break;
96  }
97 
98  if ((std::size_t)face < 6)
99  return faceNormals[(std::size_t)face].DotProduct(point - vertices[coreVertexIdx]);
100  return 1;
101 }
102 
104 {
105  for (std::size_t i = 0; i < 6; i++)
106  if (FaceDot((FACE_NORMALS)i, point) < 0)
107  return false;
108 
109  return true;
110 }
Eule::TrapazoidalPrismCollider::RIGHT
static constexpr std::size_t RIGHT
Definition: TrapazoidalPrismCollider.h:35
TrapazoidalPrismCollider.h
Eule::TrapazoidalPrismCollider::BACK
static constexpr std::size_t BACK
Definition: TrapazoidalPrismCollider.h:32
Eule::Vector3< double >
Eule::TrapazoidalPrismCollider::FRONT
static constexpr std::size_t FRONT
Definition: TrapazoidalPrismCollider.h:33
Eule::TrapazoidalPrismCollider::BOTTOM
static constexpr std::size_t BOTTOM
Definition: TrapazoidalPrismCollider.h:36
Eule::TrapazoidalPrismCollider::operator=
void operator=(const TrapazoidalPrismCollider &other)
Definition: TrapazoidalPrismCollider.cpp:10
Eule::TrapazoidalPrismCollider::LEFT
static constexpr std::size_t LEFT
Definition: TrapazoidalPrismCollider.h:34
Eule::TrapazoidalPrismCollider::SetVertex
void SetVertex(std::size_t index, const Vector3d value)
Will set the value of a specific vertex.
Definition: TrapazoidalPrismCollider.cpp:31
Eule::TrapazoidalPrismCollider::Contains
bool Contains(const Vector3d &point) const override
Tests, if this Collider contains a point.
Definition: TrapazoidalPrismCollider.cpp:103
Eule::TrapazoidalPrismCollider
A collider describing a trapazoidal prism.
Definition: TrapazoidalPrismCollider.h:13
Eule::TrapazoidalPrismCollider::TrapazoidalPrismCollider
TrapazoidalPrismCollider()
Definition: TrapazoidalPrismCollider.cpp:5
Eule::TrapazoidalPrismCollider::GetVertex
const Vector3d & GetVertex(std::size_t index) const
Will return a specific vertex.
Definition: TrapazoidalPrismCollider.cpp:26
Eule::TrapazoidalPrismCollider::TOP
static constexpr std::size_t TOP
Definition: TrapazoidalPrismCollider.h:37
Eule
Definition: Collider.h:4