From d24b5b3193e170b1e1153d5568827e00dfde5569 Mon Sep 17 00:00:00 2001 From: = <=> Date: Wed, 1 May 2024 18:33:32 -0600 Subject: Add tkmk00 --- src/utils/Decompressor.cpp | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'src/utils/Decompressor.cpp') diff --git a/src/utils/Decompressor.cpp b/src/utils/Decompressor.cpp index 150ae5d..b12ba0e 100644 --- a/src/utils/Decompressor.cpp +++ b/src/utils/Decompressor.cpp @@ -6,6 +6,7 @@ extern "C" { #include +#include } std::unordered_map gCachedChunks; @@ -35,6 +36,23 @@ DataChunk* Decompressor::Decode(const std::vector& buffer, const uint32 } } +DataChunk* Decompressor::DecodeTKMK00(const std::vector& buffer, const uint32_t offset, const uint32_t size, const uint32_t alpha) { + + if(gCachedChunks.contains(offset)){ + return gCachedChunks[offset]; + } + + const uint8_t* in_buf = buffer.data() + offset; + + const auto decompressed = new uint8_t[size]; + const auto rgba = new uint8_t[size]; + SPDLOG_INFO("RUN?"); + tkmk00_decode(in_buf, decompressed, rgba, alpha); + SPDLOG_INFO("RUN2?"); + gCachedChunks[offset] = new DataChunk{ decompressed, size }; + return gCachedChunks[offset]; +} + DecompressedData Decompressor::AutoDecode(YAML::Node& node, std::vector& buffer, std::optional manualSize) { auto offset = GetSafeNode(node, "offset"); @@ -58,6 +76,26 @@ DecompressedData Decompressor::AutoDecode(YAML::Node& node, std::vector }; } + // Extract compressed tkmk00 assets in mk64. + if (node["tkmk00"]) { + const auto alpha = GetSafeNode(node, "alpha"); + const auto width = GetSafeNode(node, "width"); + const auto height = GetSafeNode(node, "height"); + const auto textureSize = width * height * 2; + auto assetPtr = ASSET_PTR(offset); + auto gameSize = Companion::Instance->GetRomData().size(); + + auto fileOffset = TranslateAddr(offset, true); + offset = ASSET_PTR(offset); + + auto decoded = DecodeTKMK00(buffer, fileOffset + offset, textureSize, alpha); + auto size = node["size"] ? node["size"].as() : manualSize.value_or(decoded->size); + return { + .root = decoded, + .segment = { decoded->data, size } + }; + } + // Extract compressed files that contain many assets. switch(type) { case CompressionType::MIO0: -- cgit v1.2.3