-
Notifications
You must be signed in to change notification settings - Fork 16
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Breakdown swizzled 8bpp paletted texture data #154
Comments
I believe the swizzle of these textures is based on the This page didn't exist when I was working on this. Hopefully this helps. |
yes i have managed to unswizzle 8bpp textures friend thank you, now i'm struggling with 4 bpp. also i have looked at your palette data code and while it worked maybe 50% of the time, i am having issues with sometimes incorrect palette. If you have any information, I would appreciate it |
Sure. This guys has some pseudocode related to unswizzling TM2 stuff, he took it from the (now defunct) Xentax wiki. I believe this is where the original implementation of this came from when it was submitted to Maybe @muddle12 can himself comment on this further. https://github.com/muddle12/DCExtractor/blob/main/Specifications/Images/TM2.md //Convert the TIM2Picture's palette to linear 32-bit True Color.
Color[] ConvertPicturePaletteToRGBA(TIM2Picture tPicture)
{
//If there is no palette, return an empty palette.
if (tPicture.paletteBytes == null || tPicture.paletteBytes.Length == 0)
return null;
//Otherwise, we're going to have to figure out which palette we're using based on the paletteColorSize.
Color[] tPalette;
if (tPicture.bitsPerPixel <= 8)
{
//We'll infer which palette type we're using based on the size of each individual palette entry.
switch (tPicture.colorSize)
{
case 2://16 BIT LE_ABGR_1555?
{
tPalette = FromBufferABGR1555(tPicture.paletteBytes, tPicture.paletteSize);
}
break;
case 3://24 BIT RGB?
{
tPalette = FromBufferRGB24Bit(tPicture.paletteBytes, tPicture.paletteSize);
}
break;
case 4://32 BIT RGBA?
{
tPalette = FromBufferRGBA32Bit(tPicture.paletteBytes, tPicture.paletteSize);
}
break;
default://Invalid data.
return null;
}
//If the palette is interleaved, we need to unpack that into something linear.
if (tPicture.isLinearPalette == false)
{
//The TIM2 palettes always have these fixed values.
const int nBlockCount = 2;
const int nStripeCount = 2;
const int nColorCount = 8;
//Some calculations for unpacking the palette.
int nPartCount = tPalette.Length / 32;
int nPartStride = nColorCount * nStripeCount * nBlockCount;
int nStripeStride = nStripeCount * nColorCount;
//This next part was ripped wholesale from the xentax references. I couldn't tell you exactly what's going on, but it appears to work.
//If I had to guess, TIM2 has a very particular kind of interleave using blocks instead of straight stripes.
int i = 0;
Color[] tUnpackedColors = new Color[tPalette.Length];
for (int part = 0; part < nPartCount; part++)
{
for (int block = 0; block < nBlockCount; block++)
{
for (int stripe = 0; stripe < nStripeCount; stripe++)
{
for (int color = 0; color < nColorCount; color++)
{
tUnpackedColors[i++] = tPalette[(part * nPartStride) + (block * nColorCount) + (stripe * nStripeStride) + color];
}
}
}
}
//overwrite the original palette, as we don't need it anymore.
tPalette = tUnpackedColors;
}
}
return tPalette;
} |
Hello, i looked at the old blog and saw that you figured out how to unswizzle the 8bpp textures and apply the correct palette data, i am looking at the texture.cpp code and saw a sort of breakdown, but it's kind of messy. I'm working on my own sh3 texture tool and was wondering if you could explain and breakdown the textures so i can implement it in my code?
The text was updated successfully, but these errors were encountered: