diff options
Diffstat (limited to 'mwe/resource-manager/map_layer.cpp')
-rw-r--r-- | mwe/resource-manager/map_layer.cpp | 199 |
1 files changed, 100 insertions, 99 deletions
diff --git a/mwe/resource-manager/map_layer.cpp b/mwe/resource-manager/map_layer.cpp index 791972d..6339707 100644 --- a/mwe/resource-manager/map_layer.cpp +++ b/mwe/resource-manager/map_layer.cpp @@ -5,105 +5,106 @@ #include <tmxlite/Layer.hpp> #include <tmxlite/TileLayer.hpp> - - -MapLayer::MapLayer(){} - -MapLayer::~MapLayer(){ - m_subsets.clear(); -} - -bool MapLayer::create(const tmx::Map& map, std::uint32_t layerIndex, const std::vector<TextureMap*>& textures) -{ - const auto& layers = map.getLayers(); - assert(layers[layerIndex]->getType() == tmx::Layer::Type::Tile); - - const auto& layer = layers[layerIndex]->getLayerAs<tmx::TileLayer>(); - const auto mapSize = map.getTileCount(); - const auto mapTileSize = map.getTileSize(); - const auto& tileSets = map.getTilesets(); - - const auto tintColour = layer.getTintColour(); - const SDL_Colour vertColour = - { - tintColour.r, - tintColour.g, - tintColour.b, - tintColour.a - }; - - for (auto i = 0u; i < tileSets.size(); ++i) - { - //check tile ID to see if it falls within the current tile set - const auto& ts = tileSets[i]; - const auto& tileIDs = layer.getTiles(); - - const auto texSize = textures[i]->getSize(); - const auto tileCountX = texSize.x / mapTileSize.x; - const auto tileCountY = texSize.y / mapTileSize.y; - - const float uNorm = static_cast<float>(mapTileSize.x) / texSize.x; - const float vNorm = static_cast<float>(mapTileSize.y) / texSize.y; - - std::vector<SDL_Vertex> verts; - for (auto y = 0u; y < mapSize.y; ++y) - { - for (auto x = 0u; x < mapSize.x; ++x) - { - const auto idx = y * mapSize.x + x; - if (idx < tileIDs.size() && tileIDs[idx].ID >= ts.getFirstGID() - && tileIDs[idx].ID < (ts.getFirstGID() + ts.getTileCount())) - { - //tex coords - auto idIndex = (tileIDs[idx].ID - ts.getFirstGID()); - float u = static_cast<float>(idIndex % tileCountX); - float v = static_cast<float>(idIndex / tileCountY); - u *= mapTileSize.x; //TODO we should be using the tile set size, as this may be different from the map's grid size - v *= mapTileSize.y; - - //normalise the UV - u /= textures[i]->getSize().x; - v /= textures[i]->getSize().y; - - //vert pos - const float tilePosX = static_cast<float>(x) * mapTileSize.x; - const float tilePosY = (static_cast<float>(y) * mapTileSize.y); - - - //push back to vert array - SDL_Vertex vert = { { tilePosX, tilePosY }, vertColour, {u, v} }; - verts.emplace_back(vert); - vert = { { tilePosX + mapTileSize.x, tilePosY }, vertColour, {u + uNorm, v} }; - verts.emplace_back(vert); - vert = { { tilePosX, tilePosY + mapTileSize.y}, vertColour, {u, v + vNorm} }; - verts.emplace_back(vert); - - vert = { { tilePosX, tilePosY +mapTileSize.y}, vertColour, {u, v + vNorm} }; - verts.emplace_back(vert); - vert = { { tilePosX + mapTileSize.x, tilePosY }, vertColour, {u + uNorm, v} }; - verts.emplace_back(vert); - vert = { { tilePosX + mapTileSize.x, tilePosY + mapTileSize.y }, vertColour, {u + uNorm, v + vNorm} }; - verts.emplace_back(vert); - } - } - } - - if (!verts.empty()) - { - m_subsets.emplace_back(); - m_subsets.back().texture = *textures[i]; - m_subsets.back().vertexData.swap(verts); - } - } - - return true; +MapLayer::MapLayer() {} + +MapLayer::~MapLayer() { m_subsets.clear(); } + +bool MapLayer::create(const tmx::Map & map, std::uint32_t layerIndex, + const std::vector<TextureMap *> & textures) { + const auto & layers = map.getLayers(); + assert(layers[layerIndex]->getType() == tmx::Layer::Type::Tile); + + const auto & layer = layers[layerIndex]->getLayerAs<tmx::TileLayer>(); + const auto mapSize = map.getTileCount(); + const auto mapTileSize = map.getTileSize(); + const auto & tileSets = map.getTilesets(); + + const auto tintColour = layer.getTintColour(); + const SDL_Colour vertColour + = {tintColour.r, tintColour.g, tintColour.b, tintColour.a}; + + for (auto i = 0u; i < tileSets.size(); ++i) { + //check tile ID to see if it falls within the current tile set + const auto & ts = tileSets[i]; + const auto & tileIDs = layer.getTiles(); + + const auto texSize = textures[i]->getSize(); + const auto tileCountX = texSize.x / mapTileSize.x; + const auto tileCountY = texSize.y / mapTileSize.y; + + const float uNorm = static_cast<float>(mapTileSize.x) / texSize.x; + const float vNorm = static_cast<float>(mapTileSize.y) / texSize.y; + + std::vector<SDL_Vertex> verts; + for (auto y = 0u; y < mapSize.y; ++y) { + for (auto x = 0u; x < mapSize.x; ++x) { + const auto idx = y * mapSize.x + x; + if (idx < tileIDs.size() && tileIDs[idx].ID >= ts.getFirstGID() + && tileIDs[idx].ID + < (ts.getFirstGID() + ts.getTileCount())) { + //tex coords + auto idIndex = (tileIDs[idx].ID - ts.getFirstGID()); + float u = static_cast<float>(idIndex % tileCountX); + float v = static_cast<float>(idIndex / tileCountY); + u *= mapTileSize + .x; //TODO we should be using the tile set size, as this may be different from the map's grid size + v *= mapTileSize.y; + + //normalise the UV + u /= textures[i]->getSize().x; + v /= textures[i]->getSize().y; + + //vert pos + const float tilePosX + = static_cast<float>(x) * mapTileSize.x; + const float tilePosY + = (static_cast<float>(y) * mapTileSize.y); + + //push back to vert array + SDL_Vertex vert + = {{tilePosX, tilePosY}, vertColour, {u, v}}; + verts.emplace_back(vert); + vert = {{tilePosX + mapTileSize.x, tilePosY}, + vertColour, + {u + uNorm, v}}; + verts.emplace_back(vert); + vert = {{tilePosX, tilePosY + mapTileSize.y}, + vertColour, + {u, v + vNorm}}; + verts.emplace_back(vert); + + vert = {{tilePosX, tilePosY + mapTileSize.y}, + vertColour, + {u, v + vNorm}}; + verts.emplace_back(vert); + vert = {{tilePosX + mapTileSize.x, tilePosY}, + vertColour, + {u + uNorm, v}}; + verts.emplace_back(vert); + vert + = {{tilePosX + mapTileSize.x, tilePosY + mapTileSize.y}, + vertColour, + {u + uNorm, v + vNorm}}; + verts.emplace_back(vert); + } + } + } + + if (!verts.empty()) { + m_subsets.emplace_back(); + m_subsets.back().texture = *textures[i]; + m_subsets.back().vertexData.swap(verts); + } + } + + return true; } -void MapLayer::draw(SDL_Renderer* renderer) const -{ - assert(renderer); - for (const auto& s : m_subsets) - { - SDL_RenderGeometry(renderer, s.texture, s.vertexData.data(), static_cast<std::int32_t>(s.vertexData.size()), nullptr, 0); - } +void MapLayer::draw(SDL_Renderer * renderer) const { + assert(renderer); + for (const auto & s : m_subsets) { + SDL_RenderGeometry(renderer, s.texture, s.vertexData.data(), + static_cast<std::int32_t>(s.vertexData.size()), + nullptr, 0); + } } |