8 glm::vec3 panningAimPos{ 0,0,0 };
12 float nearPlane = 0.1f;
17 eyePos = glm::vec3(0.f, 0.f, -770.0f);
18 aimPos = glm::vec3(0.f, 0.f, 0.f);
26 void init()
override {
27 aspect = (float)_screenWidth / (
float)_screenHeight;
28 _projectionMatrix = glm::perspective(glm::radians(fov), aspect, nearPlane, zFar);
29 updateCameraOrientation();
31 _cameraMatrix = glm::mat4(1.0f);
33 _cameraMatrix = _projectionMatrix * _viewMatrix;
37 void update()
override {
39 updateCameraOrientation();
41 _cameraMatrix = glm::mat4(1.0f);
43 _cameraMatrix = _projectionMatrix * _viewMatrix;
49 glm::vec2 convertScreenToWorld(glm::vec2 screenCoords)
const override {
50 SDL_FRect cameraRect = getCameraRect();
52 glm::vec2 worldCoords;
54 worldCoords = screenCoords;
55 worldCoords /= _scale;
57 worldCoords.x = worldCoords.x + cameraRect.x;
58 worldCoords.y = worldCoords.y + cameraRect.y;
65 void setPosition(
const glm::vec3 newPosition)
override {
70 void setPosition_X(
const float newPosition)
override {
71 eyePos.x = newPosition;
75 void setPosition_Y(
const float newPosition)
override {
76 eyePos.y = newPosition;
80 void setPosition_Z(
const float newPosition)
override {
81 eyePos.z = newPosition;
85 void movePosition_Hor(
const float step) {
86 glm::vec3 direction = glm::normalize(aimPos - eyePos);
89 glm::vec3 right = glm::normalize(glm::cross(direction, upDir));
92 eyePos += right * step;
93 aimPos += right * step;
96 void movePosition_Vert(
const float step) {
97 glm::vec3 direction = glm::normalize(aimPos - eyePos);
100 eyePos += upDir * step;
101 aimPos += upDir * step;
102 _cameraChange =
true;
105 void movePosition_Forward(
const float step) {
106 glm::vec3 direction = glm::normalize(aimPos - eyePos);
107 eyePos += direction * step;
108 aimPos += direction * step;
109 _cameraChange =
true;
112 void setAimPos(
const glm::vec3 newAimPos) {
114 _cameraChange =
true;
117 void moveAimPos(glm::vec3 startingAimPos,
const glm::vec2 distance) {
118 aimPos = startingAimPos;
119 const float sensitivity = 0.005f;
121 float yaw = distance.x * sensitivity;
122 float pitch = distance.y * sensitivity;
124 glm::vec3 direction = glm::normalize(aimPos - eyePos);
126 direction = glm::rotate(direction, yaw, upDir);
128 glm::vec3 right = glm::normalize(glm::cross(direction, upDir));
130 direction = glm::rotate(direction, pitch, right);
133 aimPos = eyePos + direction;
134 _cameraChange =
true;
137 glm::vec3 getEulerAnglesFromDirection(glm::vec3 direction) {
138 float yaw = glm::atan(direction.x, direction.z);
139 float pitch = glm::asin(-direction.y);
142 return glm::vec3(glm::degrees(pitch), glm::degrees(yaw), glm::degrees(roll));
150 glm::vec3 getAimPos()
override {
154 void setPanningAimPos(
const glm::vec3 newAimPos) {
155 panningAimPos = newAimPos;
158 glm::vec3 getPanningAimPos() {
159 return panningAimPos;
162 void setScale(
float newScale)
override {
164 _cameraChange =
true;
168 glm::vec3 getPosition()
const override {
172 float getScale()
const override {
176 glm::mat4 getCameraMatrix()
const override {
177 return _cameraMatrix;
180 glm::ivec2 getCameraDimensions()
const override {
181 glm::vec2 cameraDimensions = { _screenWidth, _screenHeight };
182 return cameraDimensions;
185 SDL_FRect getCameraRect()
const override {
186 float cameraWidth = getCameraDimensions().x / getScale();
187 float cameraHeight = getCameraDimensions().y / getScale();
189 float cameraX = eyePos.x - cameraWidth / 2.0f ;
190 float cameraY = eyePos.y - cameraHeight / 2.0f ;
192 SDL_FRect cameraRect = { cameraX , cameraY , cameraWidth, cameraHeight };
196 void setCameraMatrix(glm::mat4 newMatrix) {
197 _cameraChange =
true;
199 void resetCameraPosition() {
203 eyePos = glm::vec3(0.f, 0.f, -770.0f);
204 aimPos = glm::vec3( 0,0,0 );
206 currentViewMode = ViewMode::Y_UP;
207 upDir = glm::vec3( 0,-1,0 );
211 _cameraChange =
true;
213 float getMinScale() {
217 float getMaxScale() {
222 bool hasChanged()
override {
223 return _cameraChange;
226 void makeCameraDirty()
override {
227 _cameraChange =
true;
230 void refreshCamera()
override {
231 _cameraChange =
false;
236 float _minScale = 0.1f, _maxScale = 5.0f;