summaryrefslogtreecommitdiff
path: root/ui
diff options
context:
space:
mode:
Diffstat (limited to 'ui')
-rw-r--r--ui/applicationBase.cpp1
-rw-r--r--ui/gameMainWindow.cpp23
-rw-r--r--ui/gameMainWindow.h11
-rw-r--r--ui/mainWindow.cpp28
-rw-r--r--ui/mainWindow.h16
-rw-r--r--ui/window.cpp53
-rw-r--r--ui/window.h29
-rw-r--r--ui/windowContent.cpp32
-rw-r--r--ui/windowContent.h26
9 files changed, 143 insertions, 76 deletions
diff --git a/ui/applicationBase.cpp b/ui/applicationBase.cpp
index 3fa6e2b..c3134b4 100644
--- a/ui/applicationBase.cpp
+++ b/ui/applicationBase.cpp
@@ -35,6 +35,7 @@ ApplicationBase::initSDL() const
void
ApplicationBase::initImGUI() const
{
+ puts(__PRETTY_FUNCTION__);
// Setup Dear ImGui context
IMGUI_CHECKVERSION();
ImGui::CreateContext();
diff --git a/ui/gameMainWindow.cpp b/ui/gameMainWindow.cpp
index 8e93694..6168504 100644
--- a/ui/gameMainWindow.cpp
+++ b/ui/gameMainWindow.cpp
@@ -16,12 +16,6 @@
#include <glm/glm.hpp>
#include <memory>
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wold-style-cast"
-#include "backends/imgui_impl_opengl3.h"
-#include "backends/imgui_impl_sdl2.h"
-#pragma GCC diagnostic pop
-
class GameMainToolbar : Mode<decltype(GameMainSelector::target)>, public Toolbar {
public:
explicit GameMainToolbar(GameMainSelector * gms_) :
@@ -33,22 +27,14 @@ public:
}
};
-GameMainWindow::GameMainWindow(size_t w, size_t h) :
- Window {w, h, "I Like Trains", SDL_WINDOW_OPENGL}, SceneRenderer {Window::size, 0}
+GameMainWindow::GameMainWindow(size_t w, size_t h) : WindowContent {w, h}, SceneRenderer {{w, h}, 0}
{
- ImGui_ImplSDL2_InitForOpenGL(m_window, glContext.get());
- ImGui_ImplOpenGL3_Init();
-
uiComponents.create<ManualCameraController>(glm::vec2 {310'727'624, 494'018'810});
auto gms = uiComponents.create<GameMainSelector>(&camera, ScreenAbsCoord {w, h});
uiComponents.create<GameMainToolbar>(gms.get());
}
-GameMainWindow::~GameMainWindow()
-{
- ImGui_ImplOpenGL3_Shutdown();
- ImGui_ImplSDL2_Shutdown();
-}
+GameMainWindow::~GameMainWindow() { }
void
GameMainWindow::tick(TickDuration)
@@ -60,7 +46,10 @@ void
GameMainWindow::render() const
{
SceneRenderer::render(*this);
- Window::render();
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glDisable(GL_DEPTH_TEST);
+ uiComponents.apply(&UIComponent::render, uiShader, UIComponent::Position {});
}
void
diff --git a/ui/gameMainWindow.h b/ui/gameMainWindow.h
index 594843d..fcbd135 100644
--- a/ui/gameMainWindow.h
+++ b/ui/gameMainWindow.h
@@ -2,21 +2,20 @@
#include "chronology.h"
#include "gfx/gl/sceneRenderer.h"
-#include "window.h"
+#include "windowContent.h"
#include <cstddef>
-class GameMainWindow : public Window, SceneRenderer, public SceneProvider {
+class GameMainWindow : public WindowContent, SceneRenderer, public SceneProvider {
public:
GameMainWindow(size_t w, size_t h);
~GameMainWindow() override;
- void tick(TickDuration) override;
-
- void render() const override;
-
NO_MOVE(GameMainWindow);
NO_COPY(GameMainWindow);
+ void tick(TickDuration) override;
+ void render() const override;
+
private:
void content(const SceneShader &) const override;
void environment(const SceneShader &, const SceneRenderer &) const override;
diff --git a/ui/mainWindow.cpp b/ui/mainWindow.cpp
new file mode 100644
index 0000000..830dba5
--- /dev/null
+++ b/ui/mainWindow.cpp
@@ -0,0 +1,28 @@
+#include "mainWindow.h"
+#include <format>
+#include <stdexcept>
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wold-style-cast"
+#include "backends/imgui_impl_opengl3.h"
+#include "backends/imgui_impl_sdl2.h"
+#pragma GCC diagnostic pop
+
+MainWindow::MainWindow(size_t w, size_t h) : MainWindow {w, h, "I Like Trains", SDL_WINDOW_OPENGL} { }
+
+MainWindow::MainWindow(size_t w, size_t h, const std::string & title, Uint32 flags) : Window {w, h, title, flags}
+{
+ puts(__PRETTY_FUNCTION__);
+ if (const auto version = gladLoadGL(reinterpret_cast<GLADloadfunc>(SDL_GL_GetProcAddress)); version < 30003) {
+ throw std::runtime_error {std::format("Insufficient OpenGL version: {}", version)};
+ }
+
+ ImGui_ImplSDL2_InitForOpenGL(m_window, glContext.get());
+ ImGui_ImplOpenGL3_Init();
+}
+
+MainWindow::~MainWindow()
+{
+ ImGui_ImplOpenGL3_Shutdown();
+ ImGui_ImplSDL2_Shutdown();
+}
diff --git a/ui/mainWindow.h b/ui/mainWindow.h
new file mode 100644
index 0000000..fe26c5c
--- /dev/null
+++ b/ui/mainWindow.h
@@ -0,0 +1,16 @@
+#pragma once
+
+#include "window.h"
+#include <cstddef>
+
+class MainWindow : public Window {
+public:
+ MainWindow(size_t w, size_t h);
+ ~MainWindow() override;
+
+ NO_MOVE(MainWindow);
+ NO_COPY(MainWindow);
+
+protected:
+ MainWindow(size_t width, size_t height, const std::string & title, Uint32 flags);
+};
diff --git a/ui/window.cpp b/ui/window.cpp
index dd488d7..8ceaf49 100644
--- a/ui/window.cpp
+++ b/ui/window.cpp
@@ -1,28 +1,12 @@
#include "window.h"
-#include "uiComponent.h"
-#include <format>
#include <glad/gl.h>
#include <glm/glm.hpp>
-#include <stdexcept>
-
-Window::GLInitHelper::GLInitHelper()
-{
- [[maybe_unused]] static auto init = []() {
- // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
- if (const auto version = gladLoadGL(reinterpret_cast<GLADloadfunc>(SDL_GL_GetProcAddress)); version < 30003) {
- throw std::runtime_error {std::format("Insufficient OpenGL version: {}", version)};
- }
- else {
- return version;
- }
- }();
-}
Window::Window(size_t width, size_t height, const std::string & title, Uint32 flags) :
size {static_cast<int>(width), static_cast<int>(height)},
m_window {title.c_str(), static_cast<int>(SDL_WINDOWPOS_CENTERED), static_cast<int>(SDL_WINDOWPOS_CENTERED), size.x,
size.y, flags},
- glContext {m_window}, uiShader {width, height}
+ glContext {m_window}
{
}
@@ -39,23 +23,21 @@ Window::swapBuffers() const
SDL_GL_SwapWindow(m_window);
}
+void
+Window::tick(TickDuration elapsed)
+{
+ if (content) {
+ content->tick(elapsed);
+ }
+}
+
bool
Window::handleInput(const SDL_Event & e)
{
if (SDL_GetWindowID(m_window) == e.window.windowID) {
- SDL_Event eAdjusted {e};
- switch (e.type) {
- // SDL and OpenGL have coordinates that are vertically opposed.
- case SDL_MOUSEBUTTONDOWN:
- case SDL_MOUSEBUTTONUP:
- eAdjusted.button.y = size.y - e.button.y;
- break;
- case SDL_MOUSEMOTION:
- eAdjusted.motion.y = size.y - e.motion.y;
- break;
+ if (content) {
+ return content->handleInput(e);
}
- uiComponents.rapplyOne(&UIComponent::handleInput, eAdjusted, UIComponent::Position {{}, size});
- return true;
}
return false;
}
@@ -66,16 +48,9 @@ Window::refresh() const
SDL_GL_MakeCurrent(m_window, glContext);
clear(0.0F, 0.0F, 0.0F, 1.0F);
- render();
+ if (content) {
+ content->render();
+ }
swapBuffers();
}
-
-void
-Window::render() const
-{
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glDisable(GL_DEPTH_TEST);
- uiComponents.apply(&UIComponent::render, uiShader, UIComponent::Position {});
-}
diff --git a/ui/window.h b/ui/window.h
index 8f2b70b..62c34de 100644
--- a/ui/window.h
+++ b/ui/window.h
@@ -1,13 +1,12 @@
#pragma once
#include "chronology.h"
-#include "collection.h"
-#include "gfx/gl/uiShader.h"
+#include "config/types.h"
#include "ptr.h"
-#include "uiComponent.h" // IWYU pragma: keep
+#include "special_members.h"
+#include "windowContent.h"
#include <SDL2/SDL.h>
#include <cstddef>
-#include <special_members.h>
#include <string>
using SDL_WindowPtr = wrapped_ptrt<SDL_Window, SDL_CreateWindow, SDL_DestroyWindow>;
@@ -22,24 +21,26 @@ public:
NO_COPY(Window);
NO_MOVE(Window);
- virtual void tick(TickDuration elapsed) = 0;
+ template<typename C, typename... P>
+ void
+ setContent(P &&... p)
+ {
+ glm::ivec2 size {};
+ SDL_GetWindowSizeInPixels(m_window, &size.x, &size.y);
+ content = std::make_unique<C>(size.x, size.y, std::forward<P>(p)...);
+ }
+
+ void tick(TickDuration elapsed);
void refresh() const;
bool handleInput(const SDL_Event & e);
- void clear(float r, float g, float b, float a) const;
void swapBuffers() const;
protected:
- virtual void render() const;
-
- struct GLInitHelper {
- GLInitHelper();
- };
+ void clear(float r, float g, float b, float a) const;
const ScreenAbsCoord size;
SDL_WindowPtr m_window;
SDL_GLContextPtr glContext;
- GLInitHelper glInithelper;
- Collection<UIComponent> uiComponents;
- UIShader uiShader;
+ WindowContent::Ptr content;
};
diff --git a/ui/windowContent.cpp b/ui/windowContent.cpp
new file mode 100644
index 0000000..91732a7
--- /dev/null
+++ b/ui/windowContent.cpp
@@ -0,0 +1,32 @@
+#include "windowContent.h"
+#include "SDL_events.h"
+
+WindowContent::WindowContent(size_t width, size_t height) : uiShader {width, height} { }
+
+void
+WindowContent::tick(TickDuration)
+{
+}
+
+bool
+WindowContent::handleInput(const SDL_Event & e)
+{
+ SDL_Event eAdjusted {e};
+ const auto size = [&e] {
+ glm::ivec2 size {};
+ SDL_GetWindowSizeInPixels(SDL_GetWindowFromID(e.window.windowID), &size.x, &size.y);
+ return size;
+ }();
+ switch (e.type) {
+ // SDL and OpenGL have coordinates that are vertically opposed.
+ case SDL_MOUSEBUTTONDOWN:
+ case SDL_MOUSEBUTTONUP:
+ eAdjusted.button.y = size.y - e.button.y;
+ break;
+ case SDL_MOUSEMOTION:
+ eAdjusted.motion.y = size.y - e.motion.y;
+ break;
+ }
+ uiComponents.rapplyOne(&UIComponent::handleInput, eAdjusted, UIComponent::Position {{}, size});
+ return true;
+}
diff --git a/ui/windowContent.h b/ui/windowContent.h
new file mode 100644
index 0000000..474445a
--- /dev/null
+++ b/ui/windowContent.h
@@ -0,0 +1,26 @@
+#pragma once
+
+#include "chronology.h"
+#include "collection.h"
+#include "gfx/gl/uiShader.h"
+#include "special_members.h"
+#include "stdTypeDefs.h"
+#include "uiComponent.h" // IWYU pragma: keep
+#include <functional>
+
+class WindowContent : public StdTypeDefs<WindowContent> {
+public:
+ using Factory = std::function<Ptr(size_t width, size_t height)>;
+ WindowContent(size_t width, size_t height);
+ virtual ~WindowContent() = default;
+ NO_MOVE(WindowContent);
+ NO_COPY(WindowContent);
+
+ virtual void tick(TickDuration);
+ virtual void render() const = 0;
+ virtual bool handleInput(const SDL_Event & e);
+
+protected:
+ ::Collection<UIComponent> uiComponents;
+ UIShader uiShader;
+};