Skip to content

Commit a5d521b

Browse files
committed
Port over CTexture::MangleMipmap from decomp
1 parent 1112b1e commit a5d521b

File tree

3 files changed

+77
-8
lines changed

3 files changed

+77
-8
lines changed

Runtime/CMemoryCardSys.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ void CMemoryCardSys::CCardFileInfo::LockIconToken(CAssetId iconTxtr, kabufuda::E
184184
u32 CMemoryCardSys::CCardFileInfo::CalculateBannerDataSize() const {
185185
u32 ret = 68;
186186
if (x3c_bannerTex.IsValid()) {
187-
if ((*x40_bannerTok)->GetTextureFormat() == ETexelFormat::RGB5A3) {
187+
if ((*x40_bannerTok)->GetTexelFormat() == ETexelFormat::RGB5A3) {
188188
ret = 6212;
189189
} else {
190190
ret = 3652;
@@ -193,7 +193,7 @@ u32 CMemoryCardSys::CCardFileInfo::CalculateBannerDataSize() const {
193193

194194
bool paletteTex = false;
195195
for (const Icon& icon : x50_iconToks) {
196-
if (icon.x8_tex->GetTextureFormat() == ETexelFormat::RGB5A3) {
196+
if (icon.x8_tex->GetTexelFormat() == ETexelFormat::RGB5A3) {
197197
ret += 2048;
198198
} else {
199199
ret += 1024;
@@ -236,7 +236,7 @@ void CMemoryCardSys::CCardFileInfo::BuildCardBuffer() {
236236
void CMemoryCardSys::CCardFileInfo::WriteBannerData(COutputStream& out) const {
237237
if (x3c_bannerTex.IsValid()) {
238238
const TLockedToken<CTexture>& tex = *x40_bannerTok;
239-
const auto format = tex->GetTextureFormat();
239+
const auto format = tex->GetTexelFormat();
240240
const auto* texels = tex->GetConstBitMapData(0);
241241
if (format == ETexelFormat::RGB5A3) {
242242
out.Put(texels, 6144);
@@ -252,7 +252,7 @@ void CMemoryCardSys::CCardFileInfo::WriteBannerData(COutputStream& out) const {
252252
void CMemoryCardSys::CCardFileInfo::WriteIconData(COutputStream& out) const {
253253
const u8* palette = nullptr;
254254
for (const Icon& icon : x50_iconToks) {
255-
const auto format = icon.x8_tex->GetTextureFormat();
255+
const auto format = icon.x8_tex->GetTexelFormat();
256256
const auto* texels = icon.x8_tex->GetConstBitMapData(0);
257257
if (format == ETexelFormat::RGB5A3) {
258258
out.Put(texels, 2048);
@@ -305,7 +305,7 @@ ECardResult CMemoryCardSys::CCardFileInfo::GetStatus(kabufuda::CardStat& stat) c
305305

306306
kabufuda::EImageFormat bannerFmt;
307307
if (x3c_bannerTex.IsValid()) {
308-
if ((*x40_bannerTok)->GetTextureFormat() == ETexelFormat::RGB5A3) {
308+
if ((*x40_bannerTok)->GetTexelFormat() == ETexelFormat::RGB5A3) {
309309
bannerFmt = kabufuda::EImageFormat::RGB5A3;
310310
} else {
311311
bannerFmt = kabufuda::EImageFormat::C8;
@@ -317,7 +317,7 @@ ECardResult CMemoryCardSys::CCardFileInfo::GetStatus(kabufuda::CardStat& stat) c
317317

318318
int idx = 0;
319319
for (const Icon& icon : x50_iconToks) {
320-
stat.SetIconFormat(icon.x8_tex->GetTextureFormat() == ETexelFormat::RGB5A3 ? kabufuda::EImageFormat::RGB5A3
320+
stat.SetIconFormat(icon.x8_tex->GetTexelFormat() == ETexelFormat::RGB5A3 ? kabufuda::EImageFormat::RGB5A3
321321
: kabufuda::EImageFormat::C8,
322322
idx);
323323
stat.SetIconSpeed(icon.x4_speed, idx);

Runtime/Graphics/CTexture.cpp

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
#include "Runtime/CToken.hpp"
44
#include "Runtime/Formatting.hpp"
55

6+
#include "Runtime/CBasics.hpp"
7+
68
#include <zeus/Math.hpp>
79
#include <magic_enum.hpp>
810

@@ -252,7 +254,74 @@ void CTexture::UncountMemory() {
252254
}
253255

254256
void CTexture::MangleMipmap(u32 mip) {
255-
// TODO(phil): Mangle mipmap
257+
if (mip >= x8_mips) {
258+
return;
259+
}
260+
261+
const uint colors[4] = {
262+
0x000000FF,
263+
0x0000FF00,
264+
0x00FF0000,
265+
0x0000FFFF,
266+
};
267+
const uint color = colors[(mip - 1) & 3];
268+
ushort rgb565Color = ((color >> 3) & 0x001F) | // B
269+
((color >> 5) & 0x07E0) | // G
270+
((color >> 8) & 0xF800); // R
271+
ushort rgb555Color = ((color >> 3) & 0x001F) | // B
272+
((color >> 6) & 0x03E0) | // G
273+
((color >> 9) & 0x7C00); // R
274+
ushort rgb4Color = ((color >> 4) & 0x000F) | // B
275+
((color >> 8) & 0x00F0) | // G
276+
((color >> 12) & 0x0F00); // R
277+
278+
int width = GetWidth();
279+
int height = GetHeight();
280+
281+
int offset = 0;
282+
for (int i = 0; i < mip; i++) {
283+
offset += width * height;
284+
width /= 2;
285+
height /= 2;
286+
}
287+
288+
switch (GetTexelFormat()) {
289+
case ETexelFormat::RGB565: {
290+
ushort* ptr = reinterpret_cast< ushort* >(x44_aramToken_x4_buff.get());//mARAMToken.GetMRAMSafe());
291+
for (int i = 0; i < width * height; ++i) {
292+
ptr[i + offset] = rgb565Color;
293+
CBasics::Swap2Bytes(reinterpret_cast<u8*>(&ptr[i + offset]));
294+
}
295+
break;
296+
}
297+
case ETexelFormat::CMPR: {
298+
ushort* ptr = reinterpret_cast< ushort* >(x44_aramToken_x4_buff.get()) + offset / 4;
299+
for (int i = 0; i < width * height / 16; ++i, ptr += 4) {
300+
ptr[0] = rgb565Color;
301+
CBasics::Swap2Bytes(reinterpret_cast<u8*>(&ptr[0]));
302+
ptr[1] = rgb565Color;
303+
CBasics::Swap2Bytes(reinterpret_cast<u8*>(&ptr[1]));
304+
ptr[2] = 0;
305+
ptr[3] = 0;
306+
}
307+
break;
308+
}
309+
case ETexelFormat::RGB5A3: {
310+
ushort* ptr = reinterpret_cast< ushort* >(x44_aramToken_x4_buff.get());
311+
for (int i = 0; i < width * height; ++i) {
312+
ushort& val = ptr[i + offset];
313+
if (val & 0x8000) {
314+
val = rgb555Color | 0x8000;
315+
} else {
316+
val = (val & 0xF000) | rgb4Color;
317+
}
318+
CBasics::Swap2Bytes(reinterpret_cast<u8*>(&val));
319+
}
320+
break;
321+
}
322+
default:
323+
break;
324+
}
256325
}
257326

258327
u32 CTexture::TexelFormatBitsPerPixel(ETexelFormat fmt) {

Runtime/Graphics/CTexture.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ class CTexture {
106106
EBlackKey blackKey = EBlackKey::Zero);
107107
~CTexture();
108108

109-
[[nodiscard]] ETexelFormat GetTextureFormat() const { return x0_fmt; }
109+
[[nodiscard]] ETexelFormat GetTexelFormat() const { return x0_fmt; }
110110
[[nodiscard]] u16 GetWidth() const { return x4_w; }
111111
[[nodiscard]] u16 GetHeight() const { return x6_h; }
112112
[[nodiscard]] u8 GetNumberOfMipMaps() const { return x8_mips; }

0 commit comments

Comments
 (0)