From 9b89f7aad7c4e9a764703ca86b93ed306ca795b2 Mon Sep 17 00:00:00 2001 From: paramat Date: Tue, 13 Jan 2015 07:18:00 +0000 Subject: [PATCH] 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 --- src/mapgen_v5.cpp | 114 ++++++++++++++++++++++------------------------ src/mapgen_v5.h | 2 +- 2 files changed, 56 insertions(+), 60 deletions(-) diff --git a/src/mapgen_v5.cpp b/src/mapgen_v5.cpp index 23bc85450..e288e80f2 100644 --- a/src/mapgen_v5.cpp +++ b/src/mapgen_v5.cpp @@ -135,27 +135,21 @@ MapgenV5Params::MapgenV5Params() 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_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_cave2 = NoiseParams(0, 6, v3f(50, 50, 50), 10325, 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, 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); } -// 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 // contour function, which affects the shape of the output considerably. -//#define CAVE_NOISE_SCALE 12.0 < original default -//#define CAVE_NOISE_SCALE 10.0 -//#define CAVE_NOISE_SCALE 7.5 -//#define CAVE_NOISE_SCALE 5.0 -//#define CAVE_NOISE_SCALE 1.0 +// Two original MT 0.3 parameters for non-eased noise: -//#define CAVE_NOISE_THRESHOLD (2.5/CAVE_NOISE_SCALE) -//#define CAVE_NOISE_THRESHOLD (1.5/CAVE_NOISE_SCALE) < original and current code +//#define CAVE_NOISE_SCALE 12.0 +//#define CAVE_NOISE_THRESHOLD (1.5/CAVE_NOISE_SCALE) void MapgenV5Params::readParams(Settings *settings) @@ -201,7 +195,7 @@ 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 + // 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; @@ -253,14 +247,8 @@ void MapgenV5::makeChunk(BlockMakeData *data) // Generate base terrain s16 stone_surface_max_y = generateBaseTerrain(); - updateHeightmap(node_min, node_max); - // Generate underground dirt, sand, gravel and lava blobs - if (spflags & MGV5_BLOBS) { - generateBlobs(); - } - // Calculate biomes bmgr->calcBiomes(csize.X, csize.Z, noise_heat->result, noise_humidity->result, heightmap, biomemap); @@ -281,6 +269,11 @@ 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); @@ -332,13 +325,14 @@ 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]); // return d1*d2 > CAVE_NOISE_THRESHOLD; //} - //bool val_is_ground(v3s16 p, u32 index, u32 index2d) { // double f = 0.55 + noise_factor->result[index2d]; // if(f < 0.01) @@ -350,7 +344,6 @@ void MapgenV5::calculateNoise() //} -// Make base ground level int MapgenV5::generateBaseTerrain() { 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() { if (node_max.Y < water_level) @@ -452,11 +413,8 @@ void MapgenV5::generateBiomes() for (s16 y = node_max.Y; y >= node_min.Y; y--) { 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(); if (c_below != CONTENT_AIR) { @@ -514,20 +472,58 @@ void MapgenV5::generateBiomes() 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++) { + 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 || c == c_water_source) + 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.2) + if(d1*d2 > 0.125) vm->m_data[i] = MapNode(CONTENT_AIR); } + index2d = index2d - ystride; + } + index2d = index2d + ystride; + } +} + + +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); + } + } } } } diff --git a/src/mapgen_v5.h b/src/mapgen_v5.h index bf8efad14..1949bf5db 100644 --- a/src/mapgen_v5.h +++ b/src/mapgen_v5.h @@ -95,9 +95,9 @@ public: int getGroundLevelAtPoint(v2s16 p); void calculateNoise(); int generateBaseTerrain(); - void generateBlobs(); void generateBiomes(); void generateCaves(); + void generateBlobs(); void dustTopNodes(); }; -- 2.25.1