summaryrefslogtreecommitdiffhomepage
path: root/src/anim-atlas.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/anim-atlas.cpp')
-rw-r--r--src/anim-atlas.cpp19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/anim-atlas.cpp b/src/anim-atlas.cpp
index b566d19f..345ca63e 100644
--- a/src/anim-atlas.cpp
+++ b/src/anim-atlas.cpp
@@ -2,6 +2,7 @@
#include "compat/assert.hpp"
#include "shaders/tile.hpp"
#include "tile-defs.hpp"
+#include <Corrade/Containers/BitArrayView.h>
#include <Magnum/Math/Color.h>
#include <Magnum/GL/TextureFormat.h>
@@ -31,7 +32,7 @@ decltype(anim_atlas::_group_indices) anim_atlas::make_group_indices(const anim_d
anim_atlas::anim_atlas() noexcept = default;
anim_atlas::anim_atlas(StringView name, const ImageView2D& image, anim_def info) noexcept :
- _name{name},
+ _name{name}, _bitmask{make_bit_array(image)},
_info{std::move(info)}, _group_indices{make_group_indices(_info)}
{
_tex.setWrapping(GL::SamplerWrapping::ClampToEdge)
@@ -99,4 +100,20 @@ auto anim_atlas::frame_quad(const Vector3& center, rotation r, std::size_t i) co
}};
}
+BitArray anim_atlas::make_bit_array(const ImageView2D& tex)
+{
+ fm_assert(tex.pixelSize() == 4);
+ const auto size = (std::size_t)tex.size().product();
+ BitArray array{NoInit, size};
+ const char* __restrict data = tex.data().data();
+ for (std::size_t i = 0; i < size; i++)
+ array.set(i, data[i * 4 + 3] != 0);
+ return array;
+}
+
+BitArrayView anim_atlas::bitmask() const
+{
+ return _bitmask;
+}
+
} // namespace floormat