3 Copyright (C) 2014-2020 paramat
4 Copyright (C) 2014-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU Lesser General Public License as published by
8 the Free Software Foundation; either version 2.1 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public License along
17 with this program; if not, write to the Free Software Foundation, Inc.,
18 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
37 #define BIOME_NONE ((biome_t)0)
43 class Biome
: public ObjDef
, public NodeResolver
{
45 ObjDef
*clone() const;
52 content_t c_water_top
;
54 content_t c_river_water
;
57 std::vector
<content_t
> c_cave_liquid
;
59 content_t c_dungeon_alt
;
60 content_t c_dungeon_stair
;
73 virtual void resolveNodeNames();
86 virtual void readParams(const Settings
*settings
) = 0;
87 virtual void writeParams(Settings
*settings
) const = 0;
88 virtual ~BiomeParams() = default;
93 // WARNING: this class is not thread-safe
96 virtual ~BiomeGen() = default;
98 virtual BiomeGenType
getType() const = 0;
100 // Calculates the biome at the exact position provided. This function can
101 // be called at any time, but may be less efficient than the latter methods,
102 // depending on implementation.
103 virtual Biome
*calcBiomeAtPoint(v3s16 pos
) const = 0;
105 // Computes any intermediate results needed for biome generation. Must be
106 // called before using any of: getBiomes, getBiomeAtPoint, or getBiomeAtIndex.
107 // Calling this invalidates the previous results stored in biomemap.
108 virtual void calcBiomeNoise(v3s16 pmin
) = 0;
110 // Gets all biomes in current chunk using each corresponding element of
111 // heightmap as the y position, then stores the results by biome index in
112 // biomemap (also returned)
113 virtual biome_t
*getBiomes(s16
*heightmap
, v3s16 pmin
) = 0;
115 // Gets a single biome at the specified position, which must be contained
116 // in the region formed by m_pmin and (m_pmin + m_csize - 1).
117 virtual Biome
*getBiomeAtPoint(v3s16 pos
) const = 0;
119 // Same as above, but uses a raw numeric index correlating to the (x,z) position.
120 virtual Biome
*getBiomeAtIndex(size_t index
, v3s16 pos
) const = 0;
122 // Result of calcBiomes bulk computation.
123 biome_t
*biomemap
= nullptr;
126 BiomeManager
*m_bmgr
= nullptr;
133 //// BiomeGen implementations
137 // Original biome algorithm (Whittaker's classification + surface height)
140 struct BiomeParamsOriginal
: public BiomeParams
{
141 BiomeParamsOriginal() :
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)
149 virtual void readParams(const Settings
*settings
);
150 virtual void writeParams(Settings
*settings
) const;
153 NoiseParams np_humidity
;
154 NoiseParams np_heat_blend
;
155 NoiseParams np_humidity_blend
;
158 class BiomeGenOriginal
: public BiomeGen
{
160 BiomeGenOriginal(BiomeManager
*biomemgr
,
161 BiomeParamsOriginal
*params
, v3s16 chunksize
);
162 virtual ~BiomeGenOriginal();
164 BiomeGenType
getType() const { return BIOMEGEN_ORIGINAL
; }
166 Biome
*calcBiomeAtPoint(v3s16 pos
) const;
167 void calcBiomeNoise(v3s16 pmin
);
169 biome_t
*getBiomes(s16
*heightmap
, v3s16 pmin
);
170 Biome
*getBiomeAtPoint(v3s16 pos
) const;
171 Biome
*getBiomeAtIndex(size_t index
, v3s16 pos
) const;
173 Biome
*calcBiomeFromNoise(float heat
, float humidity
, v3s16 pos
) const;
179 BiomeParamsOriginal
*m_params
;
182 Noise
*noise_humidity
;
183 Noise
*noise_heat_blend
;
184 Noise
*noise_humidity_blend
;
192 class BiomeManager
: public ObjDefManager
{
194 BiomeManager(Server
*server
);
195 virtual ~BiomeManager() = default;
197 BiomeManager
*clone() const;
199 const char *getObjectTitle() const
204 static Biome
*create(BiomeType type
)
209 BiomeGen
*createBiomeGen(BiomeGenType type
, BiomeParams
*params
, v3s16 chunksize
)
212 case BIOMEGEN_ORIGINAL
:
213 return new BiomeGenOriginal(this,
214 (BiomeParamsOriginal
*)params
, chunksize
);
220 static BiomeParams
*createBiomeParams(BiomeGenType type
)
223 case BIOMEGEN_ORIGINAL
:
224 return new BiomeParamsOriginal
;
230 virtual void clear();
232 // For BiomeGen type 'BiomeGenOriginal'
233 float getHeatAtPosOriginal(v3s16 pos
, NoiseParams
&np_heat
,
234 NoiseParams
&np_heat_blend
, u64 seed
) const;
235 float getHumidityAtPosOriginal(v3s16 pos
, NoiseParams
&np_humidity
,
236 NoiseParams
&np_humidity_blend
, u64 seed
) const;
237 const Biome
*getBiomeFromNoiseOriginal(float heat
, float humidity
,