Number5
Visualisierung 2 Project - Florian Schober (0828151, f.schober@live.com), Andreas Walch (0926780, walch.andreas89@gmail.com)
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Transformation.cpp
Go to the documentation of this file.
1 #include "Transformation.hpp"
2 
3 
5  : m_scale(1)
6  , m_position(0,0,0)
7  , m_rotation(0,0,0)
8  , m_matrix(1.0f)
9  , m_matrixInverse(1.0f)
10  , m_matrixInvalid(true)
11  , m_matrixInverseInvalid(true)
12 {
13 }
14 
15 void Transformation::setPosition(vec3 const & position)
16 {
17  m_position = position;
18  checkLimits();
19  m_matrixInvalid = true;
20 }
21 void Transformation::setRotation(vec3 const & rotation)
22 {
23  m_rotation = rotation;
24  checkLimits();
25  m_matrixInvalid = true;
26 }
27 void Transformation::setScale(float const & scale)
28 {
29  m_scale = scale;
30  checkLimits();
31  m_matrixInvalid = true;
32 }
34 {
35  if (m_matrixInvalid)
36  {
37  m_matrix = glm::translate(mat4(1.0f), m_position)
38  * glm::rotate(mat4(1.0f), m_rotation.z, vec3(0,0,1))
39  * glm::rotate(mat4(1.0f), m_rotation.y, vec3(0,1,0))
40  * glm::rotate(mat4(1.0f), m_rotation.x, vec3(1,0,0))
41  * glm::scale(mat4(1.0f),vec3(m_scale));
42 
43  m_matrixInvalid = false;
45  }
46 }
48 {
49  recalc();
50 
52  {
53  m_matrixInverse = glm::inverse(m_matrix);
54  m_matrixInverseInvalid = false;
55  }
56 }
58 {
59  recalc();
60  return m_matrix;
61 }
63 {
64  recalcInverse();
65  return m_matrixInverse;
66 }
67 
68 void Transformation::move(vec3 const & delta)
69 {
70  m_position += delta;
71  checkLimits();
72  m_matrixInvalid = true;
73 }
74 void Transformation::rotate(vec3 const & delta)
75 {
76  m_rotation += delta;
77  checkLimits();
78  m_matrixInvalid = true;
79 }
80 
82 {
83  auto& mat = mat3(glm::transpose(getMatrixInverse()));
84  return glm::normalize(mat[2]);
85 }
86 
88 {
89  auto& mat = mat3(glm::transpose(getMatrixInverse()));
90  return glm::normalize(mat[0]);
91 }
93 {
94  return m_matrixInvalid;
95 }
96 void Transformation::limitRotationX(float from, float to)
97 {
98  m_limits.push_back([this, from, to]
99  ()
100  {
101  m_rotation.x = glm::clamp(m_rotation.x, from, to);
102  });
103 }
104 void Transformation::limitRotationY(float from, float to)
105 {
106  m_limits.push_back([this, from, to]
107  ()
108  {
109  m_rotation.y = glm::clamp(m_rotation.y, from, to);
110  });
111 }
112 void Transformation::limitRotationZ(float from, float to)
113 {
114  m_limits.push_back([this, from, to]
115  ()
116  {
117  m_rotation.z = glm::clamp(m_rotation.z, from, to);
118  });
119 }
121 {
122  for (auto& limit : m_limits)
123  limit();
124 }
bool const needsRecalc()
mat4 const & getMatrix()
void limitRotationZ(float from, float to)
void limitRotationY(float from, float to)
vec3 const & getSideVector()
void setRotation(vec3 const &rotation)
void move(vec3 const &delta)
void limitRotationX(float from, float to)
vector< function< void()> > m_limits
void rotate(vec3 const &delta)
vec3 const & getLookVector()
void setPosition(vec3 const &position)
void setScale(float const &scale)
mat4 const & getMatrixInverse()