Skip to content
Snippets Groups Projects
Commit c367f730 authored by paramat's avatar paramat Committed by kwolekr
Browse files

Mapgen V5: Move cave generation from base terrain loop to optional function

This fixes biome surface in tunnels
parent a77c85fa
No related branches found
No related tags found
No related merge requests found
...@@ -268,6 +268,10 @@ void MapgenV5::makeChunk(BlockMakeData *data) ...@@ -268,6 +268,10 @@ void MapgenV5::makeChunk(BlockMakeData *data)
// Actually place the biome-specific nodes // Actually place the biome-specific nodes
generateBiomes(); generateBiomes();
// Generate caves
if ((flags & MG_CAVES) && (stone_surface_max_y >= node_min.Y))
generateCaves();
// Generate dungeons and desert temples // Generate dungeons and desert temples
if ((flags & MG_DUNGEONS) && (stone_surface_max_y >= node_min.Y)) { if ((flags & MG_DUNGEONS) && (stone_surface_max_y >= node_min.Y)) {
DungeonGen dgen(this, NULL); DungeonGen dgen(this, NULL);
...@@ -309,8 +313,11 @@ void MapgenV5::calculateNoise() ...@@ -309,8 +313,11 @@ void MapgenV5::calculateNoise()
noise_factor->perlinMap2D(x, z); noise_factor->perlinMap2D(x, z);
noise_height->perlinMap2D(x, z); noise_height->perlinMap2D(x, z);
noise_cave1->perlinMap3D(x, y, z); if (flags & MG_CAVES) {
noise_cave2->perlinMap3D(x, y, z); noise_cave1->perlinMap3D(x, y, z);
noise_cave2->perlinMap3D(x, y, z);
}
noise_ground->perlinMap3D(x, y, z); noise_ground->perlinMap3D(x, y, z);
if (spflags & MGV5_BLOBS) { if (spflags & MGV5_BLOBS) {
...@@ -363,16 +370,12 @@ int MapgenV5::generateBaseTerrain() ...@@ -363,16 +370,12 @@ int MapgenV5::generateBaseTerrain()
else if(f >= 1.0) else if(f >= 1.0)
f *= 1.6; f *= 1.6;
float h = water_level + noise_height->result[index2d]; 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(noise_ground->result[index] * f < y - h) {
if(y <= water_level) if(y <= water_level)
vm->m_data[i] = MapNode(c_water_source); vm->m_data[i] = MapNode(c_water_source);
else else
vm->m_data[i] = MapNode(CONTENT_AIR); vm->m_data[i] = MapNode(CONTENT_AIR);
} else if(d1*d2 > 0.2) {
vm->m_data[i] = MapNode(CONTENT_AIR);
} else { } else {
vm->m_data[i] = MapNode(c_stone); vm->m_data[i] = MapNode(c_stone);
if (y > stone_surface_max_y) if (y > stone_surface_max_y)
...@@ -508,6 +511,28 @@ void MapgenV5::generateBiomes() ...@@ -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() void MapgenV5::dustTopNodes()
{ {
v3s16 em = vm->m_area.getExtent(); v3s16 em = vm->m_area.getExtent();
......
...@@ -97,6 +97,7 @@ class MapgenV5 : public Mapgen { ...@@ -97,6 +97,7 @@ class MapgenV5 : public Mapgen {
int generateBaseTerrain(); int generateBaseTerrain();
void generateBlobs(); void generateBlobs();
void generateBiomes(); void generateBiomes();
void generateCaves();
void dustTopNodes(); void dustTopNodes();
}; };
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment