feat(vf): add NetherColumn and Params
This commit is contained in:
1 parent
56ac2d24c8
commit
8d0de998fd
1 file changed
+95
@@ -0,0 +1,95 @@
|
||||
#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
|
||||
Reference in new issue
Block a user