summaryrefslogtreecommitdiff
path: root/gfx/manualCameraController.cpp
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2021-02-28 23:29:37 +0000
committerDan Goodliffe <dan@randomdan.homeip.net>2021-02-28 23:29:37 +0000
commitdd236a39906de5855fdd1252b17a7337f0c7b052 (patch)
treedbd19e1a278feca0f7e00409aab2cc9d2125a51a /gfx/manualCameraController.cpp
parentGlobal definition of quarter_pi (diff)
downloadilt-dd236a39906de5855fdd1252b17a7337f0c7b052.tar.bz2
ilt-dd236a39906de5855fdd1252b17a7337f0c7b052.tar.xz
ilt-dd236a39906de5855fdd1252b17a7337f0c7b052.zip
Vastly improved manual camera controller
Diffstat (limited to 'gfx/manualCameraController.cpp')
-rw-r--r--gfx/manualCameraController.cpp30
1 files changed, 18 insertions, 12 deletions
diff --git a/gfx/manualCameraController.cpp b/gfx/manualCameraController.cpp
index 01787c6..62c48c8 100644
--- a/gfx/manualCameraController.cpp
+++ b/gfx/manualCameraController.cpp
@@ -1,5 +1,8 @@
#include "manualCameraController.h"
+#include <algorithm>
+#include <cmath>
#include <gfx/gl/camera.h>
+#include <maths.h>
bool
ManualCameraController::handleInput(SDL_Event & e)
@@ -39,9 +42,19 @@ ManualCameraController::handleInput(SDL_Event & e)
break;
case SDL_MOUSEMOTION:
if (mrb) {
- motion = e.motion;
+ if (ctrl) {
+ direction -= 0.01F * e.motion.xrel;
+ pitch = std::clamp(pitch - 0.01F * e.motion.yrel, 0.1F, half_pi);
+ }
+ else {
+ focus.x += cos(direction) * e.motion.xrel + sin(direction) * e.motion.yrel;
+ focus.y += cos(direction) * e.motion.yrel - sin(direction) * e.motion.xrel;
+ }
}
return true;
+ case SDL_MOUSEWHEEL:
+ dist = std::clamp(dist - e.wheel.y * 4.F, 5.F, 200.F);
+ break;
}
return false;
}
@@ -49,15 +62,8 @@ ManualCameraController::handleInput(SDL_Event & e)
void
ManualCameraController::updateCamera(Camera * camera) const
{
- if (motion) {
- if (ctrl) {
- camera->RotateY(-0.01F * motion->xrel);
- camera->Pitch(-0.01F * motion->yrel);
- }
- else {
- camera->MoveRight(motion->xrel);
- camera->SlideForward(motion->yrel);
- }
- motion.reset();
- }
+ const auto rel {glm::normalize(glm::vec3 {sin(direction), -sin(pitch), cos(direction)})};
+ camera->pos = !focus + up * 3.F - (rel * std::pow(dist, 1.3F));
+ camera->forward = glm::normalize(rel);
+ camera->up = up;
}