diff options
Diffstat (limited to 'gfx/followCameraController.cpp')
-rw-r--r-- | gfx/followCameraController.cpp | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/gfx/followCameraController.cpp b/gfx/followCameraController.cpp new file mode 100644 index 0000000..0034c3b --- /dev/null +++ b/gfx/followCameraController.cpp @@ -0,0 +1,42 @@ +#include "followCameraController.h" +#include "game/vehicles/vehicle.h" +#include "gfx/gl/transform.h" +#include <gfx/gl/camera.h> +#include <gfx/gl/shader.h> +#include <glm/glm.hpp> +#include <maths.h> +#include <memory> +#include <tuple> +#include <utility> + +FollowCameraController::FollowCameraController(VehicleWPtr t, Mode m) : target(std::move(t)), mode(m) { } + +void +FollowCameraController::updateCamera(Camera * camera, Shader * shader) const +{ + const auto [pos, rot] = [this]() { + const auto t {target.lock()}; + return std::tie(t->getLocation().GetPos(), t->getLocation().GetRot()); + }(); + + switch (mode) { + case Mode::Pan: + camera->forward = glm::normalize(pos - camera->pos); + camera->up = up; + break; + + case Mode::Ride: + camera->pos = pos + (up * 4.8F); + camera->forward = {-std::sin(rot.y), 0.F, -std::cos(rot.y)}; + camera->up = up; + break; + + case Mode::ISO: + camera->pos = pos + ((up + north + east) * 20.F); + camera->forward = -glm::normalize(up + north + east); + camera->up = glm::normalize(up - north - east); + break; + } + + shader->setView(camera->GetViewProjection()); +} |