diff options
Diffstat (limited to 'gfx')
-rw-r--r-- | gfx/followCameraController.cpp | 42 | ||||
-rw-r--r-- | gfx/followCameraController.h | 24 |
2 files changed, 66 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()); +} diff --git a/gfx/followCameraController.h b/gfx/followCameraController.h new file mode 100644 index 0000000..d57b59f --- /dev/null +++ b/gfx/followCameraController.h @@ -0,0 +1,24 @@ +#ifndef FOLLOW_CAMERA_CONTROLLER_H +#define FOLLOW_CAMERA_CONTROLLER_H + +#include "game/worldobject.h" +#include <game/vehicles/vehicle.h> +#include <gfx/camera_controller.h> + +class Camera; +class Shader; + +class FollowCameraController : public CameraController { +public: + enum class Mode { Pan, Ride, ISO }; + explicit FollowCameraController(VehicleWPtr, Mode = Mode::Pan); + + void tick(TickDuration) override { } + + void updateCamera(Camera * camera, Shader * shader) const override; + +private: + VehicleWPtr target; + Mode mode; +}; +#endif |