Skip to content

Commit

Permalink
Huge overhaul of the entire MapgenParams system
Browse files Browse the repository at this point in the history
MapgenParams is no longer a polymorphic class, eliminating the need for messy and bug-prone reallocations.
Separation between the common and mapgen-specific parameters is now strongly defined.
Mapgen parameters objects are now properly encapsulated within the proper subsystems.
  • Loading branch information
kwolekr committed Feb 4, 2014
1 parent a439343 commit 5a34f40
Show file tree
Hide file tree
Showing 24 changed files with 405 additions and 622 deletions.
6 changes: 2 additions & 4 deletions src/biome.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "main.h"
#include "util/mathconstants.h"

NoiseParams nparams_biome_def_heat =
{50, 50, v3f(500.0, 500.0, 500.0), 5349, 3, 0.70};
NoiseParams nparams_biome_def_humidity =
{50, 50, v3f(500.0, 500.0, 500.0), 842, 3, 0.55};
NoiseParams nparams_biome_def_heat(50, 50, v3f(500.0, 500.0, 500.0), 5349, 3, 0.70);
NoiseParams nparams_biome_def_humidity(50, 50, v3f(500.0, 500.0, 500.0), 842, 3, 0.55);


BiomeDefManager::BiomeDefManager() {
Expand Down
3 changes: 1 addition & 2 deletions src/cavegen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "mapgen_v7.h"
#include "cavegen.h"

NoiseParams nparams_caveliquids =
{0, 1, v3f(150.0, 150.0, 150.0), 776, 3, 0.6};
NoiseParams nparams_caveliquids(0, 1, v3f(150.0, 150.0, 150.0), 776, 3, 0.6);


///////////////////////////////////////////////////////////////////////////////
Expand Down
36 changes: 1 addition & 35 deletions src/defaultsettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -250,41 +250,7 @@ void set_default_settings(Settings *settings)
settings->setDefault("mg_name", "v6");
settings->setDefault("water_level", "1");
settings->setDefault("chunksize", "5");
settings->setDefault("mg_flags", "trees, caves, v6_biome_blend");
settings->setDefault("mgv6_freq_desert", "0.45");
settings->setDefault("mgv6_freq_beach", "0.15");

settings->setDefault("mgv6_np_terrain_base", "-4, 20, (250, 250, 250), 82341, 5, 0.6");
settings->setDefault("mgv6_np_terrain_higher", "20, 16, (500, 500, 500), 85039, 5, 0.6");
settings->setDefault("mgv6_np_steepness", "0.85, 0.5, (125, 125, 125), -932, 5, 0.7");
settings->setDefault("mgv6_np_height_select", "0.5, 1, (250, 250, 250), 4213, 5, 0.69");
settings->setDefault("mgv6_np_mud", "4, 2, (200, 200, 200), 91013, 3, 0.55");
settings->setDefault("mgv6_np_beach", "0, 1, (250, 250, 250), 59420, 3, 0.50");
settings->setDefault("mgv6_np_biome", "0, 1, (250, 250, 250), 9130, 3, 0.50");
settings->setDefault("mgv6_np_cave", "6, 6, (250, 250, 250), 34329, 3, 0.50");
settings->setDefault("mgv6_np_humidity", "0.5, 0.5, (500, 500, 500), 72384, 4, 0.66");
settings->setDefault("mgv6_np_trees", "0, 1, (125, 125, 125), 2, 4, 0.66");
settings->setDefault("mgv6_np_apple_trees", "0, 1, (100, 100, 100), 342902, 3, 0.45");

settings->setDefault("mgv7_np_terrain_base", "4, 70, (300, 300, 300), 82341, 6, 0.7");
settings->setDefault("mgv7_np_terrain_alt", "4, 25, (600, 600, 600), 5934, 5, 0.6");
settings->setDefault("mgv7_np_terrain_persist", "0.6, 0.1, (500, 500, 500), 539, 3, 0.6");
settings->setDefault("mgv7_np_height_select", "-0.5, 1, (250, 250, 250), 4213, 5, 0.69");
settings->setDefault("mgv7_np_filler_depth", "0, 1.2, (150, 150, 150), 261, 4, 0.7");
settings->setDefault("mgv7_np_mount_height", "100, 30, (500, 500, 500), 72449, 4, 0.6");
settings->setDefault("mgv7_np_ridge_uwater", "0, 1, (500, 500, 500), 85039, 4, 0.6");
settings->setDefault("mgv7_np_mountain", "0, 1, (250, 350, 250), 5333, 5, 0.68");
settings->setDefault("mgv7_np_ridge", "0, 1, (100, 120, 100), 6467, 4, 0.75");

settings->setDefault("mgindev_np_terrain_base", "-4, 20, (250, 250, 250), 82341, 5, 0.6, 10, 10");
settings->setDefault("mgindev_np_terrain_higher", "20, 16, (500, 500, 500), 85039, 5, 0.6, 10, 10");
settings->setDefault("mgindev_np_steepness", "0.85, 0.5, (125, 125, 125), -932, 5, 0.7, 2, 10");
settings->setDefault("mgindev_np_mud", "4, 2, (200, 200, 200), 91013, 3, 0.55, 1, 1");
settings->setDefault("mgindev_np_float_islands1", "0, 1, (256, 256, 256), 3683, 6, 0.6, 1, 1.5");
settings->setDefault("mgindev_np_float_islands2", "0, 1, (8, 8, 8 ), 9292, 2, 0.5, 1, 1.5");
settings->setDefault("mgindev_np_float_islands3", "0, 1, (256, 256, 256), 6412, 2, 0.5, 1, 0.5");
settings->setDefault("mgindev_np_biome", "0, 1, (250, 250, 250), 9130, 3, 0.50, 1, 10");
settings->setDefault("mgindev_float_islands", "500");
settings->setDefault("mg_flags", "trees, caves");

settings->setDefault("mgmath_generator", "mandelbox");

Expand Down
9 changes: 3 additions & 6 deletions src/dungeongen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,

//#define DGEN_USE_TORCHES

NoiseParams nparams_dungeon_rarity =
{0.0, 1.0, v3f(500.0, 500.0, 500.0), 0, 2, 0.8};
NoiseParams nparams_dungeon_wetness =
{0.0, 1.0, v3f(40.0, 40.0, 40.0), 32474, 4, 1.1};
NoiseParams nparams_dungeon_density =
{0.0, 1.0, v3f(2.5, 2.5, 2.5), 0, 2, 1.4};
NoiseParams nparams_dungeon_rarity(0.0, 1.0, v3f(500.0, 500.0, 500.0), 0, 2, 0.8);
NoiseParams nparams_dungeon_wetness(0.0, 1.0, v3f(40.0, 40.0, 40.0), 32474, 4, 1.1);
NoiseParams nparams_dungeon_density(0.0, 1.0, v3f(2.5, 2.5, 2.5), 0, 2, 1.4);


///////////////////////////////////////////////////////////////////////////////
Expand Down
168 changes: 55 additions & 113 deletions src/emerge.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -90,44 +90,42 @@ EmergeManager::EmergeManager(IGameDef *gamedef) {

this->ndef = gamedef->getNodeDefManager();
this->biomedef = new BiomeDefManager();
this->params = NULL;
this->gennotify = 0;

// Note that accesses to this variable are not synchronized.
// This is because the *only* thread ever starting or stopping
// EmergeThreads should be the ServerThread.
this->threads_active = false;

this->luaoverride_params = NULL;
this->luaoverride_params_modified = 0;
this->luaoverride_flagmask = 0;

this->gennotify = 0;

mapgen_debug_info = g_settings->getBool("enable_mapgen_debug_info");

int nthreads;
if (g_settings->get("num_emerge_threads").empty()) {
int nprocs = porting::getNumberOfProcessors();
// leave a proc for the main thread and one for some other misc threads
nthreads = (nprocs > 2) ? nprocs - 2 : 1;
} else {
nthreads = g_settings->getU16("num_emerge_threads");
}
// if unspecified, leave a proc for the main thread and one for
// some other misc thread
int nthreads = 0;
if (!g_settings->tryGetS16("num_emerge_threads", nthreads))
nthreads = porting::getNumberOfProcessors() - 2;
if (nthreads < 1)
nthreads = 1;

qlimit_total = g_settings->getU16("emergequeue_limit_total");
qlimit_diskonly = g_settings->get("emergequeue_limit_diskonly").empty() ?
nthreads * 5 + 1 :
g_settings->getU16("emergequeue_limit_diskonly");
qlimit_generate = g_settings->get("emergequeue_limit_generate").empty() ?
nthreads + 1 :
g_settings->getU16("emergequeue_limit_generate");
qlimit_total = g_settings->getU16("emergequeue_limit_total");
if (!g_settings->tryGetU16("emergequeue_limit_diskonly", qlimit_diskonly))
qlimit_diskonly = nthreads * 5 + 1;
if (!g_settings->tryGetU16("emergequeue_limit_generate", qlimit_generate))
qlimit_generate = nthreads + 1;

for (int i = 0; i != nthreads; i++)
emergethread.push_back(new EmergeThread((Server *)gamedef, i));

infostream << "EmergeManager: using " << nthreads << " threads" << std::endl;

loadParamsFromSettings(g_settings);

if (g_settings->get("fixed_map_seed").empty()) {
params.seed = (((u64)(myrand() & 0xffff) << 0)
| ((u64)(myrand() & 0xffff) << 16)
| ((u64)(myrand() & 0xffff) << 32)
| ((u64)(myrand() & 0xffff) << 48));
}
}


Expand Down Expand Up @@ -162,9 +160,7 @@ EmergeManager::~EmergeManager() {
}


void EmergeManager::initMapgens(MapgenParams *mgparams) {
Mapgen *mg;

void EmergeManager::initMapgens() {
if (mapgen.size())
return;

Expand All @@ -178,77 +174,25 @@ void EmergeManager::initMapgens(MapgenParams *mgparams) {
for (size_t i = 0; i != decorations.size(); i++)
decorations[i]->resolveNodeNames(ndef);

// Apply mapgen parameter overrides from Lua
if (luaoverride_params) {
if (luaoverride_params_modified & MGPARAMS_SET_MGNAME) {
MapgenParams *mgp = setMapgenType(mgparams, luaoverride_params->mg_name);
if (!mgp) {
errorstream << "EmergeManager: Failed to set new mapgen name"
<< std::endl;
} else {
mgparams = mgp;
}
}

if (luaoverride_params_modified & MGPARAMS_SET_SEED)
mgparams->seed = luaoverride_params->seed;

if (luaoverride_params_modified & MGPARAMS_SET_WATER_LEVEL)
mgparams->water_level = luaoverride_params->water_level;

if (luaoverride_params_modified & MGPARAMS_SET_FLAGS) {
mgparams->flags &= ~luaoverride_flagmask;
mgparams->flags |= luaoverride_params->flags;
if (!params.sparams) {
params.sparams = createMapgenParams(params.mg_name);
if (!params.sparams) {
params.mg_name = DEFAULT_MAPGEN;
params.sparams = createMapgenParams(params.mg_name);
assert(params.sparams);
}

delete luaoverride_params;
luaoverride_params = NULL;
params.sparams->readParams(g_settings);
}

// Create the mapgens
this->params = mgparams;
for (size_t i = 0; i != emergethread.size(); i++) {
mg = createMapgen(params->mg_name, i, params);
if (!mg) {
infostream << "EmergeManager: Falling back to Mapgen V6" << std::endl;

params = setMapgenType(params, "v6");
mg = createMapgen(params->mg_name, i, params);
if (!mg) {
errorstream << "EmergeManager: CRITICAL ERROR: Failed to fall"
"back to Mapgen V6, not generating map" << std::endl;
}
}
Mapgen *mg = createMapgen(params.mg_name, i, &params);
assert(mg);
mapgen.push_back(mg);
}
}


MapgenParams *EmergeManager::setMapgenType(MapgenParams *mgparams,
std::string newname) {
MapgenParams *newparams = createMapgenParams(newname);
if (!newparams) {
errorstream << "EmergeManager: Mapgen override failed" << std::endl;
return NULL;
}

newparams->mg_name = newname;
newparams->seed = mgparams->seed;
newparams->water_level = mgparams->water_level;
newparams->chunksize = mgparams->chunksize;
newparams->flags = mgparams->flags;

if (!newparams->readParams(g_settings)) {
errorstream << "EmergeManager: Mapgen override failed" << std::endl;
delete newparams;
return NULL;
}

delete mgparams;
return newparams;
}


Mapgen *EmergeManager::getCurrentMapgen() {
for (unsigned int i = 0; i != emergethread.size(); i++) {
if (emergethread[i]->IsSameThread())
Expand Down Expand Up @@ -363,12 +307,12 @@ bool EmergeManager::isBlockUnderground(v3s16 blockpos) {

//yuck, but then again, should i bother being accurate?
//the height of the nodes in a single block is quite variable
return blockpos.Y * (MAP_BLOCKSIZE + 1) <= params->water_level;
return blockpos.Y * (MAP_BLOCKSIZE + 1) <= params.water_level;
}


u32 EmergeManager::getBlockSeed(v3s16 p) {
return (u32)(params->seed & 0xFFFFFFFF) +
return (u32)(params.seed & 0xFFFFFFFF) +
p.Z * 38134234 +
p.Y * 42123 +
p.X * 23;
Expand All @@ -390,7 +334,7 @@ Mapgen *EmergeManager::createMapgen(std::string mgname, int mgid,
}


MapgenParams *EmergeManager::createMapgenParams(std::string mgname) {
MapgenSpecificParams *EmergeManager::createMapgenParams(std::string mgname) {
std::map<std::string, MapgenFactory *>::const_iterator iter;
iter = mglist.find(mgname);
if (iter == mglist.end()) {
Expand All @@ -404,37 +348,35 @@ MapgenParams *EmergeManager::createMapgenParams(std::string mgname) {
}


MapgenParams *EmergeManager::getParamsFromSettings(Settings *settings) {
std::string mg_name = settings->get("mg_name");
MapgenParams *mgparams = createMapgenParams(mg_name);
if (!mgparams)
return NULL;
void EmergeManager::loadParamsFromSettings(Settings *settings) {
std::string seed_str;
const char *setname = (settings == g_settings) ? "fixed_map_seed" : "seed";

std::string seedstr = settings->get(settings == g_settings ?
"fixed_map_seed" : "seed");
if (settings->tryGet(setname, seed_str))
params.seed = read_seed(seed_str.c_str());

mgparams->mg_name = mg_name;
mgparams->seed = read_seed(seedstr.c_str());
mgparams->water_level = settings->getS16("water_level");
mgparams->chunksize = settings->getS16("chunksize");
mgparams->flags = settings->getFlagStr("mg_flags", flagdesc_mapgen);
settings->tryGet("mg_name", params.mg_name);
settings->tryGetS16("water_level", params.water_level);
settings->tryGetS16("chunksize", params.chunksize);
settings->tryGetFlagStr("mg_flags", params.flags, flagdesc_mapgen);

delete params.sparams;
params.sparams = createMapgenParams(params.mg_name);
if (params.sparams)
params.sparams->readParams(settings);

if (!mgparams->readParams(settings)) {
delete mgparams;
return NULL;
}
return mgparams;
}


void EmergeManager::setParamsToSettings(Settings *settings) {
settings->set("mg_name", params->mg_name);
settings->setU64("seed", params->seed);
settings->setS16("water_level", params->water_level);
settings->setS16("chunksize", params->chunksize);
settings->setFlagStr("mg_flags", params->flags, flagdesc_mapgen);
void EmergeManager::saveParamsToSettings(Settings *settings) {
settings->set("mg_name", params.mg_name);
settings->setU64("seed", params.seed);
settings->setS16("water_level", params.water_level);
settings->setS16("chunksize", params.chunksize);
settings->setFlagStr("mg_flags", params.flags, flagdesc_mapgen);

params->writeParams(settings);
if (params.sparams)
params.sparams->writeParams(settings);
}


Expand Down
21 changes: 8 additions & 13 deletions src/emerge.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "irr_v3d.h"
#include "util/container.h"
#include "map.h" // for ManualMapVoxelManipulator
#include "mapgen.h" // for MapgenParams

#define MGPARAMS_SET_MGNAME 1
#define MGPARAMS_SET_SEED 2
Expand All @@ -37,9 +38,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
infostream << "EmergeThread: " x << std::endl; }

class EmergeThread;
class Mapgen;
struct MapgenParams;
struct MapgenFactory;
//class Mapgen;
//struct MapgenFactory;
class Biome;
class BiomeDefManager;
class Decoration;
Expand Down Expand Up @@ -90,18 +90,14 @@ class EmergeManager : public IBackgroundBlockEmerger {
bool threads_active;

//settings
MapgenParams *params;
MapgenParams params;
bool mapgen_debug_info;
u16 qlimit_total;
u16 qlimit_diskonly;
u16 qlimit_generate;

u32 gennotify;

MapgenParams *luaoverride_params;
u32 luaoverride_params_modified;
u32 luaoverride_flagmask;

//block emerge queue data structures
JMutex queuemutex;
std::map<v3s16, BlockEmergeData *> blocks_enqueued;
Expand All @@ -115,19 +111,18 @@ class EmergeManager : public IBackgroundBlockEmerger {
EmergeManager(IGameDef *gamedef);
~EmergeManager();

void initMapgens(MapgenParams *mgparams);
MapgenParams *setMapgenType(MapgenParams *mgparams, std::string newname);
void initMapgens();
Mapgen *getCurrentMapgen();
Mapgen *createMapgen(std::string mgname, int mgid,
MapgenParams *mgparams);
MapgenParams *createMapgenParams(std::string mgname);
MapgenSpecificParams *createMapgenParams(std::string mgname);
void startThreads();
void stopThreads();
bool enqueueBlockEmerge(u16 peer_id, v3s16 p, bool allow_generate);

void registerMapgen(std::string name, MapgenFactory *mgfactory);
MapgenParams *getParamsFromSettings(Settings *settings);
void setParamsToSettings(Settings *settings);
void loadParamsFromSettings(Settings *settings);
void saveParamsToSettings(Settings *settings);

//mapgen helper methods
Biome *getBiomeAtPoint(v3s16 p);
Expand Down
Loading

0 comments on commit 5a34f40

Please sign in to comment.