From 274c548274d9fcbb1cd9fca5b522f8a6cc8869d2 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Sat, 25 Jun 2022 15:20:26 +0200 Subject: . --- atlas.cpp | 107 ------------------------------------------------------ atlas.hpp | 31 ---------------- loader-impl.cpp | 2 +- main.cpp | 2 +- texture-atlas.cpp | 107 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ texture-atlas.hpp | 31 ++++++++++++++++ tile.hpp | 2 +- 7 files changed, 141 insertions(+), 141 deletions(-) delete mode 100644 atlas.cpp delete mode 100644 atlas.hpp create mode 100644 texture-atlas.cpp create mode 100644 texture-atlas.hpp diff --git a/atlas.cpp b/atlas.cpp deleted file mode 100644 index 041df3f8..00000000 --- a/atlas.cpp +++ /dev/null @@ -1,107 +0,0 @@ -#include "atlas.hpp" -#include "defs.hpp" -#include -#include - -namespace Magnum::Examples { - -texture_atlas::texture_atlas(const ImageView2D& image, Vector2i dims) : - size_{image.size()}, - dims_{dims}, - tile_size_{size_ / dims} -{ - CORRADE_INTERNAL_ASSERT(dims_[0] > 0 && dims_[1] > 0); - CORRADE_INTERNAL_ASSERT(tile_size_ * dims_ == size_); - CORRADE_INTERNAL_ASSERT(size_ % dims_ == Vector2i{}); - CORRADE_INTERNAL_ASSERT(dims.product() < 256); - tex_.setWrapping(GL::SamplerWrapping::ClampToEdge) - .setMagnificationFilter(GL::SamplerFilter::Nearest) - .setMinificationFilter(GL::SamplerFilter::Linear) - .setMaxAnisotropy(0) - .setStorage(1, GL::textureFormat(image.format()), image.size()) - .setSubImage(0, {}, image); -} - -std::array texture_atlas::texcoords_for_id(int id_) const -{ - CORRADE_INTERNAL_ASSERT(id_ >= 0 && id_ < dims_.product()); - Vector2i id = { id_ % dims_[0], id_ / dims_[0] }; - auto p0 = Vector2(id * tile_size_) / Vector2(size_); - auto p1 = Vector2(tile_size_) / Vector2(size_); - auto x0 = p0.x(), x1 = p1.x(), y0 = p0.y(), y1 = p1.y(); - return {{ - { x0+x1, y0+y1 }, // bottom right - { x0+x1, y0 }, // top right - { x0, y0+y1 }, // bottom left - { x0, y0 } // top left - }}; -} - -using vertex_array_type = texture_atlas::vertex_array_type; - -vertex_array_type texture_atlas::floor_quad(Vector3 center, Vector2 size) -{ - float x = size[0]*.5f, y = size[1]*.5f; - return {{ - { x + center[0], -y + center[1], center[2]}, - { x + center[0], y + center[1], center[2]}, - {-x + center[0], -y + center[1], center[2]}, - {-x + center[0], y + center[1], center[2]}, - }}; -} - -vertex_array_type texture_atlas::wall_quad_W(Vector3 center, Vector3 size) -{ - float x = size[0]*.5f, y = size[1]*.5f, z = size[2]; - return {{ - { x + center[0], y + center[1], center[2] }, - { x + center[0], y + center[1], z + center[2] }, - {-x + center[0], y + center[1], center[2] }, - {-x + center[0], y + center[1], z + center[2] }, - }}; -} - -vertex_array_type texture_atlas::wall_quad_S(Vector3 center, Vector3 size) -{ - float x = size[0]*.5f, y = size[1]*.5f, z = size[2]; - return {{ - {-x + center[0], y + center[1], center[2] }, - {-x + center[0], y + center[1], z + center[2] }, - {-x + center[0], -y + center[1], center[2] }, - {-x + center[0], -y + center[1], z + center[2] }, - }}; -} - -vertex_array_type texture_atlas::wall_quad_E(Vector3 center, Vector3 size) -{ - float x = size[0]*.5f, y = size[1]*.5f, z = size[2]; - return {{ - { x + center[0], -y + center[1], center[2] }, - { x + center[0], -y + center[1], z + center[2] }, - {-x + center[0], -y + center[1], center[2] }, - {-x + center[0], -y + center[1], z + center[2] }, - }}; -} - -vertex_array_type texture_atlas::wall_quad_N(Vector3 center, Vector3 size) -{ - float x = size[0]*.5f, y = size[1]*.5f, z = size[2]; - return {{ - { x + center[0], -y + center[1], center[2] }, - { x + center[0], -y + center[1], z + center[2] }, - { x + center[0], y + center[1], center[2] }, - { x + center[0], y + center[1], z + center[2] }, - }}; -} - -std::array texture_atlas::indices(int N) -{ - CORRADE_INTERNAL_ASSERT(N >= 0); - using u16 = UnsignedShort; - return { /* 3--1 1 */ - (u16)(0+N*4), (u16)(1+N*4), (u16)(2+N*4), /* | / /| */ - (u16)(2+N*4), (u16)(1+N*4), (u16)(3+N*4), /* |/ / | */ - }; /* 2 2--0 */ -} - -} // namespace Magnum::Examples diff --git a/atlas.hpp b/atlas.hpp deleted file mode 100644 index e7f8a260..00000000 --- a/atlas.hpp +++ /dev/null @@ -1,31 +0,0 @@ -#pragma once -#include -#include -#include - -namespace Magnum::Examples { - -struct texture_atlas final -{ - using vertex_array_type = std::array; - - texture_atlas(const ImageView2D& img, Vector2i dims); - std::array texcoords_for_id(int id) const; - static vertex_array_type floor_quad(Vector3 center, Vector2 size); - static vertex_array_type wall_quad_S(Vector3 center, Vector3 size); - static vertex_array_type wall_quad_E(Vector3 center, Vector3 size); - static vertex_array_type wall_quad_N(Vector3 center, Vector3 size); - static vertex_array_type wall_quad_W(Vector3 center, Vector3 size); - static std::array indices(int N); - GL::Texture2D& texture() { return tex_; } - constexpr int size() const { return dims_.product(); } - constexpr Vector2i tile_size() const { return tile_size_; } - - texture_atlas(const texture_atlas&) = delete; - texture_atlas& operator=(const texture_atlas&) = delete; -private: - GL::Texture2D tex_; - Vector2i size_, dims_, tile_size_; -}; - -} // namespace Magnum::Examples diff --git a/loader-impl.cpp b/loader-impl.cpp index 6d760330..2008dbae 100644 --- a/loader-impl.cpp +++ b/loader-impl.cpp @@ -1,6 +1,6 @@ #include "defs.hpp" #include "loader.hpp" -#include "atlas.hpp" +#include "texture-atlas.hpp" #include #include #include diff --git a/main.cpp b/main.cpp index 8cab32ed..7a7aafe7 100644 --- a/main.cpp +++ b/main.cpp @@ -1,4 +1,4 @@ -#include "atlas.hpp" +#include "texture-atlas.hpp" #include "loader.hpp" #include "tile-shader.hpp" #include "defs.hpp" diff --git a/texture-atlas.cpp b/texture-atlas.cpp new file mode 100644 index 00000000..e8e44900 --- /dev/null +++ b/texture-atlas.cpp @@ -0,0 +1,107 @@ +#include "texture-atlas.hpp" +#include "defs.hpp" +#include +#include + +namespace Magnum::Examples { + +texture_atlas::texture_atlas(const ImageView2D& image, Vector2i dims) : + size_{image.size()}, + dims_{dims}, + tile_size_{size_ / dims} +{ + CORRADE_INTERNAL_ASSERT(dims_[0] > 0 && dims_[1] > 0); + CORRADE_INTERNAL_ASSERT(tile_size_ * dims_ == size_); + CORRADE_INTERNAL_ASSERT(size_ % dims_ == Vector2i{}); + CORRADE_INTERNAL_ASSERT(dims.product() < 256); + tex_.setWrapping(GL::SamplerWrapping::ClampToEdge) + .setMagnificationFilter(GL::SamplerFilter::Nearest) + .setMinificationFilter(GL::SamplerFilter::Linear) + .setMaxAnisotropy(0) + .setStorage(1, GL::textureFormat(image.format()), image.size()) + .setSubImage(0, {}, image); +} + +std::array texture_atlas::texcoords_for_id(int id_) const +{ + CORRADE_INTERNAL_ASSERT(id_ >= 0 && id_ < dims_.product()); + Vector2i id = { id_ % dims_[0], id_ / dims_[0] }; + auto p0 = Vector2(id * tile_size_) / Vector2(size_); + auto p1 = Vector2(tile_size_) / Vector2(size_); + auto x0 = p0.x(), x1 = p1.x(), y0 = p0.y(), y1 = p1.y(); + return {{ + { x0+x1, y0+y1 }, // bottom right + { x0+x1, y0 }, // top right + { x0, y0+y1 }, // bottom left + { x0, y0 } // top left + }}; +} + +using vertex_array_type = texture_atlas::vertex_array_type; + +vertex_array_type texture_atlas::floor_quad(Vector3 center, Vector2 size) +{ + float x = size[0]*.5f, y = size[1]*.5f; + return {{ + { x + center[0], -y + center[1], center[2]}, + { x + center[0], y + center[1], center[2]}, + {-x + center[0], -y + center[1], center[2]}, + {-x + center[0], y + center[1], center[2]}, + }}; +} + +vertex_array_type texture_atlas::wall_quad_W(Vector3 center, Vector3 size) +{ + float x = size[0]*.5f, y = size[1]*.5f, z = size[2]; + return {{ + { x + center[0], y + center[1], center[2] }, + { x + center[0], y + center[1], z + center[2] }, + {-x + center[0], y + center[1], center[2] }, + {-x + center[0], y + center[1], z + center[2] }, + }}; +} + +vertex_array_type texture_atlas::wall_quad_S(Vector3 center, Vector3 size) +{ + float x = size[0]*.5f, y = size[1]*.5f, z = size[2]; + return {{ + {-x + center[0], y + center[1], center[2] }, + {-x + center[0], y + center[1], z + center[2] }, + {-x + center[0], -y + center[1], center[2] }, + {-x + center[0], -y + center[1], z + center[2] }, + }}; +} + +vertex_array_type texture_atlas::wall_quad_E(Vector3 center, Vector3 size) +{ + float x = size[0]*.5f, y = size[1]*.5f, z = size[2]; + return {{ + { x + center[0], -y + center[1], center[2] }, + { x + center[0], -y + center[1], z + center[2] }, + {-x + center[0], -y + center[1], center[2] }, + {-x + center[0], -y + center[1], z + center[2] }, + }}; +} + +vertex_array_type texture_atlas::wall_quad_N(Vector3 center, Vector3 size) +{ + float x = size[0]*.5f, y = size[1]*.5f, z = size[2]; + return {{ + { x + center[0], -y + center[1], center[2] }, + { x + center[0], -y + center[1], z + center[2] }, + { x + center[0], y + center[1], center[2] }, + { x + center[0], y + center[1], z + center[2] }, + }}; +} + +std::array texture_atlas::indices(int N) +{ + CORRADE_INTERNAL_ASSERT(N >= 0); + using u16 = UnsignedShort; + return { /* 3--1 1 */ + (u16)(0+N*4), (u16)(1+N*4), (u16)(2+N*4), /* | / /| */ + (u16)(2+N*4), (u16)(1+N*4), (u16)(3+N*4), /* |/ / | */ + }; /* 2 2--0 */ +} + +} // namespace Magnum::Examples diff --git a/texture-atlas.hpp b/texture-atlas.hpp new file mode 100644 index 00000000..e7f8a260 --- /dev/null +++ b/texture-atlas.hpp @@ -0,0 +1,31 @@ +#pragma once +#include +#include +#include + +namespace Magnum::Examples { + +struct texture_atlas final +{ + using vertex_array_type = std::array; + + texture_atlas(const ImageView2D& img, Vector2i dims); + std::array texcoords_for_id(int id) const; + static vertex_array_type floor_quad(Vector3 center, Vector2 size); + static vertex_array_type wall_quad_S(Vector3 center, Vector3 size); + static vertex_array_type wall_quad_E(Vector3 center, Vector3 size); + static vertex_array_type wall_quad_N(Vector3 center, Vector3 size); + static vertex_array_type wall_quad_W(Vector3 center, Vector3 size); + static std::array indices(int N); + GL::Texture2D& texture() { return tex_; } + constexpr int size() const { return dims_.product(); } + constexpr Vector2i tile_size() const { return tile_size_; } + + texture_atlas(const texture_atlas&) = delete; + texture_atlas& operator=(const texture_atlas&) = delete; +private: + GL::Texture2D tex_; + Vector2i size_, dims_, tile_size_; +}; + +} // namespace Magnum::Examples diff --git a/tile.hpp b/tile.hpp index 88b1ade3..cf12ca05 100644 --- a/tile.hpp +++ b/tile.hpp @@ -1,5 +1,5 @@ #pragma once -#include "atlas.hpp" +#include "texture-atlas.hpp" #include "hash.hpp" #include "defs.hpp" -- cgit v1.2.3