From b9d8e59bbf727fcc1a073bbf27e5d1703b9490ef Mon Sep 17 00:00:00 2001 From: kwolekr Date: Wed, 13 Feb 2013 22:43:15 -0500 Subject: Add emerge.cpp, initial EmergeThread changes - Neatly placed all emerge related code into a new file, emerge.cpp - Greatly cleaned up the code in EmergeThread::Thread() - Reworked Emerge queue. Now an actual std::queue of v3s16 block positions - Removed the completely unnecessary map of peer ids requesting blocks --- src/emerge.h | 122 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 src/emerge.h (limited to 'src/emerge.h') diff --git a/src/emerge.h b/src/emerge.h new file mode 100644 index 000000000..0acc89a6d --- /dev/null +++ b/src/emerge.h @@ -0,0 +1,122 @@ +#ifndef EMERGE_HEADER +#define EMERGE_HEADER + +#include +#include +#include "util/thread.h" + +#define BLOCK_EMERGE_ALLOWGEN (1<<0) + +class Mapgen; +class MapgenParams; +class MapgenFactory; +class Biome; +class BiomeDefManager; +class EmergeThread; +class ManualMapVoxelManipulator; +//class ServerMap; +//class MapBlock; + +#include "server.h" + +struct BlockMakeData { + bool no_op; + ManualMapVoxelManipulator *vmanip; + u64 seed; + v3s16 blockpos_min; + v3s16 blockpos_max; + v3s16 blockpos_requested; + UniqueQueue transforming_liquid; + INodeDefManager *nodedef; + +// BlockMakeData(); +// ~BlockMakeData(); + +BlockMakeData(): + no_op(false), + vmanip(NULL), + seed(0), + nodedef(NULL) +{} + +~BlockMakeData() +{ + delete vmanip; +} +}; + +class EmergeManager { +public: + std::map mglist; + + //settings + MapgenParams *params; + + JMutex queuemutex; + std::map blocks_enqueued; //change to a hashtable later + Mapgen *mapgen; + EmergeThread *emergethread; + + //biome manager + BiomeDefManager *biomedef; + + EmergeManager(IGameDef *gamedef, BiomeDefManager *bdef); + ~EmergeManager(); + + void initMapgens(MapgenParams *mgparams); + Mapgen *createMapgen(std::string mgname, int mgid, + MapgenParams *mgparams, EmergeManager *emerge); + MapgenParams *createMapgenParams(std::string mgname); + Mapgen *getMapgen(); + bool enqueueBlockEmerge(u16 peer_id, v3s16 p, bool allow_generate); + bool popBlockEmerge(v3s16 *pos, u8 *flags); + + bool registerMapgen(std::string name, MapgenFactory *mgfactory); + MapgenParams *getParamsFromSettings(Settings *settings); + void setParamsToSettings(Settings *settings); + + //mapgen helper methods + Biome *getBiomeAtPoint(v3s16 p); + int getGroundLevelAtPoint(v2s16 p); + bool isBlockUnderground(v3s16 blockpos); + u32 getBlockSeed(v3s16 p); +}; + +class EmergeThread : public SimpleThread +{ + Server *m_server; + ServerMap *map; + EmergeManager *emerge; + Mapgen *mapgen; + bool enable_mapgen_debug_info; + +public: + Event qevent; + std::queue blockqueue; + + EmergeThread(Server *server): + SimpleThread(), + m_server(server), + map(NULL), + emerge(NULL), + mapgen(NULL) + { + enable_mapgen_debug_info = g_settings->getBool("enable_mapgen_debug_info"); + } + + void *Thread(); + + void trigger() + { + setRun(true); + if(IsRunning() == false) + { + Start(); + } + } + + bool getBlockOrStartGen(v3s16 p, MapBlock **b, + BlockMakeData *data, bool allow_generate); +}; + +#endif -- cgit v1.2.3