Allow more than 255 biomes, document new maximum (#9855)
authorParamat <paramat@users.noreply.github.com>
Wed, 20 May 2020 21:16:14 +0000 (22:16 +0100)
committerGitHub <noreply@github.com>
Wed, 20 May 2020 21:16:14 +0000 (22:16 +0100)
Change biomemap data type from u8 to u16.
New technical (not practical) maximum is 65535 biomes.

doc/lua_api.txt
src/mapgen/cavegen.cpp
src/mapgen/cavegen.h
src/mapgen/mapgen.h
src/mapgen/mg_biome.h
src/mapgen/mg_decoration.cpp
src/mapgen/mg_decoration.h
src/mapgen/mg_ore.cpp
src/mapgen/mg_ore.h
src/script/lua_api/l_mapgen.cpp
src/script/lua_api/l_mapgen.h

index 8b7c412ab66a49dff2d8345bd097a05bcf712c2b..0101bd4cf597b41987ee4613f99577c7fcc2c774 100644 (file)
@@ -7443,6 +7443,10 @@ Biome definition
 
 Used by `minetest.register_biome`.
 
+The maximum number of biomes that can be used is 65535. However, using an
+excessive number of biomes will slow down map generation. Depending on desired
+performance and computing power the practical limit is much lower.
+
     {
         name = "tundra",
 
index a9df4506fb0c606a434cb40a00791b29f90be362..340079821decbcbfabd9c12cc9dcacc43afcda86 100644 (file)
@@ -1,8 +1,8 @@
 /*
 Minetest
-Copyright (C) 2010-2018 celeron55, Perttu Ahola <celeron55@gmail.com>
-Copyright (C) 2010-2018 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
-Copyright (C) 2015-2018 paramat
+Copyright (C) 2010-2020 celeron55, Perttu Ahola <celeron55@gmail.com>
+Copyright (C) 2015-2020 paramat
+Copyright (C) 2010-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU Lesser General Public License as published by
@@ -69,7 +69,7 @@ CavesNoiseIntersection::~CavesNoiseIntersection()
 
 
 void CavesNoiseIntersection::generateCaves(MMVManip *vm,
-       v3s16 nmin, v3s16 nmax, u8 *biomemap)
+       v3s16 nmin, v3s16 nmax, biome_t *biomemap)
 {
        assert(vm);
        assert(biomemap);
index ff09f942341c34e26d438e58089870dfb33ac62d..d678d365bcda686d7baf8abab0ef3c89a74595ee 100644 (file)
@@ -1,7 +1,7 @@
 /*
 Minetest
-Copyright (C) 2010-2018 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
-Copyright (C) 2015-2018 paramat
+Copyright (C) 2015-2020 paramat
+Copyright (C) 2010-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU Lesser General Public License as published by
@@ -22,6 +22,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #define VMANIP_FLAG_CAVE VOXELFLAG_CHECKED1
 
+typedef u16 biome_t;  // copy from mg_biome.h to avoid an unnecessary include
+
 class GenerateNotifier;
 
 /*
@@ -44,7 +46,7 @@ public:
                NoiseParams *np_cave2, s32 seed, float cave_width);
        ~CavesNoiseIntersection();
 
-       void generateCaves(MMVManip *vm, v3s16 nmin, v3s16 nmax, u8 *biomemap);
+       void generateCaves(MMVManip *vm, v3s16 nmin, v3s16 nmax, biome_t *biomemap);
 
 private:
        const NodeDefManager *m_ndef;
index 7845c5349fd533aef45a5f83bfe36485f584b1a5..a92b3b0d0203caf32eb2b526b25e0a5462267d4c 100644 (file)
@@ -1,8 +1,8 @@
 /*
 Minetest
-Copyright (C) 2010-2018 celeron55, Perttu Ahola <celeron55@gmail.com>
-Copyright (C) 2013-2018 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
-Copyright (C) 2015-2018 paramat
+Copyright (C) 2010-2020 celeron55, Perttu Ahola <celeron55@gmail.com>
+Copyright (C) 2015-2020 paramat
+Copyright (C) 2013-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU Lesser General Public License as published by
@@ -38,7 +38,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #define MG_DECORATIONS 0x20
 #define MG_BIOMES      0x40
 
-typedef u8 biome_t;  // copy from mg_biome.h to avoid an unnecessary include
+typedef u16 biome_t;  // copy from mg_biome.h to avoid an unnecessary include
 
 class Settings;
 class MMVManip;
index 57f4aa20dd99b181f4cf8aa916abd7acf5f5772d..be4cfea4d9e8ab241d1fcced587f38d9062c27ab 100644 (file)
@@ -1,7 +1,7 @@
 /*
 Minetest
-Copyright (C) 2014-2018 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
-Copyright (C) 2014-2018 paramat
+Copyright (C) 2014-2020 paramat
+Copyright (C) 2014-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU Lesser General Public License as published by
@@ -32,7 +32,7 @@ class BiomeManager;
 //// Biome
 ////
 
-typedef u8 biome_t;
+typedef u16 biome_t;
 
 #define BIOME_NONE ((biome_t)0)
 
index a9b67d239beeca7cb36e601ffc87355921ad0118..a4cada396d078ac6d7725401329dee80a2451196 100644 (file)
@@ -206,8 +206,7 @@ size_t Decoration::placeDeco(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax)
                                // All-surfaces decorations
                                // Check biome of column
                                if (mg->biomemap && !biomes.empty()) {
-                                       std::unordered_set<u8>::const_iterator iter =
-                                               biomes.find(mg->biomemap[mapindex]);
+                                       auto iter = biomes.find(mg->biomemap[mapindex]);
                                        if (iter == biomes.end())
                                                continue;
                                }
@@ -259,8 +258,7 @@ size_t Decoration::placeDeco(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax)
                                        continue;
 
                                if (mg->biomemap && !biomes.empty()) {
-                                       std::unordered_set<u8>::const_iterator iter =
-                                               biomes.find(mg->biomemap[mapindex]);
+                                       auto iter = biomes.find(mg->biomemap[mapindex]);
                                        if (iter == biomes.end())
                                                continue;
                                }
index 1f9eb451091ffdbbc4198078260e7f5fcd1b6e15..1ea02a527d0fe701c48c451abcb3690e1728bfaa 100644 (file)
@@ -25,6 +25,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "noise.h"
 #include "nodedef.h"
 
+typedef u16 biome_t;  // copy from mg_biome.h to avoid an unnecessary include
+
 class Mapgen;
 class MMVManip;
 class PcgRandom;
@@ -72,7 +74,7 @@ public:
        s16 nspawnby;
        s16 place_offset_y = 0;
 
-       std::unordered_set<u8> biomes;
+       std::unordered_set<biome_t> biomes;
 
 protected:
        void cloneTo(Decoration *def) const;
index db647f82be0199e16785c7819a263d24e2b5e3f2..b50ed6a32f2a46713ce40c7c03176dcc3dbbecb4 100644 (file)
@@ -1,7 +1,7 @@
 /*
 Minetest
-Copyright (C) 2014-2018 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
-Copyright (C) 2015-2018 paramat
+Copyright (C) 2015-2020 paramat
+Copyright (C) 2014-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU Lesser General Public License as published by
@@ -146,7 +146,7 @@ ObjDef *OreScatter::clone() const
 
 
 void OreScatter::generate(MMVManip *vm, int mapseed, u32 blockseed,
-       v3s16 nmin, v3s16 nmax, u8 *biomemap)
+       v3s16 nmin, v3s16 nmax, biome_t *biomemap)
 {
        PcgRandom pr(blockseed);
        MapNode n_ore(c_ore, 0, ore_param2);
@@ -170,7 +170,7 @@ void OreScatter::generate(MMVManip *vm, int mapseed, u32 blockseed,
 
                if (biomemap && !biomes.empty()) {
                        u32 index = sizex * (z0 - nmin.Z) + (x0 - nmin.X);
-                       std::unordered_set<u8>::const_iterator it = biomes.find(biomemap[index]);
+                       auto it = biomes.find(biomemap[index]);
                        if (it == biomes.end())
                                continue;
                }
@@ -208,7 +208,7 @@ ObjDef *OreSheet::clone() const
 
 
 void OreSheet::generate(MMVManip *vm, int mapseed, u32 blockseed,
-       v3s16 nmin, v3s16 nmax, u8 *biomemap)
+       v3s16 nmin, v3s16 nmax, biome_t *biomemap)
 {
        PcgRandom pr(blockseed + 4234);
        MapNode n_ore(c_ore, 0, ore_param2);
@@ -237,7 +237,7 @@ void OreSheet::generate(MMVManip *vm, int mapseed, u32 blockseed,
                        continue;
 
                if (biomemap && !biomes.empty()) {
-                       std::unordered_set<u8>::const_iterator it = biomes.find(biomemap[index]);
+                       auto it = biomes.find(biomemap[index]);
                        if (it == biomes.end())
                                continue;
                }
@@ -285,7 +285,7 @@ ObjDef *OrePuff::clone() const
 
 
 void OrePuff::generate(MMVManip *vm, int mapseed, u32 blockseed,
-       v3s16 nmin, v3s16 nmax, u8 *biomemap)
+       v3s16 nmin, v3s16 nmax, biome_t *biomemap)
 {
        PcgRandom pr(blockseed + 4234);
        MapNode n_ore(c_ore, 0, ore_param2);
@@ -312,7 +312,7 @@ void OrePuff::generate(MMVManip *vm, int mapseed, u32 blockseed,
                        continue;
 
                if (biomemap && !biomes.empty()) {
-                       std::unordered_set<u8>::const_iterator it = biomes.find(biomemap[index]);
+                       auto it = biomes.find(biomemap[index]);
                        if (it == biomes.end())
                                continue;
                }
@@ -366,7 +366,7 @@ ObjDef *OreBlob::clone() const
 
 
 void OreBlob::generate(MMVManip *vm, int mapseed, u32 blockseed,
-       v3s16 nmin, v3s16 nmax, u8 *biomemap)
+       v3s16 nmin, v3s16 nmax, biome_t *biomemap)
 {
        PcgRandom pr(blockseed + 2404);
        MapNode n_ore(c_ore, 0, ore_param2);
@@ -388,7 +388,7 @@ void OreBlob::generate(MMVManip *vm, int mapseed, u32 blockseed,
 
                if (biomemap && !biomes.empty()) {
                        u32 bmapidx = sizex * (z0 - nmin.Z) + (x0 - nmin.X);
-                       std::unordered_set<u8>::const_iterator it = biomes.find(biomemap[bmapidx]);
+                       auto it = biomes.find(biomemap[bmapidx]);
                        if (it == biomes.end())
                                continue;
                }
@@ -451,7 +451,7 @@ ObjDef *OreVein::clone() const
 
 
 void OreVein::generate(MMVManip *vm, int mapseed, u32 blockseed,
-       v3s16 nmin, v3s16 nmax, u8 *biomemap)
+       v3s16 nmin, v3s16 nmax, biome_t *biomemap)
 {
        PcgRandom pr(blockseed + 520);
        MapNode n_ore(c_ore, 0, ore_param2);
@@ -485,7 +485,7 @@ void OreVein::generate(MMVManip *vm, int mapseed, u32 blockseed,
 
                if (biomemap && !biomes.empty()) {
                        u32 bmapidx = sizex * (z - nmin.Z) + (x - nmin.X);
-                       std::unordered_set<u8>::const_iterator it = biomes.find(biomemap[bmapidx]);
+                       auto it = biomes.find(biomemap[bmapidx]);
                        if (it == biomes.end())
                                continue;
                }
@@ -532,7 +532,7 @@ ObjDef *OreStratum::clone() const
 
 
 void OreStratum::generate(MMVManip *vm, int mapseed, u32 blockseed,
-       v3s16 nmin, v3s16 nmax, u8 *biomemap)
+       v3s16 nmin, v3s16 nmax, biome_t *biomemap)
 {
        PcgRandom pr(blockseed + 4234);
        MapNode n_ore(c_ore, 0, ore_param2);
@@ -560,7 +560,7 @@ void OreStratum::generate(MMVManip *vm, int mapseed, u32 blockseed,
        for (int z = nmin.Z; z <= nmax.Z; z++)
        for (int x = nmin.X; x <= nmax.X; x++, index++) {
                if (biomemap && !biomes.empty()) {
-                       std::unordered_set<u8>::const_iterator it = biomes.find(biomemap[index]);
+                       auto it = biomes.find(biomemap[index]);
                        if (it == biomes.end())
                                continue;
                }
index 213bdc964e29857ee8d0a78afe87c350f518b3d8..76420fab4732807c96896744d389ffefa8aae5f5 100644 (file)
@@ -1,7 +1,7 @@
 /*
 Minetest
-Copyright (C) 2014-2018 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
-Copyright (C) 2015-2018 paramat
+Copyright (C) 2015-2020 paramat
+Copyright (C) 2014-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU Lesser General Public License as published by
@@ -25,6 +25,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "noise.h"
 #include "nodedef.h"
 
+typedef u16 biome_t;  // copy from mg_biome.h to avoid an unnecessary include
+
 class Noise;
 class Mapgen;
 class MMVManip;
@@ -64,7 +66,7 @@ public:
        float nthresh;      // threshold for noise at which an ore is placed
        NoiseParams np;     // noise for distribution of clusters (NULL for uniform scattering)
        Noise *noise = nullptr;
-       std::unordered_set<u8> biomes;
+       std::unordered_set<biome_t> biomes;
 
        Ore() = default;;
        virtual ~Ore();
@@ -73,7 +75,7 @@ public:
 
        size_t placeOre(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax);
        virtual void generate(MMVManip *vm, int mapseed, u32 blockseed,
-               v3s16 nmin, v3s16 nmax, u8 *biomemap) = 0;
+               v3s16 nmin, v3s16 nmax, biome_t *biomemap) = 0;
 
 protected:
        void cloneTo(Ore *def) const;
@@ -86,7 +88,7 @@ public:
        ObjDef *clone() const;
 
        virtual void generate(MMVManip *vm, int mapseed, u32 blockseed,
-               v3s16 nmin, v3s16 nmax, u8 *biomemap);
+               v3s16 nmin, v3s16 nmax, biome_t *biomemap);
 };
 
 class OreSheet : public Ore {
@@ -100,7 +102,7 @@ public:
        float column_midpoint_factor;
 
        virtual void generate(MMVManip *vm, int mapseed, u32 blockseed,
-               v3s16 nmin, v3s16 nmax, u8 *biomemap);
+               v3s16 nmin, v3s16 nmax, biome_t *biomemap);
 };
 
 class OrePuff : public Ore {
@@ -118,7 +120,7 @@ public:
        virtual ~OrePuff();
 
        virtual void generate(MMVManip *vm, int mapseed, u32 blockseed,
-               v3s16 nmin, v3s16 nmax, u8 *biomemap);
+               v3s16 nmin, v3s16 nmax, biome_t *biomemap);
 };
 
 class OreBlob : public Ore {
@@ -128,7 +130,7 @@ public:
        ObjDef *clone() const;
 
        virtual void generate(MMVManip *vm, int mapseed, u32 blockseed,
-               v3s16 nmin, v3s16 nmax, u8 *biomemap);
+               v3s16 nmin, v3s16 nmax, biome_t *biomemap);
 };
 
 class OreVein : public Ore {
@@ -145,7 +147,7 @@ public:
        virtual ~OreVein();
 
        virtual void generate(MMVManip *vm, int mapseed, u32 blockseed,
-               v3s16 nmin, v3s16 nmax, u8 *biomemap);
+               v3s16 nmin, v3s16 nmax, biome_t *biomemap);
 };
 
 class OreStratum : public Ore {
@@ -162,7 +164,7 @@ public:
        virtual ~OreStratum();
 
        virtual void generate(MMVManip *vm, int mapseed, u32 blockseed,
-               v3s16 nmin, v3s16 nmax, u8 *biomemap);
+               v3s16 nmin, v3s16 nmax, biome_t *biomemap);
 };
 
 class OreManager : public ObjDefManager {
index 5840854283b3c6cfb1f8d8380746b72457680237..834938e5651286d68415b0c1e49be71c48d1cb98 100644 (file)
@@ -97,7 +97,7 @@ Biome *get_or_load_biome(lua_State *L, int index,
        BiomeManager *biomemgr);
 Biome *read_biome_def(lua_State *L, int index, const NodeDefManager *ndef);
 size_t get_biome_list(lua_State *L, int index,
-       BiomeManager *biomemgr, std::unordered_set<u8> *biome_id_list);
+       BiomeManager *biomemgr, std::unordered_set<biome_t> *biome_id_list);
 
 Schematic *get_or_load_schematic(lua_State *L, int index,
        SchematicManager *schemmgr, StringMap *replace_names);
@@ -425,7 +425,7 @@ Biome *read_biome_def(lua_State *L, int index, const NodeDefManager *ndef)
 
 
 size_t get_biome_list(lua_State *L, int index,
-       BiomeManager *biomemgr, std::unordered_set<u8> *biome_id_list)
+       BiomeManager *biomemgr, std::unordered_set<biome_t> *biome_id_list)
 {
        if (index < 0)
                index = lua_gettop(L) + 1 + index;
index 4a6a9ccf45fc9f4e71ee5f1d6404b4cf75b30867..0bdc56fc54e6ac9359a37279f2a50b3bceebf4c3 100644 (file)
@@ -21,6 +21,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #include "lua_api/l_base.h"
 
+typedef u16 biome_t;  // copy from mg_biome.h to avoid an unnecessary include
+
 class ModApiMapgen : public ModApiBase
 {
 private: