]> git.lizzy.rs Git - minetest.git/blobdiff - src/emerge.cpp
Minimap: Optimise
[minetest.git] / src / emerge.cpp
index 93e8f2b30a92abcbbd81f226b75ae00e8d5bb546..1c9719c4898104d4e33638d277385aa1817a452b 100644 (file)
@@ -34,13 +34,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "log.h"
 #include "map.h"
 #include "mapblock.h"
-#include "mapgen_flat.h"
-#include "mapgen_fractal.h"
-#include "mapgen_v5.h"
-#include "mapgen_v6.h"
-#include "mapgen_v7.h"
-#include "mapgen_valleys.h"
-#include "mapgen_singlenode.h"
 #include "mg_biome.h"
 #include "mg_ore.h"
 #include "mg_decoration.h"
@@ -53,13 +46,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "settings.h"
 #include "voxel.h"
 
-
-struct MapgenDesc {
-       const char *name;
-       MapgenFactory *factory;
-       bool is_user_visible;
-};
-
 class EmergeThread : public Thread {
 public:
        bool enable_mapgen_debug_info;
@@ -99,31 +85,17 @@ class EmergeThread : public Thread {
        friend class EmergeManager;
 };
 
-////
-//// Built-in mapgens
-////
-
-MapgenDesc g_reg_mapgens[] = {
-       {"v5",         new MapgenFactoryV5,         true},
-       {"v6",         new MapgenFactoryV6,         true},
-       {"v7",         new MapgenFactoryV7,         true},
-       {"flat",       new MapgenFactoryFlat,       true},
-       {"fractal",    new MapgenFactoryFractal,    true},
-       {"valleys",    new MapgenFactoryValleys,    true},
-       {"singlenode", new MapgenFactorySinglenode, false},
-};
-
 ////
 //// EmergeManager
 ////
 
-EmergeManager::EmergeManager(IGameDef *gamedef)
+EmergeManager::EmergeManager(Server *server)
 {
-       this->ndef      = gamedef->getNodeDefManager();
-       this->biomemgr  = new BiomeManager(gamedef);
-       this->oremgr    = new OreManager(gamedef);
-       this->decomgr   = new DecorationManager(gamedef);
-       this->schemmgr  = new SchematicManager(gamedef);
+       this->ndef      = server->getNodeDefManager();
+       this->biomemgr  = new BiomeManager(server);
+       this->oremgr    = new OreManager(server);
+       this->decomgr   = new DecorationManager(server);
+       this->schemmgr  = new SchematicManager(server);
        this->gen_notify_on = 0;
 
        // Note that accesses to this variable are not synchronized.
@@ -156,7 +128,7 @@ EmergeManager::EmergeManager(IGameDef *gamedef)
                m_qlimit_generate = 1;
 
        for (s16 i = 0; i < nthreads; i++)
-               m_threads.push_back(new EmergeThread((Server *)gamedef, i));
+               m_threads.push_back(new EmergeThread(server, i));
 
        infostream << "EmergeManager: using " << nthreads << " threads" << std::endl;
 }
@@ -181,42 +153,22 @@ EmergeManager::~EmergeManager()
        delete oremgr;
        delete decomgr;
        delete schemmgr;
-
-       delete params.sparams;
 }
 
 
-void EmergeManager::loadMapgenParams()
-{
-       params.load(*g_settings);
-}
-
-
-void EmergeManager::initMapgens()
+bool EmergeManager::initMapgens(MapgenParams *params)
 {
        if (m_mapgens.size())
-               return;
-
-       MapgenFactory *mgfactory = getMapgenFactory(params.mg_name);
-       if (!mgfactory) {
-               errorstream << "EmergeManager: mapgen " << params.mg_name <<
-                       " not registered; falling back to " << DEFAULT_MAPGEN << std::endl;
-
-               params.mg_name = DEFAULT_MAPGEN;
+               return false;
 
-               mgfactory = getMapgenFactory(params.mg_name);
-               FATAL_ERROR_IF(mgfactory == NULL, "Couldn't use any mapgen!");
-       }
-
-       if (!params.sparams) {
-               params.sparams = mgfactory->createMapgenParams();
-               params.sparams->readParams(g_settings);
-       }
+       this->mgparams = params;
 
        for (u32 i = 0; i != m_threads.size(); i++) {
-               Mapgen *mg = mgfactory->createMapgen(i, &params, this);
+               Mapgen *mg = Mapgen::createMapgen(params->mgtype, i, params, this);
                m_mapgens.push_back(mg);
        }
+
+       return true;
 }
 
 
@@ -318,12 +270,14 @@ bool EmergeManager::enqueueBlockEmergeEx(
 // Mapgen-related helper functions
 //
 
+
+// TODO(hmmmm): Move this to ServerMap
 v3s16 EmergeManager::getContainingChunk(v3s16 blockpos)
 {
-       return getContainingChunk(blockpos, params.chunksize);
+       return getContainingChunk(blockpos, mgparams->chunksize);
 }
 
-
+// TODO(hmmmm): Move this to ServerMap
 v3s16 EmergeManager::getContainingChunk(v3s16 blockpos, s16 chunksize)
 {
        s16 coff = -chunksize / 2;
@@ -357,7 +311,7 @@ int EmergeManager::getGroundLevelAtPoint(v2s16 p)
        return m_mapgens[0]->getGroundLevelAtPoint(p);
 }
 
-
+// TODO(hmmmm): Move this to ServerMap
 bool EmergeManager::isBlockUnderground(v3s16 blockpos)
 {
 #if 0
@@ -368,31 +322,9 @@ bool EmergeManager::isBlockUnderground(v3s16 blockpos)
 #endif
 
        // Use a simple heuristic; the above method is wildly inaccurate anyway.
-       return blockpos.Y * (MAP_BLOCKSIZE + 1) <= params.water_level;
+       return blockpos.Y * (MAP_BLOCKSIZE + 1) <= mgparams->water_level;
 }
 
-
-void EmergeManager::getMapgenNames(
-       std::vector<const char *> *mgnames, bool include_hidden)
-{
-       for (u32 i = 0; i != ARRLEN(g_reg_mapgens); i++) {
-               if (include_hidden || g_reg_mapgens[i].is_user_visible)
-                       mgnames->push_back(g_reg_mapgens[i].name);
-       }
-}
-
-
-MapgenFactory *EmergeManager::getMapgenFactory(const std::string &mgname)
-{
-       for (u32 i = 0; i != ARRLEN(g_reg_mapgens); i++) {
-               if (mgname == g_reg_mapgens[i].name)
-                       return g_reg_mapgens[i].factory;
-       }
-
-       return NULL;
-}
-
-
 bool EmergeManager::pushBlockEmergeData(
        v3s16 pos,
        u16 peer_requested,
@@ -437,12 +369,10 @@ bool EmergeManager::pushBlockEmergeData(
 }
 
 
-bool EmergeManager::popBlockEmergeData(
-       v3s16 pos,
-       BlockEmergeData *bedata)
+bool EmergeManager::popBlockEmergeData(v3s16 pos, BlockEmergeData *bedata)
 {
        std::map<v3s16, BlockEmergeData>::iterator it;
-       std::map<u16, u16>::iterator it2;
+       UNORDERED_MAP<u16, u16>::iterator it2;
 
        it = m_blocks_enqueued.find(pos);
        if (it == m_blocks_enqueued.end())
@@ -578,13 +508,15 @@ EmergeAction EmergeThread::getBlockOrStartGen(
 
        // 1). Attempt to fetch block from memory
        *block = m_map->getBlockNoCreateNoEx(pos);
-       if (*block && !(*block)->isDummy() && (*block)->isGenerated())
-               return EMERGE_FROM_MEMORY;
-
-       // 2). Attempt to load block from disk
-       *block = m_map->loadBlock(pos);
-       if (*block && (*block)->isGenerated())
-               return EMERGE_FROM_DISK;
+       if (*block && !(*block)->isDummy()) {
+               if ((*block)->isGenerated())
+                       return EMERGE_FROM_MEMORY;
+       } else {
+               // 2). Attempt to load block from disk if it was not in the memory
+               *block = m_map->loadBlock(pos);
+               if (*block && (*block)->isGenerated())
+                       return EMERGE_FROM_DISK;
+       }
 
        // 3). Attempt to start generation
        if (allow_gen && m_map->initBlockMake(pos, bmdata))
@@ -632,7 +564,7 @@ MapBlock *EmergeThread::finishGen(v3s16 pos, BlockMakeData *bmdata,
                m_server->getScriptIface()->environment_OnGenerated(
                        minp, maxp, m_mapgen->blockseed);
        } catch (LuaError &e) {
-               m_server->setAsyncFatalError("Lua: " + std::string(e.what()));
+               m_server->setAsyncFatalError("Lua: finishGen" + std::string(e.what()));
        }
 
        EMERGE_DBG_OUT("ended up with: " << analyze_block(block));