#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 =
{0.0, 1.0, v3f(250.0, 250.0, 250.0), 59420, 3, 0.50};
NoiseParams nparams_v6_def_biome =
{0.0, 1.0, v3f(250.0, 250.0, 250.0), 9130, 3, 0.50};
-//NoiseParams nparams_v6_def_cave =
-// {6.0, 6.0, v3f(250.0, 250.0, 250.0), 34329, 3, 0.50};
+NoiseParams nparams_v6_def_cave =
+ {6.0, 6.0, v3f(250.0, 250.0, 250.0), 34329, 3, 0.50};
-NoiseParams *np_terrain_base = &nparams_v6_def_terrain_base;
-NoiseParams *np_terrain_higher = &nparams_v6_def_terrain_higher;
-NoiseParams *np_steepness = &nparams_v6_def_steepness;
-NoiseParams *np_height_select = &nparams_v6_def_height_select;
-NoiseParams *np_trees = &nparams_v6_def_trees;
-NoiseParams *np_mud = &nparams_v6_def_mud;
-NoiseParams *np_beach = &nparams_v6_def_beach;
-NoiseParams *np_biome = &nparams_v6_def_biome;
-//NoiseParams *np_cave = &nparams_v6_def_cave;
+///////////////////////////////////////////////////////////////////////////////
-MapgenV6::MapgenV6(int mapgenid, u64 seed) {
+MapgenV6::MapgenV6(int mapgenid, MapgenV6Params *params) {
this->generating = false;
this->id = mapgenid;
- this->seed = (int)seed;
- this->water_level = 1;
+ this->seed = (int)params->seed;
+ this->water_level = params->water_level;
+ this->flags = params->flags;
+ this->csize = v3s16(1, 1, 1) * params->chunksize * MAP_BLOCKSIZE;
+
+ this->freq_desert = params->freq_desert;
+ this->freq_beach = params->freq_beach;
- this->csize = v3s16(5, 5, 5) * MAP_BLOCKSIZE; /////////////////get this from config!
- this->ystride = csize.X;
+ this->ystride = csize.X; //////fix this
- this->use_smooth_biome_trans = g_settings->getBool("mgv6_use_smooth_biome_trans");
+ np_cave = params->np_cave;
- noise_terrain_base = new Noise(np_terrain_base, seed, csize.X, csize.Y);
- noise_terrain_higher = new Noise(np_terrain_higher, seed, csize.X, csize.Y);
- noise_steepness = new Noise(np_steepness, seed, csize.X, csize.Y);
- noise_height_select = new Noise(np_height_select, seed, csize.X, csize.Y);
- noise_trees = new Noise(np_trees, seed, csize.X, csize.Y);
- noise_mud = new Noise(np_mud, seed, csize.X, csize.Y);
- noise_beach = new Noise(np_beach, seed, csize.X, csize.Y);
- noise_biome = new Noise(np_biome, seed, csize.X, csize.Y);
- //noise_cave = new Noise(np_cave, seed, csize.X, csize.Y);
+ 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);
+ noise_height_select = new Noise(params->np_height_select, seed, csize.X, csize.Y);
+ noise_trees = new Noise(params->np_trees, seed, csize.X, csize.Y);
+ noise_mud = new Noise(params->np_mud, seed, csize.X, csize.Y);
+ noise_beach = new Noise(params->np_beach, seed, csize.X, csize.Y);
+ noise_biome = new Noise(params->np_biome, seed, csize.X, csize.Y);
map_terrain_base = noise_terrain_base->result;
map_terrain_higher = noise_terrain_higher->result;
map_mud = noise_mud->result;
map_beach = noise_beach->result;
map_biome = noise_biome->result;
- //map_cave = noise_cave->result;
}
delete noise_mud;
delete noise_beach;
delete noise_biome;
- delete noise_cave;
}
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
0.5+(float)p.X/250., 0.5+(float)p.Y/250.,
seed+82341, 5, 0.6);*/
double base = water_level + map_terrain_base[index];
- //return base;
-//printf("%f ", base);
-//return base;
+
// Higher ground level
/*double higher = (double)WATER_LEVEL + 20. + 16. * noise2d_perlin(
0.5+(float)p.X/500., 0.5+(float)p.Y/500.,
b = pow(b, 7);
b *= 5;
b = rangelim(b, 0.5, 1000.0);
+
// Values 1.5...100 give quite horrible looking slopes
if(b > 1.5 && b < 100.0){
if(b < 10.0)
else
b = 100.0;
}
- //dstream<<"b="<<b<<std::endl;
- //double b = 20;
- //b = 0.25;
// Offset to more low
double a_off = -0.20;
+
// High/low selector
/*double a = (double)0.5 + b * (a_off + noise2d_perlin(
0.5+(float)p.X/250., 0.5+(float)p.Y/250.,
seed+4213, 5, 0.69));*/
double a = 0.5 + b * (a_off + map_height_select[index]);
+
// Limit
a = rangelim(a, 0.0, 1.0);
- //dstream<<"a="<<a<<std::endl;
-
double h = base*(1.0-a) + higher*a;
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));*/
int index = (p2d.Y - node_min.Z) * ystride + (p2d.X - node_min.X);
double sandnoise = map_beach[index];
- return (sandnoise > 0.15);
+ return (sandnoise > freq_beach);
}
BiomeType MapgenV6::get_biome(u64 seed, v2s16 p2d)
seed+9130, 3, 0.50);*/
int index = (p2d.Y - node_min.Z) * ystride + (p2d.X - node_min.X);
double d = map_biome[index];
- if(d > 0.45)
+ if(d > freq_desert)
return BT_DESERT;
- if (use_smooth_biome_trans) {
- if(d > 0.35 && (noise2d( p2d.X, p2d.Y, int(seed) ) + 1.0) > ( 0.45 - d ) * 20.0 )
+ if (flags & MGV6_BIOME_BLEND) {
+ if(d > freq_desert - 0.10 &&
+ (noise2d(p2d.X, p2d.Y, seed) + 1.0) > (freq_desert - d) * 20.0)
return BT_DESERT;
}
return BT_NORMAL;
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)
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);
-
- 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_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);
+
+ 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);
noise_biome->perlinMap2D(
x + 0.6 * noise_biome->np->spread.X,
z + 0.2 * noise_biome->np->spread.Z);
-
-/* noise_cave->perlinMap2D(
- x + 0.5 * noise_cave->np->spread.X,
- z + 0.5 * noise_cave->np->spread.Z);
- noise_cave->transformNoiseMap();*/
}
Loop this part, it will make stuff look older and newer nicely
*/
- double cave_amount = 6.0 + 6.0 * noise2d_perlin(
+ /*double cave_amount = 6.0 + 6.0 * noise2d_perlin(
0.5+(double)node_min.X/250, 0.5+(double)node_min.Y/250,
- data->seed+34329, 3, 0.50);
+ data->seed+34329, 3, 0.50);*/
+
+ 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++)
PseudoRandom ps2(blockseed+1032);
if(ps.range(1, 6) == 1)
bruises_count = ps.range(0, ps.range(0, 2));
- if(get_biome(data->seed, v2s16(node_min.X, node_min.Y)) == BT_DESERT){
+ if(get_biome(data->seed, v2s16(node_min.X, node_min.Z)) == BT_DESERT){
caves_count /= 3;
bruises_count /= 3;
}
for(u32 jj=0; jj<caves_count+bruises_count; jj++)
{
+ 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;*/
+
bool large_cave = (jj >= caves_count);
s16 min_tunnel_diameter = 2;
s16 max_tunnel_diameter = ps.range(2,6);
/*
Add blobs of dirt and gravel underground
*/
- if(get_biome(data->seed, v2s16(node_min.X, node_min.Y)) == BT_NORMAL)
+ if(get_biome(data->seed, v2s16(node_min.X, node_min.Z)) == BT_NORMAL)
{
PseudoRandom pr(blockseed+983);
for(int i=0; i<volume_nodes/10/10/10; i++)
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;