Files

96 lines
3.1 KiB
C++

#pragma once
#include <cstdint>
#include "Noise.h"
#include "NoiseAdv.h"
#include "World.h"
namespace vf {
enum class NetherBiome : uint8_t {
NetherWastes = 0,
SoulSandValley = 1,
BasaltDeltas = 2,
CrimsonForest = 3,
Count,
};
// Vertical profile of a single Nether column. The cavern is the gap between
// the top of the lower mass (floorHeight) and the underside of the roof mass
// (ceilingHeight); everything at or below lavaLevel inside that gap is lava.
struct NetherColumn {
NetherBiome biome = NetherBiome::NetherWastes;
int floorHeight = 0;
int ceilingHeight = 0;
int lavaLevel = 0;
bool drowned = false;
int cavernHeight() const { return ceilingHeight - floorHeight - 1; }
};
// Deterministic Nether generator: a solid rock volume between a bedrock floor
// and a bedrock roof, hollowed out by a cavern profile plus 3D carving noise,
// flooded with a lava sea at a fixed level, and surfaced per Nether biome.
// The same seed and column always yield the same blocks.
class NetherGenerator {
public:
struct Params {
uint32_t seed = 1337u;
int floorY = 0;
int ceilingY = 128;
int lavaLevel = 31;
int bedrockThickness = 4;
int roofThickness = 12;
float biomeFrequency = 0.0046f;
float floorFrequency = 0.017f;
float ceilingFrequency = 0.013f;
float caveFrequency = 0.031f;
float caveThreshold = 0.87f;
float blobThreshold = 0.46f;
float quartzFrequency = 0.125f;
float quartzThreshold = 0.60f;
bool decorate = true;
};
NetherGenerator();
explicit NetherGenerator(const Params& netherParams);
const Params& settings() const { return params; }
int stackChunkCount() const { return (params.ceilingY - params.floorY) / chunkSize; }
NetherBiome biomeAt(int gx, int gz) const;
NetherColumn columnAt(int gx, int gz) const;
// Tunnel network cut through the solid mass, sampled independently of the
// column profile so it links the floor rock to the roof rock.
bool isCarved(int gx, int gy, int gz) const;
bool isBedrock(int gx, int gy, int gz) const;
Block blockAt(const NetherColumn& column, int gx, int gy, int gz) const;
void generateChunk(Chunk& chunk, const Vec3i& chunkCoord) const;
void generateColumn(World& world, int columnX, int columnZ) const;
void decorateColumn(World& world, int columnX, int columnZ) const;
private:
bool isBlob(int gx, int gy, int gz) const;
Block topFor(NetherBiome biome) const;
Block fillerFor(NetherBiome biome) const;
void raiseBasaltPillar(World& world, int gx, int gz, const NetherColumn& column, uint32_t roll) const;
void pourLavafall(World& world, int gx, int gz, const NetherColumn& column) const;
void hangGlowstone(World& world, int gx, int gz, const NetherColumn& column, uint32_t roll) const;
void plantFungus(World& world, int gx, int gz, const NetherColumn& column, uint32_t roll) const;
Params params;
PerlinNoise floorNoise;
PerlinNoise ceilingNoise;
PerlinNoise caveNoise;
PerlinNoise blobNoise;
PerlinNoise oreNoise;
NoiseAdv biomeNoise;
};
} // namespace vf