Merge branch 'MathWorlds_0.1' into 'master'

Math worlds 0.1

See merge request !1
master
NF 2017-01-21 13:23:06 +00:00
commit 5bf9e9b1b7
5 changed files with 423 additions and 4 deletions

View File

@ -422,7 +422,7 @@ set(common_SRCS
mapgen_flat.cpp
mapgen_fractal.cpp
mapgen_singlenode.cpp
mapgen_v5.cpp
mapgen_torus.cpp
mapgen_v6.cpp
mapgen_v7.cpp
mapgen_valleys.cpp

View File

@ -20,7 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "util/numeric.h"
#include "map.h"
#include "mapgen.h"
#include "mapgen_v5.h"
#include "mapgen_torus.h"
#include "mapgen_v6.h"
#include "mapgen_v7.h"
#include "mg_biome.h"

View File

@ -41,7 +41,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "log.h"
#include "mapgen_flat.h"
#include "mapgen_fractal.h"
#include "mapgen_v5.h"
#include "mapgen_torus.h"
#include "mapgen_v6.h"
#include "mapgen_v7.h"
#include "mapgen_valleys.h"
@ -78,7 +78,7 @@ struct MapgenDesc {
////
static MapgenDesc g_reg_mapgens[] = {
{"v5", true},
{"MathWorlds", true},
{"v6", true},
{"v7", true},
{"flat", true},

351
src/mapgen_torus.cpp Normal file
View File

@ -0,0 +1,351 @@
/*
Minetest
Copyright (C) 2010-2015 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
Copyright (C) 2010-2015 paramat, Matt Gregory
Copyright (C) 2017 Nuno Ferreira
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <iostream>
#include "mapgen.h"
#include "voxel.h"
#include "noise.h"
#include "mapblock.h"
#include "mapnode.h"
#include "map.h"
#include "content_sao.h"
#include "nodedef.h"
#include "voxelalgorithms.h"
//#include "profiler.h" // For TimeTaker
#include "settings.h" // For g_settings
#include "emerge.h"
#include "dungeongen.h"
#include "cavegen.h"
#include "treegen.h"
#include "mg_biome.h"
#include "mg_ore.h"
#include "mg_decoration.h"
#include "mapgen_torus.h"
FlagDesc flagdesc_mapgen_v5[] = {
{NULL, 0}
};
MapgenV5::MapgenV5(int mapgenid, MapgenV5Params *params, EmergeManager *emerge)
: MapgenBasic(mapgenid, params, emerge)
{
this->spflags = params->spflags;
this->cave_width = params->cave_width;
// Terrain noise
noise_filler_depth = new Noise(&params->np_filler_depth, seed, csize.X, csize.Z);
noise_factor = new Noise(&params->np_factor, seed, csize.X, csize.Z);
noise_height = new Noise(&params->np_height, seed, csize.X, csize.Z);
// 3D terrain noise
// 1-up 1-down overgeneration
noise_ground = new Noise(&params->np_ground, seed, csize.X, csize.Y + 2, csize.Z);
MapgenBasic::np_cave1 = params->np_cave1;
MapgenBasic::np_cave2 = params->np_cave2;
}
MapgenV5::~MapgenV5()
{
delete noise_filler_depth;
delete noise_factor;
delete noise_height;
delete noise_ground;
}
MapgenV5Params::MapgenV5Params()
{
spflags = 0;
cave_width = 0.125;
np_filler_depth = NoiseParams(0, 1, v3f(150, 150, 150), 261, 4, 0.7, 2.0);
np_factor = NoiseParams(0, 1, v3f(250, 250, 250), 920381, 3, 0.45, 2.0);
np_height = NoiseParams(0, 10, v3f(250, 250, 250), 84174, 4, 0.5, 2.0);
np_cave1 = NoiseParams(0, 12, v3f(50, 50, 50), 52534, 4, 0.5, 2.0);
np_cave2 = NoiseParams(0, 12, v3f(50, 50, 50), 10325, 4, 0.5, 2.0);
np_ground = NoiseParams(0, 40, v3f(80, 80, 80), 983240, 4, 0.55, 2.0, NOISE_FLAG_EASED);
}
//#define CAVE_NOISE_SCALE 12.0
//#define CAVE_NOISE_THRESHOLD (1.5/CAVE_NOISE_SCALE) = 0.125
void MapgenV5Params::readParams(const Settings *settings)
{
settings->getFlagStrNoEx("mgv5_spflags", spflags, flagdesc_mapgen_v5);
settings->getFloatNoEx("mgv5_cave_width", cave_width);
settings->getNoiseParams("mgv5_np_filler_depth", np_filler_depth);
settings->getNoiseParams("mgv5_np_factor", np_factor);
settings->getNoiseParams("mgv5_np_height", np_height);
settings->getNoiseParams("mgv5_np_cave1", np_cave1);
settings->getNoiseParams("mgv5_np_cave2", np_cave2);
settings->getNoiseParams("mgv5_np_ground", np_ground);
}
void MapgenV5Params::writeParams(Settings *settings) const
{
settings->setFlagStr("mgv5_spflags", spflags, flagdesc_mapgen_v5, U32_MAX);
settings->setFloat("mgv5_cave_width", cave_width);
settings->setNoiseParams("mgv5_np_filler_depth", np_filler_depth);
settings->setNoiseParams("mgv5_np_factor", np_factor);
settings->setNoiseParams("mgv5_np_height", np_height);
settings->setNoiseParams("mgv5_np_cave1", np_cave1);
settings->setNoiseParams("mgv5_np_cave2", np_cave2);
settings->setNoiseParams("mgv5_np_ground", np_ground);
}
int MapgenV5::getSpawnLevelAtPoint(v2s16 p)
{
//TimeTaker t("getGroundLevelAtPoint", NULL, PRECISION_MICRO);
float f = 0.55 + NoisePerlin2D(&noise_factor->np, p.X, p.Y, seed);
if (f < 0.01)
f = 0.01;
else if (f >= 1.0)
f *= 16;
float h = 10000;//NoisePerlin2D(&noise_height->np, p.X, p.Y, seed);
for (s16 y = 200; y >= -200; y--) {
float n_ground = 10;//NoisePerlin3D(&noise_ground->np, p.X, y, p.Y, seed);
if (n_ground * f > y - h) { // If solid
// If either top 2 nodes of search are solid this is inside a
// mountain or floatland with possibly no space for the player to spawn.
if (y >= 18) {
return MAX_MAP_GENERATION_LIMIT; // Unsuitable spawn point
} else { // Ground below at least 2 nodes of empty space
if (y <= water_level || y > water_level + 16)
return MAX_MAP_GENERATION_LIMIT; // Unsuitable spawn point
else
return y;
}
}
}
//printf("getGroundLevelAtPoint: %dus\n", t.stop());
return MAX_MAP_GENERATION_LIMIT; // Unsuitable spawn position, no ground found
}
void MapgenV5::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);
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);
this->generating = true;
this->vm = data->vmanip;
this->ndef = data->nodedef;
//TimeTaker t("makeChunk");
v3s16 blockpos_min = data->blockpos_min;
v3s16 blockpos_max = data->blockpos_max;
node_min = blockpos_min * MAP_BLOCKSIZE;
node_max = (blockpos_max + v3s16(1, 1, 1)) * MAP_BLOCKSIZE - v3s16(1, 1, 1);
full_node_min = (blockpos_min - 1) * MAP_BLOCKSIZE;
full_node_max = (blockpos_max + 2) * MAP_BLOCKSIZE - v3s16(1, 1, 1);
// Create a block-specific seed
blockseed = getBlockSeed2(full_node_min, seed);
// Generate base terrain
s16 stone_surface_max_y = generateBaseTerrain();
// Create heightmap
updateHeightmap(node_min, node_max);
// Init biome generator, place biome-specific nodes, and build biomemap
biomegen->calcBiomeNoise(node_min);
MgStoneType stone_type = generateBiomes();
// Generate caves
if ((flags & MG_CAVES) && (stone_surface_max_y >= node_min.Y))
generateCaves(stone_surface_max_y, MGV5_LARGE_CAVE_DEPTH);
// Generate dungeons and desert temples
if (flags & MG_DUNGEONS)
generateDungeons(stone_surface_max_y, stone_type);
// Generate the registered decorations
if (flags & MG_DECORATIONS)
m_emerge->decomgr->placeAllDecos(this, blockseed, node_min, node_max);
// Generate the registered ores
m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max);
// Sprinkle some dust on top after everything else was generated
dustTopNodes();
//printf("makeChunk: %dms\n", t.stop());
// Add top and bottom side of water to transforming_liquid queue
updateLiquid(&data->transforming_liquid, full_node_min, full_node_max);
// 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);
}
this->generating = false;
}
//bool is_cave(u32 index) {
// double d1 = contour(noise_cave1->result[index]);
// double d2 = contour(noise_cave2->result[index]);
// return d1*d2 > CAVE_NOISE_THRESHOLD;
//}
//bool val_is_ground(v3s16 p, u32 index, u32 index2d) {
// double f = 0.55 + noise_factor->result[index2d];
// if(f < 0.01)
// f = 0.01;
// else if(f >= 1.0)
// f *= 1.6;
// double h = WATER_LEVEL + 10 * noise_height->result[index2d];
// return (noise_ground->result[index] * f > (double)p.Y - h);
//}
int MapgenV5::generateBaseTerrain()
{
u32 index = 0;
u32 index2d = 0;
int stone_surface_max_y = -MAX_MAP_GENERATION_LIMIT;
noise_factor->perlinMap2D(node_min.X, node_min.Z);
noise_height->perlinMap2D(node_min.X, node_min.Z);
noise_ground->perlinMap3D(node_min.X, node_min.Y - 1, node_min.Z);
for (s16 z=node_min.Z; z<=node_max.Z; z++) {
for (s16 y=node_min.Y - 1; y<=node_max.Y + 1; y++) {
u32 vi = vm->m_area.index(node_min.X, y, z);
for (s16 x=node_min.X; x<=node_max.X; x++, vi++, index++, index2d++) {
if (vm->m_data[vi].getContent() != CONTENT_IGNORE)
continue;
//if ( x<x_surf[x][z] && z<=y_surf[x][z] && y<=z_surf[x][z] ) //klein bottle
//~ if ( (x*x + y*y + z*z + 20*y - 1)*(pow(x*x+y*y+z*z-2*y-1,2)-800*z*z) + 100*x*z*(x*x + y*y + z*z + 2*y - 1) < 0 ) {
//~ if (y>-50)
//~ vm->m_data[vi] = MapNode(c_stone);
//~ else
//~ vm->m_data[vi] = MapNode(c_water_source);
//~ if (y > stone_surface_max_y)
//~ stone_surface_max_y = y;
//~ } else {
//~ vm->m_data[vi] = MapNode(CONTENT_AIR);}
//~ if ( (x*x + y*y + z*z + 20*y - 1)*(pow(x*x+y*y+z*z-2*y-1,2)-800*z*z) + 100*x*z*(x*x + y*y + z*z + 2*y - 1) < 0 ) //klein bottle
//~ {
//~ if (y>-50)
//~ vm->m_data[vi] = MapNode(c_stone);
//~ else
//~ vm->m_data[vi] = MapNode(c_water_source);
//~ if (y > stone_surface_max_y)
//~ stone_surface_max_y = y;
//~ } else {
//~ vm->m_data[vi] = MapNode(CONTENT_AIR);}
if ( pow((50-sqrt(x*x+z*z)),2) + y*y < 200 ) //torus
//~ // if ( x*x + z*z + y*y < 100 ) //circle
{
if (y>-50)
vm->m_data[vi] = MapNode(c_stone);
else
vm->m_data[vi] = MapNode(c_water_source);
if (y > stone_surface_max_y)
stone_surface_max_y = y;
} else {
vm->m_data[vi] = MapNode(CONTENT_AIR);}
//~ if (y <= 10*sin(0.1*x)+10*sin(0.1*z) ) //y=f(x,z)
//~ {
//~ if (y>-50)
//~ vm->m_data[vi] = MapNode(c_stone);
//~ if (y > stone_surface_max_y)
//~ stone_surface_max_y = y;
//~ } else if(y<0){
//~ vm->m_data[vi] = MapNode(c_water_source);
//~ }
//~ else {
//~ vm->m_data[vi] = MapNode(CONTENT_AIR);}
//~ if (y <= -0.1*x*x ) //y=f(x,z)
//~ {
//~ if (y>-50)
//~ vm->m_data[vi] = MapNode(c_stone);
//~ if (y > stone_surface_max_y)
//~ stone_surface_max_y = y;
//~ } else if(y<-100000){
//~ vm->m_data[vi] = MapNode(c_water_source);
//~ }
//~ else {
//~ vm->m_data[vi] = MapNode(CONTENT_AIR);}
}
index2d -= ystride;
}
index2d += ystride;
}
return stone_surface_max_y;
}

68
src/mapgen_torus.h Normal file
View File

@ -0,0 +1,68 @@
/*
Minetest
Copyright (C) 2010-2015 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
Copyright (C) 2010-2015 paramat, Matt Gregory
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef MAPGEN_V5_HEADER
#define MAPGEN_V5_HEADER
#include "mapgen.h"
#define MGV5_LARGE_CAVE_DEPTH -256
class BiomeManager;
extern FlagDesc flagdesc_mapgen_v5[];
struct MapgenV5Params : public MapgenParams {
u32 spflags;
float cave_width;
NoiseParams np_filler_depth;
NoiseParams np_factor;
NoiseParams np_height;
NoiseParams np_cave1;
NoiseParams np_cave2;
NoiseParams np_ground;
MapgenV5Params();
~MapgenV5Params() {}
void readParams(const Settings *settings);
void writeParams(Settings *settings) const;
};
class MapgenV5 : public MapgenBasic {
public:
MapgenV5(int mapgenid, MapgenV5Params *params, EmergeManager *emerge);
~MapgenV5();
virtual MapgenType getType() const { return MAPGEN_V5; }
virtual void makeChunk(BlockMakeData *data);
int getSpawnLevelAtPoint(v2s16 p);
int generateBaseTerrain();
private:
Noise *noise_factor;
Noise *noise_height;
Noise *noise_ground;
};
#endif