Mapgen: Optimize biomemap creation by combining with generateBiomes
authorkwolekr <kwolekr@minetest.net>
Sun, 5 Jun 2016 00:24:07 +0000 (20:24 -0400)
committerkwolekr <kwolekr@minetest.net>
Sun, 5 Jun 2016 17:30:02 +0000 (13:30 -0400)
src/mapgen.cpp
src/mapgen_flat.cpp
src/mapgen_fractal.cpp
src/mapgen_v5.cpp
src/mapgen_v7.cpp
src/mapgen_valleys.cpp

index 66892a5742e6f5e329cb6a4bc2c9c36db9fc17ad..576fb219af5328c340cd9d18ef229b52e54e3cc8 100644 (file)
@@ -524,6 +524,10 @@ MapgenBasic::~MapgenBasic()
 
 MgStoneType MapgenBasic::generateBiomes()
 {
+       // can't generate biomes without a biome generator!
+       assert(biomegen);
+       assert(biomemap);
+
        v3s16 em = vm->m_area.getExtent();
        u32 index = 0;
        MgStoneType stone_type = MGSTONE_STONE;
@@ -546,6 +550,8 @@ MgStoneType MapgenBasic::generateBiomes()
                bool river_water_above = c_above == c_river_water_source;
                bool water_above = c_above == c_water_source || river_water_above;
 
+               biomemap[index] = BIOME_NONE;
+
                // If there is air or water above enable top/filler placement, otherwise force
                // nplaced to stone level by setting a number exceeding any possible filler depth.
                u16 nplaced = (air_above || water_above) ? 0 : U16_MAX;
@@ -560,11 +566,19 @@ MgStoneType MapgenBasic::generateBiomes()
                        // 1. At the surface of stone below air or water.
                        // 2. At the surface of water below air.
                        // 3. When stone or water is detected but biome has not yet been calculated.
-                       if ((c == c_stone && (air_above || water_above || !biome))
-                                       || ((c == c_water_source || c == c_river_water_source)
-                                               && (air_above || !biome))) {
+                       bool is_stone_surface = (c == c_stone) &&
+                               (air_above || water_above || !biome);
+
+                       bool is_water_surface =
+                               (c == c_water_source || c == c_river_water_source) &&
+                               (air_above || !biome);
+
+                       if (is_stone_surface || is_water_surface) {
                                biome = biomegen->getBiomeAtIndex(index, y);
 
+                               if (biomemap[index] == BIOME_NONE && is_stone_surface)
+                                       biomemap[index] = biome->index;
+
                                depth_top = biome->depth_top;
                                base_filler = MYMAX(depth_top +
                                        biome->depth_filler +
index 724f0682507fcf1abb635a095babfae3ed48785c..7cc6aad5c2cacd18f1990a1ba1a0896bd78c53aa 100644 (file)
@@ -192,7 +192,6 @@ void MapgenFlat::makeChunk(BlockMakeData *data)
 
        // Init biome generator, place biome-specific nodes, and build biomemap
        biomegen->calcBiomeNoise(node_min);
-       biomegen->getBiomes(heightmap);
        MgStoneType stone_type = generateBiomes();
 
        if (flags & MG_CAVES)
index b613bf358ebdf963ce4a656359872c97294e59ce..c47a7bfdc1d330a7e1dd5c0d5fd214de9f00e867 100644 (file)
@@ -208,7 +208,6 @@ void MapgenFractal::makeChunk(BlockMakeData *data)
 
        // Init biome generator, place biome-specific nodes, and build biomemap
        biomegen->calcBiomeNoise(node_min);
-       biomegen->getBiomes(heightmap);
        MgStoneType stone_type = generateBiomes();
 
        if (flags & MG_CAVES)
index 3e10ec2a5c0b6c3db8c7047ca6816323b84c5485..74d5e1ee3297045821f89e04a5632b11463cbb59 100644 (file)
@@ -190,7 +190,6 @@ void MapgenV5::makeChunk(BlockMakeData *data)
 
        // Init biome generator, place biome-specific nodes, and build biomemap
        biomegen->calcBiomeNoise(node_min);
-       biomegen->getBiomes(heightmap);
        MgStoneType stone_type = generateBiomes();
 
        // Generate caves
index 7327facaef1c82b5a6ce048d3185ea2b64f8e1ae..35dcdcd9418b391f8b6f5f55d2c3b7f6b943c703 100644 (file)
@@ -219,7 +219,6 @@ void MapgenV7::makeChunk(BlockMakeData *data)
 
        // Init biome generator, place biome-specific nodes, and build biomemap
        biomegen->calcBiomeNoise(node_min);
-       biomegen->getBiomes(heightmap);
        MgStoneType stone_type = generateBiomes();
 
        if (flags & MG_CAVES)
index 6581b792ff0d4762cb2ecc7bb4ef89d7eb421b3a..bbf20719ddc3e6b60e02824b146c2a61bc1999d1 100644 (file)
@@ -250,10 +250,7 @@ void MapgenValleys::makeChunk(BlockMakeData *data)
        // Generate base terrain with initial heightmaps
        s16 stone_surface_max_y = generateTerrain();
 
-       // Build biomemap
-       m_bgen->getBiomes(heightmap);
-
-       // Place biome-specific nodes
+       // Place biome-specific nodes and build biomemap
        MgStoneType stone_type = generateBiomes();
 
        // Cave creation.