#pragma once #include "compat/defs.hpp" #include "scenery.hpp" #include "serialize/anim.hpp" #include #include #include #include namespace floormat { struct anim_atlas final { using anim_info = Serialize::anim; using anim_group = Serialize::anim_group; using anim_frame = Serialize::anim_frame; using texcoords = std::array; anim_atlas() noexcept; anim_atlas(StringView name, GL::Texture2D&& tex, Vector2ui pixel_size, anim_info info) noexcept; ~anim_atlas() noexcept; anim_atlas(anim_atlas&&) noexcept; anim_atlas& operator=(anim_atlas&&) noexcept; StringView name() const noexcept; GL::Texture2D& texture() noexcept; const anim_info& info() const noexcept; const anim_group& group(rotation r) const noexcept; const anim_frame& frame(rotation r, std::size_t frame) const noexcept; texcoords frame_texcoords(rotation r, std::size_t frame) const noexcept; texcoords frame_texcoords(const anim_frame& frame) const noexcept; fm_DECLARE_DELETED_COPY_ASSIGNMENT(anim_atlas); private: GL::Texture2D _tex; String _name; Vector2ui _pixel_size; anim_info _info; std::array _group_indices = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, }; static decltype(_group_indices) make_group_indices(const Serialize::anim& anim) noexcept; static std::uint8_t rotation_to_index(const anim_info& a, rotation r) noexcept; }; } // namespace floormat