summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Estelami <NEstelami@users.noreply.github.com>2023-05-05 18:24:21 -0400
committerGitHub <noreply@github.com>2023-05-05 18:24:21 -0400
commita8874cf4a6274ff3a0388fb08d43a91b620d3618 (patch)
tree3a1b6d995ab77b3b2649a74f7af169f96ea5f9cf
parentecc25616ec90e14f3ddcf3c703b7a29d6ccf1f95 (diff)
Refactor - Clean up ZTexture, ZFile, and Main (#292)
* ZTexture and ZFile cleanup * Moved Exporter Set into its own file * Some minor renaming * Arguments handled through dictionary instead of if else chain * Build error fix
-rw-r--r--ZAPD/ExporterSet.h24
-rw-r--r--ZAPD/Globals.h24
-rw-r--r--ZAPD/Main.cpp260
-rw-r--r--ZAPD/ZAPD.vcxproj1
-rw-r--r--ZAPD/ZAPD.vcxproj.filters7
-rw-r--r--ZAPD/ZFile.cpp85
-rw-r--r--ZAPD/ZFile.h1
-rw-r--r--ZAPD/ZRoom/ZRoom.cpp8
-rw-r--r--ZAPD/ZRoom/ZRoom.h2
-rw-r--r--ZAPD/ZTexture.cpp72
-rw-r--r--ZAPD/ZTexture.h61
11 files changed, 329 insertions, 216 deletions
diff --git a/ZAPD/ExporterSet.h b/ZAPD/ExporterSet.h
new file mode 100644
index 0000000..c4dd934
--- /dev/null
+++ b/ZAPD/ExporterSet.h
@@ -0,0 +1,24 @@
+#pragma once
+
+typedef void (*ExporterSetFunc)(ZFile*);
+typedef bool (*ExporterSetFuncBool)(ZFileMode fileMode);
+typedef void (*ExporterSetFuncVoid)(int argc, char* argv[], int& i);
+typedef void (*ExporterSetFuncVoid2)(const std::string& buildMode, ZFileMode& fileMode);
+typedef void (*ExporterSetFuncVoid3)();
+typedef void (*ExporterSetResSave)(ZResource* res, BinaryWriter& writer);
+
+class ExporterSet
+{
+public:
+ ~ExporterSet();
+
+ std::map<ZResourceType, ZResourceExporter*> exporters;
+ ExporterSetFuncVoid parseArgsFunc = nullptr;
+ ExporterSetFuncVoid2 parseFileModeFunc = nullptr;
+ ExporterSetFuncBool processFileModeFunc = nullptr;
+ ExporterSetFunc beginFileFunc = nullptr;
+ ExporterSetFunc endFileFunc = nullptr;
+ ExporterSetFuncVoid3 beginXMLFunc = nullptr;
+ ExporterSetFuncVoid3 endXMLFunc = nullptr;
+ ExporterSetResSave resSaveFunc = nullptr;
+}; \ No newline at end of file
diff --git a/ZAPD/Globals.h b/ZAPD/Globals.h
index 4ea2cde..0bfcaee 100644
--- a/ZAPD/Globals.h
+++ b/ZAPD/Globals.h
@@ -5,6 +5,7 @@
#include <vector>
#include "GameConfig.h"
#include "ZFile.h"
+#include "ExporterSet.h"
class ZRoom;
@@ -15,29 +16,6 @@ enum class VerbosityLevel
VERBOSITY_DEBUG
};
-typedef void (*ExporterSetFunc)(ZFile*);
-typedef bool (*ExporterSetFuncBool)(ZFileMode fileMode);
-typedef void (*ExporterSetFuncVoid)(int argc, char* argv[], int& i);
-typedef void (*ExporterSetFuncVoid2)(const std::string& buildMode, ZFileMode& fileMode);
-typedef void (*ExporterSetFuncVoid3)();
-typedef void (*ExporterSetResSave)(ZResource* res, BinaryWriter& writer);
-
-class ExporterSet
-{
-public:
- ~ExporterSet();
-
- std::map<ZResourceType, ZResourceExporter*> exporters;
- ExporterSetFuncVoid parseArgsFunc = nullptr;
- ExporterSetFuncVoid2 parseFileModeFunc = nullptr;
- ExporterSetFuncBool processFileModeFunc = nullptr;
- ExporterSetFunc beginFileFunc = nullptr;
- ExporterSetFunc endFileFunc = nullptr;
- ExporterSetFuncVoid3 beginXMLFunc = nullptr;
- ExporterSetFuncVoid3 endXMLFunc = nullptr;
- ExporterSetResSave resSaveFunc = nullptr;
-};
-
class Globals
{
public:
diff --git a/ZAPD/Main.cpp b/ZAPD/Main.cpp
index 2563154..6a7e6c1 100644
--- a/ZAPD/Main.cpp
+++ b/ZAPD/Main.cpp
@@ -10,14 +10,41 @@
#include "ZTexture.h"
#include "CrashHandler.h"
+#include <functional>
#include <string>
#include <string_view>
#include "tinyxml2.h"
+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);
+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);
@@ -55,94 +82,7 @@ int 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 == "-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
- {
- 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;
- }
- }
+ ParseArgs(argc, argv);
// Parse File Mode
ExporterSet* exporterSet = Globals::Instance->GetExporterSet();
@@ -181,9 +121,7 @@ int 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)
@@ -339,6 +277,148 @@ 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];
+
+ 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);
+ }
+}
+
+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;
+}
+
void BuildAssetTexture(const fs::path& pngFilePath, TextureType texType, const fs::path& outPath)
{
std::string name = outPath.stem().string();
diff --git a/ZAPD/ZAPD.vcxproj b/ZAPD/ZAPD.vcxproj
index f6bc351..77d0bd1 100644
--- a/ZAPD/ZAPD.vcxproj
+++ b/ZAPD/ZAPD.vcxproj
@@ -273,6 +273,7 @@ mkdir build\ZAPD
<ClInclude Include="CrashHandler.h" />
<ClInclude Include="CRC32.h" />
<ClInclude Include="Declaration.h" />
+ <ClInclude Include="ExporterSet.h" />
<ClInclude Include="GameConfig.h" />
<ClInclude Include="Globals.h" />
<ClInclude Include="ImageBackend.h" />
diff --git a/ZAPD/ZAPD.vcxproj.filters b/ZAPD/ZAPD.vcxproj.filters
index ea07eb7..eac4719 100644
--- a/ZAPD/ZAPD.vcxproj.filters
+++ b/ZAPD/ZAPD.vcxproj.filters
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
@@ -561,7 +561,10 @@
<Filter>Header Files\Z64</Filter>
</ClInclude>
<ClInclude Include="ZActorList.h">
- <Filter>Header Files\Z64</Filter>
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="ExporterSet.h">
+ <Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="ZWaterbox.h">
<Filter>Header Files</Filter>
diff --git a/ZAPD/ZFile.cpp b/ZAPD/ZFile.cpp
index f364162..5087a24 100644
--- a/ZAPD/ZFile.cpp
+++ b/ZAPD/ZFile.cpp
@@ -1011,46 +1011,7 @@ std::string ZFile::ProcessDeclarations()
// printf("RANGE START: 0x%06X - RANGE END: 0x%06X\n", rangeStart, rangeEnd);
- // Optimization: See if there are any arrays side by side that can be merged...
- std::vector<std::pair<int32_t, Declaration*>> declarationKeys(declarations.begin(),
- declarations.end());
-
- std::pair<int32_t, Declaration*> lastItem = declarationKeys.at(0);
-
- for (size_t i = 1; i < declarationKeys.size(); i++)
- {
- std::pair<int32_t, Declaration*> curItem = declarationKeys[i];
-
- if (curItem.second->isArray && lastItem.second->isArray)
- {
- if (curItem.second->declType == lastItem.second->declType)
- {
- if (!curItem.second->declaredInXml && !lastItem.second->declaredInXml)
- {
- // TEST: For now just do Vtx declarations...
- if (lastItem.second->declType == "Vtx")
- {
- int32_t sizeDiff = curItem.first - (lastItem.first + lastItem.second->size);
-
- // Make sure there isn't an unaccounted inbetween these two
- if (sizeDiff == 0)
- {
- lastItem.second->size += curItem.second->size;
- lastItem.second->arrayItemCnt += curItem.second->arrayItemCnt;
- lastItem.second->declBody += "\n" + curItem.second->declBody;
- declarations.erase(curItem.first);
- declarationKeys.erase(declarationKeys.begin() + i);
- delete curItem.second;
- i--;
- continue;
- }
- }
- }
- }
- }
-
- lastItem = curItem;
- }
+ MergeNeighboringDeclarations();
for (std::pair<uint32_t, Declaration*> item : declarations)
ProcessDeclarationText(item.second);
@@ -1107,6 +1068,50 @@ std::string ZFile::ProcessDeclarations()
return output;
}
+void ZFile::MergeNeighboringDeclarations()
+{
+ // Optimization: See if there are any arrays side by side that can be merged...
+ std::vector<std::pair<int32_t, Declaration*>> declarationKeys(declarations.begin(),
+ declarations.end());
+
+ std::pair<int32_t, Declaration*> lastItem = declarationKeys.at(0);
+
+ for (size_t i = 1; i < declarationKeys.size(); i++)
+ {
+ std::pair<int32_t, Declaration*> curItem = declarationKeys[i];
+
+ if (curItem.second->isArray && lastItem.second->isArray)
+ {
+ if (curItem.second->declType == lastItem.second->declType)
+ {
+ if (!curItem.second->declaredInXml && !lastItem.second->declaredInXml)
+ {
+ // TEST: For now just do Vtx declarations...
+ if (lastItem.second->declType == "Vtx")
+ {
+ int32_t sizeDiff = curItem.first - (lastItem.first + lastItem.second->size);
+
+ // Make sure there isn't an unaccounted inbetween these two
+ if (sizeDiff == 0)
+ {
+ lastItem.second->size += curItem.second->size;
+ lastItem.second->arrayItemCnt += curItem.second->arrayItemCnt;
+ lastItem.second->declBody += "\n" + curItem.second->declBody;
+ declarations.erase(curItem.first);
+ declarationKeys.erase(declarationKeys.begin() + i);
+ delete curItem.second;
+ i--;
+ continue;
+ }
+ }
+ }
+ }
+ }
+
+ lastItem = curItem;
+ }
+}
+
void ZFile::ProcessDeclarationText(Declaration* decl)
{
size_t refIndex = 0;
diff --git a/ZAPD/ZFile.h b/ZAPD/ZFile.h
index 3961c3d..d529c1c 100644
--- a/ZAPD/ZFile.h
+++ b/ZAPD/ZFile.h
@@ -133,6 +133,7 @@ protected:
void GenerateSourceHeaderFiles();
bool DeclarationSanityChecks(uint32_t address, const std::string& varName);
std::string ProcessDeclarations();
+ void MergeNeighboringDeclarations();
void ProcessDeclarationText(Declaration* decl);
std::string ProcessExterns();
diff --git a/ZAPD/ZRoom/ZRoom.cpp b/ZAPD/ZRoom/ZRoom.cpp
index 5831eaa..de9ee61 100644
--- a/ZAPD/ZRoom/ZRoom.cpp
+++ b/ZAPD/ZRoom/ZRoom.cpp
@@ -69,13 +69,9 @@ void ZRoom::ExtractFromXML(tinyxml2::XMLElement* reader, uint32_t nRawDataIndex)
ZResource::ExtractFromXML(reader, nRawDataIndex);
if (hackMode == "syotes_room")
- {
- SyotesRoomHack();
- }
+ SyotesRoomFix();
else
- {
DeclareVar(name, "");
- }
}
void ZRoom::ExtractFromBinary(uint32_t nRawDataIndex, ZResourceType parentType)
@@ -338,7 +334,7 @@ std::string ZRoom::GetDefaultName(const std::string& prefix) const
* back to very early in the game's development. Since this room is a special case,
* declare automatically the data its contains whitout the need of a header.
*/
-void ZRoom::SyotesRoomHack()
+void ZRoom::SyotesRoomFix()
{
PolygonType2 poly(parent, 0, this);
diff --git a/ZAPD/ZRoom/ZRoom.h b/ZAPD/ZRoom/ZRoom.h
index e837ec7..4e9026f 100644
--- a/ZAPD/ZRoom/ZRoom.h
+++ b/ZAPD/ZRoom/ZRoom.h
@@ -46,5 +46,5 @@ public:
ZResourceType GetResourceType() const override;
protected:
- void SyotesRoomHack();
+ void SyotesRoomFix();
};
diff --git a/ZAPD/ZTexture.cpp b/ZAPD/ZTexture.cpp
index a07ab97..fe54489 100644
--- a/ZAPD/ZTexture.cpp
+++ b/ZAPD/ZTexture.cpp
@@ -137,31 +137,31 @@ void ZTexture::ParseRawData()
switch (format)
{
case TextureType::RGBA16bpp:
- PrepareBitmapRGBA16();
+ ConvertN64ToBitmap_RGBA16();
break;
case TextureType::RGBA32bpp:
- PrepareBitmapRGBA32();
+ ConvertN64ToBitmap_RGBA32();
break;
case TextureType::Grayscale4bpp:
- PrepareBitmapGrayscale4();
+ ConvertN64ToBitmap_Grayscale4();
break;
case TextureType::Grayscale8bpp:
- PrepareBitmapGrayscale8();
+ ConvertN64ToBitmap_Grayscale8();
break;
case TextureType::GrayscaleAlpha4bpp:
- PrepareBitmapGrayscaleAlpha4();
+ ConvertN64ToBitmap_GrayscaleAlpha4();
break;
case TextureType::GrayscaleAlpha8bpp:
- PrepareBitmapGrayscaleAlpha8();
+ ConvertN64ToBitmap_GrayscaleAlpha8();
break;
case TextureType::GrayscaleAlpha16bpp:
- PrepareBitmapGrayscaleAlpha16();
+ ConvertN64ToBitmap_GrayscaleAlpha16();
break;
case TextureType::Palette4bpp:
- PrepareBitmapPalette4();
+ ConvertN64ToBitmap_Palette4();
break;
case TextureType::Palette8bpp:
- PrepareBitmapPalette8();
+ ConvertN64ToBitmap_Palette8();
break;
case TextureType::Error:
HANDLE_ERROR_RESOURCE(WarningType::InvalidAttributeValue, parent, this, rawDataIndex,
@@ -212,7 +212,7 @@ void ZTexture::ParseRawDataLate()
}
}
-void ZTexture::PrepareBitmapRGBA16()
+void ZTexture::ConvertN64ToBitmap_RGBA16()
{
textureData.InitEmptyRGBImage(width, height, true);
const auto& parentRawData = parent->GetRawData();
@@ -233,7 +233,7 @@ void ZTexture::PrepareBitmapRGBA16()
}
}
-void ZTexture::PrepareBitmapRGBA32()
+void ZTexture::ConvertN64ToBitmap_RGBA32()
{
textureData.InitEmptyRGBImage(width, height, true);
const auto& parentRawData = parent->GetRawData();
@@ -252,7 +252,7 @@ void ZTexture::PrepareBitmapRGBA32()
}
}
-void ZTexture::PrepareBitmapGrayscale4()
+void ZTexture::ConvertN64ToBitmap_Grayscale4()
{
textureData.InitEmptyRGBImage(width, height, false);
const auto& parentRawData = parent->GetRawData();
@@ -276,7 +276,7 @@ void ZTexture::PrepareBitmapGrayscale4()
}
}
-void ZTexture::PrepareBitmapGrayscale8()
+void ZTexture::ConvertN64ToBitmap_Grayscale8()
{
textureData.InitEmptyRGBImage(width, height, false);
const auto& parentRawData = parent->GetRawData();
@@ -291,7 +291,7 @@ void ZTexture::PrepareBitmapGrayscale8()
}
}
-void ZTexture::PrepareBitmapGrayscaleAlpha4()
+void ZTexture::ConvertN64ToBitmap_GrayscaleAlpha4()
{
textureData.InitEmptyRGBImage(width, height, true);
const auto& parentRawData = parent->GetRawData();
@@ -319,7 +319,7 @@ void ZTexture::PrepareBitmapGrayscaleAlpha4()
}
}
-void ZTexture::PrepareBitmapGrayscaleAlpha8()
+void ZTexture::ConvertN64ToBitmap_GrayscaleAlpha8()
{
textureData.InitEmptyRGBImage(width, height, true);
const auto& parentRawData = parent->GetRawData();
@@ -341,7 +341,7 @@ void ZTexture::PrepareBitmapGrayscaleAlpha8()
}
}
-void ZTexture::PrepareBitmapGrayscaleAlpha16()
+void ZTexture::ConvertN64ToBitmap_GrayscaleAlpha16()
{
textureData.InitEmptyRGBImage(width, height, true);
const auto& parentRawData = parent->GetRawData();
@@ -358,7 +358,7 @@ void ZTexture::PrepareBitmapGrayscaleAlpha16()
}
}
-void ZTexture::PrepareBitmapPalette4()
+void ZTexture::ConvertN64ToBitmap_Palette4()
{
textureData.InitEmptyPaletteImage(width, height);
const auto& parentRawData = parent->GetRawData();
@@ -382,7 +382,7 @@ void ZTexture::PrepareBitmapPalette4()
}
}
-void ZTexture::PrepareBitmapPalette8()
+void ZTexture::ConvertN64ToBitmap_Palette8()
{
textureData.InitEmptyPaletteImage(width, height);
const auto& parentRawData = parent->GetRawData();
@@ -435,31 +435,31 @@ void ZTexture::PrepareRawDataFromFile(const fs::path& pngFilePath)
switch (format)
{
case TextureType::RGBA16bpp:
- PrepareRawDataRGBA16();
+ ConvertBitmapToN64_RGBA16();
break;
case TextureType::RGBA32bpp:
- PrepareRawDataRGBA32();
+ ConvertBitmapToN64_RGBA32();
break;
case TextureType::Grayscale4bpp:
- PrepareRawDataGrayscale4();
+ ConvertBitmapToN64_Grayscale4();
break;
case TextureType::Grayscale8bpp:
- PrepareRawDataGrayscale8();
+ ConvertBitmapToN64_Grayscale8();
break;
case TextureType::GrayscaleAlpha4bpp:
- PrepareRawDataGrayscaleAlpha4();
+ ConvertBitmapToN64_GrayscaleAlpha4();
break;
case TextureType::GrayscaleAlpha8bpp:
- PrepareRawDataGrayscaleAlpha8();
+ ConvertBitmapToN64_GrayscaleAlpha8();
break;
case TextureType::GrayscaleAlpha16bpp:
- PrepareRawDataGrayscaleAlpha16();
+ ConvertBitmapToN64_GrayscaleAlpha16();
break;
case TextureType::Palette4bpp:
- PrepareRawDataPalette4();
+ ConvertBitmapToN64_Palette4();
break;
case TextureType::Palette8bpp:
- PrepareRawDataPalette8();
+ ConvertBitmapToN64_Palette8();
break;
case TextureType::Error:
HANDLE_ERROR_PROCESS(WarningType::InvalidPNG, "Input PNG file has invalid format type", "");
@@ -467,7 +467,7 @@ void ZTexture::PrepareRawDataFromFile(const fs::path& pngFilePath)
}
}
-void ZTexture::PrepareRawDataRGBA16()
+void ZTexture::ConvertBitmapToN64_RGBA16()
{
for (uint16_t y = 0; y < height; y++)
{
@@ -490,7 +490,7 @@ void ZTexture::PrepareRawDataRGBA16()
}
}
-void ZTexture::PrepareRawDataRGBA32()
+void ZTexture::ConvertBitmapToN64_RGBA32()
{
for (uint16_t y = 0; y < height; y++)
{
@@ -507,7 +507,7 @@ void ZTexture::PrepareRawDataRGBA32()
}
}
-void ZTexture::PrepareRawDataGrayscale4()
+void ZTexture::ConvertBitmapToN64_Grayscale4()
{
for (uint16_t y = 0; y < height; y++)
{
@@ -522,7 +522,7 @@ void ZTexture::PrepareRawDataGrayscale4()
}
}
-void ZTexture::PrepareRawDataGrayscale8()
+void ZTexture::ConvertBitmapToN64_Grayscale8()
{
for (uint16_t y = 0; y < height; y++)
{
@@ -535,7 +535,7 @@ void ZTexture::PrepareRawDataGrayscale8()
}
}
-void ZTexture::PrepareRawDataGrayscaleAlpha4()
+void ZTexture::ConvertBitmapToN64_GrayscaleAlpha4()
{
for (uint16_t y = 0; y < height; y++)
{
@@ -561,7 +561,7 @@ void ZTexture::PrepareRawDataGrayscaleAlpha4()
}
}
-void ZTexture::PrepareRawDataGrayscaleAlpha8()
+void ZTexture::ConvertBitmapToN64_GrayscaleAlpha8()
{
for (uint16_t y = 0; y < height; y++)
{
@@ -578,7 +578,7 @@ void ZTexture::PrepareRawDataGrayscaleAlpha8()
}
}
-void ZTexture::PrepareRawDataGrayscaleAlpha16()
+void ZTexture::ConvertBitmapToN64_GrayscaleAlpha16()
{
for (uint16_t y = 0; y < height; y++)
{
@@ -596,7 +596,7 @@ void ZTexture::PrepareRawDataGrayscaleAlpha16()
}
}
-void ZTexture::PrepareRawDataPalette4()
+void ZTexture::ConvertBitmapToN64_Palette4()
{
for (uint16_t y = 0; y < height; y++)
{
@@ -612,7 +612,7 @@ void ZTexture::PrepareRawDataPalette4()
}
}
-void ZTexture::PrepareRawDataPalette8()
+void ZTexture::ConvertBitmapToN64_Palette8()
{
for (uint16_t y = 0; y < height; y++)
{
diff --git a/ZAPD/ZTexture.h b/ZAPD/ZTexture.h
index 1601897..cf85edf 100644
--- a/ZAPD/ZTexture.h
+++ b/ZAPD/ZTexture.h
@@ -30,26 +30,28 @@ protected:
ZTexture* tlut = nullptr;
bool splitTlut;
- void PrepareBitmapRGBA16();
- void PrepareBitmapRGBA32();
- void PrepareBitmapGrayscale8();
- void PrepareBitmapGrayscaleAlpha8();
- void PrepareBitmapGrayscale4();
- void PrepareBitmapGrayscaleAlpha4();
- void PrepareBitmapGrayscaleAlpha16();
- void PrepareBitmapPalette4();
- void PrepareBitmapPalette8();
+ // The following functions convert from N64 binary data to a bitmap to be saved to a PNG.
+ void ConvertN64ToBitmap_RGBA16();
+ void ConvertN64ToBitmap_RGBA32();
+ void ConvertN64ToBitmap_Grayscale8();
+ void ConvertN64ToBitmap_GrayscaleAlpha8();
+ void ConvertN64ToBitmap_Grayscale4();
+ void ConvertN64ToBitmap_GrayscaleAlpha4();
+ void ConvertN64ToBitmap_GrayscaleAlpha16();
+ void ConvertN64ToBitmap_Palette4();
+ void ConvertN64ToBitmap_Palette8();
+ // The following functions convert from a bitmap to N64 binary data.
void PrepareRawDataFromFile(const fs::path& inFolder);
- void PrepareRawDataRGBA16();
- void PrepareRawDataRGBA32();
- void PrepareRawDataGrayscale4();
- void PrepareRawDataGrayscale8();
- void PrepareRawDataGrayscaleAlpha4();
- void PrepareRawDataGrayscaleAlpha8();
- void PrepareRawDataGrayscaleAlpha16();
- void PrepareRawDataPalette4();
- void PrepareRawDataPalette8();
+ void ConvertBitmapToN64_RGBA16();
+ void ConvertBitmapToN64_RGBA32();
+ void ConvertBitmapToN64_Grayscale4();
+ void ConvertBitmapToN64_Grayscale8();
+ void ConvertBitmapToN64_GrayscaleAlpha4();
+ void ConvertBitmapToN64_GrayscaleAlpha8();
+ void ConvertBitmapToN64_GrayscaleAlpha16();
+ void ConvertBitmapToN64_Palette4();
+ void ConvertBitmapToN64_Palette8();
public:
ZTexture(ZFile* nParent);
@@ -68,7 +70,12 @@ public:
Declaration* DeclareVar(const std::string& prefix, const std::string& bodyStr) override;
std::string GetBodySourceCode() const override;
+
+ /// <summary>
+ /// Calculates the hash of this texture, for use with the texture pool.
+ /// </summary>
void CalcHash() override;
+
void Save(const fs::path& outFolder) override;
std::string GetHeaderDefines() const;
@@ -84,10 +91,28 @@ public:
uint32_t GetWidth() const;
uint32_t GetHeight() const;
void SetDimensions(uint32_t nWidth, uint32_t nHeight);
+
+ /// <summary>
+ /// Returns how many bytes each pixel takes up.
+ /// </summary>
+ /// <returns></returns>
float GetPixelMultiplyer() const;
+
TextureType GetTextureType() const;
+
+ /// <summary>
+ /// Returns the path to the texture pool, taken from the config file.
+ /// </summary>
+ /// <param name="defaultValue"></param>
+ /// <returns></returns>
fs::path GetPoolOutPath(const fs::path& defaultValue);
+
+ /// <summary>
+ /// Returns if this texture uses a palette.
+ /// </summary>
+ /// <returns></returns>
bool IsColorIndexed() const;
+
void SetTlut(ZTexture* nTlut);
bool HasTlut() const;
void ParseRawDataLate() override;