mirror of
https://github.com/luanti-org/luanti.git
synced 2025-07-02 16:38:41 +00:00
Add emerge completion callback mechanism
Major refactor of emerge.cpp and Map::init/finishBlockMake
This commit is contained in:
parent
1f9c5a4a7b
commit
0850d3bb93
6 changed files with 624 additions and 572 deletions
111
src/emerge.h
111
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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue