From 6545ab33f284cc47488c54add06846b2be42afa8 Mon Sep 17 00:00:00 2001 From: Aaron van Geffen Date: Tue, 10 Sep 2024 12:14:01 +0200 Subject: [PATCH] Unify interface for calling internal map generator --- src/openrct2-ui/windows/MapGen.cpp | 19 +++++++++++++------ src/openrct2/world/MapGen.cpp | 28 +++++++++++++++++++++++++--- src/openrct2/world/MapGen.h | 12 +++++++++--- 3 files changed, 47 insertions(+), 12 deletions(-) diff --git a/src/openrct2-ui/windows/MapGen.cpp b/src/openrct2-ui/windows/MapGen.cpp index 7b51057efa..a0c0ace69a 100644 --- a/src/openrct2-ui/windows/MapGen.cpp +++ b/src/openrct2-ui/windows/MapGen.cpp @@ -311,6 +311,7 @@ namespace OpenRCT2::Ui::Windows MapGenSettings _settings{ // Base + .algorithm = MapGenAlgorithm::blank, .mapSize{ 150, 150 }, .height = 12, .water_level = 6, @@ -464,10 +465,11 @@ namespace OpenRCT2::Ui::Windows case WIDX_MAP_GENERATE: { MapGenSettings mapgenSettings = _settings; + mapgenSettings.algorithm = MapGenAlgorithm::blank; mapgenSettings.height += 2; mapgenSettings.water_level += 2; - MapGenGenerateBlank(&mapgenSettings); + MapGenGenerate(&mapgenSettings); GfxInvalidateScreen(); break; } @@ -593,6 +595,7 @@ namespace OpenRCT2::Ui::Windows case WIDX_RANDOM_GENERATE: { MapGenSettings mapgenSettings = _settings; + mapgenSettings.algorithm = MapGenAlgorithm::simplex; mapgenSettings.height += 2; mapgenSettings.water_level += 2; if (_randomTerrain) @@ -606,7 +609,7 @@ namespace OpenRCT2::Ui::Windows mapgenSettings.simplex_base_freq = 1.75f; mapgenSettings.simplex_octaves = 6; - MapGenGenerateSimplex(&mapgenSettings); + MapGenGenerate(&mapgenSettings); GfxInvalidateScreen(); break; } @@ -658,6 +661,7 @@ namespace OpenRCT2::Ui::Windows case WIDX_SIMPLEX_GENERATE: { MapGenSettings mapgenSettings = _settings; + mapgenSettings.algorithm = MapGenAlgorithm::simplex; mapgenSettings.water_level += kMinimumWaterHeight; mapgenSettings.simplex_base_freq /= 100.00f; if (_randomTerrain) @@ -666,7 +670,7 @@ namespace OpenRCT2::Ui::Windows mapgenSettings.wall = -1; } - MapGenGenerateSimplex(&mapgenSettings); + MapGenGenerate(&mapgenSettings); GfxInvalidateScreen(); break; } @@ -815,9 +819,10 @@ namespace OpenRCT2::Ui::Windows void HeightmapGenerateMap() { MapGenSettings mapgenSettings = _settings; + mapgenSettings.algorithm = MapGenAlgorithm::heightmapImage; mapgenSettings.simplex_low = _heightmapLow; mapgenSettings.simplex_high = _heightmapHigh; - MapGenGenerateFromHeightmapImage(&mapgenSettings); + MapGenGenerate(&mapgenSettings); GfxInvalidateScreen(); } @@ -944,10 +949,11 @@ namespace OpenRCT2::Ui::Windows case WIDX_MAP_GENERATE: { MapGenSettings mapgenSettings = _settings; + mapgenSettings.algorithm = MapGenAlgorithm::blank; mapgenSettings.height += 2; mapgenSettings.water_level += 2; - MapGenGenerateBlank(&mapgenSettings); + MapGenGenerate(&mapgenSettings); GfxInvalidateScreen(); break; } @@ -1173,10 +1179,11 @@ namespace OpenRCT2::Ui::Windows case WIDX_MAP_GENERATE: { MapGenSettings mapgenSettings = _settings; + mapgenSettings.algorithm = MapGenAlgorithm::blank; mapgenSettings.height += 2; mapgenSettings.water_level += 2; - MapGenGenerateBlank(&mapgenSettings); + MapGenGenerate(&mapgenSettings); GfxInvalidateScreen(); break; } diff --git a/src/openrct2/world/MapGen.cpp b/src/openrct2/world/MapGen.cpp index dc6e6d0245..c4aa7c21f9 100644 --- a/src/openrct2/world/MapGen.cpp +++ b/src/openrct2/world/MapGen.cpp @@ -93,6 +93,28 @@ static constexpr std::string_view BaseTerrain[] = { "rct2.terrain_surface.dirt", "rct2.terrain_surface.ice", }; +static void MapGenGenerateBlank(MapGenSettings* settings); +static void MapGenGenerateSimplex(MapGenSettings* settings); +static void MapGenGenerateFromHeightmapImage(MapGenSettings* settings); + +void MapGenGenerate(MapGenSettings* settings) +{ + switch (settings->algorithm) + { + case MapGenAlgorithm::blank: + MapGenGenerateBlank(settings); + break; + + case MapGenAlgorithm::simplex: + MapGenGenerateSimplex(settings); + break; + + case MapGenAlgorithm::heightmapImage: + MapGenGenerateFromHeightmapImage(settings); + break; + } +} + static void MapGenPlaceTrees(); static void MapGenSetWaterLevel(int32_t waterLevel); static void MapGenSmoothHeight(int32_t iterations); @@ -118,7 +140,7 @@ static void SetHeight(int32_t x, int32_t y, int32_t height) _height[x + y * _heightSize.x] = height; } -void MapGenGenerateBlank(MapGenSettings* settings) +static void MapGenGenerateBlank(MapGenSettings* settings) { int32_t x, y; MapClearAllElements(); @@ -142,7 +164,7 @@ void MapGenGenerateBlank(MapGenSettings* settings) MapGenSetWaterLevel(settings->water_level); } -void MapGenGenerateSimplex(MapGenSettings* settings) +static void MapGenGenerateSimplex(MapGenSettings* settings) { const auto& mapSize = settings->mapSize; auto waterLevel = settings->water_level; @@ -796,7 +818,7 @@ static void MapGenSmoothHeightmap(std::vector& src, int32_t strength) } } -void MapGenGenerateFromHeightmapImage(MapGenSettings* settings) +static void MapGenGenerateFromHeightmapImage(MapGenSettings* settings) { Guard::Assert(!_heightMapData.mono_bitmap.empty(), "No height map loaded"); Guard::Assert(settings->simplex_high != settings->simplex_low, "Low and high setting cannot be the same"); diff --git a/src/openrct2/world/MapGen.h b/src/openrct2/world/MapGen.h index 8db921f516..a1fad13579 100644 --- a/src/openrct2/world/MapGen.h +++ b/src/openrct2/world/MapGen.h @@ -12,9 +12,17 @@ #include "../core/StringTypes.h" #include "Location.hpp" +enum class MapGenAlgorithm : uint8_t +{ + blank, + simplex, + heightmapImage, +}; + struct MapGenSettings { // Base + MapGenAlgorithm algorithm; TileCoordsXY mapSize; int32_t height; int32_t water_level; @@ -37,8 +45,6 @@ struct MapGenSettings bool normalize_height; }; -void MapGenGenerateBlank(MapGenSettings* settings); -void MapGenGenerateSimplex(MapGenSettings* settings); +void MapGenGenerate(MapGenSettings* settings); bool MapGenLoadHeightmapImage(const utf8* path); void MapGenUnloadHeightmapImage(); -void MapGenGenerateFromHeightmapImage(MapGenSettings* settings);