From de9909df038d1b6bb47bcc82fea5f8dc9dec2491 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Tue, 28 Dec 2021 15:42:50 +0000 Subject: Initial implementation for being able to click in the main window to select something --- ui/gameMainWindow.cpp | 45 +++++++++++++++++++++++++++++++++++++++++-- ui/gameMainWindow.h | 2 +- ui/manualCameraController.cpp | 12 ++++++++++++ 3 files changed, 56 insertions(+), 3 deletions(-) (limited to 'ui') diff --git a/ui/gameMainWindow.cpp b/ui/gameMainWindow.cpp index e1d9763..41d55da 100644 --- a/ui/gameMainWindow.cpp +++ b/ui/gameMainWindow.cpp @@ -3,15 +3,20 @@ #include "manualCameraController.h" #include "maths.h" #include "toolbar.h" +#include "ui/uiComponent.h" #include "window.h" #include #include #include #include +#include #include // IWYU pragma: keep #include #include #include +#include + +class UIShader; class GameMainToolbar : public Toolbar { public: @@ -26,9 +31,45 @@ public: } }; -GameMainWindow::GameMainWindow(size_t w, size_t h) : - Window {w, h, "I Like Trains"}, camera {{-1250.0F, -1250.0F, 35.0F}, 70.0F, rdiv(w, h), 0.1F, 10000.0F} +class GameMainSelector : public UIComponent { +public: + GameMainSelector(const Camera * c, glm::vec2 size, const GameState * gs) : + UIComponent {{{}, size}}, camera {c}, gameState {gs} + { + } + + void + render(const UIShader &, const Position &) const override + { + } + + bool + handleInput(const SDL_Event & e, const Position &) override + { + switch (e.type) { + case SDL_MOUSEBUTTONDOWN: + if (e.button.button == SDL_BUTTON_LEFT) { + const auto mouse = glm::vec2 {e.button.x, e.button.y} / position.size; + + glm::vec2 baryPos {}; + float eh; + + std::ignore = gameState->world.applyOne( + &Selectable::intersectRay, camera->pos, camera->unProject(mouse), &baryPos, &eh); + } + } + return false; + } + +private: + const Camera * camera; + const GameState * gameState; +}; + +GameMainWindow::GameMainWindow(size_t w, size_t h, const GameState * gameState) : + Window {w, h, "I Like Trains"}, camera {{-1250.0F, -1250.0F, 35.0F}, quarter_pi, rdiv(w, h), 0.1F, 10000.0F} { + uiComponents.create(&camera, glm::vec2 {w, h}, gameState); uiComponents.create(); uiComponents.create(glm::vec2 {-1150, -1150}); diff --git a/ui/gameMainWindow.h b/ui/gameMainWindow.h index 8b88f11..b85b8a8 100644 --- a/ui/gameMainWindow.h +++ b/ui/gameMainWindow.h @@ -11,7 +11,7 @@ class GameState; class GameMainWindow : public Window { public: - GameMainWindow(size_t w, size_t h); + GameMainWindow(size_t w, size_t h, const GameState *); void tick(TickDuration) override; diff --git a/ui/manualCameraController.cpp b/ui/manualCameraController.cpp index 568c547..74b526b 100644 --- a/ui/manualCameraController.cpp +++ b/ui/manualCameraController.cpp @@ -22,6 +22,18 @@ ManualCameraController::handleInput(const SDL_Event & e, const Position &) case SDLK_RCTRL: ctrl = false; return true; + case SDLK_KP_8: + direction = 0; + break; + case SDLK_KP_4: + direction = -half_pi; + break; + case SDLK_KP_6: + direction = half_pi; + break; + case SDLK_KP_2: + direction = pi; + break; } break; case SDL_MOUSEBUTTONDOWN: -- cgit v1.2.3