diff options
Diffstat (limited to 'src/mapblock.h')
-rw-r--r-- | src/mapblock.h | 260 |
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) |