diff options
Diffstat (limited to 'src/anim-atlas.cpp')
-rw-r--r-- | src/anim-atlas.cpp | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/src/anim-atlas.cpp b/src/anim-atlas.cpp index 345ca63e..b357a386 100644 --- a/src/anim-atlas.cpp +++ b/src/anim-atlas.cpp @@ -3,6 +3,7 @@ #include "shaders/tile.hpp" #include "tile-defs.hpp" #include <Corrade/Containers/BitArrayView.h> +#include <Corrade/Containers/StridedArrayView.h> #include <Magnum/Math/Color.h> #include <Magnum/GL/TextureFormat.h> @@ -35,9 +36,12 @@ anim_atlas::anim_atlas(StringView name, const ImageView2D& image, anim_def info) _name{name}, _bitmask{make_bit_array(image)}, _info{std::move(info)}, _group_indices{make_group_indices(_info)} { + const Size<3>& size = image.pixels().size(); + fm_assert(size[0]*size[1] == _info.pixel_size.product()); + fm_assert(size[2] >= 3 && size[2] <= 4); _tex.setWrapping(GL::SamplerWrapping::ClampToEdge) .setMagnificationFilter(GL::SamplerFilter::Nearest) - .setMinificationFilter(GL::SamplerFilter::Linear) + .setMinificationFilter(GL::SamplerFilter::Nearest) .setMaxAnisotropy(1) .setBorderColor(Color4{1, 0, 0, 1}) .setStorage(1, GL::textureFormat(image.format()), image.size()) @@ -102,12 +106,21 @@ auto anim_atlas::frame_quad(const Vector3& center, rotation r, std::size_t i) co BitArray anim_atlas::make_bit_array(const ImageView2D& tex) { + const auto pixels = tex.pixels(); + const auto size = pixels.size(); + const auto width = size[1], height = size[0]; + + if (tex.pixelSize() == 3) + return BitArray{DirectInit, width*height, true}; + 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); + const auto stride = (std::size_t)pixels.stride()[0]; + const auto channels = (std::size_t)pixels.stride()[1]; + BitArray array{NoInit, width*height}; + const char* __restrict const data = (const char*)tex.pixels().data(); + for (std::size_t y = 0; y < height; y++) + for (std::size_t x = 0; x < width; x++) + array.set(y*width + x, data[(height-y-1)*stride + x*channels + 3] != 0); return array; } |