diff options
| -rw-r--r-- | src/Companion.cpp | 38 | ||||
| -rw-r--r-- | src/Companion.h | 9 | ||||
| -rw-r--r-- | src/factories/CompressedTextureFactory.cpp | 4 | ||||
| -rw-r--r-- | src/factories/TextureFactory.cpp | 4 | ||||
| -rw-r--r-- | src/main.cpp | 20 |
5 files changed, 51 insertions, 24 deletions
diff --git a/src/Companion.cpp b/src/Companion.cpp index 762ebd3..61cdf4c 100644 --- a/src/Companion.cpp +++ b/src/Companion.cpp @@ -475,7 +475,7 @@ void Companion::ParseCurrentFileConfig(YAML::Node node) { } void Companion::ParseHash() { - const std::string out = this->gDestinationPath / "torch.hash.yml"; + const std::string out = this->gDestinationDirectory / "torch.hash.yml"; if(fs::exists(out)) { this->gHashNode = YAML::LoadFile(out); @@ -506,9 +506,10 @@ bool Companion::NodeHasChanges(const std::string& path) { const std::vector<uint8_t> data = std::vector<uint8_t>(std::istreambuf_iterator( yaml ), {}); this->gCurrentHash = CalculateHash(data); bool needsInit = true; + auto srcRelativePath = RelativePathToSrcDir(path); - if(this->gHashNode[path]) { - auto entry = GetSafeNode<YAML::Node>(this->gHashNode, path); + if(this->gHashNode[srcRelativePath]) { + auto entry = GetSafeNode<YAML::Node>(this->gHashNode, srcRelativePath); const auto hash = GetSafeNode<std::string>(entry, "hash", "no-hash"); auto modes = GetSafeNode<YAML::Node>(entry, "extracted"); auto extracted = GetSafeNode<bool>(modes, ExportTypeToString(this->gConfig.exporterType)); @@ -516,18 +517,18 @@ bool Companion::NodeHasChanges(const std::string& path) { if(hash == this->gCurrentHash) { needsInit = false; if(extracted) { - SPDLOG_INFO("Skipping {} as it has not changed", path); + SPDLOG_INFO("Skipping {} as it has not changed", srcRelativePath); return false; } } } if(needsInit) { - this->gHashNode[path] = YAML::Node(); - this->gHashNode[path]["hash"] = this->gCurrentHash; - this->gHashNode[path]["extracted"] = YAML::Node(); + this->gHashNode[srcRelativePath] = YAML::Node(); + this->gHashNode[srcRelativePath]["hash"] = this->gCurrentHash; + this->gHashNode[srcRelativePath]["extracted"] = YAML::Node(); for(size_t m = 0; m <= static_cast<size_t>(ExportType::Modding); m++) { - this->gHashNode[path]["extracted"][ExportTypeToString(static_cast<ExportType>(m))] = false; + this->gHashNode[srcRelativePath]["extracted"][ExportTypeToString(static_cast<ExportType>(m))] = false; } } @@ -977,7 +978,7 @@ void Companion::ProcessFile(YAML::Node root) { } if(this->gConfig.exporterType != ExportType::Binary) { - this->gHashNode[this->gCurrentFile]["extracted"][ExportTypeToString(this->gConfig.exporterType)] = true; + this->gHashNode[RelativePathToSrcDir(this->gCurrentFile)]["extracted"][ExportTypeToString(this->gConfig.exporterType)] = true; } } @@ -1074,9 +1075,13 @@ void Companion::Process() { auto gbi = cfg["gbi"]; auto gbi_floats = cfg["gbi_floats"]; auto modding_path = opath && opath["modding"] ? opath["modding"].as<std::string>() : "modding"; - auto output_path = this->gDestinationPath; - this->gConfig.moddingPath = this->gSourceDirectory / modding_path; + if (!fs::exists(this->gDestinationDirectory)) { + create_directories(this->gDestinationDirectory); + } + auto output_path = this->gDestinationDirectory; + + this->gConfig.moddingPath = this->gDestinationDirectory / modding_path; switch (this->gConfig.exporterType) { case ExportType::Binary: { std::string extension = ""; @@ -1166,6 +1171,7 @@ void Companion::Process() { if(cfg["enums"]) { auto enums = GetSafeNode<std::vector<std::string>>(cfg, "enums"); for (auto& file : enums) { + file = this->gSourceDirectory / file; this->ParseEnums(file); } } @@ -1277,7 +1283,7 @@ void Companion::Process() { } // Write entries hash - std::ofstream file(this->gDestinationPath / "torch.hash.yml", std::ios::binary); + std::ofstream file(this->gDestinationDirectory / "torch.hash.yml", std::ios::binary); file << this->gHashNode; file.close(); @@ -1578,6 +1584,14 @@ std::string Companion::RelativePath(const std::string& path) const { return doutput; } +std::string Companion::RelativePathToDestDir(const std::string& path) const { + return relative(path, this->gDestinationDirectory); +} + +std::string Companion::RelativePathToSrcDir(const std::string& path) const { + return relative(path, this->gSourceDirectory); +} + std::string Companion::CalculateHash(const std::vector<uint8_t>& data) { return Chocobo1::SHA1().addData(data).finalize().toString(); } diff --git a/src/Companion.h b/src/Companion.h index bff5a72..b40dad3 100644 --- a/src/Companion.h +++ b/src/Companion.h @@ -114,7 +114,7 @@ public: explicit Companion(std::filesystem::path rom, const ArchiveType otr, const bool debug, const bool modding = false, const std::string& srcDir = "", const std::string& destPath = "") : gCartridge(nullptr), - gSourceDirectory(srcDir), gDestinationPath(destPath) { + gSourceDirectory(srcDir), gDestinationDirectory(destPath) { this->gRomPath = rom; this->gConfig.otrMode = otr; this->gConfig.debug = debug; @@ -124,7 +124,7 @@ public: explicit Companion(std::vector<uint8_t> rom, const ArchiveType otr, const bool debug, const bool modding = false, const std::string& srcDir = "", const std::string& destPath = "") : gCartridge(nullptr), - gSourceDirectory(srcDir), gDestinationPath(destPath) { + gSourceDirectory(srcDir), gDestinationDirectory(destPath) { this->gRomData = rom; this->gConfig.otrMode = otr; this->gConfig.debug = debug; @@ -151,6 +151,7 @@ public: N64::Cartridge* GetCartridge() const { return this->gCartridge.get(); } std::vector<uint8_t>& GetRomData() { return this->gRomData; } std::string GetOutputPath() { return this->gConfig.outputPath; } + std::string GetDestRelativeOutputPath() { return RelativePathToDestDir(GetOutputPath()); } GBIVersion GetGBIVersion() const { return this->gConfig.gbi.version; } GBIMinorVersion GetGBIMinorVersion() const { return this->gConfig.gbi.subversion; } @@ -179,6 +180,8 @@ public: static void Pack(const std::string& folder, const std::string& output, const ArchiveType otrMode); std::string NormalizeAsset(const std::string& name) const; std::string RelativePath(const std::string& path) const; + std::string RelativePathToSrcDir(const std::string& path) const; + std::string RelativePathToDestDir(const std::string& path) const; void RegisterCompanionFile(const std::string path, std::vector<char> data); TorchConfig& GetConfig() { return this->gConfig; } @@ -190,7 +193,7 @@ private: TorchConfig gConfig; YAML::Node gModdingConfig; fs::path gSourceDirectory; - fs::path gDestinationPath; + fs::path gDestinationDirectory; fs::path gCurrentDirectory; std::string gCurrentHash; std::string gAssetPath; diff --git a/src/factories/CompressedTextureFactory.cpp b/src/factories/CompressedTextureFactory.cpp index 6b507e4..34ccc61 100644 --- a/src/factories/CompressedTextureFactory.cpp +++ b/src/factories/CompressedTextureFactory.cpp @@ -218,7 +218,7 @@ ExportResult CompressedTextureCodeExporter::Export(std::ostream &write, std::sha write << tab_t << "{\n"; - write << tab_t << tab_t << "#include \"" << Companion::Instance->GetOutputPath() + "/" << *replacement << ".incbin.c\"\n"; + write << tab_t << tab_t << "#include \"" << Companion::Instance->GetDestRelativeOutputPath() + "/" << *replacement << ".incbin.c\"\n"; write << tab_t << "},\n"; @@ -231,7 +231,7 @@ ExportResult CompressedTextureCodeExporter::Export(std::ostream &write, std::sha } else { write << "u8 " << symbol << "[] = {\n"; - write << tab_t << "#include \"" << Companion::Instance->GetOutputPath() + "/" << *replacement << ".incbin.c\"\n"; + write << tab_t << "#include \"" << Companion::Instance->GetDestRelativeOutputPath() + "/" << *replacement << ".incbin.c\"\n"; write << "};\n"; diff --git a/src/factories/TextureFactory.cpp b/src/factories/TextureFactory.cpp index 75b6796..8e9d53c 100644 --- a/src/factories/TextureFactory.cpp +++ b/src/factories/TextureFactory.cpp @@ -137,7 +137,7 @@ ExportResult TextureCodeExporter::Export(std::ostream &write, std::shared_ptr<IP write << tab_t << "{\n"; if (!Companion::Instance->IsUsingIndividualIncludes()){ - write << tab_t << tab_t << "#include \"" << Companion::Instance->GetOutputPath() + "/" << *replacement << ".inc.c\"\n"; + write << tab_t << tab_t << "#include \"" << Companion::Instance->GetDestRelativeOutputPath() + "/" << *replacement << ".inc.c\"\n"; } else { write << imgstream.str(); } @@ -153,7 +153,7 @@ ExportResult TextureCodeExporter::Export(std::ostream &write, std::shared_ptr<IP write << GetSafeNode<std::string>(node, "ctype", "u8") << " " << symbol << "[] = {\n"; if (!Companion::Instance->IsUsingIndividualIncludes()){ - write << tab_t << "#include \"" << Companion::Instance->GetOutputPath() + "/" << *replacement << ".inc.c\"\n"; + write << tab_t << "#include \"" << Companion::Instance->GetDestRelativeOutputPath() + "/" << *replacement << ".inc.c\"\n"; } else { write << imgstream.str(); } diff --git a/src/main.cpp b/src/main.cpp index afb3536..6fb356f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -21,18 +21,17 @@ int main(int argc, char *argv[]) { bool xmlMode = false; bool debug = false; std::string srcdir; - std::string destdir + std::string destdir; app.require_subcommand(); - app.add_option("-s", "--srcdir", srcdir, "Set source directory to locate config.yml, asset metadata, and modding files for importing"); - app.add_option("-d", "--destdir", destdir, "Set destination directory for exporting and generating binaries and source code"); - /* Generate an OTR */ const auto otr = app.add_subcommand("otr", "OTR - Generates an otr\n"); otr->add_option("<baserom.z64>", filename, "")->required()->check(CLI::ExistingFile); otr->add_flag("-v,--verbose", debug, "Verbose Debug Mode"); + otr->add_option("-s,--srcdir", srcdir, "Set source directory to locate config.yml and asset metadata for processing")->check(CLI::ExistingDirectory); + otr->add_option("-d,--destdir", destdir, "Set destination directory for export"); otr->parse_complete_callback([&] { const auto instance = Companion::Instance = new Companion(filename, ArchiveType::OTR, debug, srcdir, destdir); @@ -44,6 +43,8 @@ int main(int argc, char *argv[]) { o2r->add_option("<baserom.z64>", filename, "")->required()->check(CLI::ExistingFile); o2r->add_flag("-v,--verbose", debug, "Verbose Debug Mode"); + o2r->add_option("-s,--srcdir", srcdir, "Set source directory to locate config.yml and asset metadata for processing")->check(CLI::ExistingDirectory); + o2r->add_option("-d,--destdir", destdir, "Set destination directory for export"); o2r->parse_complete_callback([&] { const auto instance = Companion::Instance = new Companion(filename, ArchiveType::O2R, debug, srcdir, destdir); @@ -55,6 +56,8 @@ int main(int argc, char *argv[]) { code->add_option("<baserom.z64>", filename, "")->required()->check(CLI::ExistingFile); code->add_flag("-v,--verbose", debug, "Verbose Debug Mode; adds offsets to C code"); + code->add_option("-s,--srcdir", srcdir, "Set source directory to locate config.yml and asset metadata for processing")->check(CLI::ExistingDirectory); + code->add_option("-d,--destdir", destdir, "Set destination directory to place C code to"); code->parse_complete_callback([&]() { const auto instance = Companion::Instance = new Companion(filename, ArchiveType::None, debug, srcdir, destdir); @@ -65,6 +68,8 @@ int main(int argc, char *argv[]) { const auto binary = app.add_subcommand("binary", "Binary - Generates a binary\n"); binary->add_option("<baserom.z64>", filename, "")->required()->check(CLI::ExistingFile); + binary->add_option("-s,--srcdir", srcdir, "Set source directory to locate config.yml and asset metadata for processing")->check(CLI::ExistingDirectory); + binary->add_option("-d,--destdir", destdir, "Set destination directory to place binary to"); binary->parse_complete_callback([&] { const auto instance = Companion::Instance = new Companion(filename, ArchiveType::None, debug, srcdir, destdir); @@ -76,7 +81,8 @@ int main(int argc, char *argv[]) { header->add_option("<baserom.z64>", filename, "")->required()->check(CLI::ExistingFile); header->add_flag("-o,--otr", otrModeSelected, "OTR/O2R Mode"); - + header->add_option("-s,--srcdir", srcdir, "Set source directory to locate config.yml and asset metadata for processing")->check(CLI::ExistingDirectory); + header->add_option("-d,--destdir", destdir, "Set destination directory to place headers to"); header->parse_complete_callback([&] { if (otrModeSelected) { @@ -121,6 +127,8 @@ int main(int argc, char *argv[]) { modding_import->add_option("mode", mode, "code, otr, o2r or header")->required(); modding_import->add_option("<baserom.z64>", filename, "")->required()->check(CLI::ExistingFile); modding_import->add_flag("-v,--verbose", debug, "Verbose Debug Mode"); + modding_import->add_option("-s,--srcdir", srcdir, "Set source directory to locate config.yml and asset metadata for processing, including modified files")->check(CLI::ExistingDirectory); + modding_import->add_option("-d,--destdir", destdir, "Set destination directory to place for generating C code"); modding_import->parse_complete_callback([&] { ArchiveType otrMode; @@ -147,6 +155,8 @@ int main(int argc, char *argv[]) { modding_export->add_flag("-x,--xml", xmlMode, "XML Mode"); modding_export->add_option("<baserom.z64>", filename, "")->required()->check(CLI::ExistingFile); + modding_export->add_option("-s,--srcdir", srcdir, "Set source directory to locate config.yml and asset metadata for processing, including modified files")->check(CLI::ExistingDirectory); + modding_export->add_option("-d,--destdir", destdir, "Set destination directory to place for generating modified files"); modding_export->parse_complete_callback([&] { const auto instance = Companion::Instance = new Companion(filename, ArchiveType::None, debug, srcdir, destdir); |
