#pragma once #include #include "BiomeType.hpp" #include "BlockType.hpp" #include "../GFX/Mesh.hpp" #include "BlockSide.hpp" namespace MC::World { class Chunk { public: static constexpr uint32_t Width = 16; static constexpr uint32_t Height = 128; Chunk(int64_t x, int64_t y) : m_blocks{Width * Height * Width, {BlockType::Air}}, m_position{(float)x * Width, 0.0f, (float)y * Width} {} struct BlockData { BlockType type; bool empty() const { return type == BlockType::Air; } }; void set(uint32_t x, uint32_t y, uint32_t z, BlockData data); BlockData get(uint32_t x, uint32_t y, uint32_t z) const; bool is_empty(uint32_t x, uint32_t y, uint32_t z) const; struct Details { Matrix landmass_values{}; Matrix hill_values{}; Matrix temperature_values{}; Matrix humidity_values{}; Matrix biome_values{}; }; void set_details(const Details& details) { m_details = details; } Details& details(){ return m_details; } Vector<3> position() const; static bool is_valid_position(uint32_t x, uint32_t y, uint32_t z); private: static uint64_t pos(uint32_t x, uint32_t y, uint32_t z); Vector<3> m_position; std::vector m_blocks; Details m_details; }; }