summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2023-11-05 07:39:06 +0100
committerStanislaw Halik <sthalik@misaki.pl>2023-11-05 07:39:06 +0100
commit98da53beb78d9a617a1c66b404e9a7d8469a443a (patch)
treee708c5133ea5705d402b31b16aadcb24ec25b6c1 /src
parent8cd318bc55e9d1588307999618a0d8bef09f9f68 (diff)
a
Diffstat (limited to 'src')
-rw-r--r--src/wall-atlas.cpp50
-rw-r--r--src/wall-atlas.hpp40
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