Minetest 5.9.0-dev
 
Loading...
Searching...
No Matches
emerge.h
Go to the documentation of this file.
1/*
2Minetest
3Copyright (C) 2010-2013 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
4
5This program is free software; you can redistribute it and/or modify
6it under the terms of the GNU Lesser General Public License as published by
7the Free Software Foundation; either version 2.1 of the License, or
8(at your option) any later version.
9
10This program is distributed in the hope that it will be useful,
11but WITHOUT ANY WARRANTY; without even the implied warranty of
12MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13GNU Lesser General Public License for more details.
14
15You should have received a copy of the GNU Lesser General Public License along
16with this program; if not, write to the Free Software Foundation, Inc.,
1751 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18*/
19
20#pragma once
21
22#include <map>
23#include <mutex>
25#include "irr_v3d.h"
26#include "util/container.h"
27#include "util/metricsbackend.h"
28#include "mapgen/mapgen.h" // for MapgenParams
29#include "map.h"
30
31#define BLOCK_EMERGE_ALLOW_GEN (1 << 0)
32#define BLOCK_EMERGE_FORCE_QUEUE (1 << 1)
33
34#define EMERGE_DBG_OUT(x) { \
35 if (enable_mapgen_debug_info) \
36 infostream << "EmergeThread: " x << std::endl; \
37}
38
39class EmergeThread;
40class NodeDefManager;
41class Settings;
43class BiomeManager;
44class OreManager;
47class Server;
48class ModApiMapgen;
49
50// Structure containing inputs/outputs for chunk generation
52 MMVManip *vmanip = nullptr;
53 u64 seed = 0;
57 const NodeDefManager *nodedef = nullptr;
58
59 BlockMakeData() = default;
60
61 ~BlockMakeData() { delete vmanip; }
62};
63
64// Result from processing an item on the emerge queue
71};
72
73constexpr const char *emergeActionStrs[] = {
74 "cancelled",
75 "errored",
76 "from_memory",
77 "from_disk",
78 "generated",
79};
80
81// Callback
83 v3s16 blockpos, EmergeAction action, void *param);
84
85typedef std::vector<
86 std::pair<
88 void *
89 >
91
94 u16 flags;
96};
97
99 friend class EmergeManager;
100public:
101 EmergeParams() = delete;
104
105 const NodeDefManager *ndef; // shared
107
109 const std::set<u32> *gen_notify_on_deco_ids; // shared
110 const std::set<std::string> *gen_notify_on_custom; // shared
111
117
121 }
122
123private:
125 const BiomeManager *biomemgr,
128};
129
131 /* The mod API needs unchecked access to allow:
132 * - using decomgr or oremgr to place decos/ores
133 * - using schemmgr to load and place schematics
134 */
135 friend class ModApiMapgen;
136public:
139
140 // Generation Notify
143 std::set<std::string> gen_notify_on_custom;
144
145 // Parameters passed to mapgens owned by ServerMap
146 // TODO(hmmmm): Remove this after mapgen helper methods using them
147 // are moved to ServerMap
149
150 // Hackish workaround:
151 // For now, EmergeManager must hold onto a ptr to the Map's setting manager
152 // since the Map can only be accessed through the Environment, and the
153 // Environment is not created until after script initialization.
155
156 // Methods
160
161 const BiomeGen *getBiomeGen() const { return biomegen; }
162
163 // no usage restrictions
164 const BiomeManager *getBiomeManager() const { return biomemgr; }
165 const OreManager *getOreManager() const { return oremgr; }
168 // only usable before mapgen init
173
175
176 void startThreads();
177 void stopThreads();
178 bool isRunning();
179
181 session_t peer_id,
182 v3s16 blockpos,
183 bool allow_generate,
184 bool ignore_queue_limits=false);
185
187 v3s16 blockpos,
188 session_t peer_id,
189 u16 flags,
191 void *callback_param);
192
193 bool isBlockInQueue(v3s16 pos);
194
196
197 // Mapgen helpers methods
199 bool isBlockUnderground(v3s16 blockpos);
200
201 static v3s16 getContainingChunk(v3s16 blockpos, s16 chunksize);
202
203private:
204 std::vector<Mapgen *> m_mapgens;
205 std::vector<EmergeThread *> m_threads;
206 bool m_threads_active = false;
207
208 std::mutex m_queue_mutex;
209 std::map<v3s16, BlockEmergeData> m_blocks_enqueued;
210 std::unordered_map<u16, u32> m_peer_queue_count;
211
215
216 // Emerge metrics
218
219 // Managers of various map generation-related components
220 // Note that each Mapgen gets a copy(!) of these to work with
226
227 // Requires m_queue_mutex held
229
231 v3s16 pos,
232 u16 peer_requested,
233 u16 flags,
235 void *callback_param,
236 bool *entry_already_exists);
237
238 bool popBlockEmergeData(v3s16 pos, BlockEmergeData *bedata);
239
241
242 friend class EmergeThread;
243};
Definition: mg_biome.h:94
Definition: mg_biome.h:211
Definition: mg_decoration.h:127
Definition: emerge.h:130
bool enable_mapgen_debug_info
Definition: emerge.h:138
OreManager * oremgr
Definition: emerge.h:223
BiomeGen * biomegen
Definition: emerge.h:221
MapSettingsManager * map_settings_mgr
Definition: emerge.h:154
std::vector< Mapgen * > m_mapgens
Definition: emerge.h:204
u32 gen_notify_on
Definition: emerge.h:141
~EmergeManager()
Definition: emerge.cpp:134
void stopThreads()
Definition: emerge.cpp:235
const BiomeManager * getBiomeManager() const
Definition: emerge.h:164
const OreManager * getOreManager() const
Definition: emerge.h:165
void reportCompletedEmerge(EmergeAction action)
Definition: emerge.cpp:439
OreManager * getWritableOreManager()
Definition: emerge.cpp:167
bool isBlockUnderground(v3s16 blockpos)
Definition: emerge.cpp:342
u32 m_qlimit_generate
Definition: emerge.h:214
void startThreads()
Definition: emerge.cpp:223
bool isBlockInQueue(v3s16 pos)
Definition: emerge.cpp:306
bool enqueueBlockEmergeEx(v3s16 blockpos, session_t peer_id, u16 flags, EmergeCompletionCallback callback, void *callback_param)
Definition: emerge.cpp:276
const NodeDefManager * ndef
Definition: emerge.h:137
bool isRunning()
Definition: emerge.cpp:254
BiomeManager * getWritableBiomeManager()
Definition: emerge.cpp:160
u32 m_qlimit_diskonly
Definition: emerge.h:213
std::set< u32 > gen_notify_on_deco_ids
Definition: emerge.h:142
Mapgen * getCurrentMapgen()
Definition: emerge.cpp:208
std::set< std::string > gen_notify_on_custom
Definition: emerge.h:143
void initMapgens(MapgenParams *mgparams)
Definition: emerge.cpp:189
SchematicManager * schemmgr
Definition: emerge.h:225
BiomeManager * biomemgr
Definition: emerge.h:222
EmergeThread * getOptimalThread()
Definition: emerge.cpp:419
static v3s16 getContainingChunk(v3s16 blockpos, s16 chunksize)
Definition: emerge.cpp:319
bool pushBlockEmergeData(v3s16 pos, u16 peer_requested, u16 flags, EmergeCompletionCallback callback, void *callback_param, bool *entry_already_exists)
Definition: emerge.cpp:348
std::mutex m_queue_mutex
Definition: emerge.h:208
u32 m_qlimit_total
Definition: emerge.h:212
bool m_threads_active
Definition: emerge.h:206
DISABLE_CLASS_COPY(EmergeManager)
SchematicManager * getWritableSchematicManager()
Definition: emerge.cpp:181
std::vector< EmergeThread * > m_threads
Definition: emerge.h:205
const DecorationManager * getDecorationManager() const
Definition: emerge.h:166
MapgenParams * mgparams
Definition: emerge.h:148
const SchematicManager * getSchematicManager() const
Definition: emerge.h:167
bool enqueueBlockEmerge(session_t peer_id, v3s16 blockpos, bool allow_generate, bool ignore_queue_limits=false)
Definition: emerge.cpp:260
std::map< v3s16, BlockEmergeData > m_blocks_enqueued
Definition: emerge.h:209
std::unordered_map< u16, u32 > m_peer_queue_count
Definition: emerge.h:210
bool popBlockEmergeData(v3s16 pos, BlockEmergeData *bedata)
Definition: emerge.cpp:396
const BiomeGen * getBiomeGen() const
Definition: emerge.h:161
MetricCounterPtr m_completed_emerge_counter[5]
Definition: emerge.h:217
DecorationManager * decomgr
Definition: emerge.h:224
int getSpawnLevelAtPoint(v2s16 p)
Definition: emerge.cpp:329
DecorationManager * getWritableDecorationManager()
Definition: emerge.cpp:174
Definition: emerge.h:98
bool enable_mapgen_debug_info
Definition: emerge.h:106
GenerateNotifier createNotifier() const
Definition: emerge.h:118
const std::set< u32 > * gen_notify_on_deco_ids
Definition: emerge.h:109
BiomeGen * biomegen
Definition: emerge.h:112
EmergeParams()=delete
~EmergeParams()
Definition: emerge.cpp:47
DISABLE_CLASS_COPY(EmergeParams)
u32 gen_notify_on
Definition: emerge.h:108
OreManager * oremgr
Definition: emerge.h:114
BiomeManager * biomemgr
Definition: emerge.h:113
const NodeDefManager * ndef
Definition: emerge.h:105
DecorationManager * decomgr
Definition: emerge.h:115
const std::set< std::string > * gen_notify_on_custom
Definition: emerge.h:110
SchematicManager * schemmgr
Definition: emerge.h:116
Definition: emerge_internal.h:40
Definition: mapgen.h:83
Definition: map.h:320
Definition: map_settings_manager.h:45
Definition: mapgen.h:168
Definition: metricsbackend.h:54
This class is for getting the actual properties of nodes from their content ID.
Definition: nodedef.h:556
Definition: mg_ore.h:163
Definition: mg_schematic.h:132
Definition: server.h:146
Definition: settings.h:124
Definition: container.h:41
std::vector< std::pair< EmergeCompletionCallback, void * > > EmergeCallbackList
Definition: emerge.h:90
EmergeAction
Definition: emerge.h:65
@ EMERGE_FROM_DISK
Definition: emerge.h:69
@ EMERGE_FROM_MEMORY
Definition: emerge.h:68
@ EMERGE_GENERATED
Definition: emerge.h:70
@ EMERGE_CANCELLED
Definition: emerge.h:66
@ EMERGE_ERRORED
Definition: emerge.h:67
constexpr const char * emergeActionStrs[]
Definition: emerge.h:73
void(* EmergeCompletionCallback)(v3s16 blockpos, EmergeAction action, void *param)
Definition: emerge.h:82
core::vector2d< s16 > v2s16
Definition: irr_v2d.h:27
core::vector3d< s16 > v3s16
Definition: irr_v3d.h:28
std::shared_ptr< MetricCounter > MetricCounterPtr
Definition: metricsbackend.h:37
Definition: activeobjectmgr.cpp:26
u16 session_t
Definition: networkprotocol.h:251
Definition: emerge.h:92
u16 flags
Definition: emerge.h:94
u16 peer_requested
Definition: emerge.h:93
EmergeCallbackList callbacks
Definition: emerge.h:95
Definition: emerge.h:51
BlockMakeData()=default
~BlockMakeData()
Definition: emerge.h:61
v3s16 blockpos_max
Definition: emerge.h:55
u64 seed
Definition: emerge.h:53
const NodeDefManager * nodedef
Definition: emerge.h:57
MMVManip * vmanip
Definition: emerge.h:52
UniqueQueue< v3s16 > transforming_liquid
Definition: emerge.h:56
v3s16 blockpos_min
Definition: emerge.h:54
Definition: mapgen.h:129
Definition: l_mapgen.cpp:42
static std::string p(std::string path)
Definition: test_filesys.cpp:64