From 884de3c8836368cb3592ed9dec2e117be1fbc744 Mon Sep 17 00:00:00 2001 From: KiritoDv Date: Sat, 13 Apr 2024 00:26:45 -0600 Subject: Fully implemented tlut load by addr or symbol --- src/Companion.cpp | 35 +++++++++++++++++++++++++++++++---- src/Companion.h | 14 +++++++++++--- src/factories/TextureFactory.cpp | 35 +++++++++++++++++++++-------------- 3 files changed, 63 insertions(+), 21 deletions(-) (limited to 'src') diff --git a/src/Companion.cpp b/src/Companion.cpp index e2e6f21..0a74658 100644 --- a/src/Companion.cpp +++ b/src/Companion.cpp @@ -1171,6 +1171,37 @@ std::optional> Companion::GetNodeByAddr(cons return this->gAddrMap[this->gCurrentFile][addr]; } +std::optional Companion::GetParseDataByAddr(uint32_t addr) { + if(!this->gParseResults.contains(this->gCurrentFile)){ + return std::nullopt; + } + + for(auto& result : this->gParseResults[this->gCurrentFile]){ + if(result.data.has_value() && result.GetOffset() == addr){ + return result; + } + } + + return std::nullopt; +} + +std::optional Companion::GetParseDataBySymbol(const std::string& symbol) { + if(!this->gParseResults.contains(this->gCurrentFile)){ + return std::nullopt; + } + + for(auto& result : this->gParseResults[this->gCurrentFile]){ + auto sym = GetNode(result.node, "symbol"); + + if(result.data.has_value() && sym.has_value() && sym.value() == symbol){ + return result; + } + } + + return std::nullopt; + +} + std::optional>> Companion::GetNodesByType(const std::string& type){ std::vector> nodes; @@ -1263,8 +1294,4 @@ std::optional Companion::AddAsset(YAML::Node asset) { } return std::nullopt; -} - -void Companion::AddTlutTextureMap(std::string index, std::shared_ptr entry) { - this->TlutTextureMap[index] = entry; } \ No newline at end of file diff --git a/src/Companion.h b/src/Companion.h index 88e23c8..3c58637 100644 --- a/src/Companion.h +++ b/src/Companion.h @@ -80,6 +80,14 @@ struct ParseResultData { std::string type; YAML::Node node; std::optional> data; + + uint32_t GetOffset() { + return GetSafeNode(node, "offset"); + } + + std::optional GetSymbol() { + return GetSafeNode(node, "symbol"); + } }; class Companion { @@ -110,6 +118,9 @@ public: std::unordered_map> GetCourseMetadata() { return this->gCourseMetadata; } std::optional GetEnumFromValue(const std::string& key, int id); + std::optional GetParseDataByAddr(uint32_t addr); + std::optional GetParseDataBySymbol(const std::string& symbol); + std::optional GetFileOffsetFromSegmentedAddr(uint8_t segment) const; std::optional> GetNodeByAddr(uint32_t addr); std::optional> GetFactory(const std::string& type); @@ -120,8 +131,6 @@ public: CompressionType GetCurrCompressionType(void) const { return this->gCurrentCompressionType; }; CompressionType GetCompressionType(std::vector& buffer, const uint32_t offset); std::optional GetCurrentVRAM(void) const { return this->gCurrentVram; }; - std::unordered_map> GetTlutTextureMap() { return this->TlutTextureMap; }; - void AddTlutTextureMap(std::string index, std::shared_ptr entry); std::optional SearchTable(uint32_t addr); static std::string CalculateHash(const std::vector& data); @@ -167,7 +176,6 @@ private: std::unordered_map>> gWriteMap; std::unordered_map>> gAssetDependencies; std::unordered_map>> gAddrMap; - std::unordered_map> TlutTextureMap; void ParseEnums(std::string& file); void ParseHash(); diff --git a/src/factories/TextureFactory.cpp b/src/factories/TextureFactory.cpp index d2166d4..2734244 100644 --- a/src/factories/TextureFactory.cpp +++ b/src/factories/TextureFactory.cpp @@ -255,19 +255,32 @@ ExportResult TextureModdingExporter::Export(std::ostream&write, std::shared_ptr< case TextureType::Palette4bpp: { // This check needed until sf64 has tluts fixed. if (node["tlut_symbol"]) { - auto tlut = GetSafeNode(node,"tlut_symbol"); - auto tlutTextureMap = Companion::Instance->GetTlutTextureMap(); - auto palettePtr = tlutTextureMap[tlut]; - - if (palettePtr) { - convert_raw_to_ci8(&raw, &size, texture->mBuffer.data(), (uint8_t *)palettePtr->mBuffer.data(), 0, texture->mWidth, texture->mHeight, texture->mFormat.depth, palettePtr->mFormat.depth); + auto tlut = GetSafeNode(node,"tlut_symbol"); + auto palette = Companion::Instance->GetParseDataBySymbol(tlut); + if (palette.has_value()) { + auto palTexture = std::static_pointer_cast(palette.value().data.value()); + convert_raw_to_ci8(&raw, &size, texture->mBuffer.data(), (uint8_t *)palTexture->mBuffer.data(), 0, texture->mWidth, texture->mHeight, texture->mFormat.depth, palTexture->mFormat.depth); } else { auto symbol = GetSafeNode(node, "symbol"); throw std::runtime_error("Could not convert ci8 '"+symbol+"' the tlut symbol name is probably wrong for tlut_symbol node"); } break; } + + if (node["tlut"]) { + auto tlut = GetSafeNode(node,"tlut"); + auto palette = Companion::Instance->GetParseDataByAddr(tlut); + + if (palette.has_value()) { + auto palTexture = std::static_pointer_cast(palette.value().data.value()); + convert_raw_to_ci8(&raw, &size, texture->mBuffer.data(), (uint8_t *)palTexture->mBuffer.data(), 0, texture->mWidth, texture->mHeight, texture->mFormat.depth, palTexture->mFormat.depth); + } else { + auto symbol = GetSafeNode(node, "symbol"); + throw std::runtime_error("Could not convert ci8 '"+symbol+"' the address is probably wrong for tlut address node"); + } + break; + } } case TextureType::Grayscale8bpp: case TextureType::Grayscale4bpp: { @@ -351,7 +364,7 @@ std::optional> TextureFactory::parse(std::vector> TextureFactory::parse(std::vector(fmt, width, height, result); - Companion::Instance->AddTlutTextureMap(symbol, textureData); - return textureData; - } - return std::make_shared(fmt, width, height, result); } @@ -432,7 +439,7 @@ std::optional> TextureFactory::parse_modding(std::v // todo: Add wheel palette input // Implement so that it works. - // auto tlut = GetSafeNode(node,"tlut_symbol"); + // auto tlut = GetSafeNode(node,"tlut_symbol"); // auto tlutTextureMap = Companion::Instance->GetTlutTextureMap(); // auto palettePtr = tlutTextureMap[tlut]; -- cgit v1.2.3