From 81f4371c2083c5f31c8abc07592d25c9f69741a6 Mon Sep 17 00:00:00 2001 From: MegaMech Date: Sun, 24 Mar 2024 21:27:07 -0600 Subject: Add Include Factory (#51) * Add Include Factory * Fix * Fixes * Update --------- Co-authored-by: = <=> --- src/Companion.cpp | 33 +++++++++++++++------------ src/factories/IncludeFactory.cpp | 48 ++++++++++++++++++++++++++++++++++++++++ src/factories/IncludeFactory.h | 37 +++++++++++++++++++++++++++++++ src/factories/TextureFactory.cpp | 4 +++- 4 files changed, 107 insertions(+), 15 deletions(-) create mode 100644 src/factories/IncludeFactory.cpp create mode 100644 src/factories/IncludeFactory.h diff --git a/src/Companion.cpp b/src/Companion.cpp index 687941c..b6d2605 100644 --- a/src/Companion.cpp +++ b/src/Companion.cpp @@ -1,13 +1,16 @@ #include "Companion.h" -#include "storm/SWrapper.h" #include "utils/Decompressor.h" +#include "utils/TorchUtils.h" +#include "storm/SWrapper.h" +#include "spdlog/spdlog.h" +#include "hj/sha1.h" + +#include +#include +#include +#include -#include "factories/sm64/AnimationFactory.h" -#include "factories/sm64/DialogFactory.h" -#include "factories/sm64/DictionaryFactory.h" -#include "factories/sm64/TextFactory.h" -#include "factories/sm64/GeoLayoutFactory.h" #include "factories/BankFactory.h" #include "factories/AudioHeaderFactory.h" #include "factories/SampleFactory.h" @@ -15,23 +18,26 @@ #include "factories/VtxFactory.h" #include "factories/MtxFactory.h" #include "factories/FloatFactory.h" +#include "factories/IncludeFactory.h" #include "factories/TextureFactory.h" #include "factories/DisplayListFactory.h" #include "factories/DisplayListOverrides.h" #include "factories/BlobFactory.h" #include "factories/LightsFactory.h" #include "factories/Vec3fFactory.h" + +#include "factories/sm64/AnimationFactory.h" +#include "factories/sm64/DialogFactory.h" +#include "factories/sm64/DictionaryFactory.h" +#include "factories/sm64/TextFactory.h" +#include "factories/sm64/GeoLayoutFactory.h" + #include "factories/mk64/CourseVtx.h" #include "factories/mk64/Waypoints.h" #include "factories/mk64/TrackSections.h" #include "factories/mk64/SpawnData.h" #include "factories/mk64/DrivingBehaviour.h" -#include "spdlog/spdlog.h" -#include "hj/sha1.h" -#include -#include -#include #include "factories/sf64/ColPolyFactory.h" #include "factories/sf64/MessageFactory.h" #include "factories/sf64/MessageLookupFactory.h" @@ -42,8 +48,6 @@ #include "factories/sf64/EnvSettingsFactory.h" #include "factories/sf64/ObjInitFactory.h" #include "factories/sf64/TriangleFactory.h" -#include -#include "utils/TorchUtils.h" using namespace std::chrono; namespace fs = std::filesystem; @@ -64,6 +68,7 @@ void Companion::Init(const ExportType type) { this->RegisterFactory("VTX", std::make_shared()); this->RegisterFactory("MTX", std::make_shared()); this->RegisterFactory("F32", std::make_shared()); + this->RegisterFactory("INC", std::make_shared()); this->RegisterFactory("LIGHTS", std::make_shared()); this->RegisterFactory("GFX", std::make_shared()); this->RegisterFactory("AUDIO:HEADER", std::make_shared()); @@ -166,7 +171,7 @@ void Companion::ExtractNode(YAML::Node& node, std::string& name, SWrapper* binar auto factory = this->GetFactory(type); if(!factory.has_value()){ - SPDLOG_ERROR("No factory found for {}", name); + throw std::runtime_error("No factory by the name '"+type+"' found for '"+name+"'"); return; } diff --git a/src/factories/IncludeFactory.cpp b/src/factories/IncludeFactory.cpp new file mode 100644 index 0000000..bf3d268 --- /dev/null +++ b/src/factories/IncludeFactory.cpp @@ -0,0 +1,48 @@ +#include "IncludeFactory.h" +#include "spdlog/spdlog.h" + +#include "Companion.h" +#include "utils/Decompressor.h" + +#define NUM(x) std::dec << std::setfill(' ') << std::setw(6) << x +#define COL(c) std::dec << std::setfill(' ') << std::setw(3) << c + +ExportResult IncludeHeaderExporter::Export(std::ostream &write, std::shared_ptr raw, std::string& entryName, YAML::Node &node, std::string* replacement) { + const auto symbol = GetSafeNode(node, "symbol", entryName); + auto ctype = GetSafeNode(node, "ctype"); + + if(Companion::Instance->IsOTRMode()){ + write << "static const char " << symbol << "[] = \"__OTR__" << (*replacement) << "\";\n\n"; + return std::nullopt; + } + + write << "extern " << ctype << " " << symbol << "[];\n"; + return std::nullopt; +} + +ExportResult IncludeCodeExporter::Export(std::ostream &write, std::shared_ptr raw, std::string& entryName, YAML::Node &node, std::string* replacement ) { + const auto symbol = GetSafeNode(node, "symbol", entryName); + const auto file = GetSafeNode(node, "file_path"); + const auto ctype = GetSafeNode(node, "ctype"); + SPDLOG_INFO("writing INC"); + write << ctype << " " << symbol << "[] = {\n"; + + write << fourSpaceTab << "#include '" << file << "'\n"; + + write << "};\n\n"; + + return std::nullopt; +} + +ExportResult IncludeBinaryExporter::Export(std::ostream &write, std::shared_ptr raw, std::string& entryName, YAML::Node &node, std::string* replacement ) { + throw std::runtime_error("Include factory should not be used for otr/o2r mode."); + return std::nullopt; +} + +std::optional> IncludeFactory::parse(std::vector& buffer, YAML::Node& node) { + + SPDLOG_INFO("parsing INC"); + const uint32_t blank = 1; + + return std::make_shared(blank); +} \ No newline at end of file diff --git a/src/factories/IncludeFactory.h b/src/factories/IncludeFactory.h new file mode 100644 index 0000000..6d39a96 --- /dev/null +++ b/src/factories/IncludeFactory.h @@ -0,0 +1,37 @@ +#pragma once + +#include "BaseFactory.h" + +class IncludeData : public IParsedData { +public: + uint32_t blanks; + + explicit IncludeData(uint32_t blank) : blanks(blank) {} +}; + +class IncludeHeaderExporter : public BaseExporter { + ExportResult Export(std::ostream& write, std::shared_ptr data, std::string& entryName, YAML::Node& node, std::string* replacement) override; +}; + +class IncludeBinaryExporter : public BaseExporter { + ExportResult Export(std::ostream& write, std::shared_ptr data, std::string& entryName, YAML::Node& node, std::string* replacement) override; +}; + +class IncludeCodeExporter : public BaseExporter { + ExportResult Export(std::ostream& write, std::shared_ptr data, std::string& entryName, YAML::Node& node, std::string* replacement) override; +}; + +class IncludeFactory : public BaseFactory { +public: + std::optional> parse(std::vector& buffer, YAML::Node& data) override; + inline std::unordered_map> GetExporters() override { + return { + REGISTER(Code, IncludeCodeExporter) + REGISTER(Header, IncludeHeaderExporter) + REGISTER(Binary, IncludeBinaryExporter) + }; + } + uint32_t GetAlignment() override { + return 8; + }; +}; \ No newline at end of file diff --git a/src/factories/TextureFactory.cpp b/src/factories/TextureFactory.cpp index d30cb7b..9d24c5c 100644 --- a/src/factories/TextureFactory.cpp +++ b/src/factories/TextureFactory.cpp @@ -174,8 +174,10 @@ ExportResult TextureCodeExporter::Export(std::ostream &write, std::shared_ptrIsDebug()) { - write << "// size: 0x" << std::hex << std::uppercase << sz << "\n"; + write << "// size: 0x" << std::hex << std::uppercase << sz; } + + write << "\n"; } return offset + data.size(); } -- cgit v1.2.3