Mapgen V5: Various improvements

Caves check for biome nodes, only excavate stone under water level
Unease caves noises, use MT0.3 parameters
Blobgen after cavegen
Biomegen: remove 'is replaceable content' bool
This commit is contained in:
paramat 2015-01-13 07:18:00 +00:00 committed by kwolekr
parent 38bd9e93a2
commit 9b89f7aad7
2 changed files with 58 additions and 62 deletions

@ -135,27 +135,21 @@ MapgenV5Params::MapgenV5Params()
np_filler_depth = NoiseParams(0, 1, v3f(150, 150, 150), 261, 4, 0.7, 2.0); np_filler_depth = NoiseParams(0, 1, v3f(150, 150, 150), 261, 4, 0.7, 2.0);
np_factor = NoiseParams(0, 1, v3f(250, 250, 250), 920381, 3, 0.45, 2.0); np_factor = NoiseParams(0, 1, v3f(250, 250, 250), 920381, 3, 0.45, 2.0);
np_height = NoiseParams(0, 10, v3f(250, 250, 250), 84174, 4, 0.5, 2.0); np_height = NoiseParams(0, 10, v3f(250, 250, 250), 84174, 4, 0.5, 2.0);
np_cave1 = NoiseParams(0, 6, v3f(50, 50, 50), 52534, 4, 0.5, 2.0, NOISE_FLAG_EASED); np_cave1 = NoiseParams(0, 12, v3f(50, 50, 50), 52534, 4, 0.5, 2.0);
np_cave2 = NoiseParams(0, 6, v3f(50, 50, 50), 10325, 4, 0.5, 2.0, NOISE_FLAG_EASED); np_cave2 = NoiseParams(0, 12, v3f(50, 50, 50), 10325, 4, 0.5, 2.0);
np_ground = NoiseParams(0, 40, v3f(80, 80, 80), 983240, 4, 0.55, 2.0, NOISE_FLAG_EASED); np_ground = NoiseParams(0, 40, v3f(80, 80, 80), 983240, 4, 0.55, 2.0, NOISE_FLAG_EASED);
np_crumble = NoiseParams(0, 1, v3f(20, 20, 20), 34413, 3, 1.3, 2.0, NOISE_FLAG_EASED); np_crumble = NoiseParams(0, 1, v3f(20, 20, 20), 34413, 3, 1.3, 2.0, NOISE_FLAG_EASED);
np_wetness = NoiseParams(0, 1, v3f(40, 40, 40), 32474, 4, 1.1, 2.0); np_wetness = NoiseParams(0, 1, v3f(40, 40, 40), 32474, 4, 1.1, 2.0);
} }
// Current caves noise scale default is 6 to compensate for new eased 3d noise amplitude
// Scaling the output of the noise function affects the overdrive of the // Scaling the output of the noise function affects the overdrive of the
// contour function, which affects the shape of the output considerably. // contour function, which affects the shape of the output considerably.
//#define CAVE_NOISE_SCALE 12.0 < original default // Two original MT 0.3 parameters for non-eased noise:
//#define CAVE_NOISE_SCALE 10.0
//#define CAVE_NOISE_SCALE 7.5
//#define CAVE_NOISE_SCALE 5.0
//#define CAVE_NOISE_SCALE 1.0
//#define CAVE_NOISE_THRESHOLD (2.5/CAVE_NOISE_SCALE) //#define CAVE_NOISE_SCALE 12.0
//#define CAVE_NOISE_THRESHOLD (1.5/CAVE_NOISE_SCALE) < original and current code //#define CAVE_NOISE_THRESHOLD (1.5/CAVE_NOISE_SCALE)
void MapgenV5Params::readParams(Settings *settings) void MapgenV5Params::readParams(Settings *settings)
@ -201,7 +195,7 @@ int MapgenV5::getGroundLevelAtPoint(v2s16 p)
s16 search_top = water_level + 15; s16 search_top = water_level + 15;
s16 search_base = water_level; s16 search_base = water_level;
// Use these 2 lines instead for a slower search returning highest ground level // Use these 2 lines instead for a slower search returning highest ground level:
//s16 search_top = h + f * noise_ground->np->octaves * noise_ground->np->scale; //s16 search_top = h + f * noise_ground->np->octaves * noise_ground->np->scale;
//s16 search_base = h - f * noise_ground->np->octaves * noise_ground->np->scale; //s16 search_base = h - f * noise_ground->np->octaves * noise_ground->np->scale;
@ -253,14 +247,8 @@ void MapgenV5::makeChunk(BlockMakeData *data)
// Generate base terrain // Generate base terrain
s16 stone_surface_max_y = generateBaseTerrain(); s16 stone_surface_max_y = generateBaseTerrain();
updateHeightmap(node_min, node_max); updateHeightmap(node_min, node_max);
// Generate underground dirt, sand, gravel and lava blobs
if (spflags & MGV5_BLOBS) {
generateBlobs();
}
// Calculate biomes // Calculate biomes
bmgr->calcBiomes(csize.X, csize.Z, noise_heat->result, bmgr->calcBiomes(csize.X, csize.Z, noise_heat->result,
noise_humidity->result, heightmap, biomemap); noise_humidity->result, heightmap, biomemap);
@ -281,6 +269,11 @@ void MapgenV5::makeChunk(BlockMakeData *data)
// Generate the registered decorations // Generate the registered decorations
m_emerge->decomgr->placeAllDecos(this, blockseed, node_min, node_max); m_emerge->decomgr->placeAllDecos(this, blockseed, node_min, node_max);
// Generate underground dirt, sand, gravel and lava blobs
if (spflags & MGV5_BLOBS) {
generateBlobs();
}
// Generate the registered ores // Generate the registered ores
m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max); m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max);
@ -332,13 +325,14 @@ void MapgenV5::calculateNoise()
} }
// Two original MT 0.3 functions:
//bool is_cave(u32 index) { //bool is_cave(u32 index) {
// double d1 = contour(noise_cave1->result[index]); // double d1 = contour(noise_cave1->result[index]);
// double d2 = contour(noise_cave2->result[index]); // double d2 = contour(noise_cave2->result[index]);
// return d1*d2 > CAVE_NOISE_THRESHOLD; // return d1*d2 > CAVE_NOISE_THRESHOLD;
//} //}
//bool val_is_ground(v3s16 p, u32 index, u32 index2d) { //bool val_is_ground(v3s16 p, u32 index, u32 index2d) {
// double f = 0.55 + noise_factor->result[index2d]; // double f = 0.55 + noise_factor->result[index2d];
// if(f < 0.01) // if(f < 0.01)
@ -350,7 +344,6 @@ void MapgenV5::calculateNoise()
//} //}
// Make base ground level
int MapgenV5::generateBaseTerrain() int MapgenV5::generateBaseTerrain()
{ {
u32 index = 0; u32 index = 0;
@ -391,38 +384,6 @@ int MapgenV5::generateBaseTerrain()
} }
// Add mud and sand and others underground (in place of stone)
void MapgenV5::generateBlobs()
{
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 != c_stone)
continue;
if(noise_crumble->result[index] > 1.3) {
if(noise_wetness->result[index] > 0.0)
vm->m_data[i] = MapNode(c_dirt);
else
vm->m_data[i] = MapNode(c_sand);
} else if(noise_crumble->result[index] > 0.7) {
if(noise_wetness->result[index] < -0.6)
vm->m_data[i] = MapNode(c_gravel);
} else if(noise_crumble->result[index] < -3.5 +
MYMIN(0.1 *
sqrt((float)MYMAX(0, -y)), 1.5)) {
vm->m_data[i] = MapNode(c_lava_source);
}
}
}
}
}
void MapgenV5::generateBiomes() void MapgenV5::generateBiomes()
{ {
if (node_max.Y < water_level) if (node_max.Y < water_level)
@ -452,11 +413,8 @@ void MapgenV5::generateBiomes()
for (s16 y = node_max.Y; y >= node_min.Y; y--) { for (s16 y = node_max.Y; y >= node_min.Y; y--) {
content_t c = vm->m_data[i].getContent(); content_t c = vm->m_data[i].getContent();
bool is_replaceable_content =
c == c_stone || c == c_dirt_with_grass || c == c_dirt ||
c == c_sand || c == c_lava_source || c == c_gravel;
if (is_replaceable_content && have_air) { if (c == c_stone && have_air) {
content_t c_below = vm->m_data[i - em.X].getContent(); content_t c_below = vm->m_data[i - em.X].getContent();
if (c_below != CONTENT_AIR) { if (c_below != CONTENT_AIR) {
@ -512,6 +470,35 @@ void MapgenV5::generateBiomes()
void MapgenV5::generateCaves() void MapgenV5::generateCaves()
{
u32 index = 0;
u32 index2d = 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++, index2d++) {
Biome *biome = (Biome *)bmgr->get(biomemap[index2d]);
content_t c = vm->m_data[i].getContent();
if(c == CONTENT_AIR
|| (y <= water_level
&& c != biome->c_stone
&& c != c_stone))
continue;
float d1 = contour(noise_cave1->result[index]);
float d2 = contour(noise_cave2->result[index]);
if(d1*d2 > 0.125)
vm->m_data[i] = MapNode(CONTENT_AIR);
}
index2d = index2d - ystride;
}
index2d = index2d + ystride;
}
}
void MapgenV5::generateBlobs()
{ {
u32 index = 0; u32 index = 0;
@ -520,13 +507,22 @@ void MapgenV5::generateCaves()
u32 i = vm->m_area.index(node_min.X, y, z); u32 i = vm->m_area.index(node_min.X, y, z);
for(s16 x=node_min.X; x<=node_max.X; x++, i++, index++) { for(s16 x=node_min.X; x<=node_max.X; x++, i++, index++) {
content_t c = vm->m_data[i].getContent(); content_t c = vm->m_data[i].getContent();
if(c == CONTENT_AIR || c == c_water_source) if(c != c_stone)
continue; continue;
float d1 = contour(noise_cave1->result[index]); if(noise_crumble->result[index] > 1.3) {
float d2 = contour(noise_cave2->result[index]); if(noise_wetness->result[index] > 0.0)
if(d1*d2 > 0.2) vm->m_data[i] = MapNode(c_dirt);
vm->m_data[i] = MapNode(CONTENT_AIR); else
vm->m_data[i] = MapNode(c_sand);
} else if(noise_crumble->result[index] > 0.7) {
if(noise_wetness->result[index] < -0.6)
vm->m_data[i] = MapNode(c_gravel);
} else if(noise_crumble->result[index] < -3.5 +
MYMIN(0.1 *
sqrt((float)MYMAX(0, -y)), 1.5)) {
vm->m_data[i] = MapNode(c_lava_source);
}
} }
} }
} }

@ -95,9 +95,9 @@ public:
int getGroundLevelAtPoint(v2s16 p); int getGroundLevelAtPoint(v2s16 p);
void calculateNoise(); void calculateNoise();
int generateBaseTerrain(); int generateBaseTerrain();
void generateBlobs();
void generateBiomes(); void generateBiomes();
void generateCaves(); void generateCaves();
void generateBlobs();
void dustTopNodes(); void dustTopNodes();
}; };