From bbead93c1a00a1c31956e12c94717f179ac5b84b Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Tue, 31 May 2011 20:02:55 +0300 Subject: Reduced server CPU usage on NodeMetadata step()s. Also furnace now cooks while no players are near it. --- src/map.h | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src/map.h') diff --git a/src/map.h b/src/map.h index 09154547c..6f7ac0d3b 100644 --- a/src/map.h +++ b/src/map.h @@ -46,8 +46,14 @@ with this program; if not, write to the Free Software Foundation, Inc., #define MAPTYPE_CLIENT 2 enum MapEditEventType{ + // Node added (changed from air or something else to something) MEET_ADDNODE, + // Node removed (changed to air) MEET_REMOVENODE, + // Node metadata of block changed (not knowing which node exactly) + // p stores block coordinate + MEET_BLOCK_NODE_METADATA_CHANGED, + // Anything else MEET_OTHER }; -- cgit v1.2.3 From fdee31abf1ec41434cae843c30847dad5ce4388b Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Sun, 5 Jun 2011 21:07:54 +0300 Subject: ...and the map part of that --- src/map.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'src/map.h') diff --git a/src/map.h b/src/map.h index 6f7ac0d3b..e74f89beb 100644 --- a/src/map.h +++ b/src/map.h @@ -41,6 +41,17 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mapchunk.h" #include "nodemetadata.h" +/* + Temporarily exposed map generator stuff + Should only be used for testing +*/ + +double base_rock_level_2d(u64 seed, v2s16 p); + +/* + MapEditEvent +*/ + #define MAPTYPE_BASE 0 #define MAPTYPE_SERVER 1 #define MAPTYPE_CLIENT 2 @@ -592,6 +603,8 @@ public: bool isSavingEnabled(){ return m_map_saving_enabled; } + u64 getSeed(){ return m_seed; } + private: // Seed used for all kinds of randomness u64 m_seed; -- cgit v1.2.3 From 7773e68c2a42659b4a34af56e1fc799ffc9362ed Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Sat, 18 Jun 2011 12:42:17 +0300 Subject: farmesh is now usable. --- src/map.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'src/map.h') diff --git a/src/map.h b/src/map.h index e74f89beb..691f3bdb4 100644 --- a/src/map.h +++ b/src/map.h @@ -41,13 +41,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mapchunk.h" #include "nodemetadata.h" -/* - Temporarily exposed map generator stuff - Should only be used for testing -*/ - -double base_rock_level_2d(u64 seed, v2s16 p); - /* MapEditEvent */ @@ -751,6 +744,12 @@ public: // For debug printing virtual void PrintInfo(std::ostream &out); + // Check if sector was drawn on last render() + bool sectorWasDrawn(v2s16 p) + { + return (m_last_drawn_sectors.find(p) != NULL); + } + private: Client *m_client; @@ -765,7 +764,8 @@ private: v3f m_camera_position; v3f m_camera_direction; JMutex m_camera_mutex; - + + core::map m_last_drawn_sectors; }; #endif -- cgit v1.2.3 From 7538b4c6201675c566c98b21c8ecddb798a14943 Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Sat, 25 Jun 2011 04:25:14 +0300 Subject: New map generator added (and SQLite, messed up the commits at that time...) (import from temporary git repo) --- src/map.h | 218 +++++++++++++------------------------------------------------- 1 file changed, 46 insertions(+), 172 deletions(-) (limited to 'src/map.h') diff --git a/src/map.h b/src/map.h index 691f3bdb4..ada17cd7e 100644 --- a/src/map.h +++ b/src/map.h @@ -132,7 +132,7 @@ public: // On failure returns NULL MapSector * getSectorNoGenerateNoExNoLock(v2s16 p2d); - // On failure returns NULL + // Same as the above (there exists no lock anymore) MapSector * getSectorNoGenerateNoEx(v2s16 p2d); // On failure throws InvalidPositionException MapSector * getSectorNoGenerate(v2s16 p2d); @@ -268,6 +268,9 @@ public: //bool updateChangedVisibleArea(); virtual void save(bool only_changed){assert(0);}; + + // Server implements this + virtual void saveBlock(MapBlock *block){}; /* Updates usage timers @@ -279,7 +282,7 @@ public: void deleteSectors(core::list &list, bool only_blocks); // Returns count of deleted sectors - u32 deleteUnusedSectors(float timeout, bool only_blocks=false, + u32 unloadUnusedData(float timeout, bool only_blocks=false, core::list *deleted_blocks=NULL); // For debug printing @@ -330,7 +333,9 @@ protected: This is the only map class that is able to generate map. */ -struct ChunkMakeData; +//struct ChunkMakeData; + +struct BlockMakeData; class ServerMap : public Map { @@ -346,160 +351,25 @@ public: return MAPTYPE_SERVER; } - /* - Map generation - */ - - // Returns the position of the chunk where the sector is in - v2s16 sector_to_chunk(v2s16 sectorpos) - { - if(m_chunksize == 0) - return v2s16(0,0); - sectorpos.X += m_chunksize / 2; - sectorpos.Y += m_chunksize / 2; - v2s16 chunkpos = getContainerPos(sectorpos, m_chunksize); - return chunkpos; - } - - // Returns the position of the (0,0) sector of the chunk - v2s16 chunk_to_sector(v2s16 chunkpos) - { - if(m_chunksize == 0) - return v2s16(0,0); - v2s16 sectorpos( - chunkpos.X * m_chunksize, - chunkpos.Y * m_chunksize - ); - sectorpos.X -= m_chunksize / 2; - sectorpos.Y -= m_chunksize / 2; - return sectorpos; - } - - /* - Get a chunk. - */ - MapChunk *getChunk(v2s16 chunkpos) - { - core::map::Node *n; - n = m_chunks.find(chunkpos); - if(n == NULL) - return NULL; - return n->getValue(); - } - - /* - True if the chunk and its neighbors are fully generated. - It means the chunk will not be touched in the future by the - generator. If false, generateChunk will make it true. - */ - bool chunkNonVolatile(v2s16 chunkpos) - { - if(m_chunksize == 0) - return true; - - /*for(s16 x=-1; x<=1; x++) - for(s16 y=-1; y<=1; y++)*/ - s16 x=0; - s16 y=0; - { - v2s16 chunkpos0 = chunkpos + v2s16(x,y); - MapChunk *chunk = getChunk(chunkpos); - if(chunk == NULL) - return false; - if(chunk->getGenLevel() != GENERATED_FULLY) - return false; - } - return true; - } - - /* - Returns true if any chunk is marked as modified - */ - bool anyChunkModified() - { - for(core::map::Iterator - i = m_chunks.getIterator(); - i.atEnd()==false; i++) - { - v2s16 p = i.getNode()->getKey(); - MapChunk *chunk = i.getNode()->getValue(); - if(chunk->isModified()) - return true; - } - return false; - } - - void setChunksNonModified() - { - for(core::map::Iterator - i = m_chunks.getIterator(); - i.atEnd()==false; i++) - { - v2s16 p = i.getNode()->getKey(); - MapChunk *chunk = i.getNode()->getValue(); - chunk->setModified(false); - } - } - - /* - Chunks are generated by using these and makeChunk(). - */ - void initChunkMake(ChunkMakeData &data, v2s16 chunkpos); - MapChunk* finishChunkMake(ChunkMakeData &data, - core::map &changed_blocks); - - /* - Generate a chunk. - - All chunks touching this one can be altered also. - */ - /*MapChunk* generateChunkRaw(v2s16 chunkpos, - core::map &changed_blocks, - bool force=false);*/ - - /* - Generate a chunk and its neighbors so that it won't be touched - anymore. - */ - /*MapChunk* generateChunk(v2s16 chunkpos, - core::map &changed_blocks);*/ - - /* - Generate a sector. - - This is mainly called by generateChunkRaw. - */ - //ServerMapSector * generateSector(v2s16 p); - /* Get a sector from somewhere. - Check memory - - Check disk (loads blocks also) + - Check disk (doesn't load blocks) - Create blank one */ ServerMapSector * createSector(v2s16 p); /* - Get a sector from somewhere. - - Check memory - - Check disk (loads blocks also) - - Generate chunk + Blocks are generated by using these and makeBlock(). */ - /*MapSector * emergeSector(v2s16 p, - core::map &changed_blocks);*/ + void initBlockMake(BlockMakeData *data, v3s16 blockpos); + MapBlock* finishBlockMake(BlockMakeData *data, + core::map &changed_blocks); - /*MapSector * emergeSector(v2s16 p) - { - core::map changed_blocks; - return emergeSector(p, changed_blocks); - }*/ - + // A non-threaded wrapper to the above MapBlock * generateBlock( v3s16 p, - MapBlock *original_dummy, - ServerMapSector *sector, - core::map &changed_blocks, - core::map &lighting_invalidated_blocks + core::map &modified_blocks ); /* @@ -508,37 +378,17 @@ public: - Create blank */ MapBlock * createBlock(v3s16 p); - - /* - only_from_disk, changed_blocks and lighting_invalidated_blocks - are not properly used by the new map generator. - */ - MapBlock * emergeBlock( - v3s16 p, - bool only_from_disk, - core::map &changed_blocks, - core::map &lighting_invalidated_blocks - ); #if 0 /* + NOTE: This comment might be outdated + Forcefully get a block from somewhere. - Exceptions: - - InvalidPositionException: possible if only_from_disk==true - - changed_blocks: - - All already existing blocks that were modified are added. - - If found on disk, nothing will be added. - - If generated, the new block will not be included. - - lighting_invalidated_blocks: - - All blocks that have heavy-to-calculate lighting changes - are added. - - updateLighting() should be called for these. + InvalidPositionException possible if only_from_disk==true - - A block that is in changed_blocks may not be in - lighting_invalidated_blocks. + Parameters: + changed_blocks: Blocks that have been modified */ MapBlock * emergeBlock( v3s16 p, @@ -561,6 +411,7 @@ public: // dirname: final directory name v2s16 getSectorPos(std::string dirname); v3s16 getBlockPos(std::string sectordir, std::string blockfile); + static std::string getBlockFilename(v3s16 p); void save(bool only_changed); //void loadAll(); @@ -569,8 +420,8 @@ public: void saveMapMeta(); void loadMapMeta(); - void saveChunkMeta(); - void loadChunkMeta(); + /*void saveChunkMeta(); + void loadChunkMeta();*/ // The sector mutex should be locked when calling most of these @@ -579,6 +430,7 @@ public: // DEPRECATED? Sectors have no metadata anymore. void saveSectorMeta(ServerMapSector *sector); MapSector* loadSectorMeta(std::string dirname, bool save_after_load); + bool loadSectorMeta(v2s16 p2d); // Full load of a sector including all blocks. // returns true on success, false on failure. @@ -590,6 +442,7 @@ public: void saveBlock(MapBlock *block); // This will generate a sector with getSector if not found. void loadBlock(std::string sectordir, std::string blockfile, MapSector *sector, bool save_after_load=false); + MapBlock* loadBlock(v3s16 p); // For debug printing virtual void PrintInfo(std::ostream &out); @@ -605,11 +458,13 @@ private: std::string m_savedir; bool m_map_saving_enabled; +#if 0 // Chunk size in MapSectors // If 0, chunks are disabled. s16 m_chunksize; // Chunks core::map m_chunks; +#endif /* Metadata is re-written on disk only if this is true. @@ -815,6 +670,7 @@ protected: bool m_create_area; }; +#if 0 struct ChunkMakeData { bool no_op; @@ -838,6 +694,24 @@ struct ChunkMakeData }; void makeChunk(ChunkMakeData *data); +#endif + +struct BlockMakeData +{ + bool no_op; + ManualMapVoxelManipulator vmanip; + u64 seed; + v3s16 blockpos; + UniqueQueue transforming_liquid; + + BlockMakeData(): + no_op(false), + vmanip(NULL), + seed(0) + {} +}; + +void makeBlock(BlockMakeData *data); #endif -- cgit v1.2.3 From a80025c352fb91ff295423940b3ded22755b70f0 Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Sat, 25 Jun 2011 18:35:32 +0300 Subject: moved mapgen stuff around abit --- src/map.h | 55 ++++++------------------------------------------------- 1 file changed, 6 insertions(+), 49 deletions(-) (limited to 'src/map.h') diff --git a/src/map.h b/src/map.h index ada17cd7e..86b6b6e18 100644 --- a/src/map.h +++ b/src/map.h @@ -41,6 +41,10 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mapchunk.h" #include "nodemetadata.h" +namespace mapgen{ + struct BlockMakeData; +}; + /* MapEditEvent */ @@ -333,10 +337,6 @@ protected: This is the only map class that is able to generate map. */ -//struct ChunkMakeData; - -struct BlockMakeData; - class ServerMap : public Map { public: @@ -362,8 +362,8 @@ public: /* Blocks are generated by using these and makeBlock(). */ - void initBlockMake(BlockMakeData *data, v3s16 blockpos); - MapBlock* finishBlockMake(BlockMakeData *data, + void initBlockMake(mapgen::BlockMakeData *data, v3s16 blockpos); + MapBlock* finishBlockMake(mapgen::BlockMakeData *data, core::map &changed_blocks); // A non-threaded wrapper to the above @@ -670,48 +670,5 @@ protected: bool m_create_area; }; -#if 0 -struct ChunkMakeData -{ - bool no_op; - ManualMapVoxelManipulator vmanip; - u64 seed; - v2s16 chunkpos; - s16 y_blocks_min; - s16 y_blocks_max; - v2s16 sectorpos_base; - s16 sectorpos_base_size; - v2s16 sectorpos_bigbase; - s16 sectorpos_bigbase_size; - s16 max_spread_amount; - UniqueQueue transforming_liquid; - - ChunkMakeData(): - no_op(false), - vmanip(NULL), - seed(0) - {} -}; - -void makeChunk(ChunkMakeData *data); -#endif - -struct BlockMakeData -{ - bool no_op; - ManualMapVoxelManipulator vmanip; - u64 seed; - v3s16 blockpos; - UniqueQueue transforming_liquid; - - BlockMakeData(): - no_op(false), - vmanip(NULL), - seed(0) - {} -}; - -void makeBlock(BlockMakeData *data); - #endif -- cgit v1.2.3