From af9ae9430c7328e030ace9787bc90b426cfc2f52 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Th=C3=A9au?= <theau.baton@etu.univ-amu.fr>
Date: Tue, 14 Jan 2025 01:46:01 +0100
Subject: [PATCH] Add animation on tilemap

---
 assets/tilemap.png                            | Bin 4536 -> 4547 bytes
 .../engine/graphics/back/textures/Texture.cpp |  25 ++---------
 .../engine/graphics/back/textures/Texture.hpp |   7 +--
 source/game/object/Test.cpp                   |   7 ++-
 .../front/component/graphic/TileMap.cpp       |  40 ++++++++++++------
 .../front/component/graphic/TileMap.hpp       |   8 +++-
 6 files changed, 48 insertions(+), 39 deletions(-)

diff --git a/assets/tilemap.png b/assets/tilemap.png
index 48ec4457cb7f48a2078e595d0f56a72cc4239534..b336765460a48008cfa66ca7a72ecdc290c9aa51 100644
GIT binary patch
delta 4245
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
b`)t2pL&#B)-0vm~3=9mOu6{1-oD!M<xGN}e

delta 4249
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
BEZzVB

diff --git a/source/engine/graphics/back/textures/Texture.cpp b/source/engine/graphics/back/textures/Texture.cpp
index 658169b..88821c8 100644
--- a/source/engine/graphics/back/textures/Texture.cpp
+++ b/source/engine/graphics/back/textures/Texture.cpp
@@ -5,7 +5,7 @@
 
 namespace megu {
     Texture::Texture(GLuint slot, GLuint type) 
-    : _id(0), _type(type), _slot(slot) {
+    : _id(0), _type(type), _slot(slot), _width(0), _height(0) {
         glGenTextures(1, &this->_id);
     }
 
@@ -38,26 +38,6 @@ namespace megu {
         this->bind();
     }
 
-    GLint Texture::width() const {
-        if(this->_id == 0) {
-            return 0;
-        }
-
-        GLint width;
-        glGetTexLevelParameteriv(this->_type, 0, GL_TEXTURE_WIDTH, &width);
-        return width;
-    }
-
-    GLint Texture::height() const {
-        if(this->_id == 0) {
-            return 0;
-        }
-
-        GLint height;
-        glGetTexLevelParameteriv(this->_type, 0, GL_TEXTURE_HEIGHT, &height);
-        return height;
-    }
-
     void Texture::changeSlot(GLuint slot) {
         this->_slot = slot;
     }
@@ -90,6 +70,9 @@ namespace megu {
             glDeleteTextures(1, &this->_id);
             glGenTextures(1, &this->_id);
         }
+
+        this->_width = width;
+        this->_height = height;
         
         glBindTexture(this->_type, this->_id);
         glTexImage2D(this->_type, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, data);
diff --git a/source/engine/graphics/back/textures/Texture.hpp b/source/engine/graphics/back/textures/Texture.hpp
index 221d628..c58c013 100644
--- a/source/engine/graphics/back/textures/Texture.hpp
+++ b/source/engine/graphics/back/textures/Texture.hpp
@@ -39,8 +39,8 @@ namespace megu {
             void bind() const;
             void bind(GLuint) const;
 
-            GLint width() const;
-            GLint height() const;
+            inline  GLint width() const {return this->_width;}
+            inline GLint height() const {return this->_height;}
 
             inline GLuint slot() const {return this->_slot;}
             inline GLuint type() const {return this->_type;}
@@ -71,6 +71,7 @@ namespace megu {
         private:
             GLuint _id;
             GLuint _type;
-            mutable GLuint _slot;    
+            mutable GLuint _slot;   
+            GLsizei _width, _height; 
     };
 }
\ No newline at end of file
diff --git a/source/game/object/Test.cpp b/source/game/object/Test.cpp
index bcdf555..f2c6e96 100644
--- a/source/game/object/Test.cpp
+++ b/source/game/object/Test.cpp
@@ -7,8 +7,11 @@ namespace megu::game {
         this->_graphic.setSize({51.f, 98.f});
 
         this->_map.setValue(0, 0, 1);
-        this->_map.setValue(1, 0, 1);
-        this->_map.setValue(0, 1, 2);
+        this->_map.setValue(1, 0, 2);
+        this->_map.setValue(0, 1, 1);
         this->_map.setValue(1, 1, 1);
+
+        this->_map.addAnimation(0, 1, {18, 19, 20, 21});
+        this->_map.addAnimation(1, 1, {18, 19, 20, 21});
     }
 }
\ No newline at end of file
diff --git a/source/kernel/front/component/graphic/TileMap.cpp b/source/kernel/front/component/graphic/TileMap.cpp
index da61dc8..252c86f 100644
--- a/source/kernel/front/component/graphic/TileMap.cpp
+++ b/source/kernel/front/component/graphic/TileMap.cpp
@@ -3,23 +3,19 @@
 namespace megu::kernel {
     UniqueGraphicLinker<TileArray> Tilemap::_Linker = UniqueGraphicLinker<TileArray>();
 
-    Tilemap::Tilemap(const std::filesystem::path & path, size_t width, size_t height, float size, size_t lenght) 
-    : TileArray(path, width , height, size), _tileSize(lenght) {
+    Tilemap::Tilemap(const std::filesystem::path & path, size_t width, size_t height, float size, size_t lenght, double aUpdate) 
+    : TileArray(path, width , height, size), _tileSize(lenght), _duration(aUpdate) {
         if(lenght % width != 0 && lenght % height != 0) {
             throw std::runtime_error("Tilemap dimension not matching tiles size.");
         }
 
-        size_t i = 0, j = 0;
-        for(size_t x = 0; x < this->texture().width(); x += this->_tileSize) {
-            j = 0;
-            for(size_t y = 0; y < this->texture().height(); y += this->_tileSize) {
-                this->_tilesPosition.push_back({j * this->_tileSize, i * this->_tileSize});
-                ++j;
+        for(size_t x = 0; x < this->texture().width() - this->_tileSize*2; x += this->_tileSize) {
+            for(size_t y = 0; y < this->texture().height() - this->_tileSize*2; y += this->_tileSize) {
+                this->_tilesPosition.push_back({y, x});
             }
-            ++i;
         }
         
-        i = 0;
+        size_t i = 0;
         for(size_t x = 0; x < width * this->_tileSize; x += this->_tileSize) {
             this->_tilesValue.push_back({});
             for(size_t y = 0; y < height * this->_tileSize; y += this->_tileSize) {
@@ -38,11 +34,11 @@ namespace megu::kernel {
     void Tilemap::setValue(size_t x, size_t y, size_t value) {
         TilePosition position = this->_tilesPosition[value];
         glm::vec4 uv = {position.x, 
-                        this->texture().height() - position.y - this->_tileSize, 
+                        this->texture().height()  - position.y - this->_tileSize, 
                         this->_tileSize, 
                         this->_tileSize};
 
-        this->setUv(x, this->width() - 1 - y, uv);
+        this->setUv(this->height() - 1 - y, x, uv);
         this->_tilesValue[x][y] = value;
     }
 
@@ -53,8 +49,28 @@ namespace megu::kernel {
         throw std::runtime_error("Tilemap coords out of bound");
     }
 
+    void Tilemap::addAnimation(size_t x, size_t y, const std::vector<size_t> & ids) {
+        this->_animations[{x, y}] = std::pair<std::vector<size_t>, size_t>(ids, 0);
+    }
+
+    void Tilemap::removeAnimation(size_t x, size_t y) {
+        this->_animations.erase({x, y});
+    }
+
     void Tilemap::update(double time) {
         //... Peut-être des tiles animées si j'ai le temps 🙌 (spoiler non).
+        if(this->_previous == 0.0) {
+            this->_previous = time;
+        }
+        else {
+            if(time - this->_previous > this->_duration) {
+                for(auto & [coords, animation] : this->_animations) {
+                    animation.second = (animation.second+1) % animation.first.size();
+                    this->setValue(coords.x, coords.y, animation.first[animation.second]);
+                }
+                this->_previous = time;
+            }
+        }
     }
 
     void Tilemap::apply(Kernel & kernel, GraphicEngine & engine) {
diff --git a/source/kernel/front/component/graphic/TileMap.hpp b/source/kernel/front/component/graphic/TileMap.hpp
index 3834953..39f43c8 100644
--- a/source/kernel/front/component/graphic/TileMap.hpp
+++ b/source/kernel/front/component/graphic/TileMap.hpp
@@ -25,19 +25,25 @@ namespace megu::kernel {
                 }
             };
 
-            Tilemap(const std::filesystem::path &, size_t, size_t, float, size_t);
+            Tilemap(const std::filesystem::path &, size_t, size_t, float, size_t, double = 0.1);
 
             void setValue(size_t, size_t, size_t);
             size_t getValue(size_t, size_t);
 
+            void addAnimation(size_t, size_t, const std::vector<size_t> &);
+            void removeAnimation(size_t, size_t);
+
             void update(double) override;
             void apply(Kernel &, GraphicEngine &) override;
 
         private:
             std::vector<TilePosition> _tilesPosition;
             std::vector<std::vector<size_t>> _tilesValue;
+            std::map<TilePosition, std::pair<std::vector<size_t>, size_t>> _animations;
             TileArray_Module _module;
             size_t _tileSize;
+            double _duration;
+            double _previous;
 
             static UniqueGraphicLinker<TileArray> _Linker;
     };
-- 
GitLab