summaryrefslogtreecommitdiff
path: root/ui
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2025-02-24 01:28:14 +0000
committerDan Goodliffe <dan@randomdan.homeip.net>2025-02-24 01:28:14 +0000
commitef08a08617a1541d8aa1862d8bcfe049dcb57998 (patch)
treeabfcb0e0146a29deead395b0a730acaf8b01dc47 /ui
parentMerge branch 'terrain-deform-2' (diff)
parentNew hardcoded test rail network (diff)
downloadilt-ef08a08617a1541d8aa1862d8bcfe049dcb57998.tar.bz2
ilt-ef08a08617a1541d8aa1862d8bcfe049dcb57998.tar.xz
ilt-ef08a08617a1541d8aa1862d8bcfe049dcb57998.zip
Merge remote-tracking branch 'origin/terrain-for-networks'
Diffstat (limited to 'ui')
-rw-r--r--ui/builders/freeExtend.cpp22
-rw-r--r--ui/builders/freeExtend.h6
-rw-r--r--ui/builders/join.cpp12
-rw-r--r--ui/builders/join.h3
-rw-r--r--ui/builders/straight.cpp11
-rw-r--r--ui/builders/straight.h5
-rw-r--r--ui/editNetwork.cpp17
-rw-r--r--ui/editNetwork.h3
-rw-r--r--ui/gameMainSelector.cpp4
9 files changed, 65 insertions, 18 deletions
diff --git a/ui/builders/freeExtend.cpp b/ui/builders/freeExtend.cpp
index db127e6..ab5a998 100644
--- a/ui/builders/freeExtend.cpp
+++ b/ui/builders/freeExtend.cpp
@@ -38,11 +38,11 @@ BuilderFreeExtend::click(
case SDL_BUTTON_LEFT:
if (p1) {
if (const auto p = network->intersectRayNodes(ray)) {
- network->addJoins(*p1, p->pos);
+ createJoin(network, geoData, *p1, p->pos);
p1 = p->pos;
}
else if (const auto p = geoData->intersectRay(ray)) {
- network->addExtend(*p1, p->first);
+ createExtend(network, geoData, *p1, p->first);
p1 = p->first;
}
}
@@ -57,3 +57,21 @@ BuilderFreeExtend::click(
return;
}
}
+
+Link::CCollection
+BuilderFreeExtend::createJoin(
+ Network * network, const GeoData * geoData, GlobalPosition3D p1, GlobalPosition3D p2) const
+{
+ const auto links = network->addJoins(geoData, p1, p2);
+ setHeightsFor(network, links);
+ return links;
+}
+
+Link::CCollection
+BuilderFreeExtend::createExtend(
+ Network * network, const GeoData * geoData, GlobalPosition3D p1, GlobalPosition3D p2) const
+{
+ const auto links = network->addExtend(geoData, p1, p2);
+ setHeightsFor(network, links);
+ return links;
+}
diff --git a/ui/builders/freeExtend.h b/ui/builders/freeExtend.h
index 0d5f327..6f28493 100644
--- a/ui/builders/freeExtend.h
+++ b/ui/builders/freeExtend.h
@@ -5,11 +5,17 @@ class Network;
class GeoData;
class BuilderFreeExtend : public EditNetwork::Builder {
+private:
std::string hint() const override;
void click(Network * network, const GeoData * geoData, const SDL_MouseButtonEvent & e,
const Ray<GlobalPosition3D> & ray) override;
void move(Network * network, const GeoData * geoData, const SDL_MouseMotionEvent & e,
const Ray<GlobalPosition3D> & ray) override;
+public:
+ Link::CCollection createJoin(Network * network, const GeoData *, GlobalPosition3D, GlobalPosition3D) const;
+ Link::CCollection createExtend(Network * network, const GeoData *, GlobalPosition3D, GlobalPosition3D) const;
+
+private:
std::optional<GlobalPosition3D> p1;
};
diff --git a/ui/builders/join.cpp b/ui/builders/join.cpp
index 7474c5b..6941e23 100644
--- a/ui/builders/join.cpp
+++ b/ui/builders/join.cpp
@@ -25,13 +25,13 @@ BuilderJoin::move(Network * network, const GeoData *, const SDL_MouseMotionEvent
void
BuilderJoin::click(
- Network * network, const GeoData *, const SDL_MouseButtonEvent & e, const Ray<GlobalPosition3D> & ray)
+ Network * network, const GeoData * geoData, const SDL_MouseButtonEvent & e, const Ray<GlobalPosition3D> & ray)
{
switch (e.button) {
case SDL_BUTTON_LEFT:
if (const auto p = network->intersectRayNodes(ray)) {
if (p1) {
- create(network, p1, p);
+ create(network, geoData, p1, p);
p1.reset();
candidateLinks.removeAll();
}
@@ -46,8 +46,10 @@ BuilderJoin::click(
}
}
-void
-BuilderJoin::create(Network * network, const Node::Ptr & p1, const Node::Ptr & p2) const
+Link::CCollection
+BuilderJoin::create(Network * network, const GeoData * geoData, const Node::Ptr & p1, const Node::Ptr & p2) const
{
- network->addJoins(p1->pos, p2->pos);
+ const auto links = network->addJoins(geoData, p1->pos, p2->pos);
+ setHeightsFor(network, links);
+ return links;
}
diff --git a/ui/builders/join.h b/ui/builders/join.h
index dd57895..326d23d 100644
--- a/ui/builders/join.h
+++ b/ui/builders/join.h
@@ -5,13 +5,14 @@ class Network;
class GeoData;
class BuilderJoin : public EditNetwork::Builder {
+private:
std::string hint() const override;
void click(Network * network, const GeoData * geoData, const SDL_MouseButtonEvent & e,
const Ray<GlobalPosition3D> & ray) override;
void move(Network * network, const GeoData * geoData, const SDL_MouseMotionEvent & e,
const Ray<GlobalPosition3D> & ray) override;
- void create(Network * network, const Node::Ptr & p1, const Node::Ptr & p2) const;
+ Link::CCollection create(Network * network, const GeoData *, const Node::Ptr & p1, const Node::Ptr & p2) const;
Node::Ptr p1;
};
diff --git a/ui/builders/straight.cpp b/ui/builders/straight.cpp
index 43f5ec8..338aa8a 100644
--- a/ui/builders/straight.cpp
+++ b/ui/builders/straight.cpp
@@ -1,4 +1,5 @@
#include "straight.h"
+#include "stream_support.h"
#include <game/geoData.h>
std::string
@@ -32,7 +33,7 @@ BuilderStraight::click(
case SDL_BUTTON_LEFT:
if (const auto p = geoData->intersectRay(ray)) {
if (p1) {
- create(network, *p1, p->first);
+ create(network, geoData, *p1, p->first);
candidateLinks.removeAll();
p1.reset();
}
@@ -48,8 +49,10 @@ BuilderStraight::click(
}
}
-void
-BuilderStraight::create(Network * network, GlobalPosition3D p1, GlobalPosition3D p2) const
+Link::CCollection
+BuilderStraight::create(Network * network, const GeoData * geoData, GlobalPosition3D p1, GlobalPosition3D p2) const
{
- network->addStraight(p1, p2);
+ const auto links = network->addStraight(geoData, p1, p2);
+ setHeightsFor(network, links);
+ return links;
}
diff --git a/ui/builders/straight.h b/ui/builders/straight.h
index 28eb66e..0a6f290 100644
--- a/ui/builders/straight.h
+++ b/ui/builders/straight.h
@@ -5,13 +5,16 @@ class Network;
class GeoData;
class BuilderStraight : public EditNetwork::Builder {
+private:
std::string hint() const override;
void click(Network * network, const GeoData * geoData, const SDL_MouseButtonEvent & e,
const Ray<GlobalPosition3D> & ray) override;
void move(Network * network, const GeoData * geoData, const SDL_MouseMotionEvent & e,
const Ray<GlobalPosition3D> & ray) override;
- void create(Network * network, GlobalPosition3D p1, GlobalPosition3D p2) const;
+public:
+ Link::CCollection create(Network * network, const GeoData *, GlobalPosition3D p1, GlobalPosition3D p2) const;
+private:
std::optional<GlobalPosition3D> p1;
};
diff --git a/ui/editNetwork.cpp b/ui/editNetwork.cpp
index ac2d93d..c4c0297 100644
--- a/ui/editNetwork.cpp
+++ b/ui/editNetwork.cpp
@@ -4,7 +4,7 @@
#include "builders/straight.h"
#include "text.h"
#include <game/gamestate.h>
-#include <game/geoData.h>
+#include <game/terrain.h>
#include <gfx/gl/sceneShader.h>
#include <gfx/models/texture.h>
@@ -26,7 +26,7 @@ bool
EditNetwork::click(const SDL_MouseButtonEvent & e, const Ray<GlobalPosition3D> & ray)
{
if (builder && (e.button == SDL_BUTTON_LEFT || e.button == SDL_BUTTON_MIDDLE)) {
- builder->click(network, gameState->geoData.get(), e, ray);
+ builder->click(network, gameState->terrain.get(), e, ray);
return true;
}
return false;
@@ -36,7 +36,7 @@ bool
EditNetwork::move(const SDL_MouseMotionEvent & e, const Ray<GlobalPosition3D> & ray)
{
if (builder) {
- builder->move(network, gameState->geoData.get(), e, ray);
+ builder->move(network, gameState->terrain.get(), e, ray);
}
return false;
}
@@ -64,6 +64,17 @@ EditNetwork::Builder::render(const SceneShader & shader) const
}
void
+EditNetwork::Builder::setHeightsFor(Network * network, const Link::CCollection & links, GeoData::SetHeightsOpts opts)
+{
+ opts.surface = network->getBaseSurface();
+ const auto width = network->getBaseWidth();
+
+ for (const auto & link : links) {
+ gameState->terrain->setHeights(link->getBase(width), opts);
+ }
+}
+
+void
EditNetwork::render(const UIShader & shader, const UIComponent::Position & parentPos) const
{
if (builder) {
diff --git a/ui/editNetwork.h b/ui/editNetwork.h
index ec06fa7..2ae467d 100644
--- a/ui/editNetwork.h
+++ b/ui/editNetwork.h
@@ -1,5 +1,6 @@
#pragma once
+#include "game/geoData.h"
#include "gameMainSelector.h"
#include "modeHelper.h"
#include "toolbar.h"
@@ -30,6 +31,8 @@ public:
virtual void click(Network *, const GeoData *, const SDL_MouseButtonEvent &, const Ray<GlobalPosition3D> &) = 0;
virtual void move(Network *, const GeoData *, const SDL_MouseMotionEvent &, const Ray<GlobalPosition3D> &) = 0;
+ static void setHeightsFor(Network *, const Link::CCollection &, GeoData::SetHeightsOpts = {});
+
using Ptr = std::unique_ptr<Builder>;
protected:
diff --git a/ui/gameMainSelector.cpp b/ui/gameMainSelector.cpp
index 5bef48d..e9642ec 100644
--- a/ui/gameMainSelector.cpp
+++ b/ui/gameMainSelector.cpp
@@ -4,8 +4,8 @@
#include "ui/uiComponent.h"
#include <SDL2/SDL.h>
#include <game/gamestate.h>
-#include <game/geoData.h>
#include <game/selectable.h>
+#include <game/terrain.h>
#include <game/worldobject.h> // IWYU pragma: keep
#include <gfx/gl/camera.h>
#include <optional>
@@ -83,7 +83,7 @@ GameMainSelector::defaultClick(const Ray<GlobalPosition3D> & ray)
const auto & ref = *selected.base()->get();
clicked = typeid(ref).name();
}
- else if (const auto pos = gameState->geoData->intersectRay(ray)) {
+ else if (const auto pos = gameState->terrain->intersectRay(ray)) {
clicked = streamed_string(*pos);
}
else {