diff options
-rw-r--r-- | src/mapgen_valleys.cpp | 88 | ||||
-rw-r--r-- | src/mapgen_valleys.h | 20 |
2 files changed, 61 insertions, 47 deletions
diff --git a/src/mapgen_valleys.cpp b/src/mapgen_valleys.cpp index c14ceb51e..93f47cd5f 100644 --- a/src/mapgen_valleys.cpp +++ b/src/mapgen_valleys.cpp @@ -185,19 +185,19 @@ MapgenValleys::~MapgenValleys() MapgenValleysParams::MapgenValleysParams() { spflags = MG_VALLEYS_CLIFFS | MG_VALLEYS_RUGGED - | MG_VALLEYS_HUMID_RIVERS | MG_VALLEYS_ALT_CHILL; + | MG_VALLEYS_HUMID_RIVERS | MG_VALLEYS_ALT_CHILL; - altitude_chill = 90; // The altitude at which temperature drops by 20C. + altitude_chill = 90; // The altitude at which temperature drops by 20C. // Water in caves will never be higher than this. - cave_water_max_height = MAX_MAP_GENERATION_LIMIT; - humidity = 50; + cave_water_max_height = MAX_MAP_GENERATION_LIMIT; + humidity = 50; // the maximum humidity around rivers in otherwise dry areas - humidity_break_point = 65; - lava_max_height = 0; // Lava will never be higher than this. - river_depth = 4; // How deep to carve river channels. - river_size = 5; // How wide to make rivers. - temperature = 50; - water_features = 3; // How often water will occur in caves. + humidity_break_point = 65; + lava_max_height = 0; // Lava will never be higher than this. + river_depth = 4; // How deep to carve river channels. + river_size = 5; // How wide to make rivers. + temperature = 50; + water_features = 3; // How often water will occur in caves. np_cliffs = NoiseParams(0.f, 1.f, v3f(750, 750, 750), 8445, 5, 1.f, 2.f); np_corr = NoiseParams(0.f, 1.f, v3f(40, 40, 40), -3536, 4, 1.f, 2.f); @@ -285,7 +285,7 @@ void MapgenValleys::makeChunk(BlockMakeData *data) data->blockpos_requested.Z <= data->blockpos_max.Z); this->generating = true; - this->vm = data->vmanip; + this->vm = data->vmanip; this->ndef = data->nodedef; //TimeTaker t("makeChunk"); @@ -375,9 +375,9 @@ void MapgenValleys::makeChunk(BlockMakeData *data) if (flags & MG_LIGHT) calcLighting( - node_min - v3s16(0, 1, 0), - node_max + v3s16(0, 1, 0), - full_node_min, + node_min - v3s16(0, 1, 0), + node_max + v3s16(0, 1, 0), + full_node_min, full_node_max); //mapgen_profiler->avg("liquid_lighting", tll.stop() / 1000.f); @@ -535,7 +535,7 @@ float MapgenValleys::terrainLevelFromNoise(TerrainNoise *tn) } if (fast_terrain) { - // The penultimate step builds up the heights, but we reduce it + // The penultimate step builds up the heights, but we reduce it // occasionally to create cliffs. float delta = sin(tn->inter_valley_fill) * *tn->slope; if (cliff_terrain && tn->cliffs >= 0.2f) @@ -544,8 +544,8 @@ float MapgenValleys::terrainLevelFromNoise(TerrainNoise *tn) mount += delta; // Use yet another noise to make the heights look more rugged. - if (rugged_terrain - && mount > water_level + if (rugged_terrain + && mount > water_level && fabs(inter_valley_slope * tn->inter_valley_fill) < 0.3f) mount += ((delta < 0.f) ? -1.f : 1.f) * pow(fabs(delta), 0.5f) * fabs(sin(tn->corr)); } @@ -576,9 +576,9 @@ float MapgenValleys::adjustedTerrainLevelFromNoise(TerrainNoise *tn) float MapgenValleys::humidityByTerrain( - float humidity_base, - float mount, - float rivers, + float humidity_base, + float mount, + float rivers, float valley) { // Although the original valleys adjusts humidity by distance @@ -603,9 +603,23 @@ float MapgenValleys::humidityByTerrain( } -inline int MapgenValleys::getGroundLevelAtPoint(v2s16 p) +int MapgenValleys::getGroundLevelAtPoint(v2s16 p) { - // Base terrain calculation + // *********************************************** + // This method (deliberately) does not return correct + // terrain values. This may be a problem in the future. + // *********************************************** + + // Since MT doesn't normally deal with rivers, check + // to make sure this isn't a request for a location + // in a river. + float rivers = NoisePerlin2D(&noise_rivers->np, p.X, p.Y, seed); + + // If it's wet, return an unusable number. + if (fabs(rivers) < river_size) + return MAX_MAP_GENERATION_LIMIT; + + // Otherwise, return the real result. return terrainLevelAtPoint(p.X, p.Y); } @@ -709,14 +723,14 @@ int MapgenValleys::generateTerrain() if (!fast_terrain) { // Assign the humidity adjusted by water proximity. noise_humidity->result[index_2d] = humidityByTerrain( - noise_humidity->result[index_2d], - surface_max_y, - noise_rivers->result[index_2d], + noise_humidity->result[index_2d], + surface_max_y, + noise_rivers->result[index_2d], noise_valley_depth->result[index_2d]); // Assign the heat adjusted by altitude. See humidity, above. if (use_altitude_chill && surface_max_y > 0) - noise_heat->result[index_2d] + noise_heat->result[index_2d] *= pow(0.5f, (surface_max_y - altitude_chill / 3.f) / altitude_chill); } } @@ -759,15 +773,15 @@ MgStoneType MapgenValleys::generateBiomes(float *heat_map, float *humidity_map) // 1. At the surface of stone below air or water. // 2. At the surface of water below air. // 3. When stone or water is detected but biome has not yet been calculated. - if ((c == c_stone && (air_above || water_above || !biome)) - || ((c == c_water_source || c == c_river_water_source) + if ((c == c_stone && (air_above || water_above || !biome)) + || ((c == c_water_source || c == c_river_water_source) && (air_above || !biome))) { // Both heat and humidity have already been adjusted for altitude. biome = bmgr->getBiome(heat_map[index], humidity_map[index], y); depth_top = biome->depth_top; - base_filler = MYMAX(depth_top - + biome->depth_filler + base_filler = MYMAX(depth_top + + biome->depth_filler + noise_filler_depth->result[index], 0.f); depth_water_top = biome->depth_water_top; @@ -787,8 +801,8 @@ MgStoneType MapgenValleys::generateBiomes(float *heat_map, float *humidity_map) // any top/filler nodes above are structurally supported. // This is done by aborting the cycle of top/filler placement // immediately by forcing nplaced to stone level. - if (c_below == CONTENT_AIR - || c_below == c_water_source + if (c_below == CONTENT_AIR + || c_below == c_water_source || c_below == c_river_water_source) nplaced = U16_MAX; @@ -805,7 +819,7 @@ MgStoneType MapgenValleys::generateBiomes(float *heat_map, float *humidity_map) air_above = false; water_above = false; } else if (c == c_water_source) { - vm->m_data[vi] = MapNode((y > (s32)(water_level - depth_water_top)) + vm->m_data[vi] = MapNode((y > (s32)(water_level - depth_water_top)) ? biome->c_water_top : biome->c_water); nplaced = 0; // Enable top/filler placement for next surface air_above = false; @@ -910,8 +924,8 @@ void MapgenValleys::generateSimpleCaves(s16 max_stone_y) index_3d = (z - node_min.Z) * zstride + (csize.Y + 1) * ystride + (x - node_min.X); // Dig caves on down loop to check for air above. - for (s16 y = node_max.Y + 1; - y >= node_min.Y - 1; + for (s16 y = node_max.Y + 1; + y >= node_min.Y - 1; y--, index_3d -= ystride, vm->m_area.add_y(em, index_data, -1)) { float terrain = noise_terrain_height->result[index_2d]; @@ -936,7 +950,7 @@ void MapgenValleys::generateSimpleCaves(s16 max_stone_y) // When both n's are true, we're in a cave. vm->m_data[index_data] = n_air; air_above = true; - } else if (air_above + } else if (air_above && (c == c_stone || c == c_sandstone || c == c_desert_stone)) { // At the cave floor s16 sr = ps.next() & 1023; @@ -959,7 +973,7 @@ void MapgenValleys::generateSimpleCaves(s16 max_stone_y) } if (base_water_chance > 0 && y <= cave_water_max_height) { - s16 water_chance = base_water_chance + s16 water_chance = base_water_chance - (abs(y - water_level) / (water_features * 1000)); // Waterfalls may get out of control above ground. diff --git a/src/mapgen_valleys.h b/src/mapgen_valleys.h index 9c08b16d1..5fd549096 100644 --- a/src/mapgen_valleys.h +++ b/src/mapgen_valleys.h @@ -81,15 +81,15 @@ struct MapgenValleysParams : public MapgenSpecificParams { }; struct TerrainNoise { - s16 x; - s16 z; - float terrain_height; - float *rivers; - float *valley; - float valley_profile; - float *slope; - float inter_valley_fill; - float cliffs; + s16 x; + s16 z; + float terrain_height; + float *rivers; + float *valley; + float valley_profile; + float *slope; + float inter_valley_fill; + float cliffs; float corr; }; @@ -100,7 +100,7 @@ public: ~MapgenValleys(); virtual void makeChunk(BlockMakeData *data); - inline int getGroundLevelAtPoint(v2s16 p); + int getGroundLevelAtPoint(v2s16 p); private: EmergeManager *m_emerge; |