From f1781973bc7bd3fc9b9cc32b4d631f9e1bbc9368 Mon Sep 17 00:00:00 2001 From: KiritoDv Date: Tue, 12 Mar 2024 19:09:40 -0600 Subject: Added support for assets with vram offsets --- src/Companion.cpp | 18 +++++++++++++++--- src/Companion.h | 7 +++++++ src/factories/BaseFactory.h | 3 ++- src/utils/Decompressor.cpp | 10 ++++++++++ 4 files changed, 34 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/Companion.cpp b/src/Companion.cpp index e099c5e..754a92e 100644 --- a/src/Companion.cpp +++ b/src/Companion.cpp @@ -288,6 +288,13 @@ void Companion::ParseCurrentFileConfig(YAML::Node node) { this->gTables.push_back({name, start, end, tMode}); } } + + if(node["vram"]){ + auto vram = node["vram"]; + const auto addr = GetSafeNode(vram, "addr"); + const auto offset = GetSafeNode(vram, "offset"); + this->gCurrentVram = { addr, offset }; + } } void Companion::Process() { @@ -512,6 +519,8 @@ void Companion::Process() { this->gConfig.segment.local.clear(); this->gFileHeader.clear(); this->gCurrentPad = 0; + this->gCurrentVram = std::nullopt; + this->gCurrentSegmentNumber = 0; this->gTables.clear(); GFXDOverride::ClearVtx(); @@ -555,9 +564,10 @@ void Companion::Process() { this->ExtractNode(node, output, wrapper); } } else { + const auto offset = assetNode["offset"].as(); if(gCurrentFileOffset) { - if (IS_SEGMENTED(assetNode["offset"].as()) == false) { - assetNode["offset"] = (gCurrentSegmentNumber << 24) | assetNode["offset"].as(); + if (IS_SEGMENTED(offset) == false) { + assetNode["offset"] = (gCurrentSegmentNumber << 24) | offset; } } std::string output = (this->gCurrentDirectory / entryName).string(); @@ -735,7 +745,9 @@ void Companion::Pack(const std::string& folder, const std::string& output) { } std::optional> Companion::RegisterAsset(const std::string& name, YAML::Node& node) { - if(!node["offset"]) return std::nullopt; + if(!node["offset"]) { + return std::nullopt; + } this->gAssetDependencies[this->gCurrentFile][name] = std::make_pair(node, false); diff --git a/src/Companion.h b/src/Companion.h index 265f2eb..1ed5470 100644 --- a/src/Companion.h +++ b/src/Companion.h @@ -46,6 +46,11 @@ struct Table { TableMode mode; }; +struct VRAMEntry { + uint32_t addr; + uint32_t offset; +}; + struct GBIConfig { GBIVersion version = GBIVersion::f3d; GBIMinorVersion subversion = GBIMinorVersion::None; @@ -94,6 +99,7 @@ public: std::optional GetCurrSegmentNumber(void) const { return this->gCurrentSegmentNumber; }; 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::optional SearchTable(uint32_t addr); static std::string CalculateHash(const std::vector& data); @@ -117,6 +123,7 @@ private: uint32_t gCurrentPad = 0; uint32_t gCurrentFileOffset; uint32_t gCurrentSegmentNumber; + std::optional gCurrentVram; CompressionType gCurrentCompressionType; std::vector
gTables; std::variant, std::string> gWriteOrder; diff --git a/src/factories/BaseFactory.h b/src/factories/BaseFactory.h index 0ccf6dc..05d3d77 100644 --- a/src/factories/BaseFactory.h +++ b/src/factories/BaseFactory.h @@ -17,7 +17,8 @@ #define SEGMENT_OFFSET(a) ((uint32_t)(a) & 0x00FFFFFF) #define SEGMENT_NUMBER(x) (((uint32_t)(x) >> 24) & 0xFF) -#define IS_SEGMENTED(x) (((uint32_t)(x) > 0x01000000) && (SEGMENT_NUMBER(x) < 0x20)) +// I would love to use 0x01000000, but the stupid compiler takes it as 0x01 +#define IS_SEGMENTED(x) (((uint32_t)(x) > 16777216) && (SEGMENT_NUMBER(x) < 0x20)) #define tab "\t" #define fourSpaceTab " " diff --git a/src/utils/Decompressor.cpp b/src/utils/Decompressor.cpp index 6d41910..3a2525e 100644 --- a/src/utils/Decompressor.cpp +++ b/src/utils/Decompressor.cpp @@ -91,6 +91,16 @@ uint32_t Decompressor::TranslateAddr(uint32_t addr, bool baseAddress){ return segment.value() + (!baseAddress ? SEGMENT_OFFSET(addr) : 0); } + const auto vramEntry = Companion::Instance->GetCurrentVRAM(); + + if(vramEntry.has_value()){ + const auto vram = vramEntry.value(); + + if(addr >= vram.addr){ + return vram.offset + (addr - vram.addr); + } + } + return addr; } -- cgit v1.2.3