#pragma once #include "../Common/Sizes.hpp" #include "../Math/Vector.hpp" #include "ChunkDimensions.hpp" #include "Position.hpp" namespace MC::World { struct ChunkIndex { ChunkIndex() : x(0), y(0) {} ChunkIndex(I32 x, I32 y) : x(x), y(y) {} Vector<3> middle() const { using namespace ChunkDimensions; return {(x + 0.5f) * Width, Height / 2.0f, (y + 0.5f) * Width}; } Position::BlockWorld local_to_world_position(Position::BlockLocal local) const { using namespace ChunkDimensions; return {x * Width + local.x(), local.y(), y * Width + local.z()}; } static ChunkIndex from_position(Position::BlockWorld pos) { I32 chunk_x = std::round(pos.x() / ChunkDimensions::Width); I32 chunk_y = std::round(pos.z() / ChunkDimensions::Width); return {chunk_x, chunk_y}; } I32 x, y; }; } template<> struct std::equal_to { Bool operator()(const MC::World::ChunkIndex& i1, const MC::World::ChunkIndex& i2) const noexcept { return i1.x == i2.x && i1.y == i2.y; } }; template<> struct std::hash { USize operator()(const MC::World::ChunkIndex& i) const noexcept { return (I64)i.x << 32 | i.y; } };