diff options
author | paramat <paramat@users.noreply.github.com> | 2017-09-22 12:38:55 +0100 |
---|---|---|
committer | paramat <mat.gregory@virginmedia.com> | 2018-01-16 08:47:07 +0000 |
commit | d45e5da8ca808e552123bcd94e76b0b435a6ea79 (patch) | |
tree | 356623d2625c8e2aab94de35f7b1790dfe998d71 /src/mapgen | |
parent | 4c0d4e4105d2f2e63b9a43bb83fecf92288f63b3 (diff) | |
download | minetest-d45e5da8ca808e552123bcd94e76b0b435a6ea79.tar.gz minetest-d45e5da8ca808e552123bcd94e76b0b435a6ea79.tar.bz2 minetest-d45e5da8ca808e552123bcd94e76b0b435a6ea79.zip |
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.
Diffstat (limited to 'src/mapgen')
-rw-r--r-- | src/mapgen/mg_biome.cpp | 60 | ||||
-rw-r--r-- | src/mapgen/mg_biome.h | 7 |
2 files changed, 66 insertions, 1 deletions
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; |