Engine²
Open-source game engine written in C++.
Loading...
Searching...
No Matches
Transform.hpp
Go to the documentation of this file.
1#pragma once
2
3#define GLM_ENABLE_EXPERIMENTAL
4
5#include "glm/glm.hpp"
6#include "glm/gtc/matrix_transform.hpp"
7#include "glm/gtx/quaternion.hpp"
8
9#include <glm/gtx/string_cast.hpp>
10#include <iostream>
11
12namespace Object::Component {
18struct Transform {
24 Transform(glm::vec3 position = glm::vec3(0), glm::vec3 scale = glm::vec3(1),
25 glm::quat rotation = glm::quat(1, 0, 0, 0))
26 : _position(position), _scale(scale), _rotation(rotation)
27 {
28 }
29
30 Transform(const Transform &) = default;
31 Transform(Transform &&) = default;
32
33 Transform &operator=(const Transform &) = default;
35
36 // Getters
37 inline const glm::vec3 &GetPosition() const { return _position; }
38 inline const glm::vec3 &GetScale() const { return _scale; }
39 inline const glm::quat &GetRotation() const { return _rotation; }
40
41 // Setters
42 void SetPosition(const glm::vec3 &newPosition)
43 {
44 _dirty = true;
45 _position = newPosition;
46 }
47 void SetPosition(float x, float y, float z)
48 {
49 _dirty = true;
50 _position = glm::vec3(x, y, z);
51 }
52 void SetScale(const glm::vec3 &newScale)
53 {
54 _dirty = true;
55 _scale = newScale;
56 }
57 void SetScale(float x, float y, float z)
58 {
59 _dirty = true;
60 _scale = glm::vec3(x, y, z);
61 }
62 void SetRotation(const glm::quat &newRotation)
63 {
64 _dirty = true;
65 _rotation = newRotation;
66 }
67 void SetRotation(float x, float y, float z, float w)
68 {
69 _dirty = true;
70 _rotation = glm::quat(w, x, y, z);
71 }
72
73 glm::vec3 GetForwardVector() const { return glm::normalize(_rotation * glm::vec3(0.0f, 0.0f, 1.0f)); }
74
75 glm::vec3 GetRightVector() const { return glm::normalize(_rotation * glm::vec3(1.0f, 0.0f, 0.0f)); }
76
77 glm::vec3 GetUpVector() const { return glm::normalize(_rotation * glm::vec3(0.0f, 1.0f, 0.0f)); }
85 {
86 if (_dirty)
87 {
89 _dirty = false;
90 }
92 }
93
94 private:
98 glm::vec3 _position;
102 glm::vec3 _scale;
107 glm::quat _rotation;
108
109 mutable bool _dirty = true;
110 mutable glm::mat4 _transformationMatrixCache = glm::mat4(1.0f);
111
112 inline glm::mat4 _BuildTransformationMatrix() const
113 {
114 glm::mat4 translation = glm::translate(glm::mat4(1.0f), _position);
115 glm::mat4 rotationMatrix = glm::mat4_cast(_rotation);
116 glm::mat4 scaleMatrix = glm::scale(glm::mat4(1.0f), _scale);
117 return translation * rotationMatrix * scaleMatrix;
118 }
119};
120} // namespace Object::Component
Definition AmbientLight.hpp:5
Transform(const Transform &)=default
void SetScale(float x, float y, float z)
Definition Transform.hpp:57
void SetPosition(const glm::vec3 &newPosition)
Definition Transform.hpp:42
glm::vec3 _scale
Definition Transform.hpp:102
glm::vec3 _position
Definition Transform.hpp:98
glm::vec3 GetForwardVector() const
Definition Transform.hpp:73
void SetPosition(float x, float y, float z)
Definition Transform.hpp:47
glm::vec3 GetRightVector() const
Definition Transform.hpp:75
glm::mat4 _transformationMatrixCache
Definition Transform.hpp:110
Transform & operator=(const Transform &)=default
Transform(glm::vec3 position=glm::vec3(0), glm::vec3 scale=glm::vec3(1), glm::quat rotation=glm::quat(1, 0, 0, 0))
Definition Transform.hpp:24
Transform & operator=(Transform &&)=default
void SetScale(const glm::vec3 &newScale)
Definition Transform.hpp:52
glm::vec3 GetUpVector() const
Definition Transform.hpp:77
const glm::vec3 & GetPosition() const
Definition Transform.hpp:37
void SetRotation(const glm::quat &newRotation)
Definition Transform.hpp:62
const glm::quat & GetRotation() const
Definition Transform.hpp:39
Transform(Transform &&)=default
glm::mat4 ComputeTransformationMatrix() const
Definition Transform.hpp:84
glm::quat _rotation
Definition Transform.hpp:107
glm::mat4 _BuildTransformationMatrix() const
Definition Transform.hpp:112
const glm::vec3 & GetScale() const
Definition Transform.hpp:38
void SetRotation(float x, float y, float z, float w)
Definition Transform.hpp:67
bool _dirty
Definition Transform.hpp:109