mirror of https://github.com/PrimeDecomp/prime.git
Link DolphinCTexture
This commit is contained in:
parent
831f117842
commit
da7e0244bc
|
@ -895,7 +895,7 @@ config.libs = [
|
|||
Object(Matching, "Kyoto/Graphics/CTevCombiners.cpp"),
|
||||
Object(NonMatching, "Kyoto/Graphics/DolphinCGraphics.cpp"),
|
||||
Object(Matching, "Kyoto/Graphics/DolphinCPalette.cpp"),
|
||||
Object(NonMatching, "Kyoto/Graphics/DolphinCTexture.cpp"),
|
||||
Object(Matching, "Kyoto/Graphics/DolphinCTexture.cpp"),
|
||||
Object(Matching, "Kyoto/Math/CloseEnough.cpp"),
|
||||
Object(NonMatching, "Kyoto/Math/CMatrix3f.cpp"),
|
||||
Object(NonMatching, "Kyoto/Math/CMatrix4f.cpp"),
|
||||
|
|
|
@ -440,48 +440,68 @@ const void* CTexture::GetConstBitMapData(const int mip) const {
|
|||
void* CTexture::GetBitMapData(int mip) { return const_cast< void* >(GetConstBitMapData(mip)); }
|
||||
|
||||
void CTexture::MangleMipmap(int mip) {
|
||||
static const uint kMangleColors[4] = {0x000000FF, 0x0000FF00, 0x00FF0000, 0x0000FFFF};
|
||||
if (mip >= mNumMips) {
|
||||
return;
|
||||
}
|
||||
|
||||
uint color1 = *(uint*)((uchar*)kMangleColors + (((mip - 1) * 4) & 12));
|
||||
uint color2 = color1 >> 8;
|
||||
uint color3 = color2 & 0xf800 | (color1 >> 3) & 0x1f | (color1 >> 5) & 0x7e0;
|
||||
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);
|
||||
offset += width * height;
|
||||
width /= 2;
|
||||
height /= 2;
|
||||
}
|
||||
|
||||
switch (GetTexelFormat()) {
|
||||
case kTF_RGB565: {
|
||||
ushort* ptr = (ushort*)mARAMToken.GetMRAMSafe();
|
||||
ushort* ptr = static_cast< ushort* >(mARAMToken.GetMRAMSafe());
|
||||
for (int i = 0; i < width * height; ++i) {
|
||||
ptr[i + offset] = color3;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case kTF_RGB5A3: {
|
||||
ushort* ptr = (ushort*)mARAMToken.GetMRAMSafe();
|
||||
for (int i = 0; i < width * height; ++i) {
|
||||
if (ptr[i + offset] & 0x8000) {
|
||||
ptr[i + offset] = ptr[i + offset] & 0xf000 | (color1 >> 12) | 0xf00 | (color1 >> 4) & 0xf | color2 & 0xf0;
|
||||
} else {
|
||||
ptr[i + offset] = (color1 >> 9) | 0x7c00 | (color1 >> 6) & 0x3e0 | (color1 >> 3) & 0x1f | 0x8000;
|
||||
}
|
||||
ptr[i + offset] = rgb565Color;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case kTF_CMPR: {
|
||||
ushort* ptr = (ushort*)mARAMToken.GetMRAMSafe();
|
||||
|
||||
ushort* ptr = static_cast< ushort* >(mARAMToken.GetMRAMSafe()) + offset / 4;
|
||||
for (int i = 0; i < width * height / 16; ++i, ptr += 4) {
|
||||
ptr[0] = rgb565Color;
|
||||
ptr[1] = rgb565Color;
|
||||
ptr[2] = 0;
|
||||
ptr[3] = 0;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
case kTF_RGB5A3: {
|
||||
ushort* ptr = static_cast< ushort* >(mARAMToken.GetMRAMSafe());
|
||||
for (int i = 0; i < width * height; ++i) {
|
||||
ushort& val = ptr[i + offset];
|
||||
if (val & 0x8000) {
|
||||
val = rgb555Color | 0x8000;
|
||||
} else {
|
||||
val = (val & 0xF000) | rgb4Color;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CTexture::MakeSwappable() const {
|
||||
|
|
Loading…
Reference in New Issue