From e5218301b53da067299595f7da043946600882ea Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 19 Sep 2016 13:07:55 +0200 Subject: [PATCH] Graphics/TileMap: Add support for isometric tilemaps Former-commit-id: f89318c22ae2dcdab159f46dcfcbdb778af00ae6 [formerly 9912b85867bbb46cd785af9f3fe3a1dc72180149] [formerly a82344e574762f14805ea6c831a0a314cfe36a20 [formerly c234ec3cebd016381a38cd13f7d411511ae98164]] Former-commit-id: d170f0897b77bf29f984a8ddf9e5b193d63a5e60 [formerly 54a8819656b3c626c1485dbf5ccc8f015ad005f4] Former-commit-id: 0b0bf65c250219c29b27067b315a3735d8fbbd70 --- include/Nazara/Graphics/TileMap.hpp | 5 +++++ include/Nazara/Graphics/TileMap.inl | 30 ++++++++++++++++++++++++++++- src/Nazara/Graphics/TileMap.cpp | 7 ++++++- 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/include/Nazara/Graphics/TileMap.hpp b/include/Nazara/Graphics/TileMap.hpp index 89a901b9a..02371c33c 100644 --- a/include/Nazara/Graphics/TileMap.hpp +++ b/include/Nazara/Graphics/TileMap.hpp @@ -41,6 +41,8 @@ namespace Nz inline void DisableTiles(); inline void DisableTiles(const Vector2ui* tilesPos, std::size_t tileCount); + inline void EnableIsometricMode(bool isometric); + inline void EnableTile(const Vector2ui& tilePos, const Rectf& coords, const Color& color = Color::White, std::size_t materialIndex = 0U); inline void EnableTile(const Vector2ui& tilePos, const Rectui& rect, const Color& color = Color::White, std::size_t materialIndex = 0U); inline void EnableTiles(const Rectf& coords, const Color& color = Color::White, std::size_t materialIndex = 0U); @@ -55,6 +57,8 @@ namespace Nz inline const Tile& GetTile(const Vector2ui& tilePos) const; inline const Vector2f& GetTileSize() const; + inline bool IsIsometricModeEnabled() const; + inline void SetMaterial(std::size_t index, MaterialRef material); inline TileMap& operator=(const TileMap& TileMap); @@ -87,6 +91,7 @@ namespace Nz std::vector m_layers; Vector2ui m_mapSize; Vector2f m_tileSize; + bool m_isometricModeEnabled; static TileMapLibrary::LibraryMap s_library; }; diff --git a/include/Nazara/Graphics/TileMap.inl b/include/Nazara/Graphics/TileMap.inl index 405683f40..4473a8600 100644 --- a/include/Nazara/Graphics/TileMap.inl +++ b/include/Nazara/Graphics/TileMap.inl @@ -25,7 +25,8 @@ namespace Nz m_tiles(mapSize.x * mapSize.y), m_layers(materialCount), m_mapSize(mapSize), - m_tileSize(tileSize) + m_tileSize(tileSize), + m_isometricModeEnabled(false) { NazaraAssert(m_tiles.size() != 0U, "Invalid map size"); NazaraAssert(m_tileSize.x != 0U && m_tileSize.y != 0U, "Invalid tile size"); @@ -108,6 +109,22 @@ namespace Nz InvalidateInstanceData(invalidatedLayers); } + /*! + * \brief Enable/Disable isometric mode + * + * If enabled, every odd line will overlap by half the tile size with the upper line + * + * \param isometric Should the isometric mode be enabled for this TileMap + * + * \see IsIsometricModeEnabled + */ + inline void TileMap::EnableIsometricMode(bool isometric) + { + m_isometricModeEnabled = isometric; + + InvalidateInstanceData(0xFFFFFFFF); + } + /*! * \brief Enable and sets the tile at position tilePos * @@ -387,6 +404,17 @@ namespace Nz return m_tileSize; } + /*! + * \brief Gets the actual state of the isometric mode + * \return True if the isometric mode is enabled + * + * \see EnableIsometricMode + */ + inline bool TileMap::IsIsometricModeEnabled() const + { + return m_isometricModeEnabled; + } + /*! * \brief Sets a material of the TileMap * diff --git a/src/Nazara/Graphics/TileMap.cpp b/src/Nazara/Graphics/TileMap.cpp index 255685f43..ab035a7e4 100644 --- a/src/Nazara/Graphics/TileMap.cpp +++ b/src/Nazara/Graphics/TileMap.cpp @@ -68,7 +68,12 @@ namespace Nz std::size_t x = tileIndex % m_mapSize.x; std::size_t y = tileIndex / m_mapSize.x; - Vector3f tileLeftCorner(x * m_tileSize.x, y * -m_tileSize.y, 0.f); + + Vector3f tileLeftCorner; + if (m_isometricModeEnabled) + tileLeftCorner.Set(x * m_tileSize.x + m_tileSize.x/2.f * (y % 2), y/2.f * -m_tileSize.y, 0.f); + else + tileLeftCorner.Set(x * m_tileSize.x, y * -m_tileSize.y, 0.f); *colorPtr++ = tile.color; *posPtr++ = instanceData->transformMatrix.Transform(tileLeftCorner);