diff options
author | kwolekr <kwolekr@minetest.net> | 2015-10-04 02:54:25 -0400 |
---|---|---|
committer | kwolekr <kwolekr@minetest.net> | 2015-10-04 16:27:50 -0400 |
commit | 0850d3bb930ac5e2cfd71a58fd49725e4c2a4c96 (patch) | |
tree | 15a5f3a2e0e350d6b5ea46caaac104d39d3f5c9b /src/emerge.h | |
parent | 1f9c5a4a7b15ab49e717d81162fe58e4202c0814 (diff) | |
download | minetest-0850d3bb930ac5e2cfd71a58fd49725e4c2a4c96.tar.gz minetest-0850d3bb930ac5e2cfd71a58fd49725e4c2a4c96.tar.bz2 minetest-0850d3bb930ac5e2cfd71a58fd49725e4c2a4c96.zip |
Add emerge completion callback mechanism
Major refactor of emerge.cpp and Map::init/finishBlockMake
Diffstat (limited to 'src/emerge.h')
-rw-r--r-- | src/emerge.h | 111 |
1 files changed, 77 insertions, 34 deletions
diff --git a/src/emerge.h b/src/emerge.h index 47648a17a..5526a4c91 100644 --- a/src/emerge.h +++ b/src/emerge.h @@ -26,13 +26,13 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mapgen.h" // for MapgenParams #include "map.h" -#define BLOCK_EMERGE_ALLOWGEN (1<<0) +#define BLOCK_EMERGE_ALLOW_GEN (1 << 0) +#define BLOCK_EMERGE_FORCE_QUEUE (1 << 1) -#define EMERGE_DBG_OUT(x) \ - do { \ - if (enable_mapgen_debug_info) \ - infostream << "EmergeThread: " x << std::endl; \ - } while (0) +#define EMERGE_DBG_OUT(x) do { \ + if (enable_mapgen_debug_info) \ + infostream << "EmergeThread: " x << std::endl; \ +} while (0) class EmergeThread; class INodeDefManager; @@ -43,6 +43,7 @@ class OreManager; class DecorationManager; class SchematicManager; +// Structure containing inputs/outputs for chunk generation struct BlockMakeData { MMVManip *vmanip; u64 seed; @@ -61,64 +62,106 @@ struct BlockMakeData { ~BlockMakeData() { delete vmanip; } }; +// Result from processing an item on the emerge queue +enum EmergeAction { + EMERGE_CANCELLED, + EMERGE_ERRORED, + EMERGE_FROM_MEMORY, + EMERGE_FROM_DISK, + EMERGE_GENERATED, +}; + +// Callback +typedef void (*EmergeCompletionCallback)( + v3s16 blockpos, EmergeAction action, void *param); + +typedef std::vector< + std::pair< + EmergeCompletionCallback, + void * + > +> EmergeCallbackList; + struct BlockEmergeData { u16 peer_requested; - u8 flags; + u16 flags; + EmergeCallbackList callbacks; }; class EmergeManager { public: INodeDefManager *ndef; + bool enable_mapgen_debug_info; - std::vector<Mapgen *> mapgen; - std::vector<EmergeThread *> emergethread; - - bool threads_active; - - //settings - MapgenParams params; - bool mapgen_debug_info; - u16 qlimit_total; - u16 qlimit_diskonly; - u16 qlimit_generate; - + // Generation Notify u32 gen_notify_on; std::set<u32> gen_notify_on_deco_ids; - //// Block emerge queue data structures - Mutex queuemutex; - std::map<v3s16, BlockEmergeData *> blocks_enqueued; - std::map<u16, u16> peer_queue_count; + // Map generation parameters + MapgenParams params; - //// Managers of map generation-related components + // Managers of various map generation-related components BiomeManager *biomemgr; OreManager *oremgr; DecorationManager *decomgr; SchematicManager *schemmgr; - //// Methods + // Methods EmergeManager(IGameDef *gamedef); ~EmergeManager(); void loadMapgenParams(); - static MapgenSpecificParams *createMapgenParams(const std::string &mgname); void initMapgens(); - Mapgen *getCurrentMapgen(); - Mapgen *createMapgen(const std::string &mgname, int mgid, - MapgenParams *mgparams); - static void getMapgenNames(std::list<const char *> &mgnames); + void startThreads(); void stopThreads(); - bool enqueueBlockEmerge(u16 peer_id, v3s16 p, bool allow_generate, - bool force_queue_block=false); + + bool enqueueBlockEmerge( + u16 peer_id, + v3s16 blockpos, + bool allow_generate, + bool ignore_queue_limits=false); + + bool enqueueBlockEmergeEx( + v3s16 blockpos, + u16 peer_id, + u16 flags, + EmergeCompletionCallback callback, + void *callback_param); v3s16 getContainingChunk(v3s16 blockpos); - static v3s16 getContainingChunk(v3s16 blockpos, s16 chunksize); - // mapgen helper methods + Mapgen *getCurrentMapgen(); + + // Mapgen helpers methods Biome *getBiomeAtPoint(v3s16 p); int getGroundLevelAtPoint(v2s16 p); bool isBlockUnderground(v3s16 blockpos); + + static MapgenFactory *getMapgenFactory(const std::string &mgname); + static void getMapgenNames(std::vector<const char *> *mgnames); + static v3s16 getContainingChunk(v3s16 blockpos, s16 chunksize); + +private: + std::vector<Mapgen *> m_mapgens; + std::vector<EmergeThread *> m_threads; + bool m_threads_active; + + Mutex m_queue_mutex; + std::map<v3s16, BlockEmergeData> m_blocks_enqueued; + std::map<u16, u16> m_peer_queue_count; + + u16 m_qlimit_total; + u16 m_qlimit_diskonly; + u16 m_qlimit_generate; + + // Requires m_queue_mutex held + EmergeThread *getOptimalThread(); + bool pushBlockEmergeData(v3s16 pos, u16 peer_requested, u16 flags, + EmergeCompletionCallback callback, void *callback_param); + bool popBlockEmergeData(v3s16 pos, BlockEmergeData *bedata); + + friend class EmergeThread; }; #endif |