summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorParamat <paramat@users.noreply.github.com>2018-06-21 19:28:54 +0100
committerGitHub <noreply@github.com>2018-06-21 19:28:54 +0100
commit8d3190e77a9d13bf0bca3ecdf40a788ce1d39d58 (patch)
treef6ed139f4fcb18c736f4c8baee84747599848996
parent525fa9145e0183c01ae05aeace967fbfe78f65a5 (diff)
downloadminetest-8d3190e77a9d13bf0bca3ecdf40a788ce1d39d58.tar.gz
minetest-8d3190e77a9d13bf0bca3ecdf40a788ce1d39d58.tar.bz2
minetest-8d3190e77a9d13bf0bca3ecdf40a788ce1d39d58.zip
Biome API: Fix absent water decorations and dust, in deep water (#7470)
Previously, the biomemap was 'BIOME_NONE' for a mapchunk column if a stone surface was not found in it, causing water surface decorations and water surface dust to fail. Store the biome ID of the biome calculated at a water surface and add it to the biomemap if the biomemap is 'BIOME_NONE' for the mapchunk column. The biome calculated at a stone surface still has priority for the biomemap entry, as it should. Edit an incorrect comment.
-rw-r--r--src/mapgen/mapgen.cpp11
-rw-r--r--src/mapgen/mg_biome.cpp6
2 files changed, 14 insertions, 3 deletions
diff --git a/src/mapgen/mapgen.cpp b/src/mapgen/mapgen.cpp
index 85aab363b..7de367a27 100644
--- a/src/mapgen/mapgen.cpp
+++ b/src/mapgen/mapgen.cpp
@@ -655,6 +655,7 @@ void MapgenBasic::generateBiomes()
for (s16 z = node_min.Z; z <= node_max.Z; z++)
for (s16 x = node_min.X; x <= node_max.X; x++, index++) {
Biome *biome = NULL;
+ biome_t water_biome_index = 0;
u16 depth_top = 0;
u16 base_filler = 0;
u16 depth_water_top = 0;
@@ -697,6 +698,11 @@ void MapgenBasic::generateBiomes()
if (biomemap[index] == BIOME_NONE && is_stone_surface)
biomemap[index] = biome->index;
+ // Store biome of first water surface detected, as a fallback
+ // entry for the biomemap.
+ if (water_biome_index == 0 && is_water_surface)
+ water_biome_index = biome->index;
+
depth_top = biome->depth_top;
base_filler = MYMAX(depth_top +
biome->depth_filler +
@@ -763,6 +769,11 @@ void MapgenBasic::generateBiomes()
VoxelArea::add_y(em, vi, -1);
}
+ // If no stone surface detected in mapchunk column and a water surface
+ // biome fallback exists, add it to the biomemap. This avoids water
+ // surface decorations failing in deep water.
+ if (biomemap[index] == BIOME_NONE && water_biome_index != 0)
+ biomemap[index] = water_biome_index;
}
}
diff --git a/src/mapgen/mg_biome.cpp b/src/mapgen/mg_biome.cpp
index e02eee703..7f717011c 100644
--- a/src/mapgen/mg_biome.cpp
+++ b/src/mapgen/mg_biome.cpp
@@ -194,9 +194,9 @@ BiomeGenOriginal::BiomeGenOriginal(BiomeManager *biomemgr,
humidmap = noise_humidity->result;
biomemap = new biome_t[m_csize.X * m_csize.Z];
- // Initialise with the ID of the default biome so that cavegen can get
- // biomes when biome generation (which calculates the biomemap IDs) is
- // disabled.
+ // Initialise with the ID of 'BIOME_NONE' so that cavegen can get the
+ // fallback biome when biome generation (which calculates the biomemap IDs)
+ // is disabled.
memset(biomemap, 0, sizeof(biome_t) * m_csize.X * m_csize.Z);
}