mirror of
https://github.com/AssetRipper/AssetRipper.git
synced 2025-12-11 20:15:29 +01:00
parent
4529fc218e
commit
cdf4f3f24d
@ -76,7 +76,7 @@ public static class SwitchSwizzle
|
|||||||
int gobDstY = (i * blockHeight + k) * GobYTexelCount + gobY;
|
int gobDstY = (i * blockHeight + k) * GobYTexelCount + gobY;
|
||||||
int gobDstLinPos = gobDstY * blockCountX * TexelByteSize + gobDstX * TexelByteSize;
|
int gobDstLinPos = gobDstY * blockCountX * TexelByteSize + gobDstX * TexelByteSize;
|
||||||
|
|
||||||
Array.Copy(data, srcPos, newData, gobDstLinPos, TexelByteSize);
|
data.AsSpan(srcPos, TexelByteSize).CopyTo(newData.AsSpan(gobDstLinPos, TexelByteSize));
|
||||||
|
|
||||||
srcPos += TexelByteSize;
|
srcPos += TexelByteSize;
|
||||||
}
|
}
|
||||||
@ -84,8 +84,24 @@ public static class SwitchSwizzle
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We need to remove padding from the data now, so that it matches the expected layout for later decoding.
|
||||||
|
// The resulting arrays will have extra unused data at the end, but we need to leave it there
|
||||||
|
// because TextureConverter expects the data to be at least texture.CompleteImageSize bytes long.
|
||||||
|
|
||||||
if (blockSize.Height > 1)
|
if (blockSize.Height > 1)
|
||||||
{
|
{
|
||||||
|
int dstBlockCountX = CeilDivide(texture.Width_C28, blockSize.Width);
|
||||||
|
if (dstBlockCountX != blockCountX)
|
||||||
|
{
|
||||||
|
byte[] croppedImageData = new byte[newData.Length];
|
||||||
|
int dstBlockCountY = CeilDivide(texture.Height_C28, blockSize.Height);
|
||||||
|
for (int y = 0; y < dstBlockCountY; y++)
|
||||||
|
{
|
||||||
|
newData.AsSpan(y * blockCountX * TexelByteSize, dstBlockCountX * TexelByteSize).CopyTo(croppedImageData.AsSpan(y * dstBlockCountX * TexelByteSize));
|
||||||
|
}
|
||||||
|
return croppedImageData;
|
||||||
|
}
|
||||||
|
|
||||||
return newData;
|
return newData;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -95,15 +111,35 @@ public static class SwitchSwizzle
|
|||||||
return newData;
|
return newData;
|
||||||
}
|
}
|
||||||
|
|
||||||
// This will have extra unused data at the end, but we need to leave it there
|
|
||||||
// because TextureConverter expects the data to be at least texture.CompleteImageSize bytes long.
|
|
||||||
byte[] croppedData = new byte[newData.Length];
|
byte[] croppedData = new byte[newData.Length];
|
||||||
|
int rowBytesSrc = paddedSize.Width * pixelSize;
|
||||||
|
int rowBytesDst = texture.Width_C28 * pixelSize;
|
||||||
for (int y = 0; y < texture.Height_C28; y++)
|
for (int y = 0; y < texture.Height_C28; y++)
|
||||||
{
|
{
|
||||||
Array.Copy(newData, y * paddedSize.Width * pixelSize, croppedData, y * texture.Width_C28 * pixelSize, texture.Width_C28 * pixelSize);
|
newData.AsSpan(y * rowBytesSrc, rowBytesDst).CopyTo(croppedData.AsSpan(y * rowBytesDst, rowBytesDst));
|
||||||
}
|
}
|
||||||
|
|
||||||
return croppedData;
|
if (realFormat == texture.Format_C28E)
|
||||||
|
{
|
||||||
|
return croppedData;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert RGBA to RGB
|
||||||
|
Debug.Assert(pixelSize % 4 == 0);
|
||||||
|
int actualPixelSize = pixelSize / 4 * 3;
|
||||||
|
byte[] finalData = new byte[croppedData.Length];
|
||||||
|
for (int y = 0; y < texture.Height_C28; y++)
|
||||||
|
{
|
||||||
|
int srcOffset = y * texture.Width_C28 * pixelSize;
|
||||||
|
int dstOffset = y * texture.Width_C28 * actualPixelSize;
|
||||||
|
for (int x = 0; x < texture.Width_C28; x++)
|
||||||
|
{
|
||||||
|
int srcIndex = srcOffset + x * pixelSize;
|
||||||
|
int dstIndex = dstOffset + x * actualPixelSize;
|
||||||
|
croppedData.AsSpan(srcIndex, actualPixelSize).CopyTo(finalData.AsSpan(dstIndex, actualPixelSize));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return finalData;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
@ -153,15 +189,12 @@ public static class SwitchSwizzle
|
|||||||
return 1 << new EndianSpanReader(platformBlob.AsSpan(8), endianType).ReadInt32();
|
return 1 << new EndianSpanReader(platformBlob.AsSpan(8), endianType).ReadInt32();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static TextureFormat GetCorrectedSwitchTextureFormat(TextureFormat format)
|
private static TextureFormat GetCorrectedSwitchTextureFormat(TextureFormat format) => format switch
|
||||||
{
|
{
|
||||||
// This is suspicious. I didn't encounter any RGB24 textures in the files I have available.
|
TextureFormat.RGB24 => TextureFormat.RGBA32,
|
||||||
// Assuming it's correct, we likely need additional code in this file to convert RGBA pixels to RGB.
|
TextureFormat.RGB48 => TextureFormat.RGBA64,
|
||||||
// Also, RGB48 might need similar treatment.
|
TextureFormat.RGB24_SIGNED => TextureFormat.RGBA32_SIGNED,
|
||||||
return format switch
|
TextureFormat.RGB48_SIGNED => TextureFormat.RGBA64_SIGNED,
|
||||||
{
|
_ => format
|
||||||
TextureFormat.RGB24 => TextureFormat.RGBA32,
|
};
|
||||||
_ => format
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user