diff options
| author | KiritoDv <kiritodev01@gmail.com> | 2024-03-28 22:19:27 -0600 |
|---|---|---|
| committer | KiritoDv <kiritodev01@gmail.com> | 2024-03-28 22:19:27 -0600 |
| commit | 42d95d50fd6f8d41db71ff7f42d1260df84c1c1d (patch) | |
| tree | 511fa7ace7500edafb8ea1ab87135faa2c8db376 /src/utils | |
| parent | a7d7acdc4219d474597960b55fea06b06e1911ad (diff) | |
WIP Collision factoryfeature/sm64-collision
Diffstat (limited to 'src/utils')
| -rw-r--r-- | src/utils/Decompressor.cpp | 25 | ||||
| -rw-r--r-- | src/utils/Decompressor.h | 6 |
2 files changed, 19 insertions, 12 deletions
diff --git a/src/utils/Decompressor.cpp b/src/utils/Decompressor.cpp index c59d867..7c63c09 100644 --- a/src/utils/Decompressor.cpp +++ b/src/utils/Decompressor.cpp @@ -43,12 +43,9 @@ DecompressedData Decompressor::AutoDecode(YAML::Node& node, std::vector<uint8_t> auto offset = node["offset"].as<uint32_t>(); - CompressionType type = Companion::Instance->GetCurrCompressionType(); - - switch(type) { - case CompressionType::MIO0: - { - auto fileOffset = TranslateAddr(offset, true); + switch(Companion::Instance->GetCurrCompressionType()) { + case CompressionType::MIO0: { + const auto fileOffset = TranslateAddr(offset, true); offset = ASSET_PTR(offset); auto decoded = Decode(buffer, fileOffset, CompressionType::MIO0); @@ -60,15 +57,12 @@ DecompressedData Decompressor::AutoDecode(YAML::Node& node, std::vector<uint8_t> } case CompressionType::YAY0: throw std::runtime_error("Found compressed yay0 segment.\nDecompression of yay0 has not been implemented yet."); - break; case CompressionType::YAZ0: throw std::runtime_error("Found compressed yaz0 segment.\nDecompression of yaz0 has not been implemented yet."); - break; - case CompressionType::None: - { - auto fileOffset = TranslateAddr(offset); + case CompressionType::None: { + const auto fileOffset = TranslateAddr(offset); - auto size = node["size"] ? node["size"].as<size_t>() : manualSize.value_or(buffer.size() - fileOffset); + const auto size = node["size"] ? node["size"].as<size_t>() : manualSize.value_or(buffer.size() - fileOffset); return { .root = nullptr, @@ -80,6 +74,13 @@ DecompressedData Decompressor::AutoDecode(YAML::Node& node, std::vector<uint8_t> throw std::runtime_error("Auto decode could not find a compression type nor uncompressed segment.\nThis is one of those issues that should never really happen."); } +DecompressedData Decompressor::AutoDecodeByOffset(uint32_t offset, size_t size, std::vector<uint8_t>& buffer) { + YAML::Node node; + node["offset"] = offset; + node["size"] = size; + return AutoDecode(node, buffer); +} + uint32_t Decompressor::TranslateAddr(uint32_t addr, bool baseAddress){ if(IS_SEGMENTED(addr)){ const auto segment = Companion::Instance->GetFileOffsetFromSegmentedAddr(SEGMENT_NUMBER(addr)); diff --git a/src/utils/Decompressor.h b/src/utils/Decompressor.h index 0cb5a01..093b12c 100644 --- a/src/utils/Decompressor.h +++ b/src/utils/Decompressor.h @@ -1,5 +1,6 @@ #pragma once +#include <BinaryReader.h> #include <vector> #include <cstdint> #include <unordered_map> @@ -23,12 +24,17 @@ struct DataChunk { struct DecompressedData { DataChunk* root; DataChunk segment; + + LUS::BinaryReader GetReader() const { + return LUS::BinaryReader(segment.data, segment.size); + } }; class Decompressor { public: static DataChunk* Decode(const std::vector<uint8_t>& buffer, uint32_t offset, CompressionType type); static DecompressedData AutoDecode(YAML::Node& node, std::vector<uint8_t>& buffer, std::optional<size_t> size = std::nullopt); + static DecompressedData AutoDecodeByOffset(uint32_t offset, size_t size, std::vector<uint8_t>& buffer); static uint32_t TranslateAddr(uint32_t addr, bool baseAddress = false); static bool IsSegmented(uint32_t addr); |
