GameKit  0.0.1a
C++ gamedev tools
View.cpp
Go to the documentation of this file.
1 /*
2  * =====================================================================================
3  *
4  * Filename: View.cpp
5  *
6  * Description:
7  *
8  * Created: 01/01/2019 21:30:43
9  *
10  * Author: Quentin Bazin, <quent42340@gmail.com>
11  *
12  * =====================================================================================
13  */
14 #include <cmath>
15 
16 #define GLM_FORCE_RADIANS
17 #include <glm/gtc/matrix_transform.hpp>
18 
19 #include "gk/gl/View.hpp"
20 
21 namespace gk {
22 
24  reset(FloatRect(0, 0, 1000, 1000));
25 }
26 
27 View::View(const Vector3f &center, const Vector2f &size) {
28  reset(FloatRect(center.xy(), size));
29 }
30 
31 View::View(const FloatRect &rectangle) {
32  reset(rectangle);
33 }
34 
35 void View::setCenter(float x, float y, float z) {
36  m_position.x = x;
37  m_position.y = y;
38  m_position.z = z;
39 
40  m_viewTransformUpdated = false;
41 }
42 
43 void View::setSize(float width, float height) {
44  m_size.x = width;
45  m_size.y = height;
46 
47  m_transformUpdated = false;
48  m_viewTransformUpdated = false;
49 }
50 
51 void View::setRotation(float angle) {
52  m_rotation = static_cast<float>(fmod(angle, 360));
53  if (m_rotation < 0)
54  m_rotation += 360.f;
55 
56  m_viewTransformUpdated = false;
57 }
58 
59 void View::reset(const FloatRect &rectangle) {
60  m_position.x = rectangle.x + rectangle.width / 2.f;
61  m_position.y = rectangle.y + rectangle.height / 2.f;
62 
63  m_size.x = rectangle.width;
64  m_size.y = rectangle.height;
65 
66  m_rotation = 0;
67 
68  m_transformUpdated = false;
69 }
70 
71 void View::move(float offsetX, float offsetY, float offsetZ) {
72  setCenter(m_position.x + offsetX, m_position.y + offsetY, m_position.z + offsetZ);
73 }
74 
75 const Transform &View::getTransform() const {
76  if (!m_transformUpdated) {
77  m_transform = glm::ortho(0.0f, m_size.x, m_size.y, 0.0f);
78 
79  m_transformUpdated = true;
80  }
81 
82  return m_transform;
83 }
84 
87  Transform positionTransform;
88  positionTransform.translate(m_size.x / 2.f - m_position.x, m_size.y / 2.f - m_position.y);
89 
90  Transform rotationTransform;
91  rotationTransform.rotate(m_rotation * M_PI / 180.0f);
92 
93  m_viewTransform = positionTransform * rotationTransform;
94 
95  // m_viewTransform = Transform::Identity;
96  // m_viewTransform.rotate(m_rotation);
97  // m_viewTransform.translate(Vector3f{getCenter().x, getCenter().y, 0}
98  // - Vector3f{getSize(), 0.f} / 2.0f);
99 
100  m_viewTransformUpdated = true;
101  }
102 
103  return m_viewTransform;
104 }
105 
106 } // namespace gk
107 
View()
Definition: View.cpp:23
bool m_transformUpdated
Definition: View.hpp:68
Transform & translate(float x, float y, float z=0)
Definition: Transform.cpp:28
void setSize(float width, float height)
Definition: View.cpp:43
Vector2< T > xy() const
Definition: Vector3.hpp:63
Transform m_transform
Definition: View.hpp:71
Vector2f m_size
Definition: View.hpp:76
void move(float offsetX, float offsetY, float offsetZ=0)
Definition: View.cpp:71
Vector3f m_position
Definition: View.hpp:75
Transform m_viewTransform
Definition: View.hpp:72
T y
Top coordinate of the rectangle.
Definition: Rect.hpp:216
Transform & rotate(float angle)
Definition: Transform.hpp:38
void setCenter(float x, float y, float z=0)
Definition: View.cpp:35
void reset(const FloatRect &rectangle)
Definition: View.cpp:59
float m_rotation
Definition: View.hpp:78
virtual const Transform & getTransform() const
Definition: View.cpp:75
bool m_viewTransformUpdated
Definition: View.hpp:69
void setRotation(float angle)
Definition: View.cpp:51
T x
Left coordinate of the rectangle.
Definition: Rect.hpp:215
virtual const Transform & getViewTransform() const
Definition: View.cpp:85
T width
Width of the rectangle.
Definition: Rect.hpp:217
Rect< float > FloatRect
Definition: Rect.hpp:223
T height
Height of the rectangle.
Definition: Rect.hpp:218