aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorparamat <mat.gregory@virginmedia.com>2015-01-11 09:21:55 +0000
committerkwolekr <kwolekr@minetest.net>2015-01-11 22:35:36 -0500
commitc367f7301a4bd2f69a84b53392439482abd6dc5a (patch)
treee4fa46bd461cc362a88f03edcae11acd6ec5989d
parenta77c85fa6df91292120fec7c499cb68f3dcad480 (diff)
downloadminetest-c367f7301a4bd2f69a84b53392439482abd6dc5a.tar.gz
minetest-c367f7301a4bd2f69a84b53392439482abd6dc5a.tar.bz2
minetest-c367f7301a4bd2f69a84b53392439482abd6dc5a.zip
Mapgen V5: Move cave generation from base terrain loop to optional function
This fixes biome surface in tunnels
-rw-r--r--src/mapgen_v5.cpp37
-rw-r--r--src/mapgen_v5.h1
2 files changed, 32 insertions, 6 deletions
diff --git a/src/mapgen_v5.cpp b/src/mapgen_v5.cpp
index e220455bf..23bc85450 100644
--- a/src/mapgen_v5.cpp
+++ b/src/mapgen_v5.cpp
@@ -268,6 +268,10 @@ void MapgenV5::makeChunk(BlockMakeData *data)
// Actually place the biome-specific nodes
generateBiomes();
+ // Generate caves
+ if ((flags & MG_CAVES) && (stone_surface_max_y >= node_min.Y))
+ generateCaves();
+
// Generate dungeons and desert temples
if ((flags & MG_DUNGEONS) && (stone_surface_max_y >= node_min.Y)) {
DungeonGen dgen(this, NULL);
@@ -309,8 +313,11 @@ void MapgenV5::calculateNoise()
noise_factor->perlinMap2D(x, z);
noise_height->perlinMap2D(x, z);
- noise_cave1->perlinMap3D(x, y, z);
- noise_cave2->perlinMap3D(x, y, z);
+ if (flags & MG_CAVES) {
+ noise_cave1->perlinMap3D(x, y, z);
+ noise_cave2->perlinMap3D(x, y, z);
+ }
+
noise_ground->perlinMap3D(x, y, z);
if (spflags & MGV5_BLOBS) {
@@ -363,16 +370,12 @@ int MapgenV5::generateBaseTerrain()
else if(f >= 1.0)
f *= 1.6;
float h = water_level + noise_height->result[index2d];
- float d1 = contour(noise_cave1->result[index]);
- float d2 = contour(noise_cave2->result[index]);
if(noise_ground->result[index] * f < y - h) {
if(y <= water_level)
vm->m_data[i] = MapNode(c_water_source);
else
vm->m_data[i] = MapNode(CONTENT_AIR);
- } else if(d1*d2 > 0.2) {
- vm->m_data[i] = MapNode(CONTENT_AIR);
} else {
vm->m_data[i] = MapNode(c_stone);
if (y > stone_surface_max_y)
@@ -508,6 +511,28 @@ void MapgenV5::generateBiomes()
}
+void MapgenV5::generateCaves()
+{
+ u32 index = 0;
+
+ for(s16 z=node_min.Z; z<=node_max.Z; z++) {
+ for(s16 y=node_min.Y - 1; y<=node_max.Y + 1; y++) {
+ u32 i = vm->m_area.index(node_min.X, y, z);
+ for(s16 x=node_min.X; x<=node_max.X; x++, i++, index++) {
+ content_t c = vm->m_data[i].getContent();
+ if(c == CONTENT_AIR || c == c_water_source)
+ continue;
+
+ float d1 = contour(noise_cave1->result[index]);
+ float d2 = contour(noise_cave2->result[index]);
+ if(d1*d2 > 0.2)
+ vm->m_data[i] = MapNode(CONTENT_AIR);
+ }
+ }
+ }
+}
+
+
void MapgenV5::dustTopNodes()
{
v3s16 em = vm->m_area.getExtent();
diff --git a/src/mapgen_v5.h b/src/mapgen_v5.h
index 18f0ffa03..bf8efad14 100644
--- a/src/mapgen_v5.h
+++ b/src/mapgen_v5.h
@@ -97,6 +97,7 @@ public:
int generateBaseTerrain();
void generateBlobs();
void generateBiomes();
+ void generateCaves();
void dustTopNodes();
};