Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Mapgen V5: Move cave generation from base terrain loop to optional fu…
…nction

This fixes biome surface in tunnels
  • Loading branch information
paramat authored and kwolekr committed Jan 12, 2015
1 parent a77c85f commit c367f73
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 6 deletions.
37 changes: 31 additions & 6 deletions src/mapgen_v5.cpp
Expand Up @@ -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);
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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();
Expand Down
1 change: 1 addition & 0 deletions src/mapgen_v5.h
Expand Up @@ -97,6 +97,7 @@ class MapgenV5 : public Mapgen {
int generateBaseTerrain();
void generateBlobs();
void generateBiomes();
void generateCaves();
void dustTopNodes();
};

Expand Down

0 comments on commit c367f73

Please sign in to comment.