Luanti 5.10.0-dev
 
Loading...
Searching...
No Matches
mg_biome.h
Go to the documentation of this file.
1// Luanti
2// SPDX-License-Identifier: LGPL-2.1-or-later
3// Copyright (C) 2014-2020 paramat
4// Copyright (C) 2014-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
5
6#pragma once
7
8#include "objdef.h"
9#include "nodedef.h"
10#include "noise.h"
11
12class Server;
13class Settings;
14class BiomeManager;
15
19
20typedef u16 biome_t;
21
22#define BIOME_NONE ((biome_t)0)
23
27
60
61
65
69
71 virtual void readParams(const Settings *settings) = 0;
72 virtual void writeParams(Settings *settings) const = 0;
73 virtual ~BiomeParams() = default;
74
75 s32 seed;
76};
77
78// WARNING: this class is not thread-safe
79class BiomeGen {
80public:
81 virtual ~BiomeGen() = default;
82
83 virtual BiomeGenType getType() const = 0;
84
85 // Clone this BiomeGen and set a the new BiomeManager to be used by the copy
86 virtual BiomeGen *clone(BiomeManager *biomemgr) const = 0;
87
88 // Check that the internal chunk size is what the mapgen expects, just to be sure.
89 inline void assertChunkSize(v3s16 expect) const
90 {
91 FATAL_ERROR_IF(m_csize != expect, "Chunk size mismatches");
92 }
93
94 // Calculates the biome at the exact position provided. This function can
95 // be called at any time, but may be less efficient than the latter methods,
96 // depending on implementation.
97 virtual Biome *calcBiomeAtPoint(v3s16 pos) const = 0;
98
99 // Computes any intermediate results needed for biome generation. Must be
100 // called before using any of: getBiomes, getBiomeAtPoint, or getBiomeAtIndex.
101 // Calling this invalidates the previous results stored in biomemap.
102 virtual void calcBiomeNoise(v3s16 pmin) = 0;
103
104 // Gets all biomes in current chunk using each corresponding element of
105 // heightmap as the y position, then stores the results by biome index in
106 // biomemap (also returned)
107 virtual biome_t *getBiomes(s16 *heightmap, v3s16 pmin) = 0;
108
109 // Gets a single biome at the specified position, which must be contained
110 // in the region formed by m_pmin and (m_pmin + m_csize - 1).
111 virtual Biome *getBiomeAtPoint(v3s16 pos) const = 0;
112
113 // Same as above, but uses a raw numeric index correlating to the (x,z) position.
114 virtual Biome *getBiomeAtIndex(size_t index, v3s16 pos) const = 0;
115
116 // Returns the next lower y position at which the biome could change.
117 // You can use this to optimize calls to getBiomeAtIndex().
118 virtual s16 getNextTransitionY(s16 y) const {
119 return y == S16_MIN ? y : (y - 1);
120 };
121
122 // Result of calcBiomes bulk computation.
123 biome_t *biomemap = nullptr;
124
125protected:
129};
130
131
135
136//
137// Original biome algorithm (Whittaker's classification + surface height)
138//
139
142 np_heat(50, 50, v3f(1000.0, 1000.0, 1000.0), 5349, 3, 0.5, 2.0),
143 np_humidity(50, 50, v3f(1000.0, 1000.0, 1000.0), 842, 3, 0.5, 2.0),
144 np_heat_blend(0, 1.5, v3f(8.0, 8.0, 8.0), 13, 2, 1.0, 2.0),
145 np_humidity_blend(0, 1.5, v3f(8.0, 8.0, 8.0), 90003, 2, 1.0, 2.0)
146 {
147 }
148
149 virtual void readParams(const Settings *settings);
150 virtual void writeParams(Settings *settings) const;
151
156};
157
158class BiomeGenOriginal final : public BiomeGen {
159public:
161 const BiomeParamsOriginal *params, v3s16 chunksize);
162 virtual ~BiomeGenOriginal();
163
165
166 BiomeGen *clone(BiomeManager *biomemgr) const;
167
168 // Slower, meant for Script API use
169 float calcHeatAtPoint(v3s16 pos) const;
170 float calcHumidityAtPoint(v3s16 pos) const;
171 Biome *calcBiomeAtPoint(v3s16 pos) const;
172
173 void calcBiomeNoise(v3s16 pmin);
174
175 biome_t *getBiomes(s16 *heightmap, v3s16 pmin);
176 Biome *getBiomeAtPoint(v3s16 pos) const;
177 Biome *getBiomeAtIndex(size_t index, v3s16 pos) const;
178
179 Biome *calcBiomeFromNoise(float heat, float humidity, v3s16 pos) const;
180 s16 getNextTransitionY(s16 y) const;
181
182 float *heatmap;
183 float *humidmap;
184
185private:
187
192
193 // ordered descending
194 std::vector<s16> m_transitions_y;
195};
196
197
201
203public:
205 virtual ~BiomeManager() = default;
206
207 BiomeManager *clone() const;
208
209 const char *getObjectTitle() const
210 {
211 return "biome";
212 }
213
214 static Biome *create(BiomeType type)
215 {
216 return new Biome;
217 }
218
220 {
221 switch (type) {
223 return new BiomeGenOriginal(this,
224 (BiomeParamsOriginal *)params, chunksize);
225 default:
226 return NULL;
227 }
228 }
229
231 {
232 switch (type) {
234 return new BiomeParamsOriginal;
235 default:
236 return NULL;
237 }
238 }
239
240 virtual void clear();
241
242private:
244
246
247};
u16 biome_t
Definition cavegen.h:10
Definition mg_biome.h:158
Biome * calcBiomeAtPoint(v3s16 pos) const
Definition mg_biome.cpp:186
Noise * noise_heat_blend
Definition mg_biome.h:190
virtual ~BiomeGenOriginal()
Definition mg_biome.cpp:152
BiomeGenOriginal(BiomeManager *biomemgr, const BiomeParamsOriginal *params, v3s16 chunksize)
Definition mg_biome.cpp:112
float * humidmap
Definition mg_biome.h:183
s16 getNextTransitionY(s16 y) const
Definition mg_biome.cpp:162
Noise * noise_humidity
Definition mg_biome.h:189
BiomeGen * clone(BiomeManager *biomemgr) const
Definition mg_biome.cpp:169
Biome * getBiomeAtIndex(size_t index, v3s16 pos) const
Definition mg_biome.cpp:233
float calcHeatAtPoint(v3s16 pos) const
Definition mg_biome.cpp:174
Biome * calcBiomeFromNoise(float heat, float humidity, v3s16 pos) const
Definition mg_biome.cpp:242
Noise * noise_humidity_blend
Definition mg_biome.h:191
float * heatmap
Definition mg_biome.h:182
const BiomeParamsOriginal * m_params
Definition mg_biome.h:186
biome_t * getBiomes(s16 *heightmap, v3s16 pmin)
Definition mg_biome.cpp:208
float calcHumidityAtPoint(v3s16 pos) const
Definition mg_biome.cpp:180
std::vector< s16 > m_transitions_y
Definition mg_biome.h:194
BiomeGenType getType() const
Definition mg_biome.h:164
Noise * noise_heat
Definition mg_biome.h:188
Biome * getBiomeAtPoint(v3s16 pos) const
Definition mg_biome.cpp:225
void calcBiomeNoise(v3s16 pmin)
Definition mg_biome.cpp:192
Definition mg_biome.h:79
biome_t * biomemap
Definition mg_biome.h:123
v3s16 m_csize
Definition mg_biome.h:128
virtual BiomeGen * clone(BiomeManager *biomemgr) const =0
virtual Biome * calcBiomeAtPoint(v3s16 pos) const =0
void assertChunkSize(v3s16 expect) const
Definition mg_biome.h:89
virtual biome_t * getBiomes(s16 *heightmap, v3s16 pmin)=0
virtual BiomeGenType getType() const =0
virtual s16 getNextTransitionY(s16 y) const
Definition mg_biome.h:118
virtual ~BiomeGen()=default
BiomeManager * m_bmgr
Definition mg_biome.h:126
virtual void calcBiomeNoise(v3s16 pmin)=0
v3s16 m_pmin
Definition mg_biome.h:127
virtual Biome * getBiomeAtIndex(size_t index, v3s16 pos) const =0
virtual Biome * getBiomeAtPoint(v3s16 pos) const =0
Definition mg_biome.h:202
virtual ~BiomeManager()=default
BiomeManager * clone() const
Definition mg_biome.cpp:81
BiomeManager()
Definition mg_biome.h:243
Server * m_server
Definition mg_biome.h:245
static BiomeParams * createBiomeParams(BiomeGenType type)
Definition mg_biome.h:230
BiomeGen * createBiomeGen(BiomeGenType type, BiomeParams *params, v3s16 chunksize)
Definition mg_biome.h:219
static Biome * create(BiomeType type)
Definition mg_biome.h:214
virtual void clear()
Definition mg_biome.cpp:62
const char * getObjectTitle() const
Definition mg_biome.h:209
Definition mg_biome.h:28
content_t c_dungeon
Definition mg_biome.h:43
float heat_point
Definition mg_biome.h:54
ObjDef * clone() const
Definition mg_biome.cpp:293
s16 depth_filler
Definition mg_biome.h:48
u32 flags
Definition mg_biome.h:32
s16 depth_top
Definition mg_biome.h:47
content_t c_top
Definition mg_biome.h:34
std::vector< content_t > c_cave_liquid
Definition mg_biome.h:42
virtual void resolveNodeNames()
Definition mg_biome.cpp:328
content_t c_filler
Definition mg_biome.h:35
content_t c_water_top
Definition mg_biome.h:37
s16 depth_riverbed
Definition mg_biome.h:50
v3s16 min_pos
Definition mg_biome.h:52
content_t c_dungeon_stair
Definition mg_biome.h:45
content_t c_stone
Definition mg_biome.h:36
s16 depth_water_top
Definition mg_biome.h:49
content_t c_riverbed
Definition mg_biome.h:40
content_t c_water
Definition mg_biome.h:38
v3s16 max_pos
Definition mg_biome.h:53
content_t c_dust
Definition mg_biome.h:41
s16 vertical_blend
Definition mg_biome.h:56
float humidity_point
Definition mg_biome.h:55
content_t c_river_water
Definition mg_biome.h:39
content_t c_dungeon_alt
Definition mg_biome.h:44
Definition nodedef.h:838
Definition noise.h:146
Definition objdef.h:56
Definition objdef.h:30
Definition server.h:167
Definition settings.h:109
#define FATAL_ERROR_IF(expr, msg)
Definition debug.h:36
static const char * settings[]
Definition fontengine.cpp:27
core::vector3d< s16 > v3s16
Definition irr_v3d.h:13
core::vector3df v3f
Definition irr_v3d.h:11
#define S16_MIN
Definition irrlichttypes.h:18
u16 content_t
Definition mapnode.h:22
BiomeGenType
Definition mg_biome.h:66
@ BIOMEGEN_ORIGINAL
Definition mg_biome.h:67
BiomeType
Definition mg_biome.h:24
@ BIOMETYPE_NORMAL
Definition mg_biome.h:25
u16 biome_t
Definition mg_biome.h:20
Definition activeobjectmgr.cpp:11
Definition mg_biome.h:140
NoiseParams np_heat
Definition mg_biome.h:152
NoiseParams np_humidity
Definition mg_biome.h:153
NoiseParams np_humidity_blend
Definition mg_biome.h:155
virtual void readParams(const Settings *settings)
Definition mg_biome.cpp:92
BiomeParamsOriginal()
Definition mg_biome.h:141
NoiseParams np_heat_blend
Definition mg_biome.h:154
virtual void writeParams(Settings *settings) const
Definition mg_biome.cpp:101
Definition mg_biome.h:70
virtual void readParams(const Settings *settings)=0
s32 seed
Definition mg_biome.h:75
virtual ~BiomeParams()=default
virtual void writeParams(Settings *settings) const =0
Definition noise.h:119