aboutsummaryrefslogtreecommitdiff
path: root/src/mapgen/mg_biome.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mapgen/mg_biome.cpp')
-rw-r--r--src/mapgen/mg_biome.cpp181
1 files changed, 102 insertions, 79 deletions
diff --git a/src/mapgen/mg_biome.cpp b/src/mapgen/mg_biome.cpp
index ea7c24721..610c38594 100644
--- a/src/mapgen/mg_biome.cpp
+++ b/src/mapgen/mg_biome.cpp
@@ -28,28 +28,31 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "porting.h"
#include "settings.h"
+
///////////////////////////////////////////////////////////////////////////////
-BiomeManager::BiomeManager(Server *server) : ObjDefManager(server, OBJDEF_BIOME)
+
+BiomeManager::BiomeManager(Server *server) :
+ ObjDefManager(server, OBJDEF_BIOME)
{
m_server = server;
// Create default biome to be used in case none exist
Biome *b = new Biome;
- b->name = "default";
- b->flags = 0;
- b->depth_top = 0;
- b->depth_filler = -MAX_MAP_GENERATION_LIMIT;
+ b->name = "default";
+ b->flags = 0;
+ b->depth_top = 0;
+ b->depth_filler = -MAX_MAP_GENERATION_LIMIT;
b->depth_water_top = 0;
- b->depth_riverbed = 0;
- b->min_pos = v3s16(-MAX_MAP_GENERATION_LIMIT, -MAX_MAP_GENERATION_LIMIT,
- -MAX_MAP_GENERATION_LIMIT);
- b->max_pos = v3s16(MAX_MAP_GENERATION_LIMIT, MAX_MAP_GENERATION_LIMIT,
- MAX_MAP_GENERATION_LIMIT);
- b->heat_point = 0.0;
- b->humidity_point = 0.0;
- b->vertical_blend = 0;
+ b->depth_riverbed = 0;
+ b->min_pos = v3s16(-MAX_MAP_GENERATION_LIMIT,
+ -MAX_MAP_GENERATION_LIMIT, -MAX_MAP_GENERATION_LIMIT);
+ b->max_pos = v3s16(MAX_MAP_GENERATION_LIMIT,
+ MAX_MAP_GENERATION_LIMIT, MAX_MAP_GENERATION_LIMIT);
+ b->heat_point = 0.0;
+ b->humidity_point = 0.0;
+ b->vertical_blend = 0;
b->m_nodenames.emplace_back("mapgen_stone");
b->m_nodenames.emplace_back("mapgen_stone");
@@ -69,6 +72,7 @@ BiomeManager::BiomeManager(Server *server) : ObjDefManager(server, OBJDEF_BIOME)
add(b);
}
+
void BiomeManager::clear()
{
EmergeManager *emerge = m_server->getEmergeManager();
@@ -87,6 +91,7 @@ void BiomeManager::clear()
m_objects.resize(1);
}
+
BiomeManager *BiomeManager::clone() const
{
auto mgr = new BiomeManager();
@@ -96,25 +101,30 @@ BiomeManager *BiomeManager::clone() const
return mgr;
}
+
// For BiomeGen type 'BiomeGenOriginal'
float BiomeManager::getHeatAtPosOriginal(v3s16 pos, NoiseParams &np_heat,
- NoiseParams &np_heat_blend, u64 seed) const
+ NoiseParams &np_heat_blend, u64 seed) const
{
- return NoisePerlin2D(&np_heat, pos.X, pos.Z, seed) +
- NoisePerlin2D(&np_heat_blend, pos.X, pos.Z, seed);
+ return
+ NoisePerlin2D(&np_heat, pos.X, pos.Z, seed) +
+ NoisePerlin2D(&np_heat_blend, pos.X, pos.Z, seed);
}
+
// For BiomeGen type 'BiomeGenOriginal'
float BiomeManager::getHumidityAtPosOriginal(v3s16 pos, NoiseParams &np_humidity,
- NoiseParams &np_humidity_blend, u64 seed) const
+ NoiseParams &np_humidity_blend, u64 seed) const
{
- return NoisePerlin2D(&np_humidity, pos.X, pos.Z, seed) +
- NoisePerlin2D(&np_humidity_blend, pos.X, pos.Z, seed);
+ return
+ NoisePerlin2D(&np_humidity, pos.X, pos.Z, seed) +
+ NoisePerlin2D(&np_humidity_blend, pos.X, pos.Z, seed);
}
+
// For BiomeGen type 'BiomeGenOriginal'
-const Biome *BiomeManager::getBiomeFromNoiseOriginal(
- float heat, float humidity, v3s16 pos) const
+const Biome *BiomeManager::getBiomeFromNoiseOriginal(float heat,
+ float humidity, v3s16 pos) const
{
Biome *biome_closest = nullptr;
Biome *biome_closest_blend = nullptr;
@@ -123,8 +133,8 @@ const Biome *BiomeManager::getBiomeFromNoiseOriginal(
for (size_t i = 1; i < getNumObjects(); i++) {
Biome *b = (Biome *)getRaw(i);
- if (!b || pos.Y < b->min_pos.Y ||
- pos.Y > b->max_pos.Y + b->vertical_blend ||
+ if (!b ||
+ pos.Y < b->min_pos.Y || pos.Y > b->max_pos.Y + b->vertical_blend ||
pos.X < b->min_pos.X || pos.X > b->max_pos.X ||
pos.Z < b->min_pos.Z || pos.Z > b->max_pos.Z)
continue;
@@ -149,48 +159,52 @@ const Biome *BiomeManager::getBiomeFromNoiseOriginal(
if (biome_closest_blend && dist_min_blend <= dist_min &&
rng.range(0, biome_closest_blend->vertical_blend) >=
- pos.Y - biome_closest_blend->max_pos.Y)
+ pos.Y - biome_closest_blend->max_pos.Y)
return biome_closest_blend;
return (biome_closest) ? biome_closest : (Biome *)getRaw(BIOME_NONE);
}
+
////////////////////////////////////////////////////////////////////////////////
void BiomeParamsOriginal::readParams(const Settings *settings)
{
- settings->getNoiseParams("mg_biome_np_heat", np_heat);
- settings->getNoiseParams("mg_biome_np_heat_blend", np_heat_blend);
- settings->getNoiseParams("mg_biome_np_humidity", np_humidity);
+ settings->getNoiseParams("mg_biome_np_heat", np_heat);
+ settings->getNoiseParams("mg_biome_np_heat_blend", np_heat_blend);
+ settings->getNoiseParams("mg_biome_np_humidity", np_humidity);
settings->getNoiseParams("mg_biome_np_humidity_blend", np_humidity_blend);
}
+
void BiomeParamsOriginal::writeParams(Settings *settings) const
{
- settings->setNoiseParams("mg_biome_np_heat", np_heat);
- settings->setNoiseParams("mg_biome_np_heat_blend", np_heat_blend);
- settings->setNoiseParams("mg_biome_np_humidity", np_humidity);
+ settings->setNoiseParams("mg_biome_np_heat", np_heat);
+ settings->setNoiseParams("mg_biome_np_heat_blend", np_heat_blend);
+ settings->setNoiseParams("mg_biome_np_humidity", np_humidity);
settings->setNoiseParams("mg_biome_np_humidity_blend", np_humidity_blend);
}
+
////////////////////////////////////////////////////////////////////////////////
-BiomeGenOriginal::BiomeGenOriginal(
- BiomeManager *biomemgr, BiomeParamsOriginal *params, v3s16 chunksize)
+BiomeGenOriginal::BiomeGenOriginal(BiomeManager *biomemgr,
+ BiomeParamsOriginal *params, v3s16 chunksize)
{
- m_bmgr = biomemgr;
+ m_bmgr = biomemgr;
m_params = params;
- m_csize = chunksize;
-
- noise_heat = new Noise(&params->np_heat, params->seed, m_csize.X, m_csize.Z);
- noise_humidity = new Noise(
- &params->np_humidity, params->seed, m_csize.X, m_csize.Z);
- noise_heat_blend = new Noise(
- &params->np_heat_blend, params->seed, m_csize.X, m_csize.Z);
- noise_humidity_blend = new Noise(
- &params->np_humidity_blend, params->seed, m_csize.X, m_csize.Z);
-
- heatmap = noise_heat->result;
+ m_csize = chunksize;
+
+ noise_heat = new Noise(&params->np_heat,
+ params->seed, m_csize.X, m_csize.Z);
+ noise_humidity = new Noise(&params->np_humidity,
+ params->seed, m_csize.X, m_csize.Z);
+ noise_heat_blend = new Noise(&params->np_heat_blend,
+ params->seed, m_csize.X, m_csize.Z);
+ noise_humidity_blend = new Noise(&params->np_humidity_blend,
+ params->seed, m_csize.X, m_csize.Z);
+
+ heatmap = noise_heat->result;
humidmap = noise_humidity->result;
biomemap = new biome_t[m_csize.X * m_csize.Z];
@@ -202,7 +216,7 @@ BiomeGenOriginal::BiomeGenOriginal(
BiomeGenOriginal::~BiomeGenOriginal()
{
- delete[] biomemap;
+ delete []biomemap;
delete noise_heat;
delete noise_humidity;
@@ -213,17 +227,17 @@ BiomeGenOriginal::~BiomeGenOriginal()
// Only usable in a mapgen thread
Biome *BiomeGenOriginal::calcBiomeAtPoint(v3s16 pos) const
{
- float heat = NoisePerlin2D(&m_params->np_heat, pos.X, pos.Z, m_params->seed) +
- NoisePerlin2D(&m_params->np_heat_blend, pos.X, pos.Z,
- m_params->seed);
- float humidity = NoisePerlin2D(&m_params->np_humidity, pos.X, pos.Z,
- m_params->seed) +
- NoisePerlin2D(&m_params->np_humidity_blend, pos.X, pos.Z,
- m_params->seed);
+ float heat =
+ NoisePerlin2D(&m_params->np_heat, pos.X, pos.Z, m_params->seed) +
+ NoisePerlin2D(&m_params->np_heat_blend, pos.X, pos.Z, m_params->seed);
+ float humidity =
+ NoisePerlin2D(&m_params->np_humidity, pos.X, pos.Z, m_params->seed) +
+ NoisePerlin2D(&m_params->np_humidity_blend, pos.X, pos.Z, m_params->seed);
return calcBiomeFromNoise(heat, humidity, pos);
}
+
void BiomeGenOriginal::calcBiomeNoise(v3s16 pmin)
{
m_pmin = pmin;
@@ -234,37 +248,46 @@ void BiomeGenOriginal::calcBiomeNoise(v3s16 pmin)
noise_humidity_blend->perlinMap2D(pmin.X, pmin.Z);
for (s32 i = 0; i < m_csize.X * m_csize.Z; i++) {
- noise_heat->result[i] += noise_heat_blend->result[i];
+ noise_heat->result[i] += noise_heat_blend->result[i];
noise_humidity->result[i] += noise_humidity_blend->result[i];
}
}
+
biome_t *BiomeGenOriginal::getBiomes(s16 *heightmap, v3s16 pmin)
{
for (s16 zr = 0; zr < m_csize.Z; zr++)
- for (s16 xr = 0; xr < m_csize.X; xr++) {
- s32 i = zr * m_csize.X + xr;
- Biome *biome = calcBiomeFromNoise(noise_heat->result[i],
- noise_humidity->result[i],
- v3s16(pmin.X + xr, heightmap[i], pmin.Z + zr));
-
- biomemap[i] = biome->index;
- }
+ for (s16 xr = 0; xr < m_csize.X; xr++) {
+ s32 i = zr * m_csize.X + xr;
+ Biome *biome = calcBiomeFromNoise(
+ noise_heat->result[i],
+ noise_humidity->result[i],
+ v3s16(pmin.X + xr, heightmap[i], pmin.Z + zr));
+
+ biomemap[i] = biome->index;
+ }
return biomemap;
}
+
Biome *BiomeGenOriginal::getBiomeAtPoint(v3s16 pos) const
{
- return getBiomeAtIndex((pos.Z - m_pmin.Z) * m_csize.X + (pos.X - m_pmin.X), pos);
+ return getBiomeAtIndex(
+ (pos.Z - m_pmin.Z) * m_csize.X + (pos.X - m_pmin.X),
+ pos);
}
+
Biome *BiomeGenOriginal::getBiomeAtIndex(size_t index, v3s16 pos) const
{
return calcBiomeFromNoise(
- noise_heat->result[index], noise_humidity->result[index], pos);
+ noise_heat->result[index],
+ noise_humidity->result[index],
+ pos);
}
+
Biome *BiomeGenOriginal::calcBiomeFromNoise(float heat, float humidity, v3s16 pos) const
{
Biome *biome_closest = nullptr;
@@ -274,8 +297,8 @@ Biome *BiomeGenOriginal::calcBiomeFromNoise(float heat, float humidity, v3s16 po
for (size_t i = 1; i < m_bmgr->getNumObjects(); i++) {
Biome *b = (Biome *)m_bmgr->getRaw(i);
- if (!b || pos.Y < b->min_pos.Y ||
- pos.Y > b->max_pos.Y + b->vertical_blend ||
+ if (!b ||
+ pos.Y < b->min_pos.Y || pos.Y > b->max_pos.Y + b->vertical_blend ||
pos.X < b->min_pos.X || pos.X > b->max_pos.X ||
pos.Z < b->min_pos.Z || pos.Z > b->max_pos.Z)
continue;
@@ -303,12 +326,13 @@ Biome *BiomeGenOriginal::calcBiomeFromNoise(float heat, float humidity, v3s16 po
if (biome_closest_blend && dist_min_blend <= dist_min &&
rng.range(0, biome_closest_blend->vertical_blend) >=
- pos.Y - biome_closest_blend->max_pos.Y)
+ pos.Y - biome_closest_blend->max_pos.Y)
return biome_closest_blend;
- return (biome_closest) ? biome_closest : (Biome *)m_bmgr->getRaw(BIOME_NONE);
+ return (biome_closest) ? biome_closest : (Biome *)m_bmgr->getRaw(BIOME_NONE);
}
+
////////////////////////////////////////////////////////////////////////////////
ObjDef *Biome::clone() const
@@ -348,17 +372,16 @@ ObjDef *Biome::clone() const
void Biome::resolveNodeNames()
{
- getIdFromNrBacklog(&c_top, "mapgen_stone", CONTENT_AIR, false);
- getIdFromNrBacklog(&c_filler, "mapgen_stone", CONTENT_AIR, false);
- getIdFromNrBacklog(&c_stone, "mapgen_stone", CONTENT_AIR, false);
- getIdFromNrBacklog(&c_water_top, "mapgen_water_source", CONTENT_AIR, false);
- getIdFromNrBacklog(&c_water, "mapgen_water_source", CONTENT_AIR, false);
- getIdFromNrBacklog(
- &c_river_water, "mapgen_river_water_source", CONTENT_AIR, false);
- getIdFromNrBacklog(&c_riverbed, "mapgen_stone", CONTENT_AIR, false);
- getIdFromNrBacklog(&c_dust, "ignore", CONTENT_IGNORE, false);
+ getIdFromNrBacklog(&c_top, "mapgen_stone", CONTENT_AIR, false);
+ getIdFromNrBacklog(&c_filler, "mapgen_stone", CONTENT_AIR, false);
+ getIdFromNrBacklog(&c_stone, "mapgen_stone", CONTENT_AIR, false);
+ getIdFromNrBacklog(&c_water_top, "mapgen_water_source", CONTENT_AIR, false);
+ getIdFromNrBacklog(&c_water, "mapgen_water_source", CONTENT_AIR, false);
+ getIdFromNrBacklog(&c_river_water, "mapgen_river_water_source", CONTENT_AIR, false);
+ getIdFromNrBacklog(&c_riverbed, "mapgen_stone", CONTENT_AIR, false);
+ getIdFromNrBacklog(&c_dust, "ignore", CONTENT_IGNORE, false);
getIdsFromNrBacklog(&c_cave_liquid);
- getIdFromNrBacklog(&c_dungeon, "ignore", CONTENT_IGNORE, false);
- getIdFromNrBacklog(&c_dungeon_alt, "ignore", CONTENT_IGNORE, false);
- getIdFromNrBacklog(&c_dungeon_stair, "ignore", CONTENT_IGNORE, false);
+ getIdFromNrBacklog(&c_dungeon, "ignore", CONTENT_IGNORE, false);
+ getIdFromNrBacklog(&c_dungeon_alt, "ignore", CONTENT_IGNORE, false);
+ getIdFromNrBacklog(&c_dungeon_stair, "ignore", CONTENT_IGNORE, false);
}