X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Femerge.h;h=71ad97da33070842c5b47efada00573e975d1f0f;hb=6d7b95d76355334ccb57638d35b123fb49456cf6;hp=d5bb72f85d0303f2fc4282522f18530e6ec09de9;hpb=c3708b456e90bccf19e7c82c54a93c8cb7c8896c;p=dragonfireclient.git diff --git a/src/emerge.h b/src/emerge.h index d5bb72f85..71ad97da3 100644 --- a/src/emerge.h +++ b/src/emerge.h @@ -23,32 +23,29 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include "irr_v3d.h" #include "util/container.h" -#include "map.h" // for ManualMapVoxelManipulator +#include "mapgen.h" // for MapgenParams +#include "map.h" -#define MGPARAMS_SET_MGNAME 1 -#define MGPARAMS_SET_SEED 2 -#define MGPARAMS_SET_WATER_LEVEL 4 -#define MGPARAMS_SET_FLAGS 8 +#define BLOCK_EMERGE_ALLOW_GEN (1 << 0) +#define BLOCK_EMERGE_FORCE_QUEUE (1 << 1) -#define BLOCK_EMERGE_ALLOWGEN (1<<0) - -#define EMERGE_DBG_OUT(x) \ - { if (enable_mapgen_debug_info) \ - infostream << "EmergeThread: " x << std::endl; } +#define EMERGE_DBG_OUT(x) do { \ + if (enable_mapgen_debug_info) \ + infostream << "EmergeThread: " x << std::endl; \ +} while (0) class EmergeThread; -class Mapgen; -struct MapgenParams; -struct MapgenFactory; -class Biome; -class BiomeDefManager; -class Decoration; -class Ore; class INodeDefManager; class Settings; +class BiomeManager; +class OreManager; +class DecorationManager; +class SchematicManager; + +// Structure containing inputs/outputs for chunk generation struct BlockMakeData { - ManualMapVoxelManipulator *vmanip; + MMVManip *vmanip; u64 seed; v3s16 blockpos_min; v3s16 blockpos_max; @@ -65,72 +62,122 @@ struct BlockMakeData { ~BlockMakeData() { delete vmanip; } }; -struct BlockEmergeData { - u16 peer_requested; - u8 flags; +// Result from processing an item on the emerge queue +enum EmergeAction { + EMERGE_CANCELLED, + EMERGE_ERRORED, + EMERGE_FROM_MEMORY, + EMERGE_FROM_DISK, + EMERGE_GENERATED, }; -class IBackgroundBlockEmerger -{ -public: - virtual bool enqueueBlockEmerge(u16 peer_id, v3s16 p, - bool allow_generate) = 0; - virtual ~IBackgroundBlockEmerger() {} +// Callback +typedef void (*EmergeCompletionCallback)( + v3s16 blockpos, EmergeAction action, void *param); + +typedef std::vector< + std::pair< + EmergeCompletionCallback, + void * + > +> EmergeCallbackList; + +struct BlockEmergeData { + u16 peer_requested; + u16 flags; + EmergeCallbackList callbacks; }; -class EmergeManager : public IBackgroundBlockEmerger { +class EmergeManager { public: INodeDefManager *ndef; + bool enable_mapgen_debug_info; + + // Generation Notify + u32 gen_notify_on; + std::set gen_notify_on_deco_ids; + + // Parameters passed to mapgens owned by ServerMap + // TODO(hmmmm): Remove this after mapgen helper methods using them + // are moved to ServerMap + MapgenParams *mgparams; + + // Hackish workaround: + // For now, EmergeManager must hold onto a ptr to the Map's setting manager + // since the Map can only be accessed through the Environment, and the + // Environment is not created until after script initialization. + MapSettingsManager *map_settings_mgr; + + // Managers of various map generation-related components + BiomeManager *biomemgr; + OreManager *oremgr; + DecorationManager *decomgr; + SchematicManager *schemmgr; + + // Methods + EmergeManager(IGameDef *gamedef); + ~EmergeManager(); - std::map mglist; - - std::vector mapgen; - std::vector emergethread; - - //settings - MapgenParams *params; - bool mapgen_debug_info; - u16 qlimit_total; - u16 qlimit_diskonly; - u16 qlimit_generate; - - u32 gennotify; + bool initMapgens(MapgenParams *mgparams); - MapgenParams *luaoverride_params; - u32 luaoverride_params_modified; - u32 luaoverride_flagmask; + void startThreads(); + void stopThreads(); + bool isRunning(); - //block emerge queue data structures - JMutex queuemutex; - std::map blocks_enqueued; - std::map peer_queue_count; + bool enqueueBlockEmerge( + u16 peer_id, + v3s16 blockpos, + bool allow_generate, + bool ignore_queue_limits=false); - //Mapgen-related structures - BiomeDefManager *biomedef; - std::vector ores; - std::vector decorations; + bool enqueueBlockEmergeEx( + v3s16 blockpos, + u16 peer_id, + u16 flags, + EmergeCompletionCallback callback, + void *callback_param); - EmergeManager(IGameDef *gamedef); - ~EmergeManager(); + v3s16 getContainingChunk(v3s16 blockpos); - void initMapgens(MapgenParams *mgparams); - MapgenParams *setMapgenType(MapgenParams *mgparams, std::string newname); Mapgen *getCurrentMapgen(); - Mapgen *createMapgen(std::string mgname, int mgid, - MapgenParams *mgparams); - MapgenParams *createMapgenParams(std::string mgname); - void triggerAllThreads(); - bool enqueueBlockEmerge(u16 peer_id, v3s16 p, bool allow_generate); - - void registerMapgen(std::string name, MapgenFactory *mgfactory); - MapgenParams *getParamsFromSettings(Settings *settings); - void setParamsToSettings(Settings *settings); - //mapgen helper methods + // Mapgen helpers methods Biome *getBiomeAtPoint(v3s16 p); + int getSpawnLevelAtPoint(v2s16 p); int getGroundLevelAtPoint(v2s16 p); bool isBlockUnderground(v3s16 blockpos); - u32 getBlockSeed(v3s16 p); + + static v3s16 getContainingChunk(v3s16 blockpos, s16 chunksize); + +private: + std::vector m_mapgens; + std::vector m_threads; + bool m_threads_active; + + Mutex m_queue_mutex; + std::map m_blocks_enqueued; + UNORDERED_MAP 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 *entry_already_exists); + + bool popBlockEmergeData(v3s16 pos, BlockEmergeData *bedata); + + friend class EmergeThread; + + DISABLE_CLASS_COPY(EmergeManager); }; #endif