diff options
Diffstat (limited to 'src/mapgen/mapgen_fractal.cpp')
-rw-r--r-- | src/mapgen/mapgen_fractal.cpp | 196 |
1 files changed, 104 insertions, 92 deletions
diff --git a/src/mapgen/mapgen_fractal.cpp b/src/mapgen/mapgen_fractal.cpp index fca8c9196..cb55bc288 100644 --- a/src/mapgen/mapgen_fractal.cpp +++ b/src/mapgen/mapgen_fractal.cpp @@ -18,6 +18,7 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ + #include "mapgen.h" #include <cmath> #include "voxel.h" @@ -37,32 +38,37 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mg_decoration.h" #include "mapgen_fractal.h" -FlagDesc flagdesc_mapgen_fractal[] = {{"terrain", MGFRACTAL_TERRAIN}, {NULL, 0}}; + +FlagDesc flagdesc_mapgen_fractal[] = { + {"terrain", MGFRACTAL_TERRAIN}, + {NULL, 0} +}; /////////////////////////////////////////////////////////////////////////////////////// -MapgenFractal::MapgenFractal(MapgenFractalParams *params, EmergeParams *emerge) : - MapgenBasic(MAPGEN_FRACTAL, params, emerge) + +MapgenFractal::MapgenFractal(MapgenFractalParams *params, EmergeParams *emerge) + : MapgenBasic(MAPGEN_FRACTAL, params, emerge) { - spflags = params->spflags; - cave_width = params->cave_width; - large_cave_depth = params->large_cave_depth; + spflags = params->spflags; + cave_width = params->cave_width; + large_cave_depth = params->large_cave_depth; small_cave_num_min = params->small_cave_num_min; small_cave_num_max = params->small_cave_num_max; large_cave_num_min = params->large_cave_num_min; large_cave_num_max = params->large_cave_num_max; large_cave_flooded = params->large_cave_flooded; - dungeon_ymin = params->dungeon_ymin; - dungeon_ymax = params->dungeon_ymax; - fractal = params->fractal; - iterations = params->iterations; - scale = params->scale; - offset = params->offset; - slice_w = params->slice_w; - julia_x = params->julia_x; - julia_y = params->julia_y; - julia_z = params->julia_z; - julia_w = params->julia_w; + dungeon_ymin = params->dungeon_ymin; + dungeon_ymax = params->dungeon_ymax; + fractal = params->fractal; + iterations = params->iterations; + scale = params->scale; + offset = params->offset; + slice_w = params->slice_w; + julia_x = params->julia_x; + julia_y = params->julia_y; + julia_z = params->julia_z; + julia_w = params->julia_w; //// 2D noise if (spflags & MGFRACTAL_TERRAIN) @@ -73,99 +79,106 @@ MapgenFractal::MapgenFractal(MapgenFractalParams *params, EmergeParams *emerge) //// 3D noise MapgenBasic::np_dungeons = params->np_dungeons; // Overgeneration to node_min.Y - 1 - MapgenBasic::np_cave1 = params->np_cave1; - MapgenBasic::np_cave2 = params->np_cave2; + MapgenBasic::np_cave1 = params->np_cave1; + MapgenBasic::np_cave2 = params->np_cave2; formula = fractal / 2 + fractal % 2; - julia = fractal % 2 == 0; + julia = fractal % 2 == 0; } + MapgenFractal::~MapgenFractal() { delete noise_seabed; delete noise_filler_depth; } -MapgenFractalParams::MapgenFractalParams() : - np_seabed(-14, 9, v3f(600, 600, 600), 41900, 5, 0.6, 2.0), - np_filler_depth(0, 1.2, v3f(150, 150, 150), 261, 3, 0.7, 2.0), - np_cave1(0, 12, v3f(61, 61, 61), 52534, 3, 0.5, 2.0), - np_cave2(0, 12, v3f(67, 67, 67), 10325, 3, 0.5, 2.0), - np_dungeons(0.9, 0.5, v3f(500, 500, 500), 0, 2, 0.8, 2.0) + +MapgenFractalParams::MapgenFractalParams(): + np_seabed (-14, 9, v3f(600, 600, 600), 41900, 5, 0.6, 2.0), + np_filler_depth (0, 1.2, v3f(150, 150, 150), 261, 3, 0.7, 2.0), + np_cave1 (0, 12, v3f(61, 61, 61), 52534, 3, 0.5, 2.0), + np_cave2 (0, 12, v3f(67, 67, 67), 10325, 3, 0.5, 2.0), + np_dungeons (0.9, 0.5, v3f(500, 500, 500), 0, 2, 0.8, 2.0) { } + void MapgenFractalParams::readParams(const Settings *settings) { settings->getFlagStrNoEx("mgfractal_spflags", spflags, flagdesc_mapgen_fractal); - settings->getFloatNoEx("mgfractal_cave_width", cave_width); - settings->getS16NoEx("mgfractal_large_cave_depth", large_cave_depth); - settings->getU16NoEx("mgfractal_small_cave_num_min", small_cave_num_min); - settings->getU16NoEx("mgfractal_small_cave_num_max", small_cave_num_max); - settings->getU16NoEx("mgfractal_large_cave_num_min", large_cave_num_min); - settings->getU16NoEx("mgfractal_large_cave_num_max", large_cave_num_max); + settings->getFloatNoEx("mgfractal_cave_width", cave_width); + settings->getS16NoEx("mgfractal_large_cave_depth", large_cave_depth); + settings->getU16NoEx("mgfractal_small_cave_num_min", small_cave_num_min); + settings->getU16NoEx("mgfractal_small_cave_num_max", small_cave_num_max); + settings->getU16NoEx("mgfractal_large_cave_num_min", large_cave_num_min); + settings->getU16NoEx("mgfractal_large_cave_num_max", large_cave_num_max); settings->getFloatNoEx("mgfractal_large_cave_flooded", large_cave_flooded); - settings->getS16NoEx("mgfractal_dungeon_ymin", dungeon_ymin); - settings->getS16NoEx("mgfractal_dungeon_ymax", dungeon_ymax); - settings->getU16NoEx("mgfractal_fractal", fractal); - settings->getU16NoEx("mgfractal_iterations", iterations); - settings->getV3FNoEx("mgfractal_scale", scale); - settings->getV3FNoEx("mgfractal_offset", offset); - settings->getFloatNoEx("mgfractal_slice_w", slice_w); - settings->getFloatNoEx("mgfractal_julia_x", julia_x); - settings->getFloatNoEx("mgfractal_julia_y", julia_y); - settings->getFloatNoEx("mgfractal_julia_z", julia_z); - settings->getFloatNoEx("mgfractal_julia_w", julia_w); - - settings->getNoiseParams("mgfractal_np_seabed", np_seabed); + settings->getS16NoEx("mgfractal_dungeon_ymin", dungeon_ymin); + settings->getS16NoEx("mgfractal_dungeon_ymax", dungeon_ymax); + settings->getU16NoEx("mgfractal_fractal", fractal); + settings->getU16NoEx("mgfractal_iterations", iterations); + settings->getV3FNoEx("mgfractal_scale", scale); + settings->getV3FNoEx("mgfractal_offset", offset); + settings->getFloatNoEx("mgfractal_slice_w", slice_w); + settings->getFloatNoEx("mgfractal_julia_x", julia_x); + settings->getFloatNoEx("mgfractal_julia_y", julia_y); + settings->getFloatNoEx("mgfractal_julia_z", julia_z); + settings->getFloatNoEx("mgfractal_julia_w", julia_w); + + settings->getNoiseParams("mgfractal_np_seabed", np_seabed); settings->getNoiseParams("mgfractal_np_filler_depth", np_filler_depth); - settings->getNoiseParams("mgfractal_np_cave1", np_cave1); - settings->getNoiseParams("mgfractal_np_cave2", np_cave2); - settings->getNoiseParams("mgfractal_np_dungeons", np_dungeons); + settings->getNoiseParams("mgfractal_np_cave1", np_cave1); + settings->getNoiseParams("mgfractal_np_cave2", np_cave2); + settings->getNoiseParams("mgfractal_np_dungeons", np_dungeons); } + void MapgenFractalParams::writeParams(Settings *settings) const { settings->setFlagStr("mgfractal_spflags", spflags, flagdesc_mapgen_fractal); - settings->setFloat("mgfractal_cave_width", cave_width); - settings->setS16("mgfractal_large_cave_depth", large_cave_depth); - settings->setU16("mgfractal_small_cave_num_min", small_cave_num_min); - settings->setU16("mgfractal_small_cave_num_max", small_cave_num_max); - settings->setU16("mgfractal_large_cave_num_min", large_cave_num_min); - settings->setU16("mgfractal_large_cave_num_max", large_cave_num_max); + settings->setFloat("mgfractal_cave_width", cave_width); + settings->setS16("mgfractal_large_cave_depth", large_cave_depth); + settings->setU16("mgfractal_small_cave_num_min", small_cave_num_min); + settings->setU16("mgfractal_small_cave_num_max", small_cave_num_max); + settings->setU16("mgfractal_large_cave_num_min", large_cave_num_min); + settings->setU16("mgfractal_large_cave_num_max", large_cave_num_max); settings->setFloat("mgfractal_large_cave_flooded", large_cave_flooded); - settings->setS16("mgfractal_dungeon_ymin", dungeon_ymin); - settings->setS16("mgfractal_dungeon_ymax", dungeon_ymax); - settings->setU16("mgfractal_fractal", fractal); - settings->setU16("mgfractal_iterations", iterations); - settings->setV3F("mgfractal_scale", scale); - settings->setV3F("mgfractal_offset", offset); - settings->setFloat("mgfractal_slice_w", slice_w); - settings->setFloat("mgfractal_julia_x", julia_x); - settings->setFloat("mgfractal_julia_y", julia_y); - settings->setFloat("mgfractal_julia_z", julia_z); - settings->setFloat("mgfractal_julia_w", julia_w); - - settings->setNoiseParams("mgfractal_np_seabed", np_seabed); + settings->setS16("mgfractal_dungeon_ymin", dungeon_ymin); + settings->setS16("mgfractal_dungeon_ymax", dungeon_ymax); + settings->setU16("mgfractal_fractal", fractal); + settings->setU16("mgfractal_iterations", iterations); + settings->setV3F("mgfractal_scale", scale); + settings->setV3F("mgfractal_offset", offset); + settings->setFloat("mgfractal_slice_w", slice_w); + settings->setFloat("mgfractal_julia_x", julia_x); + settings->setFloat("mgfractal_julia_y", julia_y); + settings->setFloat("mgfractal_julia_z", julia_z); + settings->setFloat("mgfractal_julia_w", julia_w); + + settings->setNoiseParams("mgfractal_np_seabed", np_seabed); settings->setNoiseParams("mgfractal_np_filler_depth", np_filler_depth); - settings->setNoiseParams("mgfractal_np_cave1", np_cave1); - settings->setNoiseParams("mgfractal_np_cave2", np_cave2); - settings->setNoiseParams("mgfractal_np_dungeons", np_dungeons); + settings->setNoiseParams("mgfractal_np_cave1", np_cave1); + settings->setNoiseParams("mgfractal_np_cave2", np_cave2); + settings->setNoiseParams("mgfractal_np_dungeons", np_dungeons); } + void MapgenFractalParams::setDefaultSettings(Settings *settings) { - settings->setDefault( - "mgfractal_spflags", flagdesc_mapgen_fractal, MGFRACTAL_TERRAIN); + settings->setDefault("mgfractal_spflags", flagdesc_mapgen_fractal, + MGFRACTAL_TERRAIN); } + ///////////////////////////////////////////////////////////////// + int MapgenFractal::getSpawnLevelAtPoint(v2s16 p) { bool solid_below = false; // Fractal node is present below to spawn on - u8 air_count = 0; // Consecutive air nodes above a fractal node - s16 search_start = 0; // No terrain search start + u8 air_count = 0; // Consecutive air nodes above a fractal node + s16 search_start = 0; // No terrain search start // If terrain present, don't start search below terrain or water level if (noise_seabed) { @@ -187,22 +200,23 @@ int MapgenFractal::getSpawnLevelAtPoint(v2s16 p) } } - return MAX_MAP_GENERATION_LIMIT; // Unsuitable spawn point + return MAX_MAP_GENERATION_LIMIT; // Unsuitable spawn point } + void MapgenFractal::makeChunk(BlockMakeData *data) { // Pre-conditions assert(data->vmanip); assert(data->nodedef); assert(data->blockpos_requested.X >= data->blockpos_min.X && - data->blockpos_requested.Y >= data->blockpos_min.Y && - data->blockpos_requested.Z >= data->blockpos_min.Z); + data->blockpos_requested.Y >= data->blockpos_min.Y && + data->blockpos_requested.Z >= data->blockpos_min.Z); assert(data->blockpos_requested.X <= data->blockpos_max.X && - data->blockpos_requested.Y <= data->blockpos_max.Y && - data->blockpos_requested.Z <= data->blockpos_max.Z); + data->blockpos_requested.Y <= data->blockpos_max.Y && + data->blockpos_requested.Z <= data->blockpos_max.Z); - // TimeTaker t("makeChunk"); + //TimeTaker t("makeChunk"); this->generating = true; this->vm = data->vmanip; @@ -257,18 +271,19 @@ void MapgenFractal::makeChunk(BlockMakeData *data) // Calculate lighting if (flags & MG_LIGHT) calcLighting(node_min - v3s16(0, 1, 0), node_max + v3s16(0, 1, 0), - full_node_min, full_node_max); + full_node_min, full_node_max); this->generating = false; - // printf("makeChunk: %lums\n", t.stop()); + //printf("makeChunk: %lums\n", t.stop()); } + bool MapgenFractal::getFractalAtPoint(s16 x, s16 y, s16 z) { float cx, cy, cz, cw, ox, oy, oz, ow; - if (julia) { // Julia set + if (julia) { // Julia set cx = julia_x; cy = julia_y; cz = julia_z; @@ -277,7 +292,7 @@ bool MapgenFractal::getFractalAtPoint(s16 x, s16 y, s16 z) oy = (float)y / scale.Y - offset.Y; oz = (float)z / scale.Z - offset.Z; ow = slice_w; - } else { // Mandelbrot set + } else { // Mandelbrot set cx = (float)x / scale.X - offset.X; cy = (float)y / scale.Y - offset.Y; cz = (float)z / scale.Z - offset.Z; @@ -326,8 +341,7 @@ bool MapgenFractal::getFractalAtPoint(s16 x, s16 y, s16 z) nz = -2.0f * ox * oz + cz; break; case 6: // 3D "Christmas Tree" - // Altering the formula here is necessary to avoid division by - // zero + // Altering the formula here is necessary to avoid division by zero if (std::fabs(oz) < 0.000000001f) { nx = ox * ox - oy * oy - oz * oz + cx; ny = 2.0f * oy * ox + cy; @@ -366,8 +380,7 @@ bool MapgenFractal::getFractalAtPoint(s16 x, s16 y, s16 z) case 9: // 4D "Mandelbulb" float rxy = std::sqrt(ox * ox + oy * oy); float rxyz = std::sqrt(ox * ox + oy * oy + oz * oz); - if (std::fabs(ow) < 0.000000001f && - std::fabs(oz) < 0.000000001f) { + if (std::fabs(ow) < 0.000000001f && std::fabs(oz) < 0.000000001f) { nx = (ox * ox - oy * oy) + cx; ny = 2.0f * ox * oy + cy; nz = -2.0f * rxy * oz + cz; @@ -395,6 +408,7 @@ bool MapgenFractal::getFractalAtPoint(s16 x, s16 y, s16 z) return true; } + s16 MapgenFractal::generateTerrain() { MapNode n_air(CONTENT_AIR); @@ -418,14 +432,12 @@ s16 MapgenFractal::generateTerrain() if (noise_seabed) seabed_height = noise_seabed->result[index2d]; - if (((spflags & MGFRACTAL_TERRAIN) && - y <= seabed_height) || + if (((spflags & MGFRACTAL_TERRAIN) && y <= seabed_height) || getFractalAtPoint(x, y, z)) { vm->m_data[vi] = n_stone; if (y > stone_surface_max_y) stone_surface_max_y = y; - } else if ((spflags & MGFRACTAL_TERRAIN) && - y <= water_level) { + } else if ((spflags & MGFRACTAL_TERRAIN) && y <= water_level) { vm->m_data[vi] = n_water; } else { vm->m_data[vi] = n_air; |