diff options
Diffstat (limited to 'gfx')
-rw-r--r-- | gfx/inputHandler.h | 18 | ||||
-rw-r--r-- | gfx/manualCameraController.cpp | 65 | ||||
-rw-r--r-- | gfx/manualCameraController.h | 25 |
3 files changed, 108 insertions, 0 deletions
diff --git a/gfx/inputHandler.h b/gfx/inputHandler.h new file mode 100644 index 0000000..5b426c7 --- /dev/null +++ b/gfx/inputHandler.h @@ -0,0 +1,18 @@ +#ifndef INPUT_HANDLER_H +#define INPUT_HANDLER_H + +#include <special_members.hpp> + +union SDL_Event; + +class InputHandler { +public: + InputHandler() = default; + virtual ~InputHandler() = default; + + DEFAULT_MOVE_COPY(InputHandler); + + virtual bool handleInput(SDL_Event &) = 0; +}; + +#endif diff --git a/gfx/manualCameraController.cpp b/gfx/manualCameraController.cpp new file mode 100644 index 0000000..36f3312 --- /dev/null +++ b/gfx/manualCameraController.cpp @@ -0,0 +1,65 @@ +#include "manualCameraController.h" +#include <gfx/gl/camera.h> +#include <gfx/gl/shader.h> + +bool +ManualCameraController::handleInput(SDL_Event & e) +{ + switch (e.type) { + case SDL_KEYDOWN: + switch (e.key.keysym.sym) { + case SDLK_LCTRL: + case SDLK_RCTRL: + ctrl = true; + return true; + } + break; + case SDL_KEYUP: + switch (e.key.keysym.sym) { + case SDLK_LCTRL: + case SDLK_RCTRL: + ctrl = false; + return true; + } + break; + case SDL_MOUSEBUTTONDOWN: + switch (e.button.button) { + case SDL_BUTTON_RIGHT: + SDL_SetRelativeMouseMode(SDL_TRUE); + mrb = true; + return true; + } + break; + case SDL_MOUSEBUTTONUP: + switch (e.button.button) { + case SDL_BUTTON_RIGHT: + SDL_SetRelativeMouseMode(SDL_FALSE); + mrb = false; + return true; + } + break; + case SDL_MOUSEMOTION: + if (mrb) { + motion = e.motion; + } + return true; + } + return false; +} + +void +ManualCameraController::updateCamera(Camera * camera, Shader * shader) 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); + } + shader->setView(camera->GetViewProjection()); + motion.reset(); + } +} diff --git a/gfx/manualCameraController.h b/gfx/manualCameraController.h new file mode 100644 index 0000000..112ec5c --- /dev/null +++ b/gfx/manualCameraController.h @@ -0,0 +1,25 @@ +#ifndef MANUAL_CAMERA_CONTROLLER_H +#define MANUAL_CAMERA_CONTROLLER_H + +#include "game/worldobject.h" +#include "inputHandler.h" +#include <SDL2/SDL.h> +#include <gfx/camera_controller.h> +#include <optional> + +class Camera; +class Shader; + +class ManualCameraController : public CameraController, public InputHandler { +public: + bool handleInput(SDL_Event & e) override; + + void tick(TickDuration) override { } + + void updateCamera(Camera * camera, Shader * shader) const override; + +private: + bool ctrl {false}, mrb {false}; + mutable std::optional<SDL_MouseMotionEvent> motion; +}; +#endif |