#include "wall-atlas.hpp" #include "compat/assert.hpp" #include #include #include namespace floormat { size_t wall_atlas::enum_to_index(enum rotation r) { static_assert(rotation_COUNT == rotation{8}); fm_debug_assert(r < rotation_COUNT); auto x = uint8_t(r); x >>= 1; return x; } wall_atlas::wall_atlas(wall_info info, const ImageView2D& image, Array frames, std::unique_ptr framesets, uint8_t frameset_count, std::array frameset_indexes) : _framesets{std::move(framesets)}, _frame_array{std::move(frames)}, _info(std::move(info)), _frameset_indexes{frameset_indexes}, _frameset_count{(uint8_t)frameset_count} { { fm_assert(frameset_count <= 4); uint8_t counts[4] = {}, total = 0; for (auto i = 0uz; i < frameset_count; i++) if (frameset_indexes[i] != (uint8_t)-1) { fm_assert(++counts[i] == 1); total++; } fm_assert(total == frameset_count); } _texture.setLabel(_info.name) .setWrapping(GL::SamplerWrapping::ClampToEdge) .setMagnificationFilter(GL::SamplerFilter::Nearest) .setMinificationFilter(GL::SamplerFilter::Linear) .setMaxAnisotropy(1) .setBorderColor(Color4{1, 0, 0, 1}) .setStorage(1, GL::textureFormat(image.format()), image.size()) .setSubImage(0, {}, image); } wall_atlas::wall_atlas() = default; wall_atlas::~wall_atlas() noexcept = default; ArrayView wall_atlas::frame_array() const { return _frame_array; } StringView wall_atlas::name() const { return _info.name; } const wall_frame_set& wall_atlas::frameset(enum rotation r) const { return frameset(enum_to_index(r)); } const wall_frame_set& wall_atlas::frameset(size_t i) const { fm_assert(i < 4 && _frameset_indexes[i] != (uint8_t)-1); return _framesets[i]; } ArrayView wall_frames::items(const wall_atlas& a) const { auto sz = a.frame_array().size(); (void)sz; fm_assert(index < sz && index + count <= sz); return { a.frame_array() + index, count }; } } // namespace floormat