]> git.lizzy.rs Git - minetest.git/blobdiff - src/mapgen_v6.cpp
Added debug log level setting
[minetest.git] / src / mapgen_v6.cpp
index f31a754d6d2597dad77df02ccab35995a15bbd89..3a5e1093067b0eb6db1d96d90fce08645de0538c 100644 (file)
@@ -31,14 +31,13 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "profiler.h"
 #include "settings.h" // For g_settings
 #include "main.h" // For g_profiler
+#include "mapgen_v6.h"
 
-/*
-#define AVERAGE_MUD_AMOUNT 4
-
+/////////////////// Mapgen V6 perlin noise default values
 NoiseParams nparams_v6_def_terrain_base =
        {-AVERAGE_MUD_AMOUNT, 20.0, v3f(250.0, 250.0, 250.0), 82341, 5, 0.6};
 NoiseParams nparams_v6_def_terrain_higher =
-       {20.0, 16.0, v3f(500.0, 500.0, 500.0), 85309, 5, 0.6};
+       {20.0, 16.0, v3f(500.0, 500.0, 500.0), 85039, 5, 0.6};
 NoiseParams nparams_v6_def_steepness =
        {0.85, 0.5, v3f(125.0, 125.0, 125.0), -932, 5, 0.7};
 NoiseParams nparams_v6_def_height_select =
@@ -55,25 +54,6 @@ NoiseParams nparams_v6_def_cave =
        {6.0, 6.0, v3f(250.0, 250.0, 250.0), 34329, 3, 0.50};
 
 
-MapgenV6Params mg_def_params_v6 = {
-       0,
-       1,
-       5,
-       MG_TREES | MG_CAVES | MGV6_BIOME_BLEND,
-       0.45,
-       0.15,
-       &nparams_v6_def_terrain_base,
-       &nparams_v6_def_terrain_higher,
-       &nparams_v6_def_steepness,
-       &nparams_v6_def_height_select,
-       &nparams_v6_def_trees,
-       &nparams_v6_def_mud,
-       &nparams_v6_def_beach,
-       &nparams_v6_def_biome,
-       &nparams_v6_def_cave
-};
-*/
-
 ///////////////////////////////////////////////////////////////////////////////
 
 
@@ -81,9 +61,9 @@ MapgenV6::MapgenV6(int mapgenid, MapgenV6Params *params) {
        this->generating  = false;
        this->id       = mapgenid;
 
-       this->seed     = params->seed;
+       this->seed     = (int)params->seed;
        this->water_level = params->water_level;
-       this->flags   = flags;
+       this->flags   = params->flags;
        this->csize   = v3s16(1, 1, 1) * params->chunksize * MAP_BLOCKSIZE;
 
        this->freq_desert = params->freq_desert;
@@ -91,6 +71,8 @@ MapgenV6::MapgenV6(int mapgenid, MapgenV6Params *params) {
 
        this->ystride = csize.X; //////fix this
 
+       np_cave = params->np_cave;
+
        noise_terrain_base   = new Noise(params->np_terrain_base,   seed, csize.X, csize.Y);
        noise_terrain_higher = new Noise(params->np_terrain_higher, seed, csize.X, csize.Y);
        noise_steepness      = new Noise(params->np_steepness,      seed, csize.X, csize.Y);
@@ -120,7 +102,6 @@ MapgenV6::~MapgenV6() {
        delete noise_mud;
        delete noise_beach;
        delete noise_biome;
-       delete noise_cave;
 }
 
 
@@ -297,6 +278,9 @@ bool MapgenV6::block_is_underground(u64 seed, v3s16 blockpos)
 
 double MapgenV6::base_rock_level_2d(u64 seed, v2s16 p)
 {
+       if (flags & MG_FLAT)
+               return water_level;
+       
        int index = (p.Y - node_min.Z) * ystride + (p.X - node_min.X);
 
        // The base ground level
@@ -351,13 +335,50 @@ double MapgenV6::base_rock_level_2d(u64 seed, v2s16 p)
        return h;
 }
 
+double MapgenV6::baseRockLevelFromNoise(v2s16 p) {
+       if (flags & MG_FLAT)
+               return water_level;
+       
+       double base = water_level + 
+               NoisePerlin2DPosOffset(noise_terrain_base->np, p.X, 0.5, p.Y, 0.5, seed);
+       double higher = water_level +
+               NoisePerlin2DPosOffset(noise_terrain_higher->np, p.X, 0.5, p.Y, 0.5, seed);
+
+       if (higher < base)
+               higher = base;
+
+       double b = NoisePerlin2DPosOffset(noise_steepness->np, p.X, 0.5, p.Y, 0.5, seed);
+       b = rangelim(b, 0.0, 1000.0);
+       b = b*b*b*b*b*b*b;
+       b *= 5;
+       b = rangelim(b, 0.5, 1000.0);
+
+       if(b > 1.5 && b < 100.0){
+               if(b < 10.0)
+                       b = 1.5;
+               else
+                       b = 100.0;
+       }
+       
+       double a_off = -0.20;
+       double a = 0.5 + b * (a_off + NoisePerlin2DNoTxfmPosOffset(
+                       noise_height_select->np, p.X, 0.5, p.Y, 0.5, seed));
+       a = rangelim(a, 0.0, 1.0);
+
+       return base * (1.0 - a) + higher * a;
+}
+
+
 s16 MapgenV6::find_ground_level_from_noise(u64 seed, v2s16 p2d, s16 precision)
 {
-       return base_rock_level_2d(seed, p2d) + AVERAGE_MUD_AMOUNT;
+       return baseRockLevelFromNoise(p2d) + AVERAGE_MUD_AMOUNT;
 }
 
 double MapgenV6::get_mud_add_amount(u64 seed, v2s16 p)
 {
+       if (flags & MG_FLAT)
+               return AVERAGE_MUD_AMOUNT;
+               
        /*return ((float)AVERAGE_MUD_AMOUNT + 2.0 * noise2d_perlin(
                        0.5+(float)p.X/200, 0.5+(float)p.Y/200,
                        seed+91013, 3, 0.55));*/
@@ -401,6 +422,11 @@ u32 MapgenV6::get_blockseed(u64 seed, v3s16 p)
        return (u32)(seed%0x100000000ULL) + z*38134234 + y*42123 + x*23;
 }
 
+
+int MapgenV6::getGroundLevelAtPoint(v2s16 p) {
+       return baseRockLevelFromNoise(p) + AVERAGE_MUD_AMOUNT;
+}
+
 #define VMANIP_FLAG_CAVE VOXELFLAG_CHECKED1
 
 void MapgenV6::makeChunk(BlockMakeData *data)
@@ -474,34 +500,37 @@ void MapgenV6::makeChunk(BlockMakeData *data)
                int z = node_min.Z;
 
                // Need to adjust for the original implementation's +.5 offset...
-               noise_terrain_base->perlinMap2D(
-                       x + 0.5 * noise_terrain_base->np->spread.X,
-                       z + 0.5 * noise_terrain_base->np->spread.Z);
-               noise_terrain_base->transformNoiseMap();
-
-               noise_terrain_higher->perlinMap2D(
-                       x + 0.5 * noise_terrain_higher->np->spread.X,
-                       z + 0.5 * noise_terrain_higher->np->spread.Z);
-               noise_terrain_higher->transformNoiseMap();
-
-               noise_steepness->perlinMap2D(
-                       x + 0.5 * noise_steepness->np->spread.X,
-                       z + 0.5 * noise_steepness->np->spread.Z);
-               noise_steepness->transformNoiseMap();
-
-               noise_height_select->perlinMap2D(
-                       x + 0.5 * noise_height_select->np->spread.X,
-                       z + 0.5 * noise_height_select->np->spread.Z);
-
+               if (!(flags & MG_FLAT)) {
+                       noise_terrain_base->perlinMap2D(
+                               x + 0.5 * noise_terrain_base->np->spread.X,
+                               z + 0.5 * noise_terrain_base->np->spread.Z);
+                       noise_terrain_base->transformNoiseMap();
+
+                       noise_terrain_higher->perlinMap2D(
+                               x + 0.5 * noise_terrain_higher->np->spread.X,
+                               z + 0.5 * noise_terrain_higher->np->spread.Z);
+                       noise_terrain_higher->transformNoiseMap();
+
+                       noise_steepness->perlinMap2D(
+                               x + 0.5 * noise_steepness->np->spread.X,
+                               z + 0.5 * noise_steepness->np->spread.Z);
+                       noise_steepness->transformNoiseMap();
+
+                       noise_height_select->perlinMap2D(
+                               x + 0.5 * noise_height_select->np->spread.X,
+                               z + 0.5 * noise_height_select->np->spread.Z);
+               }
+               
                noise_trees->perlinMap2D(
                        x + 0.5 * noise_trees->np->spread.X,
                        z + 0.5 * noise_trees->np->spread.Z);
-
-               noise_mud->perlinMap2D(
-                       x + 0.5 * noise_mud->np->spread.X,
-                       z + 0.5 * noise_mud->np->spread.Z);
-               noise_mud->transformNoiseMap();
-
+                       
+               if (!(flags & MG_FLAT)) {
+                       noise_mud->perlinMap2D(
+                               x + 0.5 * noise_mud->np->spread.X,
+                               z + 0.5 * noise_mud->np->spread.Z);
+                       noise_mud->transformNoiseMap();
+               }
                noise_beach->perlinMap2D(
                        x + 0.2 * noise_beach->np->spread.X,
                        z + 0.7 * noise_beach->np->spread.Z);
@@ -636,10 +665,7 @@ void MapgenV6::makeChunk(BlockMakeData *data)
                        0.5+(double)node_min.X/250, 0.5+(double)node_min.Y/250,
                        data->seed+34329, 3, 0.50);*/
 
-       double cave_amount = np_cave->offset + np_cave->scale * noise2d_perlin(
-                       0.5 + (double)node_min.X / np_cave->spread.X,
-                       0.5 + (double)node_min.Y / np_cave->spread.Y,
-                       data->seed + np_cave->seed, np_cave->octaves, np_cave->persist);
+       double cave_amount = NoisePerlin2D(np_cave, node_min.X, node_min.Y, data->seed);
 
        const u32 age_loops = 2;
        for(u32 i_age=0; i_age<age_loops; i_age++)
@@ -669,11 +695,15 @@ void MapgenV6::makeChunk(BlockMakeData *data)
        }
        for(u32 jj=0; jj<caves_count+bruises_count; jj++)
        {
-               int avg_height = (int)
+               if (!(flags & MG_CAVES))
+                       continue;
+
+               /*int avg_height = (int)
                          ((base_rock_level_2d(data->seed, v2s16(node_min.X, node_min.Z)) +
                                base_rock_level_2d(data->seed, v2s16(node_max.X, node_max.Z))) / 2);
                if ((node_max.Y + node_min.Y) / 2 > avg_height)
-                       break;
+                       break;*/
+
                bool large_cave = (jj >= caves_count);
                s16 min_tunnel_diameter = 2;
                s16 max_tunnel_diameter = ps.range(2,6);
@@ -1316,7 +1346,7 @@ void MapgenV6::makeChunk(BlockMakeData *data)
                Generate some trees
        */
        assert(central_area_size.X == central_area_size.Z);
-       {
+       if (flags & MG_TREES) {
                // Divide area into parts
                s16 div = 8;
                s16 sidelen = central_area_size.X / div;