summaryrefslogtreecommitdiff
path: root/src/mapblock.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mapblock.h')
-rw-r--r--src/mapblock.h260
1 files changed, 111 insertions, 149 deletions
diff --git a/src/mapblock.h b/src/mapblock.h
index 1eb97353c..693bc5190 100644
--- a/src/mapblock.h
+++ b/src/mapblock.h
@@ -33,10 +33,15 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "voxel.h"
#include "nodemetadata.h"
#include "staticobject.h"
+#include "mapblock_nodemod.h"
+#ifndef SERVER
+ #include "mapblock_mesh.h"
+#endif
+
#define BLOCK_TIMESTAMP_UNDEFINED 0xffffffff
-// Named by looking towards z+
+/*// Named by looking towards z+
enum{
FACE_BACK=0,
FACE_TOP,
@@ -44,103 +49,37 @@ enum{
FACE_FRONT,
FACE_BOTTOM,
FACE_LEFT
-};
-
-struct FastFace
-{
- TileSpec tile;
- video::S3DVertex vertices[4]; // Precalculated vertices
-};
-
-enum NodeModType
-{
- NODEMOD_NONE,
- NODEMOD_CHANGECONTENT, //param is content id
- NODEMOD_CRACK // param is crack progression
-};
+};*/
-struct NodeMod
+enum ModifiedState
{
- NodeMod(enum NodeModType a_type=NODEMOD_NONE, u16 a_param=0)
- {
- type = a_type;
- param = a_param;
- }
- bool operator==(const NodeMod &other)
- {
- return (type == other.type && param == other.param);
- }
- enum NodeModType type;
- u16 param;
+ // Has not been modified.
+ MOD_STATE_CLEAN = 0,
+ MOD_RESERVED1 = 1,
+ // Has been modified, and will be saved when being unloaded.
+ MOD_STATE_WRITE_AT_UNLOAD = 2,
+ MOD_RESERVED3 = 3,
+ // Has been modified, and will be saved as soon as possible.
+ MOD_STATE_WRITE_NEEDED = 4,
+ MOD_RESERVED5 = 5,
};
-class NodeModMap
+// NOTE: If this is enabled, set MapBlock to be initialized with
+// CONTENT_IGNORE.
+/*enum BlockGenerationStatus
{
-public:
- /*
- returns true if the mod was different last time
- */
- bool set(v3s16 p, const NodeMod &mod)
- {
- // See if old is different, cancel if it is not different.
- core::map<v3s16, NodeMod>::Node *n = m_mods.find(p);
- if(n)
- {
- NodeMod old = n->getValue();
- if(old == mod)
- return false;
-
- n->setValue(mod);
- }
- else
- {
- m_mods.insert(p, mod);
- }
-
- return true;
- }
- // Returns true if there was one
- bool get(v3s16 p, NodeMod *mod)
- {
- core::map<v3s16, NodeMod>::Node *n;
- n = m_mods.find(p);
- if(n == NULL)
- return false;
- if(mod)
- *mod = n->getValue();
- return true;
- }
- bool clear(v3s16 p)
- {
- if(m_mods.find(p))
- {
- m_mods.remove(p);
- return true;
- }
- return false;
- }
- bool clear()
- {
- if(m_mods.size() == 0)
- return false;
- m_mods.clear();
- return true;
- }
- void copy(NodeModMap &dest)
- {
- dest.m_mods.clear();
-
- for(core::map<v3s16, NodeMod>::Iterator
- i = m_mods.getIterator();
- i.atEnd() == false; i++)
- {
- dest.m_mods.insert(i.getNode()->getKey(), i.getNode()->getValue());
- }
- }
-
-private:
- core::map<v3s16, NodeMod> m_mods;
-};
+ // Completely non-generated (filled with CONTENT_IGNORE).
+ BLOCKGEN_UNTOUCHED=0,
+ // Trees or similar might have been blitted from other blocks to here.
+ // Otherwise, the block contains CONTENT_IGNORE
+ BLOCKGEN_FROM_NEIGHBORS=2,
+ // Has been generated, but some neighbors might put some stuff in here
+ // when they are generated.
+ // Does not contain any CONTENT_IGNORE
+ BLOCKGEN_SELF_GENERATED=4,
+ // The block and all its neighbors have been generated
+ BLOCKGEN_FULLY_GENERATED=6
+};*/
enum
{
@@ -171,35 +110,6 @@ public:
};
/*
- Mesh making stuff
-*/
-
-class MapBlock;
-
-#ifndef SERVER
-
-struct MeshMakeData
-{
- u32 m_daynight_ratio;
- NodeModMap m_temp_mods;
- VoxelManipulator m_vmanip;
- v3s16 m_blockpos;
-
- /*
- Copy central data directly from block, and other data from
- parent of block.
- */
- void fill(u32 daynight_ratio, MapBlock *block);
-};
-
-scene::SMesh* makeMapBlockMesh(MeshMakeData *data);
-
-#endif
-
-u8 getFaceLight(u32 daynight_ratio, MapNode n, MapNode n2,
- v3s16 face_dir);
-
-/*
MapBlock itself
*/
@@ -226,9 +136,10 @@ public:
u32 l = MAP_BLOCKSIZE * MAP_BLOCKSIZE * MAP_BLOCKSIZE;
data = new MapNode[l];
for(u32 i=0; i<l; i++){
- data[i] = MapNode();
+ //data[i] = MapNode();
+ data[i] = MapNode(CONTENT_IGNORE);
}
- setChangedFlag();
+ raiseModified(MOD_STATE_WRITE_NEEDED);
}
/*
@@ -250,19 +161,43 @@ public:
modified, so that the block is saved and possibly not deleted from
memory.
*/
+ // DEPRECATED, use *Modified()
void setChangedFlag()
{
- changed = true;
+ //dstream<<"Deprecated setChangedFlag() called"<<std::endl;
+ raiseModified(MOD_STATE_WRITE_NEEDED);
}
+ // DEPRECATED, use *Modified()
void resetChangedFlag()
{
- changed = false;
+ //dstream<<"Deprecated resetChangedFlag() called"<<std::endl;
+ resetModified();
}
+ // DEPRECATED, use *Modified()
bool getChangedFlag()
{
- return changed;
+ //dstream<<"Deprecated getChangedFlag() called"<<std::endl;
+ if(getModified() == MOD_STATE_CLEAN)
+ return false;
+ else
+ return true;
+ }
+
+ // m_modified methods
+ void raiseModified(u32 mod)
+ {
+ m_modified = MYMAX(m_modified, mod);
}
-
+ u32 getModified()
+ {
+ return m_modified;
+ }
+ void resetModified()
+ {
+ m_modified = MOD_STATE_CLEAN;
+ }
+
+ // is_underground getter/setter
bool getIsUnderground()
{
return is_underground;
@@ -270,7 +205,7 @@ public:
void setIsUnderground(bool a_is_underground)
{
is_underground = a_is_underground;
- setChangedFlag();
+ raiseModified(MOD_STATE_WRITE_NEEDED);
}
#ifndef SERVER
@@ -288,22 +223,22 @@ public:
void setLightingExpired(bool expired)
{
m_lighting_expired = expired;
- setChangedFlag();
+ raiseModified(MOD_STATE_WRITE_NEEDED);
}
bool getLightingExpired()
{
return m_lighting_expired;
}
- /*bool isFullyGenerated()
+ bool isGenerated()
{
- return !m_not_fully_generated;
+ return m_generated;
}
- void setFullyGenerated(bool b)
+ void setGenerated(bool b)
{
- setChangedFlag();
- m_not_fully_generated = !b;
- }*/
+ raiseModified(MOD_STATE_WRITE_NEEDED);
+ m_generated = b;
+ }
bool isValid()
{
@@ -381,7 +316,7 @@ public:
if(y < 0 || y >= MAP_BLOCKSIZE) throw InvalidPositionException();
if(z < 0 || z >= MAP_BLOCKSIZE) throw InvalidPositionException();
data[z*MAP_BLOCKSIZE*MAP_BLOCKSIZE + y*MAP_BLOCKSIZE + x] = n;
- setChangedFlag();
+ raiseModified(MOD_STATE_WRITE_NEEDED);
}
void setNode(v3s16 p, MapNode & n)
@@ -410,7 +345,7 @@ public:
if(data == NULL)
throw InvalidPositionException();
data[z*MAP_BLOCKSIZE*MAP_BLOCKSIZE + y*MAP_BLOCKSIZE + x] = n;
- setChangedFlag();
+ raiseModified(MOD_STATE_WRITE_NEEDED);
}
void setNodeNoCheck(v3s16 p, MapNode & n)
@@ -474,8 +409,7 @@ public:
// See comments in mapblock.cpp
bool propagateSunlight(core::map<v3s16, bool> & light_sources,
- bool remove_light=false, bool *black_air_left=NULL,
- bool grow_grass=false);
+ bool remove_light=false, bool *black_air_left=NULL);
// Copies data to VoxelManipulator to getPosRelative()
void copyTo(VoxelManipulator &dst);
@@ -487,36 +421,36 @@ public:
DEPRECATED
*/
- void serializeObjects(std::ostream &os, u8 version)
+ /*void serializeObjects(std::ostream &os, u8 version)
{
m_objects.serialize(os, version);
- }
+ }*/
// If smgr!=NULL, new objects are added to the scene
void updateObjects(std::istream &is, u8 version,
scene::ISceneManager *smgr, u32 daynight_ratio)
{
m_objects.update(is, version, smgr, daynight_ratio);
- setChangedFlag();
+ raiseModified(MOD_STATE_WRITE_NEEDED);
}
void clearObjects()
{
m_objects.clear();
- setChangedFlag();
+ raiseModified(MOD_STATE_WRITE_NEEDED);
}
void addObject(MapBlockObject *object)
throw(ContainerFullException, AlreadyExistsException)
{
m_objects.add(object);
- setChangedFlag();
+ raiseModified(MOD_STATE_WRITE_NEEDED);
}
void removeObject(s16 id)
{
m_objects.remove(id);
- setChangedFlag();
+ raiseModified(MOD_STATE_WRITE_NEEDED);
}
MapBlockObject * getObject(s16 id)
{
@@ -626,12 +560,32 @@ public:
void setTimestamp(u32 time)
{
m_timestamp = time;
- setChangedFlag();
+ raiseModified(MOD_STATE_WRITE_AT_UNLOAD);
+ }
+ void setTimestampNoChangedFlag(u32 time)
+ {
+ m_timestamp = time;
}
u32 getTimestamp()
{
return m_timestamp;
}
+
+ /*
+ See m_usage_timer
+ */
+ void resetUsageTimer()
+ {
+ m_usage_timer = 0;
+ }
+ void incrementUsageTimer(float dtime)
+ {
+ m_usage_timer += dtime;
+ }
+ u32 getUsageTimer()
+ {
+ return m_usage_timer;
+ }
/*
Serialization
@@ -698,10 +652,10 @@ private:
/*
- On the server, this is used for telling whether the
- block has been changed from the one on disk.
+ block has been modified from the one on disk.
- On the client, this is used for nothing.
*/
- bool changed;
+ u32 m_modified;
/*
When propagating sunlight and the above block doesn't exist,
@@ -724,6 +678,8 @@ private:
// Whether day and night lighting differs
bool m_day_night_differs;
+
+ bool m_generated;
// DEPRECATED
MapBlockObjectList m_objects;
@@ -747,6 +703,12 @@ private:
Value BLOCK_TIMESTAMP_UNDEFINED=0xffffffff means there is no timestamp.
*/
u32 m_timestamp;
+
+ /*
+ When the block is accessed, this is set to 0.
+ Map will unload the block when this reaches a timeout.
+ */
+ float m_usage_timer;
};
inline bool blockpos_over_limit(v3s16 p)