X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fmapblock.h;h=22b3b7db6189d986c947d9ac50c393f4f53fe909;hb=fe98fe342a65c995bbc59470549417f38311366b;hp=1eb97353cc74129e600904fbabced36a53640c5b;hpb=7cfb71385d00d1cbbbfd9c76f6c01adafa9e648a;p=minetest.git diff --git a/src/mapblock.h b/src/mapblock.h index 1eb97353c..22b3b7db6 100644 --- a/src/mapblock.h +++ b/src/mapblock.h @@ -29,14 +29,19 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "exceptions.h" #include "serialization.h" #include "constants.h" -#include "mapblockobject.h" #include "voxel.h" #include "nodemetadata.h" #include "staticobject.h" +#include "mapblock_nodemod.h" +#ifndef SERVER + #include "mapblock_mesh.h" +#endif + +class Map; #define BLOCK_TIMESTAMP_UNDEFINED 0xffffffff -// Named by looking towards z+ +/*// Named by looking towards z+ enum{ FACE_BACK=0, FACE_TOP, @@ -44,104 +49,39 @@ enum{ FACE_FRONT, FACE_BOTTOM, FACE_LEFT -}; +};*/ -struct FastFace +enum ModifiedState { - TileSpec tile; - video::S3DVertex vertices[4]; // Precalculated vertices + // 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, }; -enum NodeModType +// NOTE: If this is enabled, set MapBlock to be initialized with +// CONTENT_IGNORE. +/*enum BlockGenerationStatus { - NODEMOD_NONE, - NODEMOD_CHANGECONTENT, //param is content id - NODEMOD_CRACK // param is crack progression -}; - -struct NodeMod -{ - 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; -}; - -class NodeModMap -{ -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::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::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::Iterator - i = m_mods.getIterator(); - i.atEnd() == false; i++) - { - dest.m_mods.insert(i.getNode()->getKey(), i.getNode()->getValue()); - } - } - -private: - core::map 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 +};*/ + +#if 0 enum { NODECONTAINER_ID_MAPBLOCK, @@ -169,52 +109,24 @@ class NodeContainer } } }; - -/* - 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 */ -class MapBlock : public NodeContainer +class MapBlock /*: public NodeContainer*/ { public: - MapBlock(NodeContainer *parent, v3s16 pos, bool dummy=false); + MapBlock(Map *parent, v3s16 pos, bool dummy=false); ~MapBlock(); - virtual u16 nodeContainerId() const + /*virtual u16 nodeContainerId() const { return NODECONTAINER_ID_MAPBLOCK; - } + }*/ - NodeContainer * getParent() + Map * getParent() { return m_parent; } @@ -226,9 +138,10 @@ class MapBlock : public NodeContainer u32 l = MAP_BLOCKSIZE * MAP_BLOCKSIZE * MAP_BLOCKSIZE; data = new MapNode[l]; for(u32 i=0; i= 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 +351,7 @@ class MapBlock : public NodeContainer 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,76 +415,13 @@ class MapBlock : public NodeContainer // See comments in mapblock.cpp bool propagateSunlight(core::map & 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); // Copies data from VoxelManipulator getPosRelative() void copyFrom(VoxelManipulator &dst); - /* - MapBlockObject stuff - DEPRECATED - */ - - 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(); - } - void clearObjects() - { - m_objects.clear(); - - setChangedFlag(); - } - void addObject(MapBlockObject *object) - throw(ContainerFullException, AlreadyExistsException) - { - m_objects.add(object); - - setChangedFlag(); - } - void removeObject(s16 id) - { - m_objects.remove(id); - - setChangedFlag(); - } - MapBlockObject * getObject(s16 id) - { - return m_objects.get(id); - } - JMutexAutoLock * getObjectLock() - { - return m_objects.getLock(); - } - - /* - Moves objects, deletes objects and spawns new objects - */ - void stepObjects(float dtime, bool server, u32 daynight_ratio); - - // origin is relative to block - void getObjects(v3f origin, f32 max_d, - core::array &dest) - { - m_objects.getObjects(origin, max_d, dest); - } - - s32 getObjectCount() - { - return m_objects.getCount(); - } - #ifndef SERVER // Only on client /* Methods for setting temporary modifications to nodes for @@ -626,12 +504,32 @@ class MapBlock : public NodeContainer 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 @@ -686,7 +584,7 @@ class MapBlock : public NodeContainer */ // NOTE: Lots of things rely on this being the Map - NodeContainer *m_parent; + Map *m_parent; // Position in blocks on parent v3s16 m_pos; @@ -698,10 +596,10 @@ class MapBlock : public NodeContainer /* - 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,10 +622,9 @@ class MapBlock : public NodeContainer // Whether day and night lighting differs bool m_day_night_differs; - - // DEPRECATED - MapBlockObjectList m_objects; + bool m_generated; + #ifndef SERVER // Only on client /* Set to true if the mesh has been ordered to be updated @@ -747,6 +644,12 @@ class MapBlock : public NodeContainer 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) @@ -778,5 +681,10 @@ inline s16 getNodeBlockY(s16 y) return getContainerPos(y, MAP_BLOCKSIZE); } +/* + Get a quick string to describe what a block actually contains +*/ +std::string analyze_block(MapBlock *block); + #endif