mirror of
https://github.com/Cubitect/cubiomes.git
synced 2025-01-07 03:06:38 +08:00
58515533de
* 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
145 lines
4.3 KiB
C
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_ */
|
|
|