diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2023-11-05 07:39:06 +0100 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2023-11-05 07:39:06 +0100 |
commit | 98da53beb78d9a617a1c66b404e9a7d8469a443a (patch) | |
tree | e708c5133ea5705d402b31b16aadcb24ec25b6c1 /src | |
parent | 8cd318bc55e9d1588307999618a0d8bef09f9f68 (diff) |
a
Diffstat (limited to 'src')
-rw-r--r-- | src/wall-atlas.cpp | 50 | ||||
-rw-r--r-- | src/wall-atlas.hpp | 40 |
2 files changed, 60 insertions, 30 deletions
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<const wall_frame_set> rotations, - ArrayView<const wall_frame> frames) : - _array{NoInit, frames.size()}, _info(std::move(info)) + Array<wall_frame> frames, + std::unique_ptr<wall_frame_set[]> framesets, + uint8_t frameset_count, + std::array<uint8_t, 4> 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<const wall_frame> wall_atlas::array() const { return _array; } +ArrayView<const wall_frame> 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<const wall_frame> 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 <array> +#include <memory> #include <Corrade/Containers/Array.h> #include <Corrade/Containers/String.h> #include <Magnum/Math/Vector2.h> @@ -20,7 +22,7 @@ struct wall_frames { ArrayView<const wall_frame> 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<wall_frame_set[]> framesets; + std::array<uint8_t, 4> frameset_indexes = {255, 255, 255, 255}; + uint8_t frameset_count = 0; + + Array<wall_frame> 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<const wall_frame_set> rotations, - ArrayView<const wall_frame> frames); ~wall_atlas() noexcept; + wall_atlas(wall_info info, const ImageView2D& image, + Array<wall_frame> frames, + std::unique_ptr<wall_frame_set[]> framesets, + uint8_t frameset_count, + std::array<uint8_t, 4> 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<const wall_frame> array() const; + ArrayView<const wall_frame> frame_array() const; StringView name() const; private: - String _name; - std::array<wall_frame_set, 4> _rotations; - Array<wall_frame> _array; - GL::Texture2D _texture; + std::unique_ptr<wall_frame_set[]> _framesets; + Array<wall_frame> _frame_array; wall_info _info; - uint8_t _rotation_count = 0; + GL::Texture2D _texture; + std::array<uint8_t, 4> _frameset_indexes; + uint8_t _frameset_count = 0; }; } // namespace floormat |