2
0
mirror of https://github.com/AxioDL/metaforce.git synced 2025-05-13 15:51:22 +00:00

Port over CTexture::MangleMipmap from decomp

This commit is contained in:
Phillip Stephens 2025-04-14 18:25:38 -07:00
parent 1112b1e0e1
commit a5d521b652
3 changed files with 77 additions and 8 deletions

View File

@ -184,7 +184,7 @@ void CMemoryCardSys::CCardFileInfo::LockIconToken(CAssetId iconTxtr, kabufuda::E
u32 CMemoryCardSys::CCardFileInfo::CalculateBannerDataSize() const { u32 CMemoryCardSys::CCardFileInfo::CalculateBannerDataSize() const {
u32 ret = 68; u32 ret = 68;
if (x3c_bannerTex.IsValid()) { if (x3c_bannerTex.IsValid()) {
if ((*x40_bannerTok)->GetTextureFormat() == ETexelFormat::RGB5A3) { if ((*x40_bannerTok)->GetTexelFormat() == ETexelFormat::RGB5A3) {
ret = 6212; ret = 6212;
} else { } else {
ret = 3652; ret = 3652;
@ -193,7 +193,7 @@ u32 CMemoryCardSys::CCardFileInfo::CalculateBannerDataSize() const {
bool paletteTex = false; bool paletteTex = false;
for (const Icon& icon : x50_iconToks) { for (const Icon& icon : x50_iconToks) {
if (icon.x8_tex->GetTextureFormat() == ETexelFormat::RGB5A3) { if (icon.x8_tex->GetTexelFormat() == ETexelFormat::RGB5A3) {
ret += 2048; ret += 2048;
} else { } else {
ret += 1024; ret += 1024;
@ -236,7 +236,7 @@ void CMemoryCardSys::CCardFileInfo::BuildCardBuffer() {
void CMemoryCardSys::CCardFileInfo::WriteBannerData(COutputStream& out) const { void CMemoryCardSys::CCardFileInfo::WriteBannerData(COutputStream& out) const {
if (x3c_bannerTex.IsValid()) { if (x3c_bannerTex.IsValid()) {
const TLockedToken<CTexture>& tex = *x40_bannerTok; const TLockedToken<CTexture>& tex = *x40_bannerTok;
const auto format = tex->GetTextureFormat(); const auto format = tex->GetTexelFormat();
const auto* texels = tex->GetConstBitMapData(0); const auto* texels = tex->GetConstBitMapData(0);
if (format == ETexelFormat::RGB5A3) { if (format == ETexelFormat::RGB5A3) {
out.Put(texels, 6144); out.Put(texels, 6144);
@ -252,7 +252,7 @@ void CMemoryCardSys::CCardFileInfo::WriteBannerData(COutputStream& out) const {
void CMemoryCardSys::CCardFileInfo::WriteIconData(COutputStream& out) const { void CMemoryCardSys::CCardFileInfo::WriteIconData(COutputStream& out) const {
const u8* palette = nullptr; const u8* palette = nullptr;
for (const Icon& icon : x50_iconToks) { for (const Icon& icon : x50_iconToks) {
const auto format = icon.x8_tex->GetTextureFormat(); const auto format = icon.x8_tex->GetTexelFormat();
const auto* texels = icon.x8_tex->GetConstBitMapData(0); const auto* texels = icon.x8_tex->GetConstBitMapData(0);
if (format == ETexelFormat::RGB5A3) { if (format == ETexelFormat::RGB5A3) {
out.Put(texels, 2048); out.Put(texels, 2048);
@ -305,7 +305,7 @@ ECardResult CMemoryCardSys::CCardFileInfo::GetStatus(kabufuda::CardStat& stat) c
kabufuda::EImageFormat bannerFmt; kabufuda::EImageFormat bannerFmt;
if (x3c_bannerTex.IsValid()) { if (x3c_bannerTex.IsValid()) {
if ((*x40_bannerTok)->GetTextureFormat() == ETexelFormat::RGB5A3) { if ((*x40_bannerTok)->GetTexelFormat() == ETexelFormat::RGB5A3) {
bannerFmt = kabufuda::EImageFormat::RGB5A3; bannerFmt = kabufuda::EImageFormat::RGB5A3;
} else { } else {
bannerFmt = kabufuda::EImageFormat::C8; bannerFmt = kabufuda::EImageFormat::C8;
@ -317,7 +317,7 @@ ECardResult CMemoryCardSys::CCardFileInfo::GetStatus(kabufuda::CardStat& stat) c
int idx = 0; int idx = 0;
for (const Icon& icon : x50_iconToks) { for (const Icon& icon : x50_iconToks) {
stat.SetIconFormat(icon.x8_tex->GetTextureFormat() == ETexelFormat::RGB5A3 ? kabufuda::EImageFormat::RGB5A3 stat.SetIconFormat(icon.x8_tex->GetTexelFormat() == ETexelFormat::RGB5A3 ? kabufuda::EImageFormat::RGB5A3
: kabufuda::EImageFormat::C8, : kabufuda::EImageFormat::C8,
idx); idx);
stat.SetIconSpeed(icon.x4_speed, idx); stat.SetIconSpeed(icon.x4_speed, idx);

View File

@ -3,6 +3,8 @@
#include "Runtime/CToken.hpp" #include "Runtime/CToken.hpp"
#include "Runtime/Formatting.hpp" #include "Runtime/Formatting.hpp"
#include "Runtime/CBasics.hpp"
#include <zeus/Math.hpp> #include <zeus/Math.hpp>
#include <magic_enum.hpp> #include <magic_enum.hpp>
@ -252,7 +254,74 @@ void CTexture::UncountMemory() {
} }
void CTexture::MangleMipmap(u32 mip) { void CTexture::MangleMipmap(u32 mip) {
// TODO(phil): Mangle mipmap if (mip >= x8_mips) {
return;
}
const uint colors[4] = {
0x000000FF,
0x0000FF00,
0x00FF0000,
0x0000FFFF,
};
const uint color = colors[(mip - 1) & 3];
ushort rgb565Color = ((color >> 3) & 0x001F) | // B
((color >> 5) & 0x07E0) | // G
((color >> 8) & 0xF800); // R
ushort rgb555Color = ((color >> 3) & 0x001F) | // B
((color >> 6) & 0x03E0) | // G
((color >> 9) & 0x7C00); // R
ushort rgb4Color = ((color >> 4) & 0x000F) | // B
((color >> 8) & 0x00F0) | // G
((color >> 12) & 0x0F00); // R
int width = GetWidth();
int height = GetHeight();
int offset = 0;
for (int i = 0; i < mip; i++) {
offset += width * height;
width /= 2;
height /= 2;
}
switch (GetTexelFormat()) {
case ETexelFormat::RGB565: {
ushort* ptr = reinterpret_cast< ushort* >(x44_aramToken_x4_buff.get());//mARAMToken.GetMRAMSafe());
for (int i = 0; i < width * height; ++i) {
ptr[i + offset] = rgb565Color;
CBasics::Swap2Bytes(reinterpret_cast<u8*>(&ptr[i + offset]));
}
break;
}
case ETexelFormat::CMPR: {
ushort* ptr = reinterpret_cast< ushort* >(x44_aramToken_x4_buff.get()) + offset / 4;
for (int i = 0; i < width * height / 16; ++i, ptr += 4) {
ptr[0] = rgb565Color;
CBasics::Swap2Bytes(reinterpret_cast<u8*>(&ptr[0]));
ptr[1] = rgb565Color;
CBasics::Swap2Bytes(reinterpret_cast<u8*>(&ptr[1]));
ptr[2] = 0;
ptr[3] = 0;
}
break;
}
case ETexelFormat::RGB5A3: {
ushort* ptr = reinterpret_cast< ushort* >(x44_aramToken_x4_buff.get());
for (int i = 0; i < width * height; ++i) {
ushort& val = ptr[i + offset];
if (val & 0x8000) {
val = rgb555Color | 0x8000;
} else {
val = (val & 0xF000) | rgb4Color;
}
CBasics::Swap2Bytes(reinterpret_cast<u8*>(&val));
}
break;
}
default:
break;
}
} }
u32 CTexture::TexelFormatBitsPerPixel(ETexelFormat fmt) { u32 CTexture::TexelFormatBitsPerPixel(ETexelFormat fmt) {

View File

@ -106,7 +106,7 @@ public:
EBlackKey blackKey = EBlackKey::Zero); EBlackKey blackKey = EBlackKey::Zero);
~CTexture(); ~CTexture();
[[nodiscard]] ETexelFormat GetTextureFormat() const { return x0_fmt; } [[nodiscard]] ETexelFormat GetTexelFormat() const { return x0_fmt; }
[[nodiscard]] u16 GetWidth() const { return x4_w; } [[nodiscard]] u16 GetWidth() const { return x4_w; }
[[nodiscard]] u16 GetHeight() const { return x6_h; } [[nodiscard]] u16 GetHeight() const { return x6_h; }
[[nodiscard]] u8 GetNumberOfMipMaps() const { return x8_mips; } [[nodiscard]] u8 GetNumberOfMipMaps() const { return x8_mips; }