From ec017e07800cfd7c411b9725ef1d898ca74e0741 Mon Sep 17 00:00:00 2001 From: KiritoDv Date: Sun, 26 Jan 2025 20:11:36 -0600 Subject: [PATCH] Fixed macro and painting sm64 factories --- src/factories/sm64/MacroFactory.cpp | 56 ++++++++++++++++------- src/factories/sm64/MacroFactory.h | 9 +++- src/factories/sm64/PaintingMapFactory.cpp | 2 +- src/factories/sm64/macro/MacroPresets.h | 3 +- 4 files changed, 50 insertions(+), 20 deletions(-) diff --git a/src/factories/sm64/MacroFactory.cpp b/src/factories/sm64/MacroFactory.cpp index fd9bcfe..a35d9e7 100644 --- a/src/factories/sm64/MacroFactory.cpp +++ b/src/factories/sm64/MacroFactory.cpp @@ -36,7 +36,7 @@ ExportResult SM64::MacroCodeExporter::Export(std::ostream &write, std::shared_pt } write << object.preset << ", "; - write << "CONVERT_YAW(" << object.yaw << "), "; + write << (object.yaw / 1.41) << ", "; write << object.posX << ", "; write << object.posY << ", "; write << object.posZ; @@ -58,46 +58,68 @@ ExportResult SM64::MacroCodeExporter::Export(std::ostream &write, std::shared_pt ExportResult SM64::MacroBinaryExporter::Export(std::ostream &write, std::shared_ptr raw, std::string& entryName, YAML::Node &node, std::string* replacement ) { auto writer = LUS::BinaryWriter(); - auto macro = std::static_pointer_cast(raw); + auto macro = std::static_pointer_cast(raw); WriteHeader(writer, Torch::ResourceType::MacroObject, 0); writer.Write((uint32_t) macro->mMacroData.size()); + for(auto &entry : macro->mMacroData){ + writer.Write(entry); + } + /* for (auto &object : macro->mMacroData) { writer.Write(static_cast(object.preset)); - writer.Write((int16_t) std::round(object.yaw * 1.41)); + writer.Write(object.yaw); writer.Write(object.posX); writer.Write(object.posY); writer.Write(object.posZ); writer.Write(object.behParam); } - + */ + writer.Finish(write); return std::nullopt; } std::optional> SM64::MacroFactory::parse(std::vector& buffer, YAML::Node& node) { - std::vector macroData; auto [_, segment] = Decompressor::AutoDecode(node, buffer); LUS::BinaryReader reader(segment.data, segment.size); reader.SetEndianness(Torch::Endianness::Big); - while (true) { - auto presetYaw = reader.ReadInt16(); - if (presetYaw == 0x1E) { + std::vector entries; + + while(true) { + int16_t raw = reader.ReadInt16(); + if(raw == 0x1E){ break; } - int16_t yaw = ((presetYaw >> 9) & 0x7F) << 1; - int16_t preset = (presetYaw & 0x1FF) - 0x1F; - - auto posX = reader.ReadInt16(); - auto posY = reader.ReadInt16(); - auto posZ = reader.ReadInt16(); - auto behParam = reader.ReadInt16(); - macroData.emplace_back(static_cast(preset), yaw, posX, posY, posZ, behParam); + entries.push_back(raw); } - return std::make_shared(macroData); + /* + std::vector macroData; + while (true) { + int16_t presetID = reader.ReadInt16(); + + if(presetID < 0) { + break; + } + + int16_t yRot = reader.ReadInt16(); + int16_t xObj = reader.ReadInt16(); + int16_t yObj = reader.ReadInt16(); + int16_t zObj = reader.ReadInt16(); + int16_t params = reader.ReadInt16(); + + macroData.emplace_back(static_cast(presetID), yRot, xObj, yObj, zObj, params); + } + + macroData.emplace_back(MacroPresets::macro_invalid, -1, -1, -1, -1, -1); + + return std::make_shared(macroData); + */ + + return std::make_shared(entries); } diff --git a/src/factories/sm64/MacroFactory.h b/src/factories/sm64/MacroFactory.h index 4881e98..cab9a80 100644 --- a/src/factories/sm64/MacroFactory.h +++ b/src/factories/sm64/MacroFactory.h @@ -23,6 +23,13 @@ public: MacroData(std::vector macroData) : mMacroData(std::move(macroData)) {} }; +class MacroDataAlt : public IParsedData { +public: + std::vector mMacroData; + + MacroDataAlt(std::vector macroData) : mMacroData(std::move(macroData)) {} +}; + class MacroHeaderExporter : public BaseExporter { ExportResult Export(std::ostream& write, std::shared_ptr data, std::string& entryName, YAML::Node& node, std::string* replacement) override; }; @@ -40,7 +47,7 @@ public: std::optional> parse(std::vector& buffer, YAML::Node& data) override; inline std::unordered_map> GetExporters() override { return { - REGISTER(Code, MacroCodeExporter) +// REGISTER(Code, MacroCodeExporter) REGISTER(Header, MacroHeaderExporter) REGISTER(Binary, MacroBinaryExporter) }; diff --git a/src/factories/sm64/PaintingMapFactory.cpp b/src/factories/sm64/PaintingMapFactory.cpp index 677906d..407cc9a 100644 --- a/src/factories/sm64/PaintingMapFactory.cpp +++ b/src/factories/sm64/PaintingMapFactory.cpp @@ -39,7 +39,7 @@ ExportResult SM64::PaintingMapCodeExporter::Export(std::ostream &write, std::sha for (auto &group : paintingData->mPaintingGroups) { write << fourSpaceTab; - write << group.x << ", " << group.y << ", " << group.z << ", " << ",\n"; + write << group.x << ", " << group.y << ", " << group.z << ",\n"; } write << "};\n"; diff --git a/src/factories/sm64/macro/MacroPresets.h b/src/factories/sm64/macro/MacroPresets.h index 964e0cc..32166a0 100644 --- a/src/factories/sm64/macro/MacroPresets.h +++ b/src/factories/sm64/macro/MacroPresets.h @@ -370,7 +370,8 @@ enum class MacroPresets { macro_empty_362, macro_empty_363, macro_empty_364, - macro_empty_365 + macro_empty_365, + macro_invalid = -1 }; inline std::ostream& operator<<(std::ostream& out, const MacroPresets& preset) {