cubiomes/layers.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

210 lines
7.1 KiB
C

#ifndef LAYER_H_
#define LAYER_H_
#include "noise.h"
#include "biomes.h"
#define LAYER_INIT_SHA (~0ULL)
enum BiomeTempCategory
{
Oceanic, Warm, Lush, Cold, Freezing, Special
};
/* Enumeration of the layer indices in the layer stack. */
enum LayerId
{
// new [[deprecated]]
L_CONTINENT_4096 = 0, L_ISLAND_4096 = L_CONTINENT_4096,
L_ZOOM_4096, // b1.8
L_LAND_4096, // b1.8
L_ZOOM_2048,
L_LAND_2048, L_ADD_ISLAND_2048 = L_LAND_2048,
L_ZOOM_1024,
L_LAND_1024_A, L_ADD_ISLAND_1024A = L_LAND_1024_A,
L_LAND_1024_B, L_ADD_ISLAND_1024B = L_LAND_1024_B, // 1.7+
L_LAND_1024_C, L_ADD_ISLAND_1024C = L_LAND_1024_C, // 1.7+
L_ISLAND_1024, L_REMOVE_OCEAN_1024 = L_ISLAND_1024, // 1.7+
L_SNOW_1024, L_ADD_SNOW_1024 = L_SNOW_1024,
L_LAND_1024_D, L_ADD_ISLAND_1024D = L_LAND_1024_D, // 1.7+
L_COOL_1024, L_COOL_WARM_1024 = L_COOL_1024, // 1.7+
L_HEAT_1024, L_HEAT_ICE_1024 = L_HEAT_1024, // 1.7+
L_SPECIAL_1024, // 1.7+
L_ZOOM_512,
L_LAND_512, // 1.6-
L_ZOOM_256,
L_LAND_256, L_ADD_ISLAND_256 = L_LAND_256,
L_MUSHROOM_256, L_ADD_MUSHROOM_256 = L_MUSHROOM_256,
L_DEEP_OCEAN_256, // 1.7+
L_BIOME_256,
L_BAMBOO_256, L14_BAMBOO_256 = L_BAMBOO_256, // 1.14+
L_ZOOM_128,
L_ZOOM_64,
L_BIOME_EDGE_64,
L_NOISE_256, L_RIVER_INIT_256 = L_NOISE_256,
L_ZOOM_128_HILLS,
L_ZOOM_64_HILLS,
L_HILLS_64,
L_SUNFLOWER_64, L_RARE_BIOME_64 = L_SUNFLOWER_64, // 1.7+
L_ZOOM_32,
L_LAND_32, L_ADD_ISLAND_32 = L_LAND_32,
L_ZOOM_16,
L_SHORE_16, // NOTE: in 1.0 this slot is scale 1:32
L_SWAMP_RIVER_16, // 1.6-
L_ZOOM_8,
L_ZOOM_4,
L_SMOOTH_4,
L_ZOOM_128_RIVER,
L_ZOOM_64_RIVER,
L_ZOOM_32_RIVER,
L_ZOOM_16_RIVER,
L_ZOOM_8_RIVER,
L_ZOOM_4_RIVER,
L_RIVER_4,
L_SMOOTH_4_RIVER,
L_RIVER_MIX_4,
L_OCEAN_TEMP_256, L13_OCEAN_TEMP_256 = L_OCEAN_TEMP_256, // 1.13+
L_ZOOM_128_OCEAN, L13_ZOOM_128 = L_ZOOM_128_OCEAN, // 1.13+
L_ZOOM_64_OCEAN, L13_ZOOM_64 = L_ZOOM_64_OCEAN, // 1.13+
L_ZOOM_32_OCEAN, L13_ZOOM_32 = L_ZOOM_32_OCEAN, // 1.13+
L_ZOOM_16_OCEAN, L13_ZOOM_16 = L_ZOOM_16_OCEAN, // 1.13+
L_ZOOM_8_OCEAN, L13_ZOOM_8 = L_ZOOM_8_OCEAN, // 1.13+
L_ZOOM_4_OCEAN, L13_ZOOM_4 = L_ZOOM_4_OCEAN, // 1.13+
L_OCEAN_MIX_4, L13_OCEAN_MIX_4 = L_OCEAN_MIX_4, // 1.13+
L_VORONOI_1, L_VORONOI_ZOOM_1 = L_VORONOI_1,
// largeBiomes layers
L_ZOOM_LARGE_A,
L_ZOOM_LARGE_B,
L_ZOOM_L_RIVER_A,
L_ZOOM_L_RIVER_B,
L_NUM
};
struct Layer;
typedef int (mapfunc_t)(const struct Layer *, int *, int, int, int, int);
STRUCT(Layer)
{
mapfunc_t *getMap;
int8_t mc; // minecraft version
int8_t zoom; // zoom factor of layer
int8_t edge; // maximum border required from parent layer
int scale; // scale of this layer (cell = scale x scale blocks)
uint64_t layerSalt; // processed salt or initialization mode
uint64_t startSalt; // (depends on world seed) used to step PRNG forward
uint64_t startSeed; // (depends on world seed) start for chunk seeds
void *noise; // (depends on world seed) noise map data
void *data; // generic data for custom layers
Layer *p, *p2; // parent layers
};
// Overworld biome generator up to 1.17
STRUCT(LayerStack)
{
Layer layers[L_NUM];
Layer *entry_1; // entry scale (1:1) [L_VORONOI_1]
Layer *entry_4; // entry scale (1:4) [L_RIVER_MIX_4|L_OCEAN_MIX_4]
// unofficial entries for other scales (latest sensible layers):
Layer *entry_16; // [L_SWAMP_RIVER_16|L_SHORE_16]
Layer *entry_64; // [L_HILLS_64|L_SUNFLOWER_64]
Layer *entry_256; // [L_BIOME_256|L_BAMBOO_256]
PerlinNoise oceanRnd;
};
#ifdef __cplusplus
extern "C"
{
#endif
//==============================================================================
// BiomeID Helpers
//==============================================================================
int biomeExists(int mc, int id);
int isOverworld(int mc, int id);
int getDimension(int id);
int getMutated(int mc, int id);
int getCategory(int mc, int id);
int areSimilar(int mc, int id1, int id2);
int isMesa(int id);
int isShallowOcean(int id);
int isDeepOcean(int id);
int isOceanic(int id);
int isSnowy(int id);
int getBiomeDepthAndScale(int id, double *depth, double *scale, int *grass);
//==============================================================================
// Essentials
//==============================================================================
/* Applies the given world seed to the layer and all dependent layers. */
void setLayerSeed(Layer *layer, uint64_t worldSeed);
//==============================================================================
// Layers
//==============================================================================
// old names
mapfunc_t mapContinent; // mapIsland
mapfunc_t mapZoomFuzzy;
mapfunc_t mapZoom;
mapfunc_t mapLand; // mapAddIsland
mapfunc_t mapLand16;
mapfunc_t mapLandB18;
mapfunc_t mapIsland; // mapRemoveTooMuchOcean
mapfunc_t mapSnow; // mapAddSnow
mapfunc_t mapSnow16;
mapfunc_t mapCool; // mapCoolWarm
mapfunc_t mapHeat; // mapHeatIce
mapfunc_t mapSpecial;
mapfunc_t mapMushroom; // mapAddMushroomIsland
mapfunc_t mapDeepOcean;
mapfunc_t mapBiome;
mapfunc_t mapBamboo; // mapAddBamboo
mapfunc_t mapNoise; // mapRiverInit
mapfunc_t mapBiomeEdge;
mapfunc_t mapHills;
mapfunc_t mapRiver;
mapfunc_t mapSmooth;
mapfunc_t mapSunflower; // mapRareBiome
mapfunc_t mapShore;
mapfunc_t mapSwampRiver;
mapfunc_t mapRiverMix;
mapfunc_t mapOceanTemp;
mapfunc_t mapOceanMix;
// final layer 1:1
mapfunc_t mapVoronoi; // mapVoronoiZoom
mapfunc_t mapVoronoi114;
// With 1.15 voronoi changed in preparation for 3D biome generation.
// Biome generation now stops at scale 1:4 OceanMix and voronoi is just an
// access algorithm, mapping the 1:1 scale onto its 1:4 correspondent.
// It is seeded by the first 8-bytes of the SHA-256 hash of the world seed.
ATTR(const)
uint64_t getVoronoiSHA(uint64_t worldSeed);
void voronoiAccess3D(uint64_t sha, int x, int y, int z, int *x4, int *y4, int *z4);
// Applies a 2D voronoi mapping at height 'y' to a 'src' plane, where
// src_range [px,pz,pw,ph] -> out_range [x,z,w,h] have to match the scaling.
void mapVoronoiPlane(uint64_t sha, int *out, int *src,
int x, int z, int w, int h, int y, int px, int pz, int pw, int ph);
#ifdef __cplusplus
}
#endif
#endif /* LAYER_H_ */