mirror of
https://github.com/luanti-org/luanti.git
synced 2025-07-27 17:28:41 +00:00
Give the Mapgen on each EmergeThread its own Biome/Ore/Deco/SchemManager copy
This commit is contained in:
parent
2062c80e21
commit
3c65d1acec
27 changed files with 225 additions and 77 deletions
|
@ -106,8 +106,8 @@ STATIC_ASSERT(
|
|||
//// Mapgen
|
||||
////
|
||||
|
||||
Mapgen::Mapgen(int mapgenid, MapgenParams *params, EmergeManager *emerge) :
|
||||
gennotify(emerge->gen_notify_on, &emerge->gen_notify_on_deco_ids)
|
||||
Mapgen::Mapgen(int mapgenid, MapgenParams *params, EmergeParams *emerge) :
|
||||
gennotify(emerge->gen_notify_on, emerge->gen_notify_on_deco_ids)
|
||||
{
|
||||
id = mapgenid;
|
||||
water_level = params->water_level;
|
||||
|
@ -156,7 +156,7 @@ const char *Mapgen::getMapgenName(MapgenType mgtype)
|
|||
|
||||
|
||||
Mapgen *Mapgen::createMapgen(MapgenType mgtype, MapgenParams *params,
|
||||
EmergeManager *emerge)
|
||||
EmergeParams *emerge)
|
||||
{
|
||||
switch (mgtype) {
|
||||
case MAPGEN_CARPATHIAN:
|
||||
|
@ -585,7 +585,7 @@ void Mapgen::spreadLight(const v3s16 &nmin, const v3s16 &nmax)
|
|||
//// MapgenBasic
|
||||
////
|
||||
|
||||
MapgenBasic::MapgenBasic(int mapgenid, MapgenParams *params, EmergeManager *emerge)
|
||||
MapgenBasic::MapgenBasic(int mapgenid, MapgenParams *params, EmergeParams *emerge)
|
||||
: Mapgen(mapgenid, params, emerge)
|
||||
{
|
||||
this->m_emerge = emerge;
|
||||
|
@ -642,6 +642,8 @@ MapgenBasic::~MapgenBasic()
|
|||
{
|
||||
delete biomegen;
|
||||
delete []heightmap;
|
||||
|
||||
delete m_emerge; // destroying EmergeParams is our responsibility
|
||||
}
|
||||
|
||||
|
||||
|
@ -974,7 +976,7 @@ void MapgenBasic::generateDungeons(s16 max_stone_y)
|
|||
////
|
||||
|
||||
GenerateNotifier::GenerateNotifier(u32 notify_on,
|
||||
std::set<u32> *notify_on_deco_ids)
|
||||
const std::set<u32> *notify_on_deco_ids)
|
||||
{
|
||||
m_notify_on = notify_on;
|
||||
m_notify_on_deco_ids = notify_on_deco_ids;
|
||||
|
@ -987,7 +989,8 @@ void GenerateNotifier::setNotifyOn(u32 notify_on)
|
|||
}
|
||||
|
||||
|
||||
void GenerateNotifier::setNotifyOnDecoIds(std::set<u32> *notify_on_deco_ids)
|
||||
void GenerateNotifier::setNotifyOnDecoIds(
|
||||
const std::set<u32> *notify_on_deco_ids)
|
||||
{
|
||||
m_notify_on_deco_ids = notify_on_deco_ids;
|
||||
}
|
||||
|
@ -999,7 +1002,7 @@ bool GenerateNotifier::addEvent(GenNotifyType type, v3s16 pos, u32 id)
|
|||
return false;
|
||||
|
||||
if (type == GENNOTIFY_DECORATION &&
|
||||
m_notify_on_deco_ids->find(id) == m_notify_on_deco_ids->end())
|
||||
m_notify_on_deco_ids->find(id) == m_notify_on_deco_ids->cend())
|
||||
return false;
|
||||
|
||||
GenNotifyEvent gne;
|
||||
|
|
|
@ -51,6 +51,7 @@ class Biome;
|
|||
class BiomeGen;
|
||||
struct BiomeParams;
|
||||
class BiomeManager;
|
||||
class EmergeParams;
|
||||
class EmergeManager;
|
||||
class MapBlock;
|
||||
class VoxelManipulator;
|
||||
|
@ -87,10 +88,10 @@ struct GenNotifyEvent {
|
|||
class GenerateNotifier {
|
||||
public:
|
||||
GenerateNotifier() = default;
|
||||
GenerateNotifier(u32 notify_on, std::set<u32> *notify_on_deco_ids);
|
||||
GenerateNotifier(u32 notify_on, const std::set<u32> *notify_on_deco_ids);
|
||||
|
||||
void setNotifyOn(u32 notify_on);
|
||||
void setNotifyOnDecoIds(std::set<u32> *notify_on_deco_ids);
|
||||
void setNotifyOnDecoIds(const std::set<u32> *notify_on_deco_ids);
|
||||
|
||||
bool addEvent(GenNotifyType type, v3s16 pos, u32 id=0);
|
||||
void getEvents(std::map<std::string, std::vector<v3s16> > &event_map);
|
||||
|
@ -98,7 +99,7 @@ public:
|
|||
|
||||
private:
|
||||
u32 m_notify_on = 0;
|
||||
std::set<u32> *m_notify_on_deco_ids;
|
||||
const std::set<u32> *m_notify_on_deco_ids;
|
||||
std::list<GenNotifyEvent> m_notify_events;
|
||||
};
|
||||
|
||||
|
@ -176,7 +177,7 @@ public:
|
|||
GenerateNotifier gennotify;
|
||||
|
||||
Mapgen() = default;
|
||||
Mapgen(int mapgenid, MapgenParams *params, EmergeManager *emerge);
|
||||
Mapgen(int mapgenid, MapgenParams *params, EmergeParams *emerge);
|
||||
virtual ~Mapgen() = default;
|
||||
DISABLE_CLASS_COPY(Mapgen);
|
||||
|
||||
|
@ -215,7 +216,7 @@ public:
|
|||
static MapgenType getMapgenType(const std::string &mgname);
|
||||
static const char *getMapgenName(MapgenType mgtype);
|
||||
static Mapgen *createMapgen(MapgenType mgtype, MapgenParams *params,
|
||||
EmergeManager *emerge);
|
||||
EmergeParams *emerge);
|
||||
static MapgenParams *createMapgenParams(MapgenType mgtype);
|
||||
static void getMapgenNames(std::vector<const char *> *mgnames, bool include_hidden);
|
||||
static void setDefaultSettings(Settings *settings);
|
||||
|
@ -243,7 +244,7 @@ private:
|
|||
*/
|
||||
class MapgenBasic : public Mapgen {
|
||||
public:
|
||||
MapgenBasic(int mapgenid, MapgenParams *params, EmergeManager *emerge);
|
||||
MapgenBasic(int mapgenid, MapgenParams *params, EmergeParams *emerge);
|
||||
virtual ~MapgenBasic();
|
||||
|
||||
virtual void generateBiomes();
|
||||
|
@ -254,7 +255,7 @@ public:
|
|||
virtual void generateDungeons(s16 max_stone_y);
|
||||
|
||||
protected:
|
||||
EmergeManager *m_emerge;
|
||||
EmergeParams *m_emerge;
|
||||
BiomeManager *m_bmgr;
|
||||
|
||||
Noise *noise_filler_depth;
|
||||
|
|
|
@ -49,7 +49,7 @@ FlagDesc flagdesc_mapgen_carpathian[] = {
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
MapgenCarpathian::MapgenCarpathian(MapgenCarpathianParams *params, EmergeManager *emerge)
|
||||
MapgenCarpathian::MapgenCarpathian(MapgenCarpathianParams *params, EmergeParams *emerge)
|
||||
: MapgenBasic(MAPGEN_CARPATHIAN, params, emerge)
|
||||
{
|
||||
base_level = params->base_level;
|
||||
|
|
|
@ -79,7 +79,7 @@ struct MapgenCarpathianParams : public MapgenParams
|
|||
class MapgenCarpathian : public MapgenBasic
|
||||
{
|
||||
public:
|
||||
MapgenCarpathian(MapgenCarpathianParams *params, EmergeManager *emerge);
|
||||
MapgenCarpathian(MapgenCarpathianParams *params, EmergeParams *emerge);
|
||||
~MapgenCarpathian();
|
||||
|
||||
virtual MapgenType getType() const { return MAPGEN_CARPATHIAN; }
|
||||
|
|
|
@ -47,7 +47,7 @@ FlagDesc flagdesc_mapgen_flat[] = {
|
|||
///////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
MapgenFlat::MapgenFlat(MapgenFlatParams *params, EmergeManager *emerge)
|
||||
MapgenFlat::MapgenFlat(MapgenFlatParams *params, EmergeParams *emerge)
|
||||
: MapgenBasic(MAPGEN_FLAT, params, emerge)
|
||||
{
|
||||
spflags = params->spflags;
|
||||
|
|
|
@ -64,7 +64,7 @@ struct MapgenFlatParams : public MapgenParams
|
|||
class MapgenFlat : public MapgenBasic
|
||||
{
|
||||
public:
|
||||
MapgenFlat(MapgenFlatParams *params, EmergeManager *emerge);
|
||||
MapgenFlat(MapgenFlatParams *params, EmergeParams *emerge);
|
||||
~MapgenFlat();
|
||||
|
||||
virtual MapgenType getType() const { return MAPGEN_FLAT; }
|
||||
|
|
|
@ -47,7 +47,7 @@ FlagDesc flagdesc_mapgen_fractal[] = {
|
|||
///////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
MapgenFractal::MapgenFractal(MapgenFractalParams *params, EmergeManager *emerge)
|
||||
MapgenFractal::MapgenFractal(MapgenFractalParams *params, EmergeParams *emerge)
|
||||
: MapgenBasic(MAPGEN_FRACTAL, params, emerge)
|
||||
{
|
||||
spflags = params->spflags;
|
||||
|
|
|
@ -72,7 +72,7 @@ struct MapgenFractalParams : public MapgenParams
|
|||
class MapgenFractal : public MapgenBasic
|
||||
{
|
||||
public:
|
||||
MapgenFractal(MapgenFractalParams *params, EmergeManager *emerge);
|
||||
MapgenFractal(MapgenFractalParams *params, EmergeParams *emerge);
|
||||
~MapgenFractal();
|
||||
|
||||
virtual MapgenType getType() const { return MAPGEN_FRACTAL; }
|
||||
|
|
|
@ -29,7 +29,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
#include "emerge.h"
|
||||
|
||||
|
||||
MapgenSinglenode::MapgenSinglenode(MapgenParams *params, EmergeManager *emerge)
|
||||
MapgenSinglenode::MapgenSinglenode(MapgenParams *params, EmergeParams *emerge)
|
||||
: Mapgen(MAPGEN_SINGLENODE, params, emerge)
|
||||
{
|
||||
const NodeDefManager *ndef = emerge->ndef;
|
||||
|
|
|
@ -38,7 +38,7 @@ public:
|
|||
content_t c_node;
|
||||
u8 set_light;
|
||||
|
||||
MapgenSinglenode(MapgenParams *params, EmergeManager *emerge);
|
||||
MapgenSinglenode(MapgenParams *params, EmergeParams *emerge);
|
||||
~MapgenSinglenode() = default;
|
||||
|
||||
virtual MapgenType getType() const { return MAPGEN_SINGLENODE; }
|
||||
|
|
|
@ -44,7 +44,7 @@ FlagDesc flagdesc_mapgen_v5[] = {
|
|||
};
|
||||
|
||||
|
||||
MapgenV5::MapgenV5(MapgenV5Params *params, EmergeManager *emerge)
|
||||
MapgenV5::MapgenV5(MapgenV5Params *params, EmergeParams *emerge)
|
||||
: MapgenBasic(MAPGEN_V5, params, emerge)
|
||||
{
|
||||
spflags = params->spflags;
|
||||
|
|
|
@ -64,7 +64,7 @@ struct MapgenV5Params : public MapgenParams
|
|||
class MapgenV5 : public MapgenBasic
|
||||
{
|
||||
public:
|
||||
MapgenV5(MapgenV5Params *params, EmergeManager *emerge);
|
||||
MapgenV5(MapgenV5Params *params, EmergeParams *emerge);
|
||||
~MapgenV5();
|
||||
|
||||
virtual MapgenType getType() const { return MAPGEN_V5; }
|
||||
|
|
|
@ -54,7 +54,7 @@ FlagDesc flagdesc_mapgen_v6[] = {
|
|||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
MapgenV6::MapgenV6(MapgenV6Params *params, EmergeManager *emerge)
|
||||
MapgenV6::MapgenV6(MapgenV6Params *params, EmergeParams *emerge)
|
||||
: Mapgen(MAPGEN_V6, params, emerge)
|
||||
{
|
||||
m_emerge = emerge;
|
||||
|
@ -160,6 +160,8 @@ MapgenV6::~MapgenV6()
|
|||
delete noise_humidity;
|
||||
|
||||
delete[] heightmap;
|
||||
|
||||
delete m_emerge; // our responsibility
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -83,7 +83,7 @@ struct MapgenV6Params : public MapgenParams {
|
|||
|
||||
class MapgenV6 : public Mapgen {
|
||||
public:
|
||||
EmergeManager *m_emerge;
|
||||
EmergeParams *m_emerge;
|
||||
|
||||
int ystride;
|
||||
u32 spflags;
|
||||
|
@ -133,7 +133,7 @@ public:
|
|||
content_t c_stair_cobble;
|
||||
content_t c_stair_desert_stone;
|
||||
|
||||
MapgenV6(MapgenV6Params *params, EmergeManager *emerge);
|
||||
MapgenV6(MapgenV6Params *params, EmergeParams *emerge);
|
||||
~MapgenV6();
|
||||
|
||||
virtual MapgenType getType() const { return MAPGEN_V6; }
|
||||
|
|
|
@ -51,7 +51,7 @@ FlagDesc flagdesc_mapgen_v7[] = {
|
|||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
MapgenV7::MapgenV7(MapgenV7Params *params, EmergeManager *emerge)
|
||||
MapgenV7::MapgenV7(MapgenV7Params *params, EmergeParams *emerge)
|
||||
: MapgenBasic(MAPGEN_V7, params, emerge)
|
||||
{
|
||||
spflags = params->spflags;
|
||||
|
|
|
@ -75,7 +75,7 @@ struct MapgenV7Params : public MapgenParams {
|
|||
|
||||
class MapgenV7 : public MapgenBasic {
|
||||
public:
|
||||
MapgenV7(MapgenV7Params *params, EmergeManager *emerge);
|
||||
MapgenV7(MapgenV7Params *params, EmergeParams *emerge);
|
||||
~MapgenV7();
|
||||
|
||||
virtual MapgenType getType() const { return MAPGEN_V7; }
|
||||
|
|
|
@ -54,7 +54,7 @@ FlagDesc flagdesc_mapgen_valleys[] = {
|
|||
};
|
||||
|
||||
|
||||
MapgenValleys::MapgenValleys(MapgenValleysParams *params, EmergeManager *emerge)
|
||||
MapgenValleys::MapgenValleys(MapgenValleysParams *params, EmergeParams *emerge)
|
||||
: MapgenBasic(MAPGEN_VALLEYS, params, emerge)
|
||||
{
|
||||
// NOTE: MapgenValleys has a hard dependency on BiomeGenOriginal
|
||||
|
|
|
@ -84,7 +84,7 @@ class MapgenValleys : public MapgenBasic {
|
|||
public:
|
||||
|
||||
MapgenValleys(MapgenValleysParams *params,
|
||||
EmergeManager *emerge);
|
||||
EmergeParams *emerge);
|
||||
~MapgenValleys();
|
||||
|
||||
virtual MapgenType getType() const { return MAPGEN_VALLEYS; }
|
||||
|
|
|
@ -78,7 +78,7 @@ void BiomeManager::clear()
|
|||
EmergeManager *emerge = m_server->getEmergeManager();
|
||||
|
||||
// Remove all dangling references in Decorations
|
||||
DecorationManager *decomgr = emerge->decomgr;
|
||||
DecorationManager *decomgr = emerge->getWritableDecorationManager();
|
||||
for (size_t i = 0; i != decomgr->getNumObjects(); i++) {
|
||||
Decoration *deco = (Decoration *)decomgr->getRaw(i);
|
||||
deco->biomes.clear();
|
||||
|
@ -104,7 +104,7 @@ BiomeManager *BiomeManager::clone() const
|
|||
|
||||
// For BiomeGen type 'BiomeGenOriginal'
|
||||
float BiomeManager::getHeatAtPosOriginal(v3s16 pos, NoiseParams &np_heat,
|
||||
NoiseParams &np_heat_blend, u64 seed)
|
||||
NoiseParams &np_heat_blend, u64 seed) const
|
||||
{
|
||||
return
|
||||
NoisePerlin2D(&np_heat, pos.X, pos.Z, seed) +
|
||||
|
@ -114,7 +114,7 @@ float BiomeManager::getHeatAtPosOriginal(v3s16 pos, NoiseParams &np_heat,
|
|||
|
||||
// For BiomeGen type 'BiomeGenOriginal'
|
||||
float BiomeManager::getHumidityAtPosOriginal(v3s16 pos, NoiseParams &np_humidity,
|
||||
NoiseParams &np_humidity_blend, u64 seed)
|
||||
NoiseParams &np_humidity_blend, u64 seed) const
|
||||
{
|
||||
return
|
||||
NoisePerlin2D(&np_humidity, pos.X, pos.Z, seed) +
|
||||
|
@ -123,7 +123,7 @@ float BiomeManager::getHumidityAtPosOriginal(v3s16 pos, NoiseParams &np_humidity
|
|||
|
||||
|
||||
// For BiomeGen type 'BiomeGenOriginal'
|
||||
Biome *BiomeManager::getBiomeFromNoiseOriginal(float heat, float humidity, v3s16 pos)
|
||||
Biome *BiomeManager::getBiomeFromNoiseOriginal(float heat, float humidity, v3s16 pos) const
|
||||
{
|
||||
Biome *biome_closest = nullptr;
|
||||
Biome *biome_closest_blend = nullptr;
|
||||
|
|
|
@ -230,10 +230,10 @@ public:
|
|||
|
||||
// For BiomeGen type 'BiomeGenOriginal'
|
||||
float getHeatAtPosOriginal(v3s16 pos, NoiseParams &np_heat,
|
||||
NoiseParams &np_heat_blend, u64 seed);
|
||||
NoiseParams &np_heat_blend, u64 seed) const;
|
||||
float getHumidityAtPosOriginal(v3s16 pos, NoiseParams &np_humidity,
|
||||
NoiseParams &np_humidity_blend, u64 seed);
|
||||
Biome *getBiomeFromNoiseOriginal(float heat, float humidity, v3s16 pos);
|
||||
NoiseParams &np_humidity_blend, u64 seed) const;
|
||||
Biome *getBiomeFromNoiseOriginal(float heat, float humidity, v3s16 pos) const;
|
||||
|
||||
private:
|
||||
BiomeManager() {};
|
||||
|
|
|
@ -391,6 +391,13 @@ size_t DecoSimple::generate(MMVManip *vm, PcgRandom *pr, v3s16 p, bool ceiling)
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
DecoSchematic::~DecoSchematic()
|
||||
{
|
||||
if (was_cloned)
|
||||
delete schematic;
|
||||
}
|
||||
|
||||
|
||||
ObjDef *DecoSchematic::clone() const
|
||||
{
|
||||
auto def = new DecoSchematic();
|
||||
|
@ -398,9 +405,12 @@ ObjDef *DecoSchematic::clone() const
|
|||
NodeResolver::cloneTo(def);
|
||||
|
||||
def->rotation = rotation;
|
||||
/* FIXME: This is not ideal, we only have a pointer to the schematic despite
|
||||
* not owning it. Optimally this would be a handle. */
|
||||
def->schematic = schematic; // not cloned
|
||||
/* FIXME: We do not own this schematic, yet we only have a pointer to it
|
||||
* and not a handle. We are left with no option but to clone it ourselves.
|
||||
* This is a waste of memory and should be replaced with an alternative
|
||||
* approach sometime. */
|
||||
def->schematic = dynamic_cast<Schematic*>(schematic->clone());
|
||||
def->was_cloned = true;
|
||||
|
||||
return def;
|
||||
}
|
||||
|
|
|
@ -99,11 +99,13 @@ public:
|
|||
ObjDef *clone() const;
|
||||
|
||||
DecoSchematic() = default;
|
||||
virtual ~DecoSchematic();
|
||||
|
||||
virtual size_t generate(MMVManip *vm, PcgRandom *pr, v3s16 p, bool ceiling);
|
||||
|
||||
Rotation rotation;
|
||||
Schematic *schematic = nullptr;
|
||||
bool was_cloned = false; // see FIXME inside DecoSchemtic::clone()
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -43,12 +43,21 @@ SchematicManager::SchematicManager(Server *server) :
|
|||
}
|
||||
|
||||
|
||||
SchematicManager *SchematicManager::clone() const
|
||||
{
|
||||
auto mgr = new SchematicManager();
|
||||
assert(mgr);
|
||||
ObjDefManager::cloneTo(mgr);
|
||||
return mgr;
|
||||
}
|
||||
|
||||
|
||||
void SchematicManager::clear()
|
||||
{
|
||||
EmergeManager *emerge = m_server->getEmergeManager();
|
||||
|
||||
// Remove all dangling references in Decorations
|
||||
DecorationManager *decomgr = emerge->decomgr;
|
||||
DecorationManager *decomgr = emerge->getWritableDecorationManager();
|
||||
for (size_t i = 0; i != decomgr->getNumObjects(); i++) {
|
||||
Decoration *deco = (Decoration *)decomgr->getRaw(i);
|
||||
|
||||
|
@ -79,7 +88,21 @@ Schematic::~Schematic()
|
|||
|
||||
ObjDef *Schematic::clone() const
|
||||
{
|
||||
FATAL_ERROR("not cloneable");
|
||||
auto def = new Schematic();
|
||||
ObjDef::cloneTo(def);
|
||||
NodeResolver::cloneTo(def);
|
||||
|
||||
def->c_nodes = c_nodes;
|
||||
def->flags = flags;
|
||||
def->size = size;
|
||||
FATAL_ERROR_IF(!schemdata, "Schematic can only be cloned after loading");
|
||||
u32 nodecount = size.X * size.Y * size.Z;
|
||||
def->schemdata = new MapNode[nodecount];
|
||||
memcpy(def->schemdata, schemdata, sizeof(MapNode) * nodecount);
|
||||
def->slice_probs = new u8[size.Y];
|
||||
memcpy(def->slice_probs, slice_probs, sizeof(u8) * size.Y);
|
||||
|
||||
return def;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -130,7 +130,7 @@ public:
|
|||
SchematicManager(Server *server);
|
||||
virtual ~SchematicManager() = default;
|
||||
|
||||
// not cloneable
|
||||
SchematicManager *clone() const;
|
||||
|
||||
virtual void clear();
|
||||
|
||||
|
@ -145,6 +145,8 @@ public:
|
|||
}
|
||||
|
||||
private:
|
||||
SchematicManager() {};
|
||||
|
||||
Server *m_server;
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue