Allow more than 255 biomes, document new maximum (#9855)

Change biomemap data type from u8 to u16.
New technical (not practical) maximum is 65535 biomes.
master
Paramat 2020-05-20 22:16:14 +01:00 committed by GitHub
parent c47a680db7
commit 42fcfb75e8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 55 additions and 45 deletions

View 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",

View 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);

View 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;

View 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;

View 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)

View 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;
}

View 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;

View 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;
}

View 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 {

View 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;

View 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: