[Resources] Properly encode soh textures and remove raw load (#2548)

This commit is contained in:
David Chavez 2023-03-01 10:18:26 +01:00 committed by GitHub
parent e07de4b3b5
commit 109345e94d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 39 additions and 48 deletions

View File

@ -1,4 +1,5 @@
#include "Main.h" #include "Main.h"
#include "Exporter.h"
#include "BackgroundExporter.h" #include "BackgroundExporter.h"
#include "TextureExporter.h" #include "TextureExporter.h"
#include "RoomExporter.h" #include "RoomExporter.h"
@ -120,13 +121,23 @@ static void ExporterProgramEnd()
splitPath.pop_back(); splitPath.pop_back();
std::string afterPath = std::accumulate(splitPath.begin(), splitPath.end(), std::string("")); std::string afterPath = std::accumulate(splitPath.begin(), splitPath.end(), std::string(""));
if (extension == "png" && (format == "rgba32" || format == "rgb5a1" || format == "i4" || format == "i8" || format == "ia4" || format == "ia8" || format == "ia16" || format == "ci4" || format == "ci8")) { if (extension == "png" && (format == "rgba32" || format == "rgb5a1" || format == "i4" || format == "i8" || format == "ia4" || format == "ia8" || format == "ia16" || format == "ci4" || format == "ci8")) {
ZTexture tex(nullptr);
Globals::Instance->buildRawTexture = true; Globals::Instance->buildRawTexture = true;
Globals::Instance->BuildAssetTexture(item, ZTexture::GetTextureTypeFromString(format), afterPath); tex.FromPNG(item, ZTexture::GetTextureTypeFromString(format));
Globals::Instance->buildRawTexture = false;
auto fileData = File::ReadAllBytes(afterPath);
printf("otrArchive->AddFile(%s)\n", StringHelper::Split(afterPath, "Extract/")[1].c_str()); printf("otrArchive->AddFile(%s)\n", StringHelper::Split(afterPath, "Extract/")[1].c_str());
otrArchive->AddFile(StringHelper::Split(afterPath, "Extract/")[1], (uintptr_t)fileData.data(), fileData.size());
auto exporter = new OTRExporter_Texture();
MemoryStream* stream = new MemoryStream();
BinaryWriter writer(stream);
exporter->Save(&tex, "", &writer);
std::string src = tex.GetBodySourceCode();
writer.Write((char*) src.c_str(), src.size());
std::vector<char> fileData = stream->ToVector();
otrArchive->AddFile(StringHelper::Split(afterPath, "Extract/assets/")[1], (uintptr_t)fileData.data(), fileData.size());
continue;
} }
} }

View File

@ -17,9 +17,10 @@ void OTRExporter_Texture::Save(ZResource* res, const fs::path& outPath, BinaryWr
writer->Write((uint32_t)tex->GetRawDataSize()); writer->Write((uint32_t)tex->GetRawDataSize());
auto data = tex->parent->GetRawData(); if (tex->parent != nullptr) {
auto data = tex->parent->GetRawData();
writer->Write((char*)data.data() + tex->GetRawDataIndex(), tex->GetRawDataSize()); writer->Write((char*)data.data() + tex->GetRawDataIndex(), tex->GetRawDataSize());
}
auto end = std::chrono::steady_clock::now(); auto end = std::chrono::steady_clock::now();
size_t diff = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count(); size_t diff = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();

View File

@ -894,26 +894,6 @@ extern "C" char* GetResourceDataByNameHandlingMQ(const char* path) {
return (char*)res->GetPointer(); return (char*)res->GetPointer();
} }
extern "C" char* ResourceMgr_LoadFileRaw(const char* resName) {
// TODO: This should not exist. Anywhere we are loading textures with this function should be Resources instead.
// We are not currently packing our otr archive with certain textures as resources with otr headers.
static std::unordered_map<std::string, std::shared_ptr<Ship::OtrFile>> cachedRawFiles;
auto cacheFind = cachedRawFiles.find(resName);
if (cacheFind != cachedRawFiles.end()) {
return cacheFind->second->Buffer.data();
}
auto file = OTRGlobals::Instance->context->GetResourceManager()->LoadFile(resName);
cachedRawFiles[resName] = file;
if (file == nullptr) {
return nullptr;
}
return file->Buffer.data();
}
extern "C" char* ResourceMgr_LoadFileFromDisk(const char* filePath) { extern "C" char* ResourceMgr_LoadFileFromDisk(const char* filePath) {
FILE* file = fopen(filePath, "r"); FILE* file = fopen(filePath, "r");
fseek(file, 0, SEEK_END); fseek(file, 0, SEEK_END);

View File

@ -97,7 +97,6 @@ float OTRGetDimensionFromLeftEdge(float v);
float OTRGetDimensionFromRightEdge(float v); float OTRGetDimensionFromRightEdge(float v);
int16_t OTRGetRectDimensionFromLeftEdge(float v); int16_t OTRGetRectDimensionFromLeftEdge(float v);
int16_t OTRGetRectDimensionFromRightEdge(float v); int16_t OTRGetRectDimensionFromRightEdge(float v);
char* ResourceMgr_LoadFileRaw(const char* resName);
bool AudioPlayer_Init(void); bool AudioPlayer_Init(void);
int AudioPlayer_Buffered(void); int AudioPlayer_Buffered(void);
int AudioPlayer_GetDesiredBuffered(void); int AudioPlayer_GetDesiredBuffered(void);

View File

@ -5321,7 +5321,7 @@ void Interface_Draw(PlayState* play) {
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, dPadColor.r, dPadColor.g, dPadColor.b, dpadAlpha); gDPSetPrimColor(OVERLAY_DISP++, 0, 0, dPadColor.r, dPadColor.g, dPadColor.b, dpadAlpha);
if (fullUi) { if (fullUi) {
gDPLoadTextureBlock(OVERLAY_DISP++, ResourceMgr_LoadFileRaw("assets/textures/parameter_static/gDPad"), gDPLoadTextureBlock(OVERLAY_DISP++, GetResourceDataByName("__OTR__textures/parameter_static/gDPad", false),
G_IM_FMT_IA, G_IM_SIZ_16b, 32, 32, 0, G_TX_NOMIRROR | G_TX_WRAP, G_IM_FMT_IA, G_IM_SIZ_16b, 32, 32, 0, G_TX_NOMIRROR | G_TX_WRAP,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
gSPWideTextureRectangle(OVERLAY_DISP++, DpadPosX << 2, DpadPosY << 2, gSPWideTextureRectangle(OVERLAY_DISP++, DpadPosX << 2, DpadPosY << 2,

View File

@ -752,16 +752,16 @@ void EnBox_UpdateSizeAndTexture(EnBox* this, PlayState* play) {
void EnBox_CreateExtraChestTextures() { void EnBox_CreateExtraChestTextures() {
if (hasCreatedRandoChestTextures) return; if (hasCreatedRandoChestTextures) return;
Gfx gTreasureChestChestTextures[] = { Gfx gTreasureChestChestTextures[] = {
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, ResourceMgr_LoadFileRaw("assets/objects/object_box/gSkullTreasureChestFrontTex")), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, GetResourceDataByName("__OTR__objects/object_box/gSkullTreasureChestFrontTex", false)),
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, ResourceMgr_LoadFileRaw("assets/objects/object_box/gSkullTreasureChestSideAndTopTex")), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, GetResourceDataByName("__OTR__objects/object_box/gSkullTreasureChestSideAndTopTex", false)),
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, ResourceMgr_LoadFileRaw("assets/objects/object_box/gGoldTreasureChestFrontTex")), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, GetResourceDataByName("__OTR__objects/object_box/gGoldTreasureChestFrontTex", false)),
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, ResourceMgr_LoadFileRaw("assets/objects/object_box/gGoldTreasureChestSideAndTopTex")), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, GetResourceDataByName("__OTR__objects/object_box/gGoldTreasureChestSideAndTopTex", false)),
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, ResourceMgr_LoadFileRaw("assets/objects/object_box/gKeyTreasureChestFrontTex")), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, GetResourceDataByName("__OTR__objects/object_box/gKeyTreasureChestFrontTex", false)),
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, ResourceMgr_LoadFileRaw("assets/objects/object_box/gKeyTreasureChestSideAndTopTex")), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, GetResourceDataByName("__OTR__objects/object_box/gKeyTreasureChestSideAndTopTex", false)),
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, ResourceMgr_LoadFileRaw("assets/objects/object_box/gChristmasRedTreasureChestFrontTex")), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, GetResourceDataByName("__OTR__objects/object_box/gChristmasRedTreasureChestFrontTex", false)),
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, ResourceMgr_LoadFileRaw("assets/objects/object_box/gChristmasRedTreasureChestSideAndTopTex")), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, GetResourceDataByName("__OTR__objects/object_box/gChristmasRedTreasureChestSideAndTopTex", false)),
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, ResourceMgr_LoadFileRaw("assets/objects/object_box/gChristmasGreenTreasureChestFrontTex")), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, GetResourceDataByName("__OTR__objects/object_box/gChristmasGreenTreasureChestFrontTex", false)),
gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, ResourceMgr_LoadFileRaw("assets/objects/object_box/gChristmasGreenTreasureChestSideAndTopTex")), gsDPSetTextureImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 1, GetResourceDataByName("__OTR__objects/object_box/gChristmasGreenTreasureChestSideAndTopTex", false)),
}; };
Gfx* frontCmd = ResourceMgr_LoadGfxByName(gTreasureChestChestFrontDL); Gfx* frontCmd = ResourceMgr_LoadGfxByName(gTreasureChestChestFrontDL);

View File

@ -55,7 +55,7 @@ void FileChoose_DrawRawImageRGBA32(GraphicsContext* gfxCtx, s16 centerX, s16 cen
OPEN_DISPS(gfxCtx); OPEN_DISPS(gfxCtx);
source = ResourceMgr_LoadFileRaw(source); source = GetResourceDataByName(source, false);
curTexture = source; curTexture = source;
rectLeft = centerX - (width / 2); rectLeft = centerX - (width / 2);
@ -1448,11 +1448,11 @@ const char* FileChoose_GetQuestChooseTitleTexName(Language lang) {
switch (lang) { switch (lang) {
case LANGUAGE_ENG: case LANGUAGE_ENG:
default: default:
return "assets/textures/title_static/gFileSelPleaseChooseAQuestENGTex"; return "__OTR__textures/title_static/gFileSelPleaseChooseAQuestENGTex";
case LANGUAGE_FRA: case LANGUAGE_FRA:
return "assets/textures/title_static/gFileSelPleaseChooseAQuestFRATex"; return "__OTR__textures/title_static/gFileSelPleaseChooseAQuestFRATex";
case LANGUAGE_GER: case LANGUAGE_GER:
return "assets/textures/title_static/gFileSelPleaseChooseAQuestGERTex"; return "__OTR__textures/title_static/gFileSelPleaseChooseAQuestGERTex";
} }
} }
@ -1471,7 +1471,7 @@ void FileChoose_DrawWindowContents(GameState* thisx) {
char* tex = (this->configMode == CM_QUEST_MENU || this->configMode == CM_ROTATE_TO_NAME_ENTRY || char* tex = (this->configMode == CM_QUEST_MENU || this->configMode == CM_ROTATE_TO_NAME_ENTRY ||
this->configMode == CM_START_QUEST_MENU || this->configMode == CM_QUEST_TO_MAIN || this->configMode == CM_START_QUEST_MENU || this->configMode == CM_QUEST_TO_MAIN ||
this->configMode == CM_NAME_ENTRY_TO_QUEST_MENU) this->configMode == CM_NAME_ENTRY_TO_QUEST_MENU)
? ResourceMgr_LoadFileRaw(FileChoose_GetQuestChooseTitleTexName(gSaveContext.language)) ? GetResourceDataByName(FileChoose_GetQuestChooseTitleTexName(gSaveContext.language), false)
: sTitleLabels[gSaveContext.language][this->titleLabel]; : sTitleLabels[gSaveContext.language][this->titleLabel];
OPEN_DISPS(this->state.gfxCtx); OPEN_DISPS(this->state.gfxCtx);
@ -1541,7 +1541,7 @@ void FileChoose_DrawWindowContents(GameState* thisx) {
FileChoose_DrawTextureI8(this->state.gfxCtx, gTitleTheLegendOfTextTex, 72, 8, 156, 108, 72, 8, 1024, 1024); FileChoose_DrawTextureI8(this->state.gfxCtx, gTitleTheLegendOfTextTex, 72, 8, 156, 108, 72, 8, 1024, 1024);
FileChoose_DrawTextureI8(this->state.gfxCtx, gTitleOcarinaOfTimeTMTextTex, 96, 8, 154, 163, 96, 8, 1024, 1024); FileChoose_DrawTextureI8(this->state.gfxCtx, gTitleOcarinaOfTimeTMTextTex, 96, 8, 154, 163, 96, 8, 1024, 1024);
FileChoose_DrawImageRGBA32(this->state.gfxCtx, 160, 135, ResourceMgr_GameHasOriginal() ? gTitleZeldaShieldLogoTex : gTitleZeldaShieldLogoMQTex, 160, 160); FileChoose_DrawImageRGBA32(this->state.gfxCtx, 160, 135, ResourceMgr_GameHasOriginal() ? gTitleZeldaShieldLogoTex : gTitleZeldaShieldLogoMQTex, 160, 160);
FileChoose_DrawRawImageRGBA32(this->state.gfxCtx, 182, 180, "assets/objects/object_mag/gTitleRandomizerSubtitleTex", 128, 32); FileChoose_DrawRawImageRGBA32(this->state.gfxCtx, 182, 180, "__OTR__objects/object_mag/gTitleRandomizerSubtitleTex", 128, 32);
break; break;
} }
} else if (this->configMode != CM_ROTATE_TO_NAME_ENTRY) { } else if (this->configMode != CM_ROTATE_TO_NAME_ENTRY) {
@ -1617,7 +1617,7 @@ void FileChoose_DrawWindowContents(GameState* thisx) {
this->nameAlpha[i]); this->nameAlpha[i]);
} }
gDPLoadTextureBlock(POLY_OPA_DISP++, gDPLoadTextureBlock(POLY_OPA_DISP++,
ResourceMgr_LoadFileRaw("assets/textures/title_static/gFileSelRANDButtonTex"), GetResourceDataByName("__OTR__textures/title_static/gFileSelRANDButtonTex", false),
G_IM_FMT_IA, G_IM_SIZ_16b, 44, 16, 0, G_TX_NOMIRROR | G_TX_WRAP, G_IM_FMT_IA, G_IM_SIZ_16b, 44, 16, 0, G_TX_NOMIRROR | G_TX_WRAP,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
gSP1Quadrangle(POLY_OPA_DISP++, 8, 10, 11, 9, 0); gSP1Quadrangle(POLY_OPA_DISP++, 8, 10, 11, 9, 0);
@ -1634,7 +1634,7 @@ void FileChoose_DrawWindowContents(GameState* thisx) {
this->nameAlpha[i]); this->nameAlpha[i]);
} }
gDPLoadTextureBlock(POLY_OPA_DISP++, gDPLoadTextureBlock(POLY_OPA_DISP++,
ResourceMgr_LoadFileRaw("assets/textures/title_static/gFileSelMQButtonTex"), GetResourceDataByName("__OTR__textures/title_static/gFileSelMQButtonTex", false),
G_IM_FMT_IA, G_IM_SIZ_16b, 44, 16, 0, G_TX_NOMIRROR | G_TX_WRAP, G_IM_FMT_IA, G_IM_SIZ_16b, 44, 16, 0, G_TX_NOMIRROR | G_TX_WRAP,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
gSP1Quadrangle(POLY_OPA_DISP++, 8, 10, 11, 9, 0); gSP1Quadrangle(POLY_OPA_DISP++, 8, 10, 11, 9, 0);