Skip to content

Commit

Permalink
Allow more than 255 biomes, document new maximum (#9855)
Browse files Browse the repository at this point in the history
Change biomemap data type from u8 to u16.
New technical (not practical) maximum is 65535 biomes.
  • Loading branch information
paramat committed May 20, 2020
1 parent c47a680 commit 42fcfb7
Show file tree
Hide file tree
Showing 11 changed files with 55 additions and 45 deletions.
4 changes: 4 additions & 0 deletions doc/lua_api.txt
Expand Up @@ -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",

Expand Down
8 changes: 4 additions & 4 deletions src/mapgen/cavegen.cpp
@@ -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
Expand Down Expand Up @@ -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);
Expand Down
8 changes: 5 additions & 3 deletions src/mapgen/cavegen.h
@@ -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
Expand All @@ -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;

/*
Expand All @@ -44,7 +46,7 @@ class CavesNoiseIntersection
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;
Expand Down
8 changes: 4 additions & 4 deletions src/mapgen/mapgen.h
@@ -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
Expand Down Expand Up @@ -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;
Expand Down
6 changes: 3 additions & 3 deletions src/mapgen/mg_biome.h
@@ -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
Expand Down Expand Up @@ -32,7 +32,7 @@ class BiomeManager;
//// Biome
////

typedef u8 biome_t;
typedef u16 biome_t;

#define BIOME_NONE ((biome_t)0)

Expand Down
6 changes: 2 additions & 4 deletions src/mapgen/mg_decoration.cpp
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
}
Expand Down
4 changes: 3 additions & 1 deletion src/mapgen/mg_decoration.h
Expand Up @@ -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;
Expand Down Expand Up @@ -72,7 +74,7 @@ class Decoration : public ObjDef, public NodeResolver {
s16 nspawnby;
s16 place_offset_y = 0;

std::unordered_set<u8> biomes;
std::unordered_set<biome_t> biomes;

protected:
void cloneTo(Decoration *def) const;
Expand Down
28 changes: 14 additions & 14 deletions src/mapgen/mg_ore.cpp
@@ -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
Expand Down Expand Up @@ -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);
Expand All @@ -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;
}
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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);
Expand All @@ -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;
}
Expand Down Expand Up @@ -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);
Expand All @@ -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;
}
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
}
Expand Down
22 changes: 12 additions & 10 deletions src/mapgen/mg_ore.h
@@ -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
Expand All @@ -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;
Expand Down Expand Up @@ -64,7 +66,7 @@ class Ore : public ObjDef, public NodeResolver {
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();
Expand All @@ -73,7 +75,7 @@ class Ore : public ObjDef, public NodeResolver {

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;
Expand All @@ -86,7 +88,7 @@ class OreScatter : public Ore {
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 {
Expand All @@ -100,7 +102,7 @@ class OreSheet : public Ore {
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 {
Expand All @@ -118,7 +120,7 @@ class OrePuff : public Ore {
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 {
Expand All @@ -128,7 +130,7 @@ class OreBlob : public Ore {
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 {
Expand All @@ -145,7 +147,7 @@ class OreVein : public Ore {
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 {
Expand All @@ -162,7 +164,7 @@ class OreStratum : public Ore {
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 {
Expand Down
4 changes: 2 additions & 2 deletions src/script/lua_api/l_mapgen.cpp
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down
2 changes: 2 additions & 0 deletions src/script/lua_api/l_mapgen.h
Expand Up @@ -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:
Expand Down

0 comments on commit 42fcfb7

Please sign in to comment.