This commit is contained in:
MihailRis
2024-08-18 17:29:02 +03:00
parent 2a506e9891
commit 810519fb4d
3 changed files with 27 additions and 2 deletions
+19
View File
@@ -9,24 +9,40 @@
class Content; class Content;
struct BlocksLayer { struct BlocksLayer {
/// @brief Layer block
std::string block; std::string block;
/// @brief Layer height. -1 is resizeable layer
int height; int height;
/// @brief Layer can present under the sea level (default: true) else will
/// extend the next layer
bool below_sea_level; bool below_sea_level;
struct { struct {
/// @brief Layer block index
blockid_t id; blockid_t id;
} rt; } rt;
}; };
/// @brief Set of blocks layers with additional info
struct BlocksLayers { struct BlocksLayers {
std::vector<BlocksLayer> layers; std::vector<BlocksLayer> layers;
/// @brief Total height of all layers after the resizeable one
uint lastLayersHeight; uint lastLayersHeight;
}; };
/// @brief Generator behaviour and settings interface
class GeneratorScript { class GeneratorScript {
public: public:
virtual ~GeneratorScript() = default; virtual ~GeneratorScript() = default;
/// @brief Generates a heightmap with values in range 0..1
/// @param offset position of the heightmap top left corner in the world
/// @param size size of the heightmap
/// @param seed world seed
/// @return generated heightmap of given size (can't be nullptr)
virtual std::shared_ptr<Heightmap> generateHeightmap( virtual std::shared_ptr<Heightmap> generateHeightmap(
const glm::ivec2& offset, const glm::ivec2& size, uint64_t seed) = 0; const glm::ivec2& offset, const glm::ivec2& size, uint64_t seed) = 0;
@@ -35,9 +51,12 @@ public:
virtual uint getSeaLevel() const = 0; virtual uint getSeaLevel() const = 0;
/// @brief Build the runtime cache
/// @param content built content
virtual void prepare(const Content* content) = 0; virtual void prepare(const Content* content) = 0;
}; };
/// @brief Generator information
struct GeneratorDef { struct GeneratorDef {
std::string name; std::string name;
std::unique_ptr<GeneratorScript> script; std::unique_ptr<GeneratorScript> script;
+2 -2
View File
@@ -15,14 +15,14 @@ WorldGenerator::WorldGenerator(const GeneratorDef& def, const Content* content)
static inline void generate_pole( static inline void generate_pole(
const BlocksLayers& layers, const BlocksLayers& layers,
int height, int top,
int bottom, int bottom,
int seaLevel, int seaLevel,
voxel* voxels, voxel* voxels,
int x, int x,
int z int z
) { ) {
uint y = height; uint y = top;
uint layerExtension = 0; uint layerExtension = 0;
for (const auto& layer : layers.layers) { for (const auto& layer : layers.layers) {
// skip layer if can't be generated under sea level // skip layer if can't be generated under sea level
+6
View File
@@ -8,6 +8,7 @@ struct voxel;
class Content; class Content;
struct GeneratorDef; struct GeneratorDef;
/// @brief High-level world generation controller
class WorldGenerator { class WorldGenerator {
const GeneratorDef& def; const GeneratorDef& def;
const Content* content; const Content* content;
@@ -18,6 +19,11 @@ public:
); );
virtual ~WorldGenerator() = default; virtual ~WorldGenerator() = default;
/// @brief Generate complete chunk voxels
/// @param voxels destinatiopn chunk voxels buffer
/// @param x chunk position X divided by CHUNK_W
/// @param z chunk position Y divided by CHUNK_D
/// @param seed world seed
virtual void generate(voxel* voxels, int x, int z, uint64_t seed); virtual void generate(voxel* voxels, int x, int z, uint64_t seed);
inline static std::string DEFAULT = "core:default"; inline static std::string DEFAULT = "core:default";