From d45e5da8ca808e552123bcd94e76b0b435a6ea79 Mon Sep 17 00:00:00 2001 From: paramat Date: Fri, 22 Sep 2017 12:38:55 +0100 Subject: Biomes: Add 'get heat', 'get humidity', 'get biome data' APIs 'get biome data' returns biome id, heat and humidity. Clean up nearby lines in lua_api.txt. --- src/mapgen/mg_biome.cpp | 60 ++++++++++++++++++++++++++++++++++++++++++++++++- src/mapgen/mg_biome.h | 7 ++++++ 2 files changed, 66 insertions(+), 1 deletion(-) (limited to 'src/mapgen') diff --git a/src/mapgen/mg_biome.cpp b/src/mapgen/mg_biome.cpp index b562084e3..2273be280 100644 --- a/src/mapgen/mg_biome.cpp +++ b/src/mapgen/mg_biome.cpp @@ -84,8 +84,66 @@ void BiomeManager::clear() m_objects.resize(1); } -//////////////////////////////////////////////////////////////////////////////// +// For BiomeGen type 'BiomeGenOriginal' +float BiomeManager::getHeatAtPosOriginal(v3s16 pos, NoiseParams &np_heat, + NoiseParams &np_heat_blend, u64 seed) +{ + return + NoisePerlin2D(&np_heat, pos.X, pos.Z, seed) + + NoisePerlin2D(&np_heat_blend, pos.X, pos.Z, seed); +} + + +// For BiomeGen type 'BiomeGenOriginal' +float BiomeManager::getHumidityAtPosOriginal(v3s16 pos, NoiseParams &np_humidity, + NoiseParams &np_humidity_blend, u64 seed) +{ + return + NoisePerlin2D(&np_humidity, pos.X, pos.Z, seed) + + NoisePerlin2D(&np_humidity_blend, pos.X, pos.Z, seed); +} + + +// For BiomeGen type 'BiomeGenOriginal' +Biome *BiomeManager::getBiomeFromNoiseOriginal(float heat, float humidity, s16 y) +{ + Biome *biome_closest = nullptr; + Biome *biome_closest_blend = nullptr; + float dist_min = FLT_MAX; + float dist_min_blend = FLT_MAX; + + for (size_t i = 1; i < getNumObjects(); i++) { + Biome *b = (Biome *)getRaw(i); + if (!b || y > b->y_max + b->vertical_blend || y < b->y_min) + continue; + + float d_heat = heat - b->heat_point; + float d_humidity = humidity - b->humidity_point; + float dist = (d_heat * d_heat) + (d_humidity * d_humidity); + + if (y <= b->y_max) { // Within y limits of biome b + if (dist < dist_min) { + dist_min = dist; + biome_closest = b; + } + } else if (dist < dist_min_blend) { // Blend area above biome b + dist_min_blend = dist; + biome_closest_blend = b; + } + } + + mysrand(y + (heat - humidity) * 2); + if (biome_closest_blend && + myrand_range(0, biome_closest_blend->vertical_blend) >= + y - biome_closest_blend->y_max) + return biome_closest_blend; + + return (biome_closest) ? biome_closest : (Biome *)getRaw(BIOME_NONE); +} + + +//////////////////////////////////////////////////////////////////////////////// void BiomeParamsOriginal::readParams(const Settings *settings) { diff --git a/src/mapgen/mg_biome.h b/src/mapgen/mg_biome.h index ac606e935..a2bfaf5b9 100644 --- a/src/mapgen/mg_biome.h +++ b/src/mapgen/mg_biome.h @@ -225,6 +225,13 @@ public: virtual void clear(); + // For BiomeGen type 'BiomeGenOriginal' + float getHeatAtPosOriginal(v3s16 pos, NoiseParams &np_heat, + NoiseParams &np_heat_blend, u64 seed); + float getHumidityAtPosOriginal(v3s16 pos, NoiseParams &np_humidity, + NoiseParams &np_humidity_blend, u64 seed); + Biome *getBiomeFromNoiseOriginal(float heat, float humidity, s16 y); + private: Server *m_server; -- cgit v1.2.3