From 98da53beb78d9a617a1c66b404e9a7d8469a443a Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Sun, 5 Nov 2023 07:39:06 +0100 Subject: a --- src/wall-atlas.cpp | 50 ++++++++++++++++++++++++++++++++------------------ src/wall-atlas.hpp | 40 ++++++++++++++++++++++++++++------------ 2 files changed, 60 insertions(+), 30 deletions(-) (limited to 'src') diff --git a/src/wall-atlas.cpp b/src/wall-atlas.cpp index 685125cd..be4010c7 100644 --- a/src/wall-atlas.cpp +++ b/src/wall-atlas.cpp @@ -8,6 +8,7 @@ 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); @@ -16,19 +17,27 @@ size_t wall_atlas::enum_to_index(enum rotation r) } wall_atlas::wall_atlas(wall_info info, const ImageView2D& image, - ArrayView rotations, - ArrayView frames) : - _array{NoInit, frames.size()}, _info(std::move(info)) + 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(info.depth > 0); - fm_assert(rotations.size() <= _rotations.size()); - _rotation_count = (uint8_t)rotations.size(); - for (auto i = 0uz; const auto& fr : frames) - _array[i++] = fr; - for (auto i = 0uz; const auto& r : rotations) - _rotations[i++] = r; - - _texture.setLabel(_name) + { 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) @@ -40,16 +49,21 @@ wall_atlas::wall_atlas(wall_info info, const ImageView2D& image, wall_atlas::wall_atlas() = default; wall_atlas::~wall_atlas() noexcept = default; -const wall_frame_set& wall_atlas::frameset(size_t i) const { return _rotations[i]; } -const wall_frame_set& wall_atlas::frameset(enum rotation r) const { return frameset(enum_to_index(r)); } -const ArrayView wall_atlas::array() const { return _array; } +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 { - fm_assert(index < a.array().size()); - fm_debug_assert(count != (uint32_t)-1); - return { a.array() + index, count }; + auto sz = a.frame_array().size(); (void)sz; + fm_assert(index < sz && index + count <= sz); + return { a.frame_array() + index, count }; } } // namespace floormat diff --git a/src/wall-atlas.hpp b/src/wall-atlas.hpp index 4414ac3f..aa18c0bc 100644 --- a/src/wall-atlas.hpp +++ b/src/wall-atlas.hpp @@ -1,6 +1,8 @@ #pragma once +#include "compat/defs.hpp" #include "src/rotation.hpp" #include +#include #include #include #include @@ -20,7 +22,7 @@ struct wall_frames { ArrayView items(const wall_atlas& a) const; - uint32_t index = (uint32_t)-1, count = (uint32_t)-1; // not serialized + uint32_t index = (uint32_t)-1, count = 0; Vector2ui pixel_size; Color4 tint_mult{1,1,1,1}; @@ -39,30 +41,44 @@ struct wall_frame_set struct wall_info { String name = "(unnamed)"_s; - float depth = 1; + unsigned depth = 0; +}; + +struct wall_atlas_def +{ + wall_info info; + std::unique_ptr framesets; + std::array frameset_indexes = {255, 255, 255, 255}; + uint8_t frameset_count = 0; + + Array array; + uint32_t frame_count = 0; }; struct wall_atlas final { + fm_DECLARE_DEFAULT_MOVE_ASSIGNMENT_(wall_atlas); wall_atlas(); - wall_atlas(wall_info info, - const ImageView2D& image, - ArrayView rotations, - ArrayView frames); ~wall_atlas() noexcept; + wall_atlas(wall_info info, const ImageView2D& image, + Array frames, + std::unique_ptr framesets, + uint8_t frameset_count, + std::array frameset_indexes); + static size_t enum_to_index(enum rotation x); const wall_frame_set& frameset(size_t i) const; const wall_frame_set& frameset(enum rotation r) const; - const ArrayView array() const; + ArrayView frame_array() const; StringView name() const; private: - String _name; - std::array _rotations; - Array _array; - GL::Texture2D _texture; + std::unique_ptr _framesets; + Array _frame_array; wall_info _info; - uint8_t _rotation_count = 0; + GL::Texture2D _texture; + std::array _frameset_indexes; + uint8_t _frameset_count = 0; }; } // namespace floormat -- cgit v1.2.3