From 9cdd5902c5496309d6705b23cea14bacff6a3e4b Mon Sep 17 00:00:00 2001 From: MegaMech <7255464+MegaMech@users.noreply.github.com> Date: Mon, 14 Apr 2025 18:33:55 -0600 Subject: [PATCH] Import fast64 paths --- src/port/Engine.cpp | 3 ++ .../importers/TrackWaypointFactory.cpp | 39 +++++++++++++++++++ .../resource/importers/TrackWaypointFactory.h | 7 ++++ src/port/resource/type/TrackWaypoint.cpp | 18 +++++++++ src/port/resource/type/TrackWaypoint.h | 15 +++++++ 5 files changed, 82 insertions(+) diff --git a/src/port/Engine.cpp b/src/port/Engine.cpp index d1c61e6fa..ce214ee27 100644 --- a/src/port/Engine.cpp +++ b/src/port/Engine.cpp @@ -158,6 +158,9 @@ GameEngine::GameEngine() { loader->RegisterResourceFactory(std::make_shared(), RESOURCE_FORMAT_BINARY, "Waypoints", static_cast(MK64::ResourceType::Waypoints), 0); + loader->RegisterResourceFactory(std::make_shared(), + RESOURCE_FORMAT_XML, "Paths", + static_cast(MK64::ResourceType::Waypoints), 0); loader->RegisterResourceFactory(std::make_shared(), RESOURCE_FORMAT_BINARY, "SpawnData", static_cast(MK64::ResourceType::SpawnData), 0); diff --git a/src/port/resource/importers/TrackWaypointFactory.cpp b/src/port/resource/importers/TrackWaypointFactory.cpp index 0034cc607..4975e018b 100644 --- a/src/port/resource/importers/TrackWaypointFactory.cpp +++ b/src/port/resource/importers/TrackWaypointFactory.cpp @@ -29,4 +29,43 @@ ResourceFactoryBinaryTrackWaypointsV0::ReadResource(std::shared_ptr return section; } + +std::shared_ptr +ResourceFactoryXMLTrackWaypointsV0::ReadResource(std::shared_ptr file, + std::shared_ptr initData) { + if (!FileHasValidFormatAndReader(file, initData)) { + return nullptr; + } + + auto paths = std::make_shared(initData); + + auto root = std::get>(file->Reader)->FirstChildElement(); + + auto path = root->FirstChildElement("TrackWaypoint"); + + while (path != nullptr) { + + std::vector waypointPath; // Temporary container for this path + + auto pointElem = path->FirstChildElement("Point"); + + while (pointElem != nullptr) { + TrackWaypoint point; + point.posX = pointElem->IntAttribute("X"); + point.posY = pointElem->IntAttribute("Y"); + point.posZ = pointElem->IntAttribute("Z"); + point.trackSegment = pointElem->IntAttribute("ID"); + + waypointPath.push_back(point); // Push to temp vector + + pointElem = pointElem->NextSiblingElement("Point"); + } + + paths->PathList.push_back(waypointPath); // Push full path to outer list + + path = path->NextSiblingElement("TrackWaypoint"); + } + return paths; +} + } // namespace MK64 diff --git a/src/port/resource/importers/TrackWaypointFactory.h b/src/port/resource/importers/TrackWaypointFactory.h index 311cd32b5..c2184a581 100644 --- a/src/port/resource/importers/TrackWaypointFactory.h +++ b/src/port/resource/importers/TrackWaypointFactory.h @@ -2,6 +2,7 @@ #include "Resource.h" #include "ResourceFactoryBinary.h" +#include "ResourceFactoryXML.h" namespace MK64 { class ResourceFactoryBinaryTrackWaypointsV0 : public Ship::ResourceFactoryBinary { @@ -10,4 +11,10 @@ class ResourceFactoryBinaryTrackWaypointsV0 : public Ship::ResourceFactoryBinary std::shared_ptr initData) override; }; +class ResourceFactoryXMLTrackWaypointsV0 : public Ship::ResourceFactoryXML { + public: + std::shared_ptr ReadResource(std::shared_ptr file, + std::shared_ptr initData) override; +}; + } // namespace MK64 diff --git a/src/port/resource/type/TrackWaypoint.cpp b/src/port/resource/type/TrackWaypoint.cpp index 4270304ac..56ec1c760 100644 --- a/src/port/resource/type/TrackWaypoint.cpp +++ b/src/port/resource/type/TrackWaypoint.cpp @@ -12,4 +12,22 @@ TrackWaypoint* TrackWaypoints::GetPointer() { size_t TrackWaypoints::GetPointerSize() { return TrackWaypointList.size() * sizeof(TrackWaypoint); } + + +Paths::Paths() : Resource(std::shared_ptr()) { +} + +// I don't know how to return this properly +TrackWaypoint* Paths::GetPointer() { + return nullptr; +} + +size_t Paths::GetPointerSize() { + size_t totalWaypoints = 0; + for (const auto& path : PathList) { + totalWaypoints += path.size(); + } + return totalWaypoints * sizeof(TrackWaypoint); +} + } // namespace MK64 diff --git a/src/port/resource/type/TrackWaypoint.h b/src/port/resource/type/TrackWaypoint.h index c038c1b19..54176bae0 100644 --- a/src/port/resource/type/TrackWaypoint.h +++ b/src/port/resource/type/TrackWaypoint.h @@ -12,6 +12,7 @@ struct TrackWaypoint { }; namespace MK64 { +// Used for binary import from torch class TrackWaypoints : public Ship::Resource { public: using Resource::Resource; @@ -23,4 +24,18 @@ class TrackWaypoints : public Ship::Resource { std::vector TrackWaypointList; }; + +// Used for xml +class Paths : public Ship::Resource { + public: + using Resource::Resource; + + Paths(); + + TrackWaypoint* GetPointer() override; + size_t GetPointerSize() override; + + std::vector> PathList; +}; + } // namespace MK64