#pragma once #include "../Common/Sizes.hpp" #include "../Math/AABB.hpp" #include "ChunkDimensions.hpp" #include "BiomeType.hpp" #include "BlockType.hpp" #include "ChunkIndex.hpp" #include "Position.hpp" #include "../GFX/Mesh.hpp" namespace MC::World { class Chunk { public: static constexpr U32 Width = ChunkDimensions::Width; static constexpr U32 Height = ChunkDimensions::Height; Chunk(I64 x, I64 y) : m_blocks{Width * Height * Width, {BlockType::Air}}, m_index(x, y), m_position{(Real)x * Width, 0.0f, (Real)y * Width} {} struct BlockData { BlockData() : type(BlockType::Air), light{0} {} BlockData(BlockType t) : type(t), light{0} {} BlockType type; U8 light; Bool empty() const { return type == BlockType::Air; } }; const BlockData& at(U32 x, U32 y, U32 z) const; BlockData& at(U32 x, U32 y, U32 z); const BlockData& at(Position::BlockLocal pos) const; BlockData& at(Position::BlockLocal pos); 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; } template void for_each(F f) { for (U32 x = 0; x < Width; ++x) { for (U32 y = 0; y < Height; ++y) { for (U32 z = 0; z < Width; ++z) { Position::BlockLocal pos{x, y, z}; f(pos, at(x, y, z)); } } } } ChunkIndex index() const; Vector<3> position() const; Bool is_damaged() const; void damage(); static Bool is_valid_position(Position::BlockLocal pos); static AABB block_bounds(Position::BlockLocal pos); private: static U64 pos(U32 x, U32 y, U32 z); ChunkIndex m_index; Vector<3> m_position; std::vector m_blocks; Bool m_damaged = false; Details m_details; }; }