]> git.lizzy.rs Git - minetest.git/blobdiff - src/mapgen_v7.cpp
src/network/connection.h: Fix race condition
[minetest.git] / src / mapgen_v7.cpp
index a111256a49c5cc01d21df693e8d0d5807c4d6609..e499ebb81c1fdee78a59241c60a012208b0d938c 100644 (file)
@@ -27,7 +27,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "content_sao.h"
 #include "nodedef.h"
 #include "voxelalgorithms.h"
-#include "profiler.h"
 #include "settings.h" // For g_settings
 #include "emerge.h"
 #include "dungeongen.h"
@@ -147,17 +146,17 @@ MapgenV7Params::MapgenV7Params()
 {
        spflags = MGV7_MOUNTAINS | MGV7_RIDGES;
 
-       np_terrain_base    = NoiseParams(4,    70,   v3f(600,  600,  600),  82341, 5, 0.6,  2.0);
-       np_terrain_alt     = NoiseParams(4,    25,   v3f(600,  600,  600),  5934,  5, 0.6,  2.0);
-       np_terrain_persist = NoiseParams(0.6,  0.12, v3f(2000, 2000, 2000), 539,   3, 0.5,  2.0);
-       np_height_select   = NoiseParams(-12,  24,   v3f(500,  500,  500),  4213,  6, 0.69, 2.0);
-       np_filler_depth    = NoiseParams(0,    1.2,  v3f(150,  150,  150),  261,   4, 0.7,  2.0);
-       np_mount_height    = NoiseParams(184,  72,   v3f(1000, 1000, 1000), 72449, 3, 0.5,  2.0);
-       np_ridge_uwater    = NoiseParams(0,    1,    v3f(1000, 1000, 1000), 85039, 5, 0.6,  2.0);
-       np_mountain        = NoiseParams(-0.6, 1,    v3f(250,  350,  250),  5333,  5, 0.68, 2.0);
-       np_ridge           = NoiseParams(0,    1,    v3f(100,  100,  100),  6467,  4, 0.75, 2.0);
-       np_cave1           = NoiseParams(0,    12,   v3f(100,  100,  100),  52534, 4, 0.5,  2.0);
-       np_cave2           = NoiseParams(0,    12,   v3f(100,  100,  100),  10325, 4, 0.5,  2.0);
+       np_terrain_base    = NoiseParams(4,    70,  v3f(600,  600,  600),  82341, 5, 0.6,  2.0);
+       np_terrain_alt     = NoiseParams(4,    25,  v3f(600,  600,  600),  5934,  5, 0.6,  2.0);
+       np_terrain_persist = NoiseParams(0.6,  0.1, v3f(2000, 2000, 2000), 539,   3, 0.6,  2.0);
+       np_height_select   = NoiseParams(-12,  24,  v3f(500,  500,  500),  4213,  6, 0.7,  2.0);
+       np_filler_depth    = NoiseParams(0,    1.2, v3f(150,  150,  150),  261,   3, 0.7,  2.0);
+       np_mount_height    = NoiseParams(256,  112, v3f(1000, 1000, 1000), 72449, 3, 0.6,  2.0);
+       np_ridge_uwater    = NoiseParams(0,    1,   v3f(1000, 1000, 1000), 85039, 5, 0.6,  2.0);
+       np_mountain        = NoiseParams(-0.6, 1,   v3f(250,  350,  250),  5333,  5, 0.63, 2.0);
+       np_ridge           = NoiseParams(0,    1,   v3f(100,  100,  100),  6467,  4, 0.75, 2.0);
+       np_cave1           = NoiseParams(0,    12,  v3f(100,  100,  100),  52534, 4, 0.5,  2.0);
+       np_cave2           = NoiseParams(0,    12,  v3f(100,  100,  100),  10325, 4, 0.5,  2.0);
 }
 
 
@@ -363,10 +362,7 @@ void MapgenV7::calculateNoise()
                noise_ridge_uwater->perlinMap2D(x, z);
        }
 
-       if ((spflags & MGV7_MOUNTAINS) && node_max.Y >= MOUNTAIN_BASE) {
-               noise_mountain->perlinMap3D(x, y, z);
-               noise_mount_height->perlinMap2D(x, z);
-       }
+       // Mountain noises are calculated in generateMountainTerrain()
 
        noise_filler_depth->perlinMap2D(x, z);
        noise_heat->perlinMap2D(x, z);
@@ -397,7 +393,7 @@ Biome *MapgenV7::getBiomeAtPoint(v3s16 p)
 }
 
 //needs to be updated
-float MapgenV7::baseTerrainLevelAtPoint(int x, int z)
+float MapgenV7::baseTerrainLevelAtPoint(s16 x, s16 z)
 {
        float hselect = NoisePerlin2D(&noise_height_select->np, x, z, seed);
        hselect = rangelim(hselect, 0.0, 1.0);
@@ -430,19 +426,23 @@ float MapgenV7::baseTerrainLevelFromMap(int index)
 }
 
 
-bool MapgenV7::getMountainTerrainAtPoint(int x, int y, int z)
+bool MapgenV7::getMountainTerrainAtPoint(s16 x, s16 y, s16 z)
 {
        float mnt_h_n = NoisePerlin2D(&noise_mount_height->np, x, z, seed);
+       float density_gradient = -((float)y / mnt_h_n);
        float mnt_n = NoisePerlin3D(&noise_mountain->np, x, y, z, seed);
-       return mnt_n * mnt_h_n >= (float)y;
+
+       return mnt_n + density_gradient >= 0.0;
 }
 
 
-bool MapgenV7::getMountainTerrainFromMap(int idx_xyz, int idx_xz, int y)
+bool MapgenV7::getMountainTerrainFromMap(int idx_xyz, int idx_xz, s16 y)
 {
        float mounthn = noise_mount_height->result[idx_xz];
+       float density_gradient = -((float)y / mounthn);
        float mountn = noise_mountain->result[idx_xyz];
-       return mountn * mounthn >= (float)y;
+
+       return mountn + density_gradient >= 0.0;
 }
 
 
@@ -483,26 +483,30 @@ void MapgenV7::carveRivers() {
 
 int MapgenV7::generateTerrain()
 {
-       int ymax = generateBaseTerrain();
+       s16 stone_surface_min_y;
+       s16 stone_surface_max_y;
+
+       generateBaseTerrain(&stone_surface_min_y, &stone_surface_max_y);
 
-       if (spflags & MGV7_MOUNTAINS)
-               ymax = generateMountainTerrain(ymax);
+       if ((spflags & MGV7_MOUNTAINS) && stone_surface_min_y < node_max.Y)
+               stone_surface_max_y = generateMountainTerrain(stone_surface_max_y);
 
        if (spflags & MGV7_RIDGES)
                generateRidgeTerrain();
 
-       return ymax;
+       return stone_surface_max_y;
 }
 
 
-int MapgenV7::generateBaseTerrain()
+void MapgenV7::generateBaseTerrain(s16 *stone_surface_min_y, s16 *stone_surface_max_y)
 {
        MapNode n_air(CONTENT_AIR);
        MapNode n_stone(c_stone);
        MapNode n_water(c_water_source);
 
-       int stone_surface_max_y = -MAP_GENERATION_LIMIT;
        v3s16 em = vm->m_area.getExtent();
+       s16 surface_min_y = MAP_GENERATION_LIMIT;
+       s16 surface_max_y = -MAP_GENERATION_LIMIT;
        u32 index = 0;
 
        for (s16 z = node_min.Z; z <= node_max.Z; z++)
@@ -513,8 +517,11 @@ int MapgenV7::generateBaseTerrain()
                heightmap[index]       = surface_y;
                ridge_heightmap[index] = surface_y;
 
-               if (surface_y > stone_surface_max_y)
-                       stone_surface_max_y = surface_y;
+               if (surface_y < surface_min_y)
+                       surface_min_y = surface_y;
+
+               if (surface_y > surface_max_y)
+                       surface_max_y = surface_y;
 
                u32 i = vm->m_area.index(x, node_min.Y - 1, z);
                for (s16 y = node_min.Y - 1; y <= node_max.Y + 1; y++) {
@@ -530,14 +537,15 @@ int MapgenV7::generateBaseTerrain()
                }
        }
 
-       return stone_surface_max_y;
+       *stone_surface_min_y = surface_min_y;
+       *stone_surface_max_y = surface_max_y;
 }
 
 
-int MapgenV7::generateMountainTerrain(int ymax)
+int MapgenV7::generateMountainTerrain(s16 ymax)
 {
-       if (node_max.Y < MOUNTAIN_BASE)
-               return ymax;
+       noise_mountain->perlinMap3D(node_min.X, node_min.Y - 1, node_min.Z);
+       noise_mount_height->perlinMap2D(node_min.X, node_min.Z);
 
        MapNode n_stone(c_stone);
        u32 j = 0;
@@ -848,7 +856,7 @@ void MapgenV7::addTopNodes()
 #endif
 
 
-void MapgenV7::generateCaves(int max_stone_y)
+void MapgenV7::generateCaves(s16 max_stone_y)
 {
        if (max_stone_y >= node_min.Y) {
                u32 index   = 0;