X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Femerge.h;h=825ac1c0fbf490a9204a687a0a2c34e9d1c5cab2;hb=630f453da402c7b6f0af9ea32aa8b127ce2e4629;hp=70b67e731f05360a3fc44198eaa5fd43a3d0bc9d;hpb=d31f07bd4b83f858cce589faac56922e12ba670f;p=minetest.git diff --git a/src/emerge.h b/src/emerge.h index 70b67e731..825ac1c0f 100644 --- a/src/emerge.h +++ b/src/emerge.h @@ -1,28 +1,51 @@ +/* +Minetest +Copyright (C) 2010-2013 kwolekr, Ryan Kwolek + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + #ifndef EMERGE_HEADER #define EMERGE_HEADER #include -#include -#include "util/thread.h" +#include "irr_v3d.h" +#include "util/container.h" +#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) \ - { 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 Mapgen; -class MapgenParams; -class MapgenFactory; -class Biome; -class BiomeDefManager; class EmergeThread; -class ManualMapVoxelManipulator; +class INodeDefManager; +class Settings; -#include "server.h" +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; @@ -39,90 +62,118 @@ 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: - 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; - - //block emerge queue data structures - JMutex queuemutex; - std::map blocks_enqueued; - std::map peer_queue_count; - - //biome manager - BiomeDefManager *biomedef; - - EmergeManager(IGameDef *gamedef, BiomeDefManager *bdef); + INodeDefManager *ndef; + bool enable_mapgen_debug_info; + + // Generation Notify + u32 gen_notify_on; + std::set gen_notify_on_deco_ids; + + // Map generation parameters + MapgenParams params; + + // Managers of various map generation-related components + BiomeManager *biomemgr; + OreManager *oremgr; + DecorationManager *decomgr; + SchematicManager *schemmgr; + + // Methods + EmergeManager(IGameDef *gamedef); ~EmergeManager(); - void initMapgens(MapgenParams *mgparams); - Mapgen *createMapgen(std::string mgname, int mgid, - MapgenParams *mgparams); - MapgenParams *createMapgenParams(std::string mgname); - 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 + void loadMapgenParams(); + void initMapgens(); + + void startThreads(); + void stopThreads(); + bool isRunning(); + + 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); + + Mapgen *getCurrentMapgen(); + + // Mapgen helpers methods Biome *getBiomeAtPoint(v3s16 p); + int getSpawnLevelAtPoint(v2s16 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; - int id; - -public: - Event qevent; - std::queue blockqueue; - - EmergeThread(Server *server, int ethreadid): - SimpleThread(), - m_server(server), - map(NULL), - emerge(NULL), - mapgen(NULL), - id(ethreadid) - { - } - - void *Thread(); - - void trigger() - { - setRun(true); - if(IsRunning() == false) - { - Start(); - } - } - - bool popBlockEmerge(v3s16 *pos, u8 *flags); - bool getBlockOrStartGen(v3s16 p, MapBlock **b, - BlockMakeData *data, bool allow_generate); + static MapgenFactory *getMapgenFactory(const std::string &mgname); + static void getMapgenNames( + std::vector *mgnames, bool include_hidden); + 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; + std::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