1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00

Mgv5: Remove blobgen. Remove crumble and wetness noises

Add large pseudorandom caves below -256
De-link terrain level from water_level
Cavegen: Mgv5 large cave code
This commit is contained in:
paramat 2015-01-21 13:24:11 +00:00
parent 109f0ffeab
commit 38e6280552
4 changed files with 322 additions and 73 deletions

View file

@ -42,7 +42,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
FlagDesc flagdesc_mapgen_v5[] = {
{"blobs", MGV5_BLOBS},
{NULL, 0}
};
@ -73,8 +72,6 @@ MapgenV5::MapgenV5(int mapgenid, MapgenParams *params, EmergeManager *emerge)
noise_cave1 = new Noise(&sp->np_cave1, seed, csize.X, csize.Y + 2, csize.Z);
noise_cave2 = new Noise(&sp->np_cave2, seed, csize.X, csize.Y + 2, csize.Z);
noise_ground = new Noise(&sp->np_ground, seed, csize.X, csize.Y + 2, csize.Z);
noise_crumble = new Noise(&sp->np_crumble, seed, csize.X, csize.Y + 2, csize.Z);
noise_wetness = new Noise(&sp->np_wetness, seed, csize.X, csize.Y + 2, csize.Z);
// Biome noise
noise_heat = new Noise(&params->np_biome_heat, seed, csize.X, csize.Z);
@ -117,8 +114,6 @@ MapgenV5::~MapgenV5()
delete noise_cave1;
delete noise_cave2;
delete noise_ground;
delete noise_crumble;
delete noise_wetness;
delete noise_heat;
delete noise_humidity;
@ -130,7 +125,7 @@ MapgenV5::~MapgenV5()
MapgenV5Params::MapgenV5Params()
{
spflags = MGV5_BLOBS;
spflags = 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);
@ -138,18 +133,11 @@ MapgenV5Params::MapgenV5Params()
np_cave1 = NoiseParams(0, 12, v3f(50, 50, 50), 52534, 4, 0.5, 2.0);
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_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);
}
// Scaling the output of the noise function affects the overdrive of the
// contour function, which affects the shape of the output considerably.
// Two original MT 0.3 parameters for non-eased noise:
//#define CAVE_NOISE_SCALE 12.0
//#define CAVE_NOISE_THRESHOLD (1.5/CAVE_NOISE_SCALE)
//#define CAVE_NOISE_THRESHOLD (1.5/CAVE_NOISE_SCALE) = 0.125
void MapgenV5Params::readParams(Settings *settings)
@ -162,8 +150,6 @@ void MapgenV5Params::readParams(Settings *settings)
settings->getNoiseParams("mgv5_np_cave1", np_cave1);
settings->getNoiseParams("mgv5_np_cave2", np_cave2);
settings->getNoiseParams("mgv5_np_ground", np_ground);
settings->getNoiseParams("mgv5_np_crumble", np_crumble);
settings->getNoiseParams("mgv5_np_wetness", np_wetness);
}
@ -177,8 +163,6 @@ void MapgenV5Params::writeParams(Settings *settings)
settings->setNoiseParams("mgv5_np_cave1", np_cave1);
settings->setNoiseParams("mgv5_np_cave2", np_cave2);
settings->setNoiseParams("mgv5_np_ground", np_ground);
settings->setNoiseParams("mgv5_np_crumble", np_crumble);
settings->setNoiseParams("mgv5_np_wetness", np_wetness);
}
@ -195,9 +179,6 @@ int MapgenV5::getGroundLevelAtPoint(v2s16 p)
s16 search_top = water_level + 15;
s16 search_base = water_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_base = h - f * noise_ground->np->octaves * noise_ground->np->scale;
s16 level = -31000;
for (s16 y = search_top; y >= search_base; y--) {
@ -258,7 +239,7 @@ void MapgenV5::makeChunk(BlockMakeData *data)
// Generate caves
if ((flags & MG_CAVES) && (stone_surface_max_y >= node_min.Y))
generateCaves();
generateCaves(stone_surface_max_y);
// Generate dungeons and desert temples
if ((flags & MG_DUNGEONS) && (stone_surface_max_y >= node_min.Y)) {
@ -269,11 +250,6 @@ void MapgenV5::makeChunk(BlockMakeData *data)
// Generate the registered decorations
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
m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max);
@ -311,11 +287,6 @@ void MapgenV5::calculateNoise()
noise_cave2->perlinMap3D(x, y, z);
}
if (spflags & MGV5_BLOBS) {
noise_crumble->perlinMap3D(x, y, z);
noise_wetness->perlinMap3D(x, y, z);
}
if (node_max.Y >= water_level) {
noise_filler_depth->perlinMap2D(x, z);
noise_heat->perlinMap2D(x, z);
@ -326,8 +297,6 @@ void MapgenV5::calculateNoise()
}
// Two original MT 0.3 functions:
//bool is_cave(u32 index) {
// double d1 = contour(noise_cave1->result[index]);
// double d2 = contour(noise_cave2->result[index]);
@ -363,7 +332,7 @@ int MapgenV5::generateBaseTerrain()
f = 0.01;
else if(f >= 1.0)
f *= 1.6;
float h = water_level + noise_height->result[index2d];
float h = noise_height->result[index2d];
if(noise_ground->result[index] * f < y - h) {
if(y <= water_level)
@ -470,7 +439,7 @@ void MapgenV5::generateBiomes()
}
void MapgenV5::generateCaves()
void MapgenV5::generateCaves(int max_stone_y)
{
u32 index = 0;
u32 index2d = 0;
@ -496,36 +465,15 @@ void MapgenV5::generateCaves()
}
index2d = index2d + ystride;
}
}
if (node_max.Y > -256)
return;
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);
}
}
}
PseudoRandom ps(blockseed + 21343);
u32 bruises_count = (ps.range(1, 5) == 1) ? ps.range(1, 2) : 0;
for (u32 i = 0; i < bruises_count; i++) {
CaveV5 cave(this, &ps);
cave.makeCave(node_min, node_max, max_stone_y);
}
}