diff options
author | paramat <mat.gregory@virginmedia.com> | 2015-01-11 09:21:55 +0000 |
---|---|---|
committer | kwolekr <kwolekr@minetest.net> | 2015-01-11 22:35:36 -0500 |
commit | c367f7301a4bd2f69a84b53392439482abd6dc5a (patch) | |
tree | e4fa46bd461cc362a88f03edcae11acd6ec5989d | |
parent | a77c85fa6df91292120fec7c499cb68f3dcad480 (diff) | |
download | minetest-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.cpp | 37 | ||||
-rw-r--r-- | src/mapgen_v5.h | 1 |
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(); }; |