summaryrefslogtreecommitdiffhomepage
path: root/Cameraman.cpp
diff options
context:
space:
mode:
authorAki <please@ignore.pl>2022-06-05 12:02:17 +0200
committerAki <please@ignore.pl>2022-06-05 12:20:49 +0200
commitb08f360cf92e76fabf5b762bf79032f60f751e30 (patch)
tree1bea4571ad78876fdec744462712ea9859edb055 /Cameraman.cpp
parent5cb5322feddfe75fe09bffef5b648062a1eb5958 (diff)
downloadderelict-b08f360cf92e76fabf5b762bf79032f60f751e30.zip
derelict-b08f360cf92e76fabf5b762bf79032f60f751e30.tar.gz
derelict-b08f360cf92e76fabf5b762bf79032f60f751e30.tar.bz2
Added cameraman to handle camera
Diffstat (limited to 'Cameraman.cpp')
-rw-r--r--Cameraman.cpp44
1 files changed, 44 insertions, 0 deletions
diff --git a/Cameraman.cpp b/Cameraman.cpp
new file mode 100644
index 0000000..f65cb44
--- /dev/null
+++ b/Cameraman.cpp
@@ -0,0 +1,44 @@
+#include "Cameraman.h"
+
+#include <algorithm>
+#include <cmath>
+
+#include <raylib.h>
+#include <raymath.h>
+
+#include "VectorMath.h"
+
+
+Cameraman::Cameraman()
+{
+ camera.position = Vector3{10.0f, 10.0f, 10.0f};
+ camera.target = Vector3{0.0f, 0.0f, 0.0f};
+ camera.up = Vector3{0.0f, 1.0f, 0.0f};
+ camera.fovy = 45;
+ camera.projection = CAMERA_PERSPECTIVE;
+ SetCameraMode(camera, CAMERA_CUSTOM);
+ m_angle.x = std::atan2(10.0f, 10.0f);
+ m_angle.y = std::atan2(10.0f, std::sqrt(std::pow(10.0f, 2) + std::pow(10.0f, 2)));
+}
+
+
+void
+Cameraman::update(const float)
+{
+ const auto drag = GetMouseDelta();
+ if (IsMouseButtonDown(0)) {
+ m_angle.x += drag.x * -0.01f;
+ m_angle.y = std::clamp(m_angle.y + drag.y * 0.01f, -1.483f, 1.483f);
+ }
+ const float zoom = GetMouseWheelMove();
+ if (zoom != 0.0f) {
+ const auto offset = Vector3Subtract(camera.target, camera.position);
+ const float current = Vector3Length(offset);
+ const float expected = std::clamp(current + zoom * 0.5f, 1.0f, 30.0f);
+ camera.position = Vector3Add(camera.target, Vector3Scale(offset, expected / current));
+ }
+ const float distance = dist(camera.position, camera.target);
+ camera.position.x = camera.target.x + distance * -std::sin(m_angle.x) * std::cos(m_angle.y);
+ camera.position.y = camera.target.y + distance * std::sin(m_angle.y);
+ camera.position.z = camera.target.z + distance * -std::cos(m_angle.x) * std::cos(m_angle.y);
+}