13 eyePos = glm::vec3(0.f, 0.f, -770.0f);
14 aimPos = glm::vec3(0.f, 0.f, 0.f);
21 void init()
override {
23 _projectionMatrix = glm::ortho(0.0f, (
float)_screenWidth, 0.0f, (
float)_screenHeight );
25 updateCameraOrientation();
27 _cameraMatrix = glm::mat4(1.0f);
29 _cameraMatrix = _projectionMatrix * _viewMatrix;
32 void update()
override {
35 updateCameraOrientation();
37 _cameraMatrix = glm::mat4(1.0f);
39 _cameraMatrix = _projectionMatrix * _viewMatrix;
44 glm::vec2 convertScreenToWorld(glm::vec2 screenCoords)
const override {
46 screenCoords -= glm::vec2(_screenWidth / 2, _screenHeight / 2);
48 screenCoords /= _scale;
49 screenCoords += glm::vec2(_screenWidth / 2, _screenHeight / 2);
51 screenCoords.x += eyePos.x;
52 screenCoords.y += eyePos.y;
59 void setPosition(
const glm::vec3 newPosition)
override {
64 void setPosition_X(
const float newPosition)
override {
65 eyePos.x = newPosition;
69 void setPosition_Y(
const float newPosition)
override {
70 eyePos.y = newPosition;
74 void setPosition_Z(
const float newPosition)
override {
75 eyePos.z = newPosition;
79 void movePosition_Hor(
const float step) {
80 glm::vec3 direction = glm::normalize(aimPos - eyePos);
83 glm::vec3 right = glm::normalize(glm::cross(direction, upDir));
86 eyePos += right * step;
87 aimPos += right * step;
90 void movePosition_Vert(
const float step) {
91 glm::vec3 direction = glm::normalize(aimPos - eyePos);
94 eyePos += upDir * step;
95 aimPos += upDir * step;
99 void movePosition_Forward(
const float step) {
100 glm::vec3 direction = glm::normalize(aimPos - eyePos);
101 eyePos += direction * step;
102 aimPos += direction * step;
103 _cameraChange =
true;
106 void setAimPos(
const glm::vec3 newAimPos) {
108 _cameraChange =
true;
111 void moveAimPos(glm::vec3 startingAimPos,
const glm::vec2 distance) {
112 aimPos = startingAimPos;
113 const float sensitivity = 0.005f;
115 float yaw = distance.x * sensitivity;
116 float pitch = distance.y * sensitivity;
118 glm::vec3 direction = glm::normalize(aimPos - eyePos);
120 direction = glm::rotate(direction, yaw, upDir);
122 glm::vec3 right = glm::normalize(glm::cross(direction, upDir));
124 direction = glm::rotate(direction, pitch, right);
127 aimPos = eyePos + direction;
128 _cameraChange =
true;
131 glm::vec3 getEulerAnglesFromDirection(glm::vec3 direction) {
132 float yaw = glm::atan(direction.x, direction.z);
133 float pitch = glm::asin(-direction.y);
136 return glm::vec3(glm::degrees(pitch), glm::degrees(yaw), glm::degrees(roll));
139 glm::vec3 getAimPos()
override {
143 void setScale(
float newScale)
override {
145 _cameraChange =
true;
149 glm::vec3 getPosition()
const override {
153 float getScale()
const override {
157 glm::mat4 getCameraMatrix()
const override {
158 return _cameraMatrix;
161 glm::ivec2 getCameraDimensions()
const override {
162 glm::vec2 cameraDimensions = { _screenWidth, _screenHeight };
163 return cameraDimensions;
166 SDL_FRect getCameraRect()
const override {
167 float cameraWidth = getCameraDimensions().x / getScale();
168 float cameraHeight = getCameraDimensions().y / getScale();
170 float cameraX = eyePos.x - cameraWidth / 2.0f + getCameraDimensions().x / 2;
171 float cameraY = eyePos.y - cameraHeight / 2.0f + getCameraDimensions().y / 2;
173 SDL_FRect cameraRect = { cameraX , cameraY , cameraWidth, cameraHeight };
177 void setCameraMatrix(glm::mat4 newMatrix) {
178 _cameraChange =
true;
181 bool hasChanged()
override {
182 return _cameraChange;
185 void makeCameraDirty()
override {
186 _cameraChange =
true;
189 void refreshCamera()
override {
190 _cameraChange =
false;