summaryrefslogtreecommitdiff
path: root/ZAPD/Main.cpp
diff options
context:
space:
mode:
authorbriaguya <70942617+briaguya-ai@users.noreply.github.com>2023-10-18 00:09:24 -0400
committerbriaguya <70942617+briaguya-ai@users.noreply.github.com>2023-10-18 00:09:24 -0400
commit3f878d401fdcff6e7f898524f3bcf5cf4c2b2532 (patch)
tree2f0a7e29ec2dd17d0cbe70e8ee52c96f88608bfa /ZAPD/Main.cpp
parente9f4fc638ed904cc0dcdac24ea7708c9a220a702 (diff)
parent094e797349c86d0baef4a624962f4287aefdfef2 (diff)
Merge branch 'JackMaster' into mergeJackOntoSquash
Conflicts: ZAPD/Declaration.h ZAPD/Globals.cpp ZAPD/Globals.h ZAPD/Main.cpp ZAPD/OtherStructs/SkinLimbStructs.cpp ZAPD/OtherStructs/SkinLimbStructs.h ZAPD/ZAnimation.cpp ZAPD/ZCollision.cpp ZAPD/ZCollision.h ZAPD/ZDisplayList.cpp ZAPD/ZFile.cpp ZAPD/ZLimb.cpp ZAPD/ZLimb.h ZAPD/ZPath.cpp ZAPD/ZResource.h ZAPD/ZRoom/Commands/SetCsCamera.cpp ZAPD/ZRoom/Commands/SetCutsceneEntryList.cpp ZAPD/ZRoom/Commands/SetCutscenes.cpp ZAPD/ZRoom/Commands/SetCutscenes.h ZAPD/ZRoom/Commands/SetEntranceList.cpp ZAPD/ZRoom/Commands/SetLightingSettings.cpp ZAPD/ZRoom/Commands/SetMesh.cpp ZAPD/ZRoom/Commands/SetMinimapList.cpp ZAPD/ZTexture.cpp ZAPDUtils/Makefile ZAPDUtils/Utils/BitConverter.h ZAPDUtils/Utils/Directory.h ZAPDUtils/Utils/File.h ZAPDUtils/Utils/Path.h ZAPDUtils/Utils/StringHelper.h ZAPDUtils/ZAPDUtils.vcxproj
Diffstat (limited to 'ZAPD/Main.cpp')
-rw-r--r--ZAPD/Main.cpp474
1 files changed, 243 insertions, 231 deletions
diff --git a/ZAPD/Main.cpp b/ZAPD/Main.cpp
index a2030aa..47f949e 100644
--- a/ZAPD/Main.cpp
+++ b/ZAPD/Main.cpp
@@ -1,9 +1,10 @@
#include "Globals.h"
#include "Utils/Directory.h"
-#include <Utils/DiskFile.h>
+#include "Utils/File.h"
#include "Utils/Path.h"
#include "WarningHandler.h"
+// Linker Hacks Begin
#include "ZAnimation.h"
ZNormalAnimation nAnim(nullptr);
ZCurveAnimation cAnim(nullptr);
@@ -67,10 +68,12 @@ ZVtx vtx(nullptr);
#include "ZRoom/ZRoom.h"
ZRoom room(nullptr);
+// Linker Hacks End
#include "ZFile.h"
#include "ZTexture.h"
+#include <functional>
#include "CrashHandler.h"
#include <string>
@@ -78,24 +81,52 @@ ZRoom room(nullptr);
#include "tinyxml2.h"
#include <ctpl_stl.h>
-//extern const char gBuildHash[];
const char gBuildHash[] = "";
+using ArgFunc = void (*)(int&, char**);
+
+void Arg_SetOutputPath(int& i, char* argv[]);
+void Arg_SetInputPath(int& i, char* argv[]);
+void Arg_SetBaseromPath(int& i, char* argv[]);
+void Arg_SetSourceOutputPath(int& i, char* argv[]);
+void Arg_GenerateSourceFile(int& i, char* argv[]);
+void Arg_TestMode(int& i, char* argv[]);
+void Arg_LegacyDList(int& i, char* argv[]);
+void Arg_EnableProfiling(int& i, char* argv[]);
+void Arg_UseExternalResources(int& i, char* argv[]);
+void Arg_SetTextureType(int& i, char* argv[]);
+void Arg_ReadConfigFile(int& i, char* argv[]);
+void Arg_EnableErrorHandler(int& i, char* argv[]);
+void Arg_SetVerbosity(int& i, char* argv[]);
+void Arg_VerboseUnaccounted(int& i, char* argv[]);
+void Arg_SetExporter(int& i, char* argv[]);
+void Arg_EnableGCCCompat(int& i, char* argv[]);
+void Arg_ForceStatic(int& i, char* argv[]);
+void Arg_ForceUnaccountedStatic(int& i, char* argv[]);
+
+int main(int argc, char* argv[]);
+
bool Parse(const fs::path& xmlFilePath, const fs::path& basePath, const fs::path& outPath,
ZFileMode fileMode, int workerID);
+void ParseArgs(int& argc, char* argv[]);
+
void BuildAssetTexture(const fs::path& pngFilePath, TextureType texType, const fs::path& outPath);
void BuildAssetBackground(const fs::path& imageFilePath, const fs::path& outPath);
void BuildAssetBlob(const fs::path& blobFilePath, const fs::path& outPath);
+ZFileMode ParseFileMode(const std::string& buildMode, ExporterSet* exporterSet);
+int HandleExtract(ZFileMode fileMode, ExporterSet* exporterSet);
int ExtractFunc(int workerID, int fileListSize, std::string fileListItem, ZFileMode fileMode);
volatile int numWorkersLeft = 0;
+extern const char gBuildHash[];
+
extern void ImportExporters();
extern "C" int zapd_main(int argc, char* argv[])
{
- // Syntax: ZAPD.out [mode (btex/bovl/e)] (Arbritrary Number of Arguments)
+ int returnCode = 0;
if (argc < 2)
{
@@ -124,108 +155,7 @@ extern "C" int zapd_main(int argc, char* argv[])
}
}
- // Parse other "commands"
- for (int32_t i = 2; i < argc; i++)
- {
- std::string arg = argv[i];
-
- if (arg == "-o" || arg == "--outputpath") // Set output path
- {
- Globals::Instance->outputPath = argv[++i];
-
- if (Globals::Instance->sourceOutputPath == "")
- Globals::Instance->sourceOutputPath = Globals::Instance->outputPath;
- }
- else if (arg == "-i" || arg == "--inputpath") // Set input path
- {
- Globals::Instance->inputPath = argv[++i];
- }
- else if (arg == "-b" || arg == "--baserompath") // Set baserom path
- {
- Globals::Instance->baseRomPath = argv[++i];
- }
- else if (arg == "-osf") // Set source output path
- {
- Globals::Instance->sourceOutputPath = argv[++i];
- }
- else if (arg == "-gsf") // Generate source file during extraction
- {
- Globals::Instance->genSourceFile = std::string_view(argv[++i]) == "1";
- }
- else if (arg == "-tm") // Test Mode (enables certain experimental features)
- {
- Globals::Instance->testMode = std::string_view(argv[++i]) == "1";
- }
- else if (arg == "-crc" ||
- arg == "--output-crc") // Outputs a CRC file for each extracted texture.
- {
- Globals::Instance->testMode = std::string_view(argv[++i]) == "1";
- }
- else if (arg == "-ulzdl") // Use Legacy ZDisplay List
- {
- Globals::Instance->useLegacyZDList = std::string_view(argv[++i]) == "1";
- }
- else if (arg == "-profile") // Enable profiling
- {
- Globals::Instance->profile = std::string_view(argv[++i]) == "1";
- }
- else if (arg ==
- "-uer") // Split resources into their individual components (enabled by default)
- // TODO: We may wish to make this a part of the config file...
- {
- Globals::Instance->useExternalResources = std::string_view(argv[++i]) == "1";
- }
- else if (arg == "-tt") // Set texture type
- {
- Globals::Instance->texType = ZTexture::GetTextureTypeFromString(argv[++i]);
- }
- else if (arg == "-fl") // Set baserom filelist path
- {
- Globals::Instance->fileListPath = argv[++i];
- }
- else if (arg == "-rconf") // Read Config File
- {
- Globals::Instance->cfg.ReadConfigFile(argv[++i]);
- }
- else if (arg == "-eh") // Enable Error Handler
- {
- CrashHandler_Init();
- }
- else if (arg == "-v") // Verbose
- {
- Globals::Instance->verbosity = static_cast<VerbosityLevel>(strtol(argv[++i], NULL, 16));
- }
- else if (arg == "-vu" || arg == "--verbose-unaccounted") // Verbose unaccounted
- {
- Globals::Instance->verboseUnaccounted = true;
- }
- else if (arg == "-se" || arg == "--set-exporter") // Set Current Exporter
- {
- ImportExporters();
- Globals::Instance->currentExporter = argv[++i];
- }
- else if (arg == "--gcc-compat") // GCC compatibility
- {
- Globals::Instance->gccCompat = true;
- }
- else if (arg == "-s" || arg == "--static")
- {
- Globals::Instance->forceStatic = true;
- }
- else if (arg == "-us" || arg == "--unaccounted-static")
- {
- Globals::Instance->forceUnaccountedStatic = true;
- }
- else if (arg == "-brt" || arg == "--build-raw-texture")
- {
- Globals::Instance->buildRawTexture = true;
- }
- else if (arg == "--norom")
- {
- Globals::Instance->onlyGenSohOtr = true;
- }
- }
-
+ ParseArgs(argc, argv);
// Parse File Mode
ExporterSet* exporterSet = Globals::Instance->GetExporterSet();
@@ -238,22 +168,7 @@ extern "C" int zapd_main(int argc, char* argv[])
}
std::string buildMode = argv[1];
- ZFileMode fileMode = ZFileMode::Invalid;
-
- if (buildMode == "btex")
- fileMode = ZFileMode::BuildTexture;
- else if (buildMode == "bren")
- fileMode = ZFileMode::BuildBackground;
- else if (buildMode == "bsf")
- fileMode = ZFileMode::BuildSourceFile;
- else if (buildMode == "bblb")
- fileMode = ZFileMode::BuildBlob;
- else if (buildMode == "e")
- fileMode = ZFileMode::Extract;
- else if (buildMode == "ed")
- fileMode = ZFileMode::ExtractDirectory;
- else if (exporterSet != nullptr && exporterSet->parseFileModeFunc != nullptr)
- exporterSet->parseFileModeFunc(buildMode, fileMode);
+ ZFileMode fileMode = ParseFileMode(buildMode, exporterSet);
if (fileMode == ZFileMode::Invalid)
{
@@ -268,7 +183,6 @@ extern "C" int zapd_main(int argc, char* argv[])
// We've parsed through our commands once. If an exporter exists, it's been set by now.
// Now we'll parse through them again but pass them on to our exporter if one is available.
-
if (exporterSet != nullptr && exporterSet->parseArgsFunc != nullptr)
{
for (int32_t i = 2; i < argc; i++)
@@ -279,125 +193,20 @@ extern "C" int zapd_main(int argc, char* argv[])
printf("ZAPD: Zelda Asset Processor For Decomp: %s\n", gBuildHash);
if (Globals::Instance->verbosity >= VerbosityLevel::VERBOSITY_DEBUG)
- {
WarningHandler::PrintWarningsDebugInfo();
- }
- // TODO: switch
if (fileMode == ZFileMode::Extract || fileMode == ZFileMode::BuildSourceFile || fileMode == ZFileMode::ExtractDirectory)
- {
- bool procFileModeSuccess = false;
-
- if (exporterSet != nullptr && exporterSet->processFileModeFunc != nullptr)
- procFileModeSuccess = exporterSet->processFileModeFunc(fileMode);
-
- if (!procFileModeSuccess)
- {
- if (fileMode == ZFileMode::ExtractDirectory)
- {
- std::vector<std::string> fileList =
- Directory::ListFiles(Globals::Instance->inputPath.string());
-
- const int num_threads = std::thread::hardware_concurrency();
- ctpl::thread_pool pool(num_threads > 1 ? num_threads / 2 : 1);
-
- bool parseSuccessful;
-
- auto start = std::chrono::steady_clock::now();
- int fileListSize = fileList.size();
- Globals::Instance->singleThreaded = false;
-
- for (int i = 0; i < fileListSize; i++)
- Globals::Instance->workerData[i] = new FileWorker();
-
- numWorkersLeft = fileListSize;
-
- for (int i = 0; i < fileListSize; i++)
- {
- if (Globals::Instance->singleThreaded)
- {
- ExtractFunc(i, fileList.size(), fileList[i], fileMode);
- }
- else
- {
- std::string fileListItem = fileList[i];
- pool.push([i, fileListSize, fileListItem, fileMode](int) {
- ExtractFunc(i, fileListSize, fileListItem, fileMode);
- });
- }
- }
-
- if (!Globals::Instance->singleThreaded)
- {
- while (true)
- {
- if (numWorkersLeft <= 0)
- break;
-
- std::this_thread::sleep_for(std::chrono::milliseconds(250));
- }
- }
-
- auto end = std::chrono::steady_clock::now();
- auto diff =
- std::chrono::duration_cast<std::chrono::seconds>(end - start).count();
-
- printf("Generated OTR File Data in %i seconds\n", diff);
- }
- else
- {
- bool parseSuccessful;
-
- for (auto& extFile : Globals::Instance->cfg.externalFiles)
- {
- fs::path externalXmlFilePath =
- Globals::Instance->cfg.externalXmlFolder / extFile.xmlPath;
-
- if (Globals::Instance->verbosity >= VerbosityLevel::VERBOSITY_INFO)
- {
- printf("Parsing external file from config: '%s'\n",
- externalXmlFilePath.c_str());
- }
-
- parseSuccessful = Parse(externalXmlFilePath, Globals::Instance->baseRomPath,
- extFile.outPath, ZFileMode::ExternalFile, 0);
-
- if (!parseSuccessful)
- return 1;
- }
-
- parseSuccessful =
- Parse(Globals::Instance->inputPath, Globals::Instance->baseRomPath,
- Globals::Instance->outputPath, fileMode, 0);
- if (!parseSuccessful)
- return 1;
- }
- }
- }
+ returnCode = HandleExtract(fileMode, exporterSet);
else if (fileMode == ZFileMode::BuildTexture)
- {
- TextureType texType = Globals::Instance->texType;
- BuildAssetTexture(Globals::Instance->inputPath, texType, Globals::Instance->outputPath);
- }
+ BuildAssetTexture(Globals::Instance->inputPath, Globals::Instance->texType,
+ Globals::Instance->outputPath);
else if (fileMode == ZFileMode::BuildBackground)
- {
BuildAssetBackground(Globals::Instance->inputPath, Globals::Instance->outputPath);
- }
else if (fileMode == ZFileMode::BuildBlob)
- {
BuildAssetBlob(Globals::Instance->inputPath, Globals::Instance->outputPath);
- }
-
- if (exporterSet != nullptr && exporterSet->endProgramFunc != nullptr)
- exporterSet->endProgramFunc();
-
-end:
- delete exporterSet;
-
- //Globals::Instance->GetExporterSet() = nullptr; //TODO NULL this out. Compiler complains about lvalue assignment.
delete g;
- return 0;
+ return returnCode;
}
int ExtractFunc(int workerID, int fileListSize, std::string fileListItem, ZFileMode fileMode)
@@ -568,6 +377,209 @@ bool Parse(const fs::path& xmlFilePath, const fs::path& basePath, const fs::path
return true;
}
+void ParseArgs(int& argc, char* argv[])
+{
+ static const std::unordered_map<std::string, ArgFunc> ArgFuncDictionary = {
+ {"-o", &Arg_SetOutputPath},
+ {"--outputpath", &Arg_SetOutputPath},
+ {"-i", &Arg_SetInputPath},
+ {"--inputpath", &Arg_SetInputPath},
+ {"-b", &Arg_SetBaseromPath},
+ {"--baserompath", &Arg_SetBaseromPath},
+ {"-osf", &Arg_SetSourceOutputPath},
+ {"-gsf", &Arg_GenerateSourceFile},
+ {"-tm", &Arg_TestMode},
+ {"-ulzdl", &Arg_LegacyDList},
+ {"-profile", &Arg_EnableProfiling},
+ {"-uer", &Arg_UseExternalResources},
+ {"-tt", &Arg_SetTextureType},
+ {"-rconf", &Arg_ReadConfigFile},
+ {"-eh", &Arg_EnableErrorHandler},
+ {"-v", &Arg_SetVerbosity},
+ {"-vu", &Arg_VerboseUnaccounted},
+ {"--verbose-unaccounted", &Arg_VerboseUnaccounted},
+ {"-se", &Arg_SetExporter},
+ {"--set-exporter", &Arg_SetExporter},
+ {"--gcc-compat", &Arg_EnableGCCCompat},
+ {"-s", &Arg_ForceStatic},
+ {"--static", &Arg_ForceStatic},
+ {"-us", &Arg_ForceUnaccountedStatic},
+ {"--unaccounted-static", &Arg_ForceUnaccountedStatic},
+ };
+
+ for (int32_t i = 2; i < argc; i++)
+ {
+ std::string arg = argv[i];
+
+ // Ignore warning args as they have already been parsed
+ if (arg.length() > 2 && arg[0] == '-' && arg[1] == 'W' && arg[2] != '\0')
+ {
+ continue;
+ }
+
+ auto it = ArgFuncDictionary.find(arg);
+ if (it == ArgFuncDictionary.end())
+ {
+ fprintf(stderr, "Unsupported argument: %s\n", arg.c_str());
+ continue;
+ }
+
+ std::invoke(it->second, i, argv);
+ }
+}
+
+ZFileMode ParseFileMode(const std::string& buildMode, ExporterSet* exporterSet)
+{
+ ZFileMode fileMode = ZFileMode::Invalid;
+
+ if (buildMode == "btex")
+ fileMode = ZFileMode::BuildTexture;
+ else if (buildMode == "bren")
+ fileMode = ZFileMode::BuildBackground;
+ else if (buildMode == "bsf")
+ fileMode = ZFileMode::BuildSourceFile;
+ else if (buildMode == "bblb")
+ fileMode = ZFileMode::BuildBlob;
+ else if (buildMode == "e")
+ fileMode = ZFileMode::Extract;
+ else if (exporterSet != nullptr && exporterSet->parseFileModeFunc != nullptr)
+ exporterSet->parseFileModeFunc(buildMode, fileMode);
+
+ return fileMode;
+}
+
+void Arg_SetOutputPath(int& i, [[maybe_unused]] char* argv[])
+{
+ Globals::Instance->outputPath = argv[++i];
+
+ if (Globals::Instance->sourceOutputPath == "")
+ Globals::Instance->sourceOutputPath = Globals::Instance->outputPath;
+}
+
+void Arg_SetInputPath(int& i, char* argv[])
+{
+ Globals::Instance->inputPath = argv[++i];
+}
+
+void Arg_SetBaseromPath(int& i, char* argv[])
+{
+ Globals::Instance->baseRomPath = argv[++i];
+}
+
+void Arg_SetSourceOutputPath(int& i, char* argv[])
+{
+ Globals::Instance->sourceOutputPath = argv[++i];
+}
+
+void Arg_GenerateSourceFile(int& i, char* argv[])
+{
+ // Generate source file during extraction
+ Globals::Instance->genSourceFile = std::string_view(argv[++i]) == "1";
+}
+
+void Arg_TestMode(int& i, char* argv[])
+{
+ // Test Mode (enables certain experimental features)
+ Globals::Instance->testMode = std::string_view(argv[++i]) == "1";
+}
+
+void Arg_LegacyDList(int& i, char* argv[])
+{
+ Globals::Instance->useLegacyZDList = std::string_view(argv[++i]) == "1";
+}
+
+void Arg_EnableProfiling(int& i, char* argv[])
+{
+ Globals::Instance->profile = std::string_view(argv[++i]) == "1";
+}
+
+void Arg_UseExternalResources(int& i, char* argv[])
+{
+ // Split resources into their individual components(enabled by default)
+ // TODO: We may wish to make this a part of the config file...
+ Globals::Instance->useExternalResources = std::string_view(argv[++i]) == "1";
+}
+
+void Arg_SetTextureType(int& i, char* argv[])
+{
+ Globals::Instance->texType = ZTexture::GetTextureTypeFromString(argv[++i]);
+}
+
+void Arg_ReadConfigFile(int& i, char* argv[])
+{
+ Globals::Instance->cfg.ReadConfigFile(argv[++i]);
+}
+
+void Arg_EnableErrorHandler([[maybe_unused]] int& i, [[maybe_unused]] char* argv[])
+{
+ CrashHandler_Init();
+}
+
+void Arg_SetVerbosity(int& i, char* argv[])
+{
+ Globals::Instance->verbosity = static_cast<VerbosityLevel>(strtol(argv[++i], NULL, 16));
+}
+
+void Arg_VerboseUnaccounted([[maybe_unused]] int& i, [[maybe_unused]] char* argv[])
+{
+ Globals::Instance->verboseUnaccounted = true;
+}
+
+void Arg_SetExporter(int& i, char* argv[])
+{
+ Globals::Instance->currentExporter = argv[++i];
+}
+
+void Arg_EnableGCCCompat([[maybe_unused]] int& i, [[maybe_unused]] char* argv[])
+{
+ Globals::Instance->gccCompat = true;
+}
+
+void Arg_ForceStatic([[maybe_unused]] int& i, [[maybe_unused]] char* argv[])
+{
+ Globals::Instance->forceStatic = true;
+}
+
+void Arg_ForceUnaccountedStatic([[maybe_unused]] int& i, [[maybe_unused]] char* argv[])
+{
+ Globals::Instance->forceUnaccountedStatic = true;
+}
+
+int HandleExtract(ZFileMode fileMode, ExporterSet* exporterSet)
+{
+ bool procFileModeSuccess = false;
+
+ if (exporterSet != nullptr && exporterSet->processFileModeFunc != nullptr)
+ procFileModeSuccess = exporterSet->processFileModeFunc(fileMode);
+
+ if (!procFileModeSuccess)
+ {
+ bool parseSuccessful;
+
+ for (auto& extFile : Globals::Instance->cfg.externalFiles)
+ {
+ fs::path externalXmlFilePath =
+ Globals::Instance->cfg.externalXmlFolder / extFile.xmlPath;
+
+ if (Globals::Instance->verbosity >= VerbosityLevel::VERBOSITY_INFO)
+ printf("Parsing external file from config: '%s'\n", externalXmlFilePath.c_str());
+
+ parseSuccessful = Parse(externalXmlFilePath, Globals::Instance->baseRomPath,
+ extFile.outPath, ZFileMode::ExternalFile);
+
+ if (!parseSuccessful)
+ return 1;
+ }
+
+ parseSuccessful = Parse(Globals::Instance->inputPath, Globals::Instance->baseRomPath,
+ Globals::Instance->outputPath, fileMode);
+ if (!parseSuccessful)
+ return 1;
+ }
+
+ return 0;
+}
+
void BuildAssetTexture(const fs::path& pngFilePath, TextureType texType, const fs::path& outPath)
{
return Globals::Instance->BuildAssetTexture(pngFilePath, texType, outPath);