1
0
Fork 0
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:
kwolekr 2015-10-04 02:54:25 -04:00
parent 1f9c5a4a7b
commit 0850d3bb93
6 changed files with 624 additions and 572 deletions

View file

@ -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