diff options
| author | KiritoDv <kiritodev01@gmail.com> | 2024-04-01 23:13:43 -0600 |
|---|---|---|
| committer | KiritoDv <kiritodev01@gmail.com> | 2024-04-01 23:13:43 -0600 |
| commit | b90af0cb29d7047b3c815ccf2d2cc1d85ead6380 (patch) | |
| tree | e970a15a35db28e494682c6a2a3c10bdb315d7be | |
| parent | c567193d17d7fb9b706d5ca2d000520def55f3f8 (diff) | |
Bswapped textures and dlists
| -rw-r--r-- | src/factories/DisplayListFactory.cpp | 4 | ||||
| -rw-r--r-- | src/factories/TextureFactory.cpp | 18 |
2 files changed, 20 insertions, 2 deletions
diff --git a/src/factories/DisplayListFactory.cpp b/src/factories/DisplayListFactory.cpp index b5d71dd..8d67392 100644 --- a/src/factories/DisplayListFactory.cpp +++ b/src/factories/DisplayListFactory.cpp @@ -303,8 +303,8 @@ std::optional<std::shared_ptr<IParsedData>> DListFactory::parse(std::vector<uint auto processing = true; while (processing){ - auto w0 = reader.ReadUInt32(); - auto w1 = reader.ReadUInt32(); + auto w0 = BSWAP32(reader.ReadUInt32()); + auto w1 = BSWAP32(reader.ReadUInt32()); uint8_t opcode = w0 >> 24; diff --git a/src/factories/TextureFactory.cpp b/src/factories/TextureFactory.cpp index a293bfc..0b70618 100644 --- a/src/factories/TextureFactory.cpp +++ b/src/factories/TextureFactory.cpp @@ -316,6 +316,24 @@ std::optional<std::shared_ptr<IParsedData>> TextureFactory::parse(std::vector<ui result = alloc_ia8_text_from_i1(reinterpret_cast<uint16_t*>(segment.data), 8, 16); } else { result = std::vector(segment.data, segment.data + segment.size); + + size_t byteSize = std::max(1, (int) (fmt.depth / 8)); + + if(byteSize == sizeof(uint16_t)){ + std::vector<uint16_t> temp; + for(int i = 0; i < result.size(); i+=2){ + temp.push_back(BSWAP16(*(uint16_t*) &result[i])); + } + result = std::vector<uint8_t>((uint8_t*) temp.data(), (uint8_t*) temp.data() + temp.size() * sizeof(uint16_t)); + } else if(byteSize == sizeof(uint32_t)){ + std::vector<uint16_t> temp; + for(int i = 0; i < result.size(); i+=4){ + temp.push_back(BSWAP32(*(uint32_t*) &result[i])); + } + result = std::vector<uint8_t>((uint8_t*) temp.data(), (uint8_t*) temp.data() + temp.size() * sizeof(uint32_t)); + } else { + result = std::vector(segment.data, segment.data + segment.size); + } } SPDLOG_INFO("Texture: {}", format); |
