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
This commit is contained in:
parent
48eb9ee3b5
commit
e5218301b5
|
|
@ -41,6 +41,8 @@ namespace Nz
|
||||||
inline void DisableTiles();
|
inline void DisableTiles();
|
||||||
inline void DisableTiles(const Vector2ui* tilesPos, std::size_t tileCount);
|
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 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 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);
|
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 Tile& GetTile(const Vector2ui& tilePos) const;
|
||||||
inline const Vector2f& GetTileSize() const;
|
inline const Vector2f& GetTileSize() const;
|
||||||
|
|
||||||
|
inline bool IsIsometricModeEnabled() const;
|
||||||
|
|
||||||
inline void SetMaterial(std::size_t index, MaterialRef material);
|
inline void SetMaterial(std::size_t index, MaterialRef material);
|
||||||
|
|
||||||
inline TileMap& operator=(const TileMap& TileMap);
|
inline TileMap& operator=(const TileMap& TileMap);
|
||||||
|
|
@ -87,6 +91,7 @@ namespace Nz
|
||||||
std::vector<Layer> m_layers;
|
std::vector<Layer> m_layers;
|
||||||
Vector2ui m_mapSize;
|
Vector2ui m_mapSize;
|
||||||
Vector2f m_tileSize;
|
Vector2f m_tileSize;
|
||||||
|
bool m_isometricModeEnabled;
|
||||||
|
|
||||||
static TileMapLibrary::LibraryMap s_library;
|
static TileMapLibrary::LibraryMap s_library;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,8 @@ namespace Nz
|
||||||
m_tiles(mapSize.x * mapSize.y),
|
m_tiles(mapSize.x * mapSize.y),
|
||||||
m_layers(materialCount),
|
m_layers(materialCount),
|
||||||
m_mapSize(mapSize),
|
m_mapSize(mapSize),
|
||||||
m_tileSize(tileSize)
|
m_tileSize(tileSize),
|
||||||
|
m_isometricModeEnabled(false)
|
||||||
{
|
{
|
||||||
NazaraAssert(m_tiles.size() != 0U, "Invalid map size");
|
NazaraAssert(m_tiles.size() != 0U, "Invalid map size");
|
||||||
NazaraAssert(m_tileSize.x != 0U && m_tileSize.y != 0U, "Invalid tile size");
|
NazaraAssert(m_tileSize.x != 0U && m_tileSize.y != 0U, "Invalid tile size");
|
||||||
|
|
@ -108,6 +109,22 @@ namespace Nz
|
||||||
InvalidateInstanceData(invalidatedLayers);
|
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
|
* \brief Enable and sets the tile at position tilePos
|
||||||
*
|
*
|
||||||
|
|
@ -387,6 +404,17 @@ namespace Nz
|
||||||
return m_tileSize;
|
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
|
* \brief Sets a material of the TileMap
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -68,7 +68,12 @@ namespace Nz
|
||||||
|
|
||||||
std::size_t x = tileIndex % m_mapSize.x;
|
std::size_t x = tileIndex % m_mapSize.x;
|
||||||
std::size_t y = 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;
|
*colorPtr++ = tile.color;
|
||||||
*posPtr++ = instanceData->transformMatrix.Transform(tileLeftCorner);
|
*posPtr++ = instanceData->transformMatrix.Transform(tileLeftCorner);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue