cubiomes/generator.h
Cubitect 58515533de Biome noise refactoring and fix for outposts
* moved biomenoise from layers.h into its own object
* moved biome tree data into separate header files for each version
* added global for the biome tree data to make runtime providers possible
* fixed outpost not generating in cherry_grove
2023-10-16 22:26:37 +02:00

145 lines
4.3 KiB
C

#ifndef GENERATOR_H_
#define GENERATOR_H_
#include "layers.h"
#include "biomenoise.h"
// generator flags
enum
{
LARGE_BIOMES = 0x1,
NO_BETA_OCEAN = 0x2,
FORCE_OCEAN_VARIANTS = 0x4,
};
STRUCT(Generator)
{
int mc;
int dim;
uint32_t flags;
uint64_t seed;
uint64_t sha;
union {
struct { // MC 1.0 - 1.17
LayerStack ls;
Layer xlayer[5]; // buffer for custom entry layers @{1,4,16,64,256}
Layer *entry;
};
struct { // MC 1.18
BiomeNoise bn;
};
struct { // MC A1.2 - B1.7
BiomeNoiseBeta bnb;
//SurfaceNoiseBeta snb;
};
};
NetherNoise nn; // MC 1.16
EndNoise en; // MC 1.9
};
#ifdef __cplusplus
extern "C"
{
#endif
///=============================================================================
/// Biome Generation
///=============================================================================
/**
* Sets up a biome generator for a given MC version. The 'flags' can be used to
* control LARGE_BIOMES or to FORCE_OCEAN_VARIANTS to enable ocean variants at
* scales higher than normal.
*/
void setupGenerator(Generator *g, int mc, uint32_t flags);
/**
* Initializes the generator for a given dimension and seed.
* dim=0: Overworld
* dim=-1: Nether
* dim=+1: End
*/
void applySeed(Generator *g, int dim, uint64_t seed);
/**
* Calculates the buffer size (number of ints) required to generate a cuboidal
* volume of size (sx, sy, sz). If 'sy' is zero the buffer is calculated for a
* 2D plane (which is equivalent to sy=1 here).
* The function allocCache() can be used to allocate the corresponding int
* buffer using malloc().
*/
size_t getMinCacheSize(const Generator *g, int scale, int sx, int sy, int sz);
int *allocCache(const Generator *g, Range r);
/**
* Generates the biomes for a cuboidal scaled range given by 'r'.
* (See description of Range for more detail.)
*
* The output is generated inside the cache. Upon success the biome ids can be
* accessed by indexing as:
* cache[ y*r.sx*r.sz + z*r.sx + x ]
* where (x,y,z) is an relative position inside the range cuboid.
*
* The required length of the cache can be determined with getMinCacheSize().
*
* The return value is zero upon success.
*/
int genBiomes(const Generator *g, int *cache, Range r);
/**
* Gets the biome for a specified scaled position. Note that the scale should
* be either 1 or 4, for block or biome coordinates respectively.
* Returns none (-1) upon failure.
*/
int getBiomeAt(const Generator *g, int scale, int x, int y, int z);
/**
* Returns the default layer that corresponds to the given scale.
* Supported scales are {0, 1, 4, 16, 64, 256}. A scale of zero indicates the
* custom entry layer 'g->entry'.
* (Overworld, MC <= 1.17)
*/
const Layer *getLayerForScale(const Generator *g, int scale);
///=============================================================================
/// Layered Biome Generation (old interface up to 1.17)
///=============================================================================
/* Initialize an instance of a layered generator. */
void setupLayerStack(LayerStack *g, int mc, int largeBiomes);
/* Calculates the minimum size of the buffers required to generate an area of
* dimensions 'sizeX' by 'sizeZ' at the specified layer.
*/
size_t getMinLayerCacheSize(const Layer *layer, int sizeX, int sizeZ);
/* Set up custom layers. */
Layer *setupLayer(Layer *l, mapfunc_t *map, int mc,
int8_t zoom, int8_t edge, uint64_t saltbase, Layer *p, Layer *p2);
/* Generates the specified area using the current generator settings and stores
* the biomeIDs in 'out'.
* The biomeIDs will be indexed in the form: out[x + z*areaWidth]
* It is recommended that 'out' is allocated using allocCache() for the correct
* buffer size.
*/
int genArea(const Layer *layer, int *out, int areaX, int areaZ, int areaWidth, int areaHeight);
/**
* Map an approximation of the Overworld surface height.
* The horizontal scaling is 1:4. If non-null, the ids are filled with the
* biomes of the area. The height (written to y) is in blocks.
*/
int mapApproxHeight(float *y, int *ids, const Generator *g,
const SurfaceNoise *sn, int x, int z, int w, int h);
#ifdef __cplusplus
}
#endif
#endif /* GENERATOR_H_ */