summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2024-10-20 21:55:00 +0100
committerDan Goodliffe <dan@randomdan.homeip.net>2024-10-20 21:55:00 +0100
commitf84a4771f3efe642c0946ccd94a52ede27f1d997 (patch)
tree390b50883fd84e01bfa1dc4e4e2714d37e0838f2
parentMove lots of maths helpers to inline, constexpr, templates (diff)
downloadilt-f84a4771f3efe642c0946ccd94a52ede27f1d997.tar.bz2
ilt-f84a4771f3efe642c0946ccd94a52ede27f1d997.tar.xz
ilt-f84a4771f3efe642c0946ccd94a52ede27f1d997.zip
Randomise for many trees, positions, rotations
-rw-r--r--application/main.cpp13
-rw-r--r--test/test-render.cpp33
2 files changed, 36 insertions, 10 deletions
diff --git a/application/main.cpp b/application/main.cpp
index d58cf6d..db42a63 100644
--- a/application/main.cpp
+++ b/application/main.cpp
@@ -24,6 +24,7 @@
#include <glm/glm.hpp>
#include <glm/gtx/transform.hpp> // IWYU pragma: keep
#include <memory>
+#include <random>
#include <special_members.h>
#include <ui/applicationBase.h>
#include <ui/gameMainWindow.h>
@@ -79,10 +80,18 @@ public:
&train->orders, l3->ends[1], l3->length, rl->findNodeAt({-1100000, -450000, 15000}));
train->currentActivity = train->orders.current()->createActivity();
- auto foliage = std::dynamic_pointer_cast<Foliage>(assets.at("Tree-01-1"));
+ std::random_device randomdev {};
+ std::uniform_real_distribution<Angle> rotationDistribution {0, two_pi};
+ std::uniform_int_distribution<GlobalDistance> positionOffsetDistribution {-1500, +1500};
+ std::uniform_int_distribution<int> treeDistribution {1, 3};
+ std::uniform_int_distribution<int> treeVariantDistribution {1, 4};
for (auto x = 311000000; x < 311830000; x += 5000) {
for (auto y = 491100000; y < 491130000; y += 5000) {
- world.create<Plant>(foliage, Location {geoData->positionAt({{x, y}})});
+ world.create<Plant>(std::dynamic_pointer_cast<Foliage>(assets.at(std::format("Tree-{:#02}-{}",
+ treeDistribution(randomdev), treeVariantDistribution(randomdev)))),
+ Location {geoData->positionAt({{x + positionOffsetDistribution(randomdev),
+ y + positionOffsetDistribution(randomdev)}}),
+ {0, rotationDistribution(randomdev), 0}});
}
}
}
diff --git a/test/test-render.cpp b/test/test-render.cpp
index 775eb5c..3966f28 100644
--- a/test/test-render.cpp
+++ b/test/test-render.cpp
@@ -28,9 +28,7 @@
class TestScene : public SceneProvider {
RailVehicleClassPtr brush47rvc;
- std::shared_ptr<Foliage> tree021f;
std::shared_ptr<RailVehicle> train1, train2;
- std::shared_ptr<Plant> plant1;
RailLinks rail;
std::shared_ptr<GeoData> gd = std::make_shared<GeoData>(GeoData::createFlat({0, 0}, {1000000, 1000000}, 1));
std::shared_ptr<Environment> env = std::make_shared<Environment>();
@@ -43,7 +41,11 @@ public:
{
gameState->assets = AssetFactory::loadAll(RESDIR);
brush47rvc = std::dynamic_pointer_cast<RailVehicleClass>(gameState->assets.at("brush-47"));
- tree021f = std::dynamic_pointer_cast<Foliage>(gameState->assets.at("Tree-02-1"));
+ std::random_device randomdev {};
+ std::uniform_real_distribution<Angle> rotationDistribution {0, two_pi};
+ std::uniform_int_distribution<GlobalDistance> positionOffsetDistribution {-1500, +1500};
+ std::uniform_int_distribution<int> treeDistribution {1, 3};
+ std::uniform_int_distribution<int> treeVariantDistribution {1, 4};
train1 = std::make_shared<RailVehicle>(brush47rvc);
train1->location.setPosition({52000, 50000, 2000});
train1->bogies.front().setPosition(train1->bogies.front().position() + train1->location.position());
@@ -52,7 +54,16 @@ public:
train2->location.setPosition({52000, 30000, 2000});
train2->bogies.front().setPosition(train2->bogies.front().position() + train2->location.position());
train2->bogies.back().setPosition(train2->bogies.back().position() + train2->location.position());
- plant1 = std::make_shared<Plant>(tree021f, Location {{40000, 60000, 1}, {}});
+ for (auto x = 40000; x < 100000; x += 5000) {
+ for (auto y = 65000; y < 125000; y += 5000) {
+ gameState->world.create<Plant>(
+ std::dynamic_pointer_cast<Foliage>(gameState->assets.at(std::format(
+ "Tree-{:#02}-{}", treeDistribution(randomdev), treeVariantDistribution(randomdev)))),
+ Location {{x + positionOffsetDistribution(randomdev), y + positionOffsetDistribution(randomdev),
+ 1},
+ {0, rotationDistribution(randomdev), 0}});
+ }
+ }
rail.addLinksBetween({42000, 50000, 1000}, {65000, 50000, 1000});
rail.addLinksBetween({65000, 50000, 1000}, {75000, 45000, 2000});
}
@@ -62,9 +73,12 @@ public:
{
terrain.render(shader);
water.render(shader);
- brush47rvc->render(shader);
- tree021f->render(shader);
rail.render(shader);
+ std::ranges::for_each(gameState->assets, [&shader](const auto & asset) {
+ if (const auto renderable = std::dynamic_pointer_cast<const Renderable>(asset.second)) {
+ renderable->render(shader);
+ }
+ });
}
void
@@ -82,8 +96,11 @@ public:
shadows(const ShadowMapper & shadowMapper) const override
{
terrain.shadows(shadowMapper);
- brush47rvc->shadows(shadowMapper);
- tree021f->shadows(shadowMapper);
+ std::ranges::for_each(gameState->assets, [&shadowMapper](const auto & asset) {
+ if (const auto renderable = std::dynamic_pointer_cast<const Renderable>(asset.second)) {
+ renderable->shadows(shadowMapper);
+ }
+ });
}
};