#pragma once #include "../Common/Sizes.hpp" #include #include #include "../Math/Vector.hpp" namespace MC::World { class BlockSide { public: enum Value : U8 { Front, Back, Top, Bottom, Right, Left, }; BlockSide() = default; BlockSide(Value side) : m_side(side) {} operator Value() const { return m_side; } std::array, 4> face() { // Winding order: (0, 1, 2) (2, 3, 0) // Note: OpenGL Coordinate system has a flipped z axis. switch (m_side) { case Front: return {{ {0, 1, 1}, {0, 0, 1}, {1, 0, 1}, {1, 1, 1} }}; case Back: return {{ {0, 1, 0}, {1, 1, 0}, {1, 0, 0}, {0, 0, 0} }}; case Top: return {{ {0, 1, 1}, {1, 1, 1}, {1, 1, 0}, {0, 1, 0} }}; case Bottom: return {{ {0, 0, 1}, {0, 0, 0}, {1, 0, 0}, {1, 0, 1} }}; case Right: return {{ {1, 1, 0}, {1, 1, 1}, {1, 0, 1}, {1, 0, 0} }}; case Left: return {{ {0, 1, 0}, {0, 0, 0}, {0, 0, 1}, {0, 1, 1} }}; } } static std::vector all() { return { Front, Back, Top, Bottom, Left, Right, }; } private: Value m_side; }; }