From e45ecad3ab401e169d1c8c9ba9448360b215b3e5 Mon Sep 17 00:00:00 2001
From: paramat <mat.gregory@virginmedia.com>
Date: Wed, 3 Jun 2015 08:59:07 +0100
Subject: [PATCH] Biome API: Add noise defined biome blend

---
 minetest.conf.example |  4 +++-
 src/mapgen.cpp        |  4 ++++
 src/mapgen.h          |  4 ++++
 src/mapgen_v5.cpp     | 20 +++++++++++++++-----
 src/mapgen_v5.h       |  3 +++
 src/mapgen_v7.cpp     | 29 +++++++++++++++++++++--------
 src/mapgen_v7.h       |  2 ++
 7 files changed, 52 insertions(+), 14 deletions(-)

diff --git a/minetest.conf.example b/minetest.conf.example
index f73dc3e27..2d533b91e 100644
--- a/minetest.conf.example
+++ b/minetest.conf.example
@@ -532,9 +532,11 @@
 #    Mgv5 uses eased noise for np_ground so this is shown in group format,
 #    other noise parameters are shown in positional format to save space.
 
-#    Noise parameters for biome API temperature and humidity
+#    Noise parameters for biome API temperature, humidity and biome blend
 #mg_biome_np_heat = 50, 50, (750, 750, 750), 5349, 3, 0.5, 2.0
+#mg_biome_np_heat_blend = 0, 1.5, (8, 8, 8), 13, 2, 1.0, 2.0
 #mg_biome_np_humidity = 50, 50, (750, 750, 750), 842, 3, 0.5, 2.0
+#mg_biome_np_humidity_blend = 0, 1.5, (8, 8, 8), 90003, 2, 1.0, 2.0
 
 #mgv5_np_filler_depth = 0, 1, (150, 150, 150), 261, 4, 0.7, 2.0
 #mgv5_np_factor = 0, 1, (250, 250, 250), 920381, 3, 0.45, 2.0
diff --git a/src/mapgen.cpp b/src/mapgen.cpp
index 7965730e4..d1171e29d 100644
--- a/src/mapgen.cpp
+++ b/src/mapgen.cpp
@@ -445,7 +445,9 @@ void MapgenParams::load(const Settings &settings)
 	settings.getS16NoEx("chunksize", chunksize);
 	settings.getFlagStrNoEx("mg_flags", flags, flagdesc_mapgen);
 	settings.getNoiseParams("mg_biome_np_heat", np_biome_heat);
+	settings.getNoiseParams("mg_biome_np_heat_blend", np_biome_heat_blend);
 	settings.getNoiseParams("mg_biome_np_humidity", np_biome_humidity);
+	settings.getNoiseParams("mg_biome_np_humidity_blend", np_biome_humidity_blend);
 
 	delete sparams;
 	sparams = EmergeManager::createMapgenParams(mg_name);
@@ -462,7 +464,9 @@ void MapgenParams::save(Settings &settings) const
 	settings.setS16("chunksize", chunksize);
 	settings.setFlagStr("mg_flags", flags, flagdesc_mapgen, (u32)-1);
 	settings.setNoiseParams("mg_biome_np_heat", np_biome_heat);
+	settings.setNoiseParams("mg_biome_np_heat_blend", np_biome_heat_blend);
 	settings.setNoiseParams("mg_biome_np_humidity", np_biome_humidity);
+	settings.setNoiseParams("mg_biome_np_humidity_blend", np_biome_humidity_blend);
 
 	if (sparams)
 		sparams->writeParams(&settings);
diff --git a/src/mapgen.h b/src/mapgen.h
index a875e0f3d..a1cc8af53 100644
--- a/src/mapgen.h
+++ b/src/mapgen.h
@@ -115,7 +115,9 @@ struct MapgenParams {
 	u32 flags;
 
 	NoiseParams np_biome_heat;
+	NoiseParams np_biome_heat_blend;
 	NoiseParams np_biome_humidity;
+	NoiseParams np_biome_humidity_blend;
 
 	MapgenSpecificParams *sparams;
 
@@ -126,7 +128,9 @@ struct MapgenParams {
 		water_level(1),
 		flags(MG_TREES | MG_CAVES | MG_LIGHT),
 		np_biome_heat(NoiseParams(50, 50, v3f(750.0, 750.0, 750.0), 5349, 3, 0.5, 2.0)),
+		np_biome_heat_blend(NoiseParams(0, 1.5, v3f(8.0, 8.0, 8.0), 13, 2, 1.0, 2.0)),
 		np_biome_humidity(NoiseParams(50, 50, v3f(750.0, 750.0, 750.0), 842, 3, 0.5, 2.0)),
+		np_biome_humidity_blend(NoiseParams(0, 1.5, v3f(8.0, 8.0, 8.0), 90003, 2, 1.0, 2.0)),
 		sparams(NULL)
 	{}
 
diff --git a/src/mapgen_v5.cpp b/src/mapgen_v5.cpp
index 92febf43b..f748e7b86 100644
--- a/src/mapgen_v5.cpp
+++ b/src/mapgen_v5.cpp
@@ -68,13 +68,15 @@ MapgenV5::MapgenV5(int mapgenid, MapgenParams *params, EmergeManager *emerge)
 	noise_height       = new Noise(&sp->np_height,       seed, csize.X, csize.Z);
 
 	// 3D terrain noise
-	noise_cave1        = new Noise(&sp->np_cave1,   seed, csize.X, csize.Y + 2, csize.Z);
-	noise_cave2        = new Noise(&sp->np_cave2,   seed, csize.X, csize.Y + 2, csize.Z);
-	noise_ground       = new Noise(&sp->np_ground,  seed, csize.X, csize.Y + 2, csize.Z);
+	noise_cave1  = new Noise(&sp->np_cave1,  seed, csize.X, csize.Y + 2, csize.Z);
+	noise_cave2  = new Noise(&sp->np_cave2,  seed, csize.X, csize.Y + 2, csize.Z);
+	noise_ground = new Noise(&sp->np_ground, seed, csize.X, csize.Y + 2, csize.Z);
 
 	// Biome noise
-	noise_heat         = new Noise(&params->np_biome_heat,     seed, csize.X, csize.Z);
-	noise_humidity     = new Noise(&params->np_biome_humidity, seed, csize.X, csize.Z);
+	noise_heat           = new Noise(&params->np_biome_heat,           seed, csize.X, csize.Z);
+	noise_humidity       = new Noise(&params->np_biome_humidity,       seed, csize.X, csize.Z);
+	noise_heat_blend     = new Noise(&params->np_biome_heat_blend,     seed, csize.X, csize.Z);
+	noise_humidity_blend = new Noise(&params->np_biome_humidity_blend, seed, csize.X, csize.Z);
 
 	//// Resolve nodes to be used
 	INodeDefManager *ndef = emerge->ndef;
@@ -116,6 +118,8 @@ MapgenV5::~MapgenV5()
 
 	delete noise_heat;
 	delete noise_humidity;
+	delete noise_heat_blend;
+	delete noise_humidity_blend;
 
 	delete[] heightmap;
 	delete[] biomemap;
@@ -330,7 +334,13 @@ void MapgenV5::calculateNoise()
 	noise_filler_depth->perlinMap2D(x, z);
 	noise_heat->perlinMap2D(x, z);
 	noise_humidity->perlinMap2D(x, z);
+	noise_heat_blend->perlinMap2D(x, z);
+	noise_humidity_blend->perlinMap2D(x, z);
 
+	for (s32 i = 0; i < csize.X * csize.Z; i++) {
+		noise_heat->result[i] += noise_heat_blend->result[i];
+		noise_humidity->result[i] += noise_humidity_blend->result[i];
+	}
 	//printf("calculateNoise: %dus\n", t.stop());
 }
 
diff --git a/src/mapgen_v5.h b/src/mapgen_v5.h
index 5575dfe61..911975e7f 100644
--- a/src/mapgen_v5.h
+++ b/src/mapgen_v5.h
@@ -69,8 +69,11 @@ class MapgenV5 : public Mapgen {
 	Noise *noise_cave1;
 	Noise *noise_cave2;
 	Noise *noise_ground;
+
 	Noise *noise_heat;
 	Noise *noise_humidity;
+	Noise *noise_heat_blend;
+	Noise *noise_humidity_blend;
 
 	content_t c_stone;
 	content_t c_water_source;
diff --git a/src/mapgen_v7.cpp b/src/mapgen_v7.cpp
index 247d9debc..6e97c2c16 100644
--- a/src/mapgen_v7.cpp
+++ b/src/mapgen_v7.cpp
@@ -82,8 +82,10 @@ MapgenV7::MapgenV7(int mapgenid, MapgenParams *params, EmergeManager *emerge)
 	noise_cave2    = new Noise(&sp->np_cave2,    seed, csize.X, csize.Y + 2, csize.Z);
 
 	//// Biome noise
-	noise_heat     = new Noise(&params->np_biome_heat,     seed, csize.X, csize.Z);
-	noise_humidity = new Noise(&params->np_biome_humidity, seed, csize.X, csize.Z);
+	noise_heat           = new Noise(&params->np_biome_heat,           seed, csize.X, csize.Z);
+	noise_humidity       = new Noise(&params->np_biome_humidity,       seed, csize.X, csize.Z);
+	noise_heat_blend     = new Noise(&params->np_biome_heat_blend,     seed, csize.X, csize.Z);
+	noise_humidity_blend = new Noise(&params->np_biome_humidity_blend, seed, csize.X, csize.Z);
 
 	//// Resolve nodes to be used
 	INodeDefManager *ndef = emerge->ndef;
@@ -130,6 +132,8 @@ MapgenV7::~MapgenV7()
 
 	delete noise_heat;
 	delete noise_humidity;
+	delete noise_heat_blend;
+	delete noise_humidity_blend;
 
 	delete[] ridge_heightmap;
 	delete[] heightmap;
@@ -227,11 +231,11 @@ void MapgenV7::makeChunk(BlockMakeData *data)
 	assert(data->vmanip);
 	assert(data->nodedef);
 	assert(data->blockpos_requested.X >= data->blockpos_min.X &&
-		   data->blockpos_requested.Y >= data->blockpos_min.Y &&
-		   data->blockpos_requested.Z >= data->blockpos_min.Z);
+		data->blockpos_requested.Y >= data->blockpos_min.Y &&
+		data->blockpos_requested.Z >= data->blockpos_min.Z);
 	assert(data->blockpos_requested.X <= data->blockpos_max.X &&
-		   data->blockpos_requested.Y <= data->blockpos_max.Y &&
-		   data->blockpos_requested.Z <= data->blockpos_max.Z);
+		data->blockpos_requested.Y <= data->blockpos_max.Y &&
+		data->blockpos_requested.Z <= data->blockpos_max.Z);
 
 	this->generating = true;
 	this->vm   = data->vmanip;
@@ -365,14 +369,23 @@ void MapgenV7::calculateNoise()
 	noise_filler_depth->perlinMap2D(x, z);
 	noise_heat->perlinMap2D(x, z);
 	noise_humidity->perlinMap2D(x, z);
+	noise_heat_blend->perlinMap2D(x, z);
+	noise_humidity_blend->perlinMap2D(x, z);
+
+	for (s32 i = 0; i < csize.X * csize.Z; i++) {
+		noise_heat->result[i] += noise_heat_blend->result[i];
+		noise_humidity->result[i] += noise_humidity_blend->result[i];
+	}
 	//printf("calculateNoise: %dus\n", t.stop());
 }
 
 
 Biome *MapgenV7::getBiomeAtPoint(v3s16 p)
 {
-	float heat      = NoisePerlin2D(&noise_heat->np, p.X, p.Z, seed);
-	float humidity  = NoisePerlin2D(&noise_humidity->np, p.X, p.Z, seed);
+	float heat = NoisePerlin2D(&noise_heat->np, p.X, p.Z, seed) +
+		NoisePerlin2D(&noise_heat_blend->np, p.X, p.Z, seed);
+	float humidity = NoisePerlin2D(&noise_humidity->np, p.X, p.Z, seed) +
+		NoisePerlin2D(&noise_humidity_blend->np, p.X, p.Z, seed);
 	s16 groundlevel = baseTerrainLevelAtPoint(p.X, p.Z);
 
 	return bmgr->getBiome(heat, humidity, groundlevel);
diff --git a/src/mapgen_v7.h b/src/mapgen_v7.h
index eb46c371b..0a8a8c876 100644
--- a/src/mapgen_v7.h
+++ b/src/mapgen_v7.h
@@ -82,6 +82,8 @@ class MapgenV7 : public Mapgen {
 
 	Noise *noise_heat;
 	Noise *noise_humidity;
+	Noise *noise_heat_blend;
+	Noise *noise_humidity_blend;
 
 	content_t c_stone;
 	content_t c_water_source;
-- 
GitLab