Skip to content

Commit

Permalink
Redefine NodeResolver interface and replace with callback mechanism
Browse files Browse the repository at this point in the history
  • Loading branch information
kwolekr committed Dec 27, 2014
1 parent 3ea5ed4 commit b67f37f
Show file tree
Hide file tree
Showing 16 changed files with 264 additions and 350 deletions.
2 changes: 1 addition & 1 deletion src/mapgen.cpp
Expand Up @@ -384,7 +384,7 @@ void GenerateNotifier::getEvents(

GenElementManager::GenElementManager(IGameDef *gamedef)
{
m_resolver = gamedef->getNodeDefManager()->getResolver();
m_ndef = gamedef->getNodeDefManager();
}


Expand Down
2 changes: 1 addition & 1 deletion src/mapgen.h
Expand Up @@ -192,7 +192,7 @@ class GenElementManager {
virtual GenElement *getByName(const std::string &name);

protected:
NodeResolver *m_resolver;
INodeDefManager *m_ndef;
std::vector<GenElement *> m_elements;
};

Expand Down
40 changes: 25 additions & 15 deletions src/mg_biome.cpp
Expand Up @@ -48,12 +48,14 @@ BiomeManager::BiomeManager(IGameDef *gamedef) :
b->heat_point = 0.0;
b->humidity_point = 0.0;

m_resolver->addNode("air", "", CONTENT_AIR, &b->c_top);
m_resolver->addNode("air", "", CONTENT_AIR, &b->c_filler);
m_resolver->addNode("mapgen_stone", "", CONTENT_AIR, &b->c_stone);
m_resolver->addNode("mapgen_water_source", "", CONTENT_AIR, &b->c_water);
m_resolver->addNode("air", "", CONTENT_AIR, &b->c_dust);
m_resolver->addNode("mapgen_water_source", "", CONTENT_AIR, &b->c_dust_water);
NodeResolveInfo *nri = new NodeResolveInfo(b);
nri->nodenames.push_back("air");
nri->nodenames.push_back("air");
nri->nodenames.push_back("mapgen_stone");
nri->nodenames.push_back("mapgen_water_source");
nri->nodenames.push_back("air");
nri->nodenames.push_back("mapgen_water_source");
m_ndef->pendNodeResolve(nri);

add(b);
}
Expand Down Expand Up @@ -102,18 +104,26 @@ Biome *BiomeManager::getBiome(float heat, float humidity, s16 y)

void BiomeManager::clear()
{

for (size_t i = 1; i < m_elements.size(); i++) {
Biome *b = (Biome *)m_elements[i];
if (!b)
continue;

m_resolver->cancelNode(&b->c_top);
m_resolver->cancelNode(&b->c_filler);
m_resolver->cancelNode(&b->c_stone);
m_resolver->cancelNode(&b->c_water);
m_resolver->cancelNode(&b->c_dust);
m_resolver->cancelNode(&b->c_dust_water);
delete b;
}

m_elements.resize(1);
}


///////////////////////////////////////////////////////////////////////////////


void Biome::resolveNodeNames(NodeResolveInfo *nri)
{
m_ndef->getIdFromResolveInfo(nri, "mapgen_dirt_with_grass", CONTENT_AIR, c_top);
m_ndef->getIdFromResolveInfo(nri, "mapgen_dirt", CONTENT_AIR, c_filler);
m_ndef->getIdFromResolveInfo(nri, "mapgen_stone", CONTENT_AIR, c_stone);
m_ndef->getIdFromResolveInfo(nri, "mapgen_water_source", CONTENT_AIR, c_water);
m_ndef->getIdFromResolveInfo(nri, "air", CONTENT_IGNORE, c_dust);
m_ndef->getIdFromResolveInfo(nri, "mapgen_water_source", CONTENT_IGNORE, c_dust_water);
}

4 changes: 3 additions & 1 deletion src/mg_biome.h
Expand Up @@ -33,7 +33,7 @@ enum BiomeType
BIOME_TYPE_FLAT
};

class Biome : public GenElement {
class Biome : public GenElement, public NodeResolver {
public:
u32 flags;

Expand All @@ -51,6 +51,8 @@ class Biome : public GenElement {
s16 height_max;
float heat_point;
float humidity_point;

virtual void resolveNodeNames(NodeResolveInfo *nri);
};

class BiomeManager : public GenElementManager {
Expand Down
26 changes: 15 additions & 11 deletions src/mg_decoration.cpp
Expand Up @@ -65,10 +65,7 @@ void DecorationManager::clear()
{
for (size_t i = 0; i < m_elements.size(); i++) {
Decoration *deco = (Decoration *)m_elements[i];
if (!deco)
continue;

deco->dropResolverEntries(m_resolver);
delete deco;
}
m_elements.clear();
}
Expand All @@ -91,6 +88,12 @@ Decoration::~Decoration()
}


void Decoration::resolveNodeNames(NodeResolveInfo *nri)
{
m_ndef->getIdsFromResolveInfo(nri, c_place_on);
}


size_t Decoration::placeDeco(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax)
{
PseudoRandom ps(blockseed + 53);
Expand Down Expand Up @@ -229,6 +232,14 @@ void Decoration::placeCutoffs(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax)
///////////////////////////////////////////////////////////////////////////////


void DecoSimple::resolveNodeNames(NodeResolveInfo *nri)
{
Decoration::resolveNodeNames(nri);
m_ndef->getIdsFromResolveInfo(nri, c_decos);
m_ndef->getIdsFromResolveInfo(nri, c_spawnby);
}


bool DecoSimple::canPlaceDecoration(ManualMapVoxelManipulator *vm, v3s16 p)
{
// Don't bother if there aren't any decorations to place
Expand Down Expand Up @@ -310,13 +321,6 @@ int DecoSimple::getHeight()
}


void DecoSimple::dropResolverEntries(NodeResolver *resolver)
{
resolver->cancelNodeList(&c_decos);
resolver->cancelNodeList(&c_spawnby);
}


///////////////////////////////////////////////////////////////////////////////


Expand Down
10 changes: 4 additions & 6 deletions src/mg_decoration.h
Expand Up @@ -58,7 +58,7 @@ struct CutoffData {
};
#endif

class Decoration : public GenElement {
class Decoration : public GenElement, public NodeResolver {
public:
INodeDefManager *ndef;

Expand All @@ -76,12 +76,13 @@ class Decoration : public GenElement {
Decoration();
virtual ~Decoration();

virtual void resolveNodeNames(NodeResolveInfo *nri);

size_t placeDeco(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax);
size_t placeCutoffs(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax);

virtual size_t generate(Mapgen *mg, PseudoRandom *pr, s16 max_y, v3s16 p) = 0;
virtual int getHeight() = 0;
virtual void dropResolverEntries(NodeResolver *resolver) {}
};

class DecoSimple : public Decoration {
Expand All @@ -92,12 +93,11 @@ class DecoSimple : public Decoration {
s16 deco_height_max;
s16 nspawnby;

~DecoSimple() {}
virtual void resolveNodeNames(NodeResolveInfo *nri);

bool canPlaceDecoration(ManualMapVoxelManipulator *vm, v3s16 p);
virtual size_t generate(Mapgen *mg, PseudoRandom *pr, s16 max_y, v3s16 p);
virtual int getHeight();
virtual void dropResolverEntries(NodeResolver *resolver);
};

class DecoSchematic : public Decoration {
Expand All @@ -106,8 +106,6 @@ class DecoSchematic : public Decoration {
Schematic *schematic;
std::string filename;

~DecoSchematic() {}

virtual size_t generate(Mapgen *mg, PseudoRandom *pr, s16 max_y, v3s16 p);
virtual int getHeight();
};
Expand Down
25 changes: 20 additions & 5 deletions src/mg_ore.cpp
Expand Up @@ -64,11 +64,7 @@ void OreManager::clear()
{
for (size_t i = 0; i < m_elements.size(); i++) {
Ore *ore = (Ore *)m_elements[i];
if (!ore)
continue;

m_resolver->cancelNodeList(&ore->c_wherein);
m_resolver->cancelNode(&ore->c_ore);
delete ore;
}
m_elements.clear();
}
Expand All @@ -84,6 +80,19 @@ Ore::Ore()
}


Ore::~Ore()
{
delete noise;
}


void Ore::resolveNodeNames(NodeResolveInfo *nri)
{
m_ndef->getIdFromResolveInfo(nri, "", CONTENT_AIR, c_ore);
m_ndef->getIdsFromResolveInfo(nri, c_wherein);
}


size_t Ore::placeOre(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax)
{
int in_range = 0;
Expand Down Expand Up @@ -113,6 +122,9 @@ size_t Ore::placeOre(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax)
}


///////////////////////////////////////////////////////////////////////////////


void OreScatter::generate(ManualMapVoxelManipulator *vm, int seed,
u32 blockseed, v3s16 nmin, v3s16 nmax)
{
Expand Down Expand Up @@ -151,6 +163,9 @@ void OreScatter::generate(ManualMapVoxelManipulator *vm, int seed,
}


///////////////////////////////////////////////////////////////////////////////


void OreSheet::generate(ManualMapVoxelManipulator *vm, int seed,
u32 blockseed, v3s16 nmin, v3s16 nmax)
{
Expand Down
5 changes: 4 additions & 1 deletion src/mg_ore.h
Expand Up @@ -54,7 +54,7 @@ enum OreType {

extern FlagDesc flagdesc_ore[];

class Ore : public GenElement {
class Ore : public GenElement, public NodeResolver {
public:
static const bool NEEDS_NOISE = false;

Expand All @@ -72,6 +72,9 @@ class Ore : public GenElement {
Noise *noise;

Ore();
virtual ~Ore();

virtual void resolveNodeNames(NodeResolveInfo *nri);

size_t placeOre(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax);
virtual void generate(ManualMapVoxelManipulator *vm, int seed,
Expand Down
24 changes: 17 additions & 7 deletions src/mg_schematic.cpp
Expand Up @@ -58,6 +58,12 @@ Schematic::~Schematic()
}


void Schematic::resolveNodeNames(NodeResolveInfo *nri)
{
m_ndef->getIdsFromResolveInfo(nri, c_nodes);
}


void Schematic::updateContentIds()
{
if (flags & SCHEM_CIDS_UPDATED)
Expand Down Expand Up @@ -195,8 +201,7 @@ void Schematic::placeStructure(Map *map, v3s16 p, u32 flags,


bool Schematic::loadSchematicFromFile(const char *filename,
NodeResolver *resolver,
std::map<std::string, std::string> &replace_names)
INodeDefManager *ndef, std::map<std::string, std::string> &replace_names)
{
content_t cignore = CONTENT_IGNORE;
bool have_cignore = false;
Expand Down Expand Up @@ -224,10 +229,9 @@ bool Schematic::loadSchematicFromFile(const char *filename,
for (int y = 0; y != size.Y; y++)
slice_probs[y] = (version >= 3) ? readU8(is) : MTSCHEM_PROB_ALWAYS;

int nodecount = size.X * size.Y * size.Z;
NodeResolveInfo *nri = new NodeResolveInfo(this);

u16 nidmapcount = readU16(is);

for (int i = 0; i != nidmapcount; i++) {
std::string name = deSerializeString(is);
if (name == "ignore") {
Expand All @@ -241,16 +245,22 @@ bool Schematic::loadSchematicFromFile(const char *filename,
if (it != replace_names.end())
name = it->second;

resolver->addNodeList(name.c_str(), &c_nodes);
nri->nodenames.push_back(name);
}

nri->nodename_sizes.push_back(nidmapcount);
ndef->pendNodeResolve(nri);

size_t nodecount = size.X * size.Y * size.Z;

delete []schemdata;
schemdata = new MapNode[nodecount];

MapNode::deSerializeBulk(is, SER_FMT_VER_HIGHEST_READ, schemdata,
nodecount, 2, 2, true);
nodecount, 2, 2, true);

if (version == 1) { // fix up the probability values
for (int i = 0; i != nodecount; i++) {
for (size_t i = 0; i != nodecount; i++) {
if (schemdata[i].param1 == 0)
schemdata[i].param1 = MTSCHEM_PROB_ALWAYS;
if (have_cignore && schemdata[i].getContent() == cignore)
Expand Down
10 changes: 6 additions & 4 deletions src/mg_schematic.h
Expand Up @@ -42,7 +42,7 @@ class NodeResolver;
#define MTSCHEM_PROB_ALWAYS 0xFF


class Schematic : public GenElement {
class Schematic : public GenElement, public NodeResolver {
public:
std::vector<content_t> c_nodes;

Expand All @@ -52,14 +52,16 @@ class Schematic : public GenElement {
u8 *slice_probs;

Schematic();
~Schematic();
virtual ~Schematic();

virtual void resolveNodeNames(NodeResolveInfo *nri);

void updateContentIds();

void blitToVManip(v3s16 p, ManualMapVoxelManipulator *vm,
Rotation rot, bool force_placement, INodeDefManager *ndef);

bool loadSchematicFromFile(const char *filename, NodeResolver *resolver,
bool loadSchematicFromFile(const char *filename, INodeDefManager *ndef,
std::map<std::string, std::string> &replace_names);
void saveSchematicToFile(const char *filename, INodeDefManager *ndef);
bool getSchematicFromMap(Map *map, v3s16 p1, v3s16 p2);
Expand All @@ -86,7 +88,7 @@ class SchematicManager : public GenElementManager {
};

void build_nnlist_and_update_ids(MapNode *nodes, u32 nodecount,
std::vector<content_t> *usednodes);
std::vector<content_t> *usednodes);


#endif

0 comments on commit b67f37f

Please sign in to comment.