From e6053f94729abbabd2581c7895f5885002c5e7cf Mon Sep 17 00:00:00 2001 From: a dinosaur Date: Thu, 11 Apr 2024 10:36:16 +1000 Subject: [PATCH] restore object reading --- src/tmx2gba.cpp | 3 +-- src/tmxmap.cpp | 22 +++++++++++++++++----- src/tmxmap.hpp | 15 ++++++++------- src/tmxobject.hpp | 27 ++++++++++++++++++++++----- src/tmxreader.cpp | 38 ++++++++++++++------------------------ 5 files changed, 62 insertions(+), 43 deletions(-) diff --git a/src/tmx2gba.cpp b/src/tmx2gba.cpp index e5c74f7..3fafd20 100644 --- a/src/tmx2gba.cpp +++ b/src/tmx2gba.cpp @@ -198,8 +198,7 @@ int main(int argc, char** argv) // Convert to GBA-friendly charmap data { std::vector charDat; - if (!convert::ConvertCharmap(charDat, p.offset, p.palette, tmx)) - return 1; + if (!convert::ConvertCharmap(charDat, p.offset, p.palette, tmx)) { return 1; } // Write out charmap outH.WriteSize(tmx.GetSize().width, tmx.GetSize().height); diff --git a/src/tmxmap.cpp b/src/tmxmap.cpp index 3248963..56e9f9b 100644 --- a/src/tmxmap.cpp +++ b/src/tmxmap.cpp @@ -180,18 +180,30 @@ void TmxMap::ReadLayer(const pugi::xml_node& xNode) mLayers.emplace_back(TmxLayer(width, height, name, std::move(tileDat))); } -void TmxMap::ReadObjects(const pugi::xml_node& xNode) +void TmxMap::ReadObjectGroup(const pugi::xml_node& xNode) { - for (const auto it : xNode.children("object")) + std::string_view name(xNode.value()); + std::vector objects; + + const auto xObjects = xNode.children("object"); + //mObjects.reserve(xObjects.size()) + for (const auto it : xObjects) { + int id = IntFromStr(it.attribute("id").value()).value_or(0); std::string_view name = it.attribute("name").value(); - // Read position + // Read axis-aligned bounding box auto x = FloatFromStr(it.attribute("x").value()).value_or(0.0f); auto y = FloatFromStr(it.attribute("y").value()).value_or(0.0f); + auto width = FloatFromStr(it.attribute("width").value()).value_or(0.0f); + auto height = FloatFromStr(it.attribute("height").value()).value_or(0.0f); - mObjects.emplace_back(TmxObject(name, x, y)); + objects.emplace_back(TmxObject(id, name, { x, y, width, height })); } + + if (objects.empty()) + return; //FIXME: log this + mObjectGroups.emplace_back(TmxObjectGroup(name, std::move(objects))); } bool TmxMap::Load(const std::string& inPath) @@ -217,7 +229,7 @@ bool TmxMap::Load(const std::string& inPath) std::string_view name(it.name()); if (!name.compare("layer")) { ReadLayer(it); } else if (!name.compare("tileset")) { ReadTileset(it); } - else if (!name.compare("objectgroup")) { ReadObjects(it); } + else if (!name.compare("objectgroup")) { ReadObjectGroup(it); } } return true; diff --git a/src/tmxmap.hpp b/src/tmxmap.hpp index d415c6d..173e931 100644 --- a/src/tmxmap.hpp +++ b/src/tmxmap.hpp @@ -18,20 +18,21 @@ class TmxMap { int mWidth = 0, mHeight = 0; - std::vector mLayers; - std::vector mTilesets; - std::vector mObjects; + std::vector mLayers; + std::vector mTilesets; + std::vector mObjectGroups; void ReadTileset(const pugi::xml_node& xNode); void ReadLayer(const pugi::xml_node& xNode); - void ReadObjects(const pugi::xml_node& xNode); + void ReadObjectGroup(const pugi::xml_node& xNode); public: [[nodiscard]] bool Load(const std::string& inPath); - constexpr std::pair TileCount() const noexcept { return { mWidth, mHeight }; } - constexpr const std::vector& Tilesets() const noexcept { return mTilesets; } - constexpr const std::vector& Layers() const noexcept { return mLayers; } + [[nodiscard]] constexpr std::pair TileCount() const noexcept { return { mWidth, mHeight }; } + [[nodiscard]] constexpr const std::vector& Tilesets() const noexcept { return mTilesets; } + [[nodiscard]] constexpr const std::vector& Layers() const noexcept { return mLayers; } + [[nodiscard]] constexpr const std::vector& ObjectGroups() const noexcept { return mObjectGroups; } }; #endif//TMXMAP_HPP diff --git a/src/tmxobject.hpp b/src/tmxobject.hpp index 7e6dbfd..085306c 100644 --- a/src/tmxobject.hpp +++ b/src/tmxobject.hpp @@ -5,22 +5,39 @@ #define TMXOBJECT_HPP #include +#include +#include #include class TmxObject { public: - TmxObject(std::string_view name, float x, float y) : mName(name), mPos{ x, y } {} - template - struct Position { T x, y; }; + struct AABB { T x, y, w, h; }; + TmxObject(int id, std::string_view name, AABB&& box) : mId(id), mName(name), mBox(std::move(box)) {} + + constexpr int Id() const noexcept { return mId; } const std::string_view Name() const noexcept { return mName; } - constexpr Position Pos() const noexcept { return mPos; } + constexpr const AABB& Box() const noexcept { return mBox; } private: + int mId; std::string mName; - Position mPos; + AABB mBox; +}; + +class TmxObjectGroup +{ + std::string mName; + std::vector mObjects; + +public: + TmxObjectGroup(std::string_view name, std::vector&& objects) + : mName(name), mObjects(std::move(objects)) {} + + const std::string_view Name() const noexcept { return mName; } + constexpr const std::vector& Objects() const noexcept { return mObjects; } }; #endif//TMXOBJECT_HPP diff --git a/src/tmxreader.cpp b/src/tmxreader.cpp index 1b523b0..920932c 100644 --- a/src/tmxreader.cpp +++ b/src/tmxreader.cpp @@ -21,10 +21,7 @@ TmxReader::Error TmxReader::Open(const std::string& inPath, using std::optional; using std::reference_wrapper; - optional> layerGfx; - optional> layerCls; - optional> layerPal; - optional>> objGroups; + optional> layerGfx, layerCls, layerPal; // Read layers for (const auto& layer : map.Layers()) @@ -37,12 +34,6 @@ TmxReader::Error TmxReader::Open(const std::string& inPath, if (!layerGfx.has_value() && (graphicsName.empty() || name == graphicsName)) { layerGfx = layer; } if (!collisionName.empty() && !layerCls.has_value() && name == collisionName) { layerCls = layer; } if (!paletteName.empty() && !layerPal.has_value() && name == paletteName) { layerPal = layer; } - /* - else if (!objMapping.empty() && layer->getType() == tmx::Layer::Type::Object) - { - objGroups.emplace_back(layer->getLayerAs()); - } - */ } // Check layers @@ -89,31 +80,30 @@ TmxReader::Error TmxReader::Open(const std::string& inPath, [](const auto& it) { return it.GidRange(); }); // Read objects - /* - if (!objMapping.empty()) + if (!map.ObjectGroups().empty()) { - for (const auto& group : objGroups) + std::vector objs; + for (const auto& group : map.ObjectGroups()) { - const auto& tmxObjects = group.get().Objects(); - v.reserve(v.size() + tmxObjects.size()); + const auto& tmxObjects = group.Objects(); + objs.reserve(objs.size() + tmxObjects.size()); for (const auto& tmxObj : tmxObjects) { auto it = objMapping.find(std::string(tmxObj.Name())); if (it == objMapping.end()) continue; - const auto& pos = tmxObj.Pos(); - Object obj; - obj.id = it->second; - obj.x = pos.x; - obj.y = pos.y; - - v.emplace_back(obj); + const auto& aabb = tmxObj.Box(); + objs.emplace_back(Object + { + .id = it->second, + .x = aabb.x, + .y = aabb.y + }); } } - mObjects.emplace(v); + mObjects.emplace(objs); } - */ return Error::OK; }