summaryrefslogtreecommitdiff
path: root/ui
diff options
context:
space:
mode:
Diffstat (limited to 'ui')
-rw-r--r--ui/builders/freeExtend.cpp8
-rw-r--r--ui/builders/join.cpp6
-rw-r--r--ui/builders/straight.cpp8
-rw-r--r--ui/editNetwork.h2
-rw-r--r--ui/gameMainWindow.cpp39
-rw-r--r--ui/gameMainWindow.h2
-rw-r--r--ui/mainApplication.h2
-rw-r--r--ui/mainWindow.cpp5
-rw-r--r--ui/toolbar.h2
-rw-r--r--ui/windowContent.h2
10 files changed, 50 insertions, 26 deletions
diff --git a/ui/builders/freeExtend.cpp b/ui/builders/freeExtend.cpp
index ab5a998..aff7cd7 100644
--- a/ui/builders/freeExtend.cpp
+++ b/ui/builders/freeExtend.cpp
@@ -16,17 +16,17 @@ BuilderFreeExtend::move(
{
if (p1) {
if (const auto p = network->intersectRayNodes(ray)) {
- candidateLinks.objects = network->candidateJoins(*p1, p->pos);
+ candidateLinks = network->candidateJoins(*p1, p->pos);
}
else if (const auto p = geoData->intersectRay(ray)) {
- candidateLinks.objects = network->candidateExtend(*p1, p->first);
+ candidateLinks = network->candidateExtend(*p1, p->first);
}
else {
- candidateLinks.removeAll();
+ candidateLinks.clear();
}
}
else {
- candidateLinks.removeAll();
+ candidateLinks.clear();
}
}
diff --git a/ui/builders/join.cpp b/ui/builders/join.cpp
index 6941e23..f6cbce5 100644
--- a/ui/builders/join.cpp
+++ b/ui/builders/join.cpp
@@ -15,10 +15,10 @@ BuilderJoin::move(Network * network, const GeoData *, const SDL_MouseMotionEvent
{
if (p1) {
if (const auto p = network->intersectRayNodes(ray)) {
- candidateLinks.objects = network->candidateJoins(p1->pos, p->pos);
+ candidateLinks = network->candidateJoins(p1->pos, p->pos);
}
else {
- candidateLinks.removeAll();
+ candidateLinks.clear();
}
}
}
@@ -33,7 +33,7 @@ BuilderJoin::click(
if (p1) {
create(network, geoData, p1, p);
p1.reset();
- candidateLinks.removeAll();
+ candidateLinks.clear();
}
else {
p1 = p;
diff --git a/ui/builders/straight.cpp b/ui/builders/straight.cpp
index 338aa8a..e7d83b5 100644
--- a/ui/builders/straight.cpp
+++ b/ui/builders/straight.cpp
@@ -17,10 +17,10 @@ BuilderStraight::move(
{
if (p1) {
if (const auto p = geoData->intersectRay(ray)) {
- candidateLinks.objects = network->candidateStraight(*p1, p->first);
+ candidateLinks = network->candidateStraight(*p1, p->first);
}
else {
- candidateLinks.removeAll();
+ candidateLinks.clear();
}
}
}
@@ -34,7 +34,7 @@ BuilderStraight::click(
if (const auto p = geoData->intersectRay(ray)) {
if (p1) {
create(network, geoData, *p1, p->first);
- candidateLinks.removeAll();
+ candidateLinks.clear();
p1.reset();
}
else {
@@ -44,7 +44,7 @@ BuilderStraight::click(
return;
case SDL_BUTTON_MIDDLE:
p1.reset();
- candidateLinks.removeAll();
+ candidateLinks.clear();
return;
}
}
diff --git a/ui/editNetwork.h b/ui/editNetwork.h
index ae887bd..2fc102a 100644
--- a/ui/editNetwork.h
+++ b/ui/editNetwork.h
@@ -36,7 +36,7 @@ public:
using Ptr = std::unique_ptr<Builder>;
protected:
- Collection<const Link> candidateLinks;
+ SharedCollection<const Link> candidateLinks;
};
private:
diff --git a/ui/gameMainWindow.cpp b/ui/gameMainWindow.cpp
index f63137c..f8c568b 100644
--- a/ui/gameMainWindow.cpp
+++ b/ui/gameMainWindow.cpp
@@ -32,7 +32,7 @@ GameMainWindow::GameMainWindow(size_t w, size_t h) : WindowContent {w, h}, Scene
{
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());
+ uiComponents.create<GameMainToolbar>(gms);
}
GameMainWindow::~GameMainWindow() { }
@@ -43,6 +43,25 @@ GameMainWindow::tick(TickDuration)
uiComponents.apply<CameraController>(&CameraController::updateCamera, &camera);
}
+bool
+GameMainWindow::handleInput(const SDL_Event & event)
+{
+ switch (event.type) {
+ case SDL_WINDOWEVENT:
+ switch (event.window.event) {
+ case SDL_WINDOWEVENT_RESIZED:
+ SceneRenderer::resize({event.window.data1, event.window.data2});
+ break;
+ default:
+ break;
+ }
+ default:
+ break;
+ }
+
+ return WindowContent::handleInput(event);
+}
+
void
GameMainWindow::render() const
{
@@ -56,12 +75,12 @@ GameMainWindow::render() const
void
GameMainWindow::content(const SceneShader & shader, const Frustum & frustum) const
{
- for (const auto & [id, asset] : gameState->assets) {
- if (const auto r = std::dynamic_pointer_cast<const Renderable>(asset)) {
- r->render(shader, frustum);
+ for (const auto & [assetId, asset] : gameState->assets) {
+ if (const auto renderable = asset.getAs<const Renderable>()) {
+ renderable->render(shader, frustum);
}
}
- gameState->world.apply<Renderable>(&Renderable::render, shader, frustum);
+ gameState->world.apply<const Renderable>(&Renderable::render, shader, frustum);
uiComponents.apply<WorldOverlay>(&WorldOverlay::render, shader, frustum);
}
@@ -74,16 +93,16 @@ GameMainWindow::environment(const SceneShader &, const SceneRenderer & r) const
void
GameMainWindow::lights(const SceneShader & shader) const
{
- gameState->world.apply<Renderable>(&Renderable::lights, shader);
+ gameState->world.apply<const Renderable>(&Renderable::lights, shader);
}
void
GameMainWindow::shadows(const ShadowMapper & shadowMapper, const Frustum & frustum) const
{
- for (const auto & [id, asset] : gameState->assets) {
- if (const auto r = std::dynamic_pointer_cast<const Renderable>(asset)) {
- r->shadows(shadowMapper, frustum);
+ for (const auto & [assetId, asset] : gameState->assets) {
+ if (const auto renderable = asset.getAs<const Renderable>()) {
+ renderable->shadows(shadowMapper, frustum);
}
}
- gameState->world.apply<Renderable>(&Renderable::shadows, shadowMapper, frustum);
+ gameState->world.apply<const Renderable>(&Renderable::shadows, shadowMapper, frustum);
}
diff --git a/ui/gameMainWindow.h b/ui/gameMainWindow.h
index 43980e8..b0f1592 100644
--- a/ui/gameMainWindow.h
+++ b/ui/gameMainWindow.h
@@ -17,6 +17,8 @@ public:
void render() const override;
private:
+ bool handleInput(const SDL_Event &) override;
+
void content(const SceneShader &, const Frustum &) const override;
void environment(const SceneShader &, const SceneRenderer &) const override;
void lights(const SceneShader &) const override;
diff --git a/ui/mainApplication.h b/ui/mainApplication.h
index a6cb126..1489587 100644
--- a/ui/mainApplication.h
+++ b/ui/mainApplication.h
@@ -6,7 +6,7 @@
class MainApplication : public ApplicationBase {
public:
- using Windows = Collection<Window>;
+ using Windows = SharedCollection<Window>;
void mainLoop();
protected:
diff --git a/ui/mainWindow.cpp b/ui/mainWindow.cpp
index 38d6a6e..73c0b5b 100644
--- a/ui/mainWindow.cpp
+++ b/ui/mainWindow.cpp
@@ -8,7 +8,10 @@
#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) :
+ MainWindow {w, h, "I Like Trains", SDL_WINDOW_RESIZABLE | SDL_WINDOW_OPENGL}
+{
+}
MainWindow::MainWindow(size_t w, size_t h, const std::string & title, Uint32 flags) : Window {w, h, title, flags}
{
diff --git a/ui/toolbar.h b/ui/toolbar.h
index ea560f5..b0480e2 100644
--- a/ui/toolbar.h
+++ b/ui/toolbar.h
@@ -19,5 +19,5 @@ public:
bool handleInput(const SDL_Event & e, const Position & parentPos) override;
- Collection<IconButton, false> icons;
+ UniqueCollection<IconButton> icons;
};
diff --git a/ui/windowContent.h b/ui/windowContent.h
index 474445a..5437da6 100644
--- a/ui/windowContent.h
+++ b/ui/windowContent.h
@@ -21,6 +21,6 @@ public:
virtual bool handleInput(const SDL_Event & e);
protected:
- ::Collection<UIComponent> uiComponents;
+ UniqueCollection<UIComponent> uiComponents;
UIShader uiShader;
};