You've already forked PrimeRemasterStructs
mirror of
https://github.com/PrimeDecomp/PrimeRemasterStructs.git
synced 2026-03-31 14:23:23 -07:00
316 lines
9.2 KiB
Plaintext
316 lines
9.2 KiB
Plaintext
#ifndef _NTEXTUREFORMAT
|
|
#define _NTEXTUREFORMAT
|
|
struct STextureReadInfo
|
|
{
|
|
if (!isDKCTF)
|
|
{
|
|
byte index; //MP1R has this byte
|
|
}
|
|
uint32 offset <format=hex>;
|
|
uint32 size <format=hex>;
|
|
};
|
|
|
|
struct STextureCompressedBufferInfo(uint64 fileStart)
|
|
{
|
|
uint32 index;
|
|
uint32 offset <format=hex>; // Relative offset into associated STextureReadInfo
|
|
uint32 size <format=hex>; // Buffer size
|
|
uint32 destOffset <format=hex>; // Output offset when decompressed
|
|
uint32 destSize <format=hex>; // Output size when decompressed
|
|
|
|
// Compressed data
|
|
local uint64 pos <format=hex, hidden=true> = FTell();
|
|
FSeek(fileStart + info[index].offset + offset);
|
|
CompressionType compressionType;
|
|
byte pad[3] <hidden=true>;
|
|
byte data[size - 4] <bgcolor=cLtRed>;
|
|
FSeek(pos);
|
|
};
|
|
|
|
struct STextureMetaData(uint64 fileStart)
|
|
{
|
|
uint32 unk0;
|
|
uint32 unk1;
|
|
uint32 allocCategory;
|
|
uint32 gpuOffset <format=hex>;
|
|
uint32 align;
|
|
uint32 decompressedSize <format=hex>; // Total size decompressed
|
|
uint32 infoCount;
|
|
if (infoCount != 0) {
|
|
STextureReadInfo info[infoCount]<optimize=false>; //Do this so isDKCTF doesn't kill 010
|
|
}
|
|
if (file.form.readerVersion == 0x41) { // Metroid Prime 4
|
|
uint32 firstIndex;
|
|
uint32 firstSize;
|
|
uint32 firstDestOffset;
|
|
uint32 firstDestSize;
|
|
uint32 unk2;
|
|
uint32 secondIndex;
|
|
uint32 secondSize;
|
|
uint32 secondDestOffset;
|
|
uint32 secondDestSize;
|
|
// Within the second buffer, part of the data may be uncompressed.
|
|
uint32 secondDecompressedLen;
|
|
uint32 secondCompressedLen;
|
|
uint32 secondCompressedOffset;
|
|
|
|
local uint64 pos <format=hex, hidden=true> = FTell();
|
|
// Compressed data
|
|
FSeek(fileStart + info[firstIndex].offset);
|
|
if (firstSize == firstDestSize) {
|
|
byte firstData[firstSize] <bgcolor=cLtRed>;
|
|
} else {
|
|
CompressionType compressionType;
|
|
byte firstPad[3] <hidden=true>;
|
|
byte firstData[firstSize - 4] <bgcolor=cLtRed>;
|
|
}
|
|
FSeek(fileStart + info[secondIndex].offset + secondCompressedOffset);
|
|
if (secondCompressedLen == secondDecompressedLen) {
|
|
byte secondData[secondCompressedLen] <bgcolor=cLtRed>;
|
|
} else {
|
|
CompressionType compressionType;
|
|
byte secondPad[3] <hidden=true>;
|
|
byte secondData[secondCompressedLen - 4] <bgcolor=cLtRed>;
|
|
}
|
|
// Uncompressed leading data
|
|
if (secondCompressedOffset > 0) {
|
|
FSeek(fileStart + info[secondIndex].offset);
|
|
byte uncompressedData1[secondCompressedOffset] <bgcolor=cLtRed>;
|
|
}
|
|
// Uncompressed trailing data
|
|
if (secondSize > secondCompressedOffset + secondCompressedLen) {
|
|
FSeek(fileStart + info[secondIndex].offset + secondCompressedOffset + secondCompressedLen);
|
|
byte uncompressedData2[secondSize - (secondCompressedOffset + secondCompressedLen)] <bgcolor=cLtRed>;
|
|
}
|
|
FSeek(pos);
|
|
} else {
|
|
uint32 bufferCount;
|
|
if (infoCount != 0) {
|
|
STextureCompressedBufferInfo buffer(fileStart)[infoCount] <optimize=false>;
|
|
}
|
|
}
|
|
};
|
|
|
|
enum <byte> ETextureWrap
|
|
{
|
|
TEXTURE_WRAP_CLAMP_TO_EDGE = 0,
|
|
TEXTURE_WRAP_REPEAT = 1,
|
|
TEXTURE_WRAP_MIRRORED_REPEAT = 2,
|
|
TEXTURE_WRAP_MIRROR_CLAMP = 3,
|
|
TEXTURE_WRAP_CLAMP_TO_BORDER = 4,
|
|
TEXTURE_WRAP_CLAMP = 5,
|
|
};
|
|
|
|
enum <byte> ETextureFilter
|
|
{
|
|
TEXTURE_FILTER_NEAREST = 0,
|
|
TEXTURE_FILTER_LINEAR = 1,
|
|
};
|
|
|
|
enum <byte> ETextureMipFilter
|
|
{
|
|
TEXTURE_MIP_FILTER_NEAREST = 0,
|
|
TEXTURE_MIP_FILTER_LINEAR = 1,
|
|
};
|
|
|
|
enum <byte> ETextureAnisotropicRatio
|
|
{
|
|
TEXTURE_ANISO_NONE = -1,
|
|
TEXTURE_ANISO_1 = 0,
|
|
TEXTURE_ANISO_2 = 1,
|
|
TEXTURE_ANISO_4 = 2,
|
|
TEXTURE_ANISO_8 = 3,
|
|
TEXTURE_ANISO_16 = 4,
|
|
};
|
|
|
|
enum /* where? */ ECompareFunction
|
|
{
|
|
TEXTURE_COMPARE_NONE = -1,
|
|
TEXTURE_COMPARE_NEVER = 0,
|
|
TEXTURE_COMPARE_ALWAYS = 1,
|
|
TEXTURE_COMPARE_NOTEQUAL = 2,
|
|
TEXTURE_COMPARE_LESS = 3,
|
|
TEXTURE_COMPARE_LEQUAL = 4,
|
|
TEXTURE_COMPARE_EQUAL = 5,
|
|
TEXTURE_COMPARE_GEQUAL = 6,
|
|
TEXTURE_COMPARE_GREATER = 7,
|
|
};
|
|
|
|
struct STextureSamplerData
|
|
{
|
|
uint32 unk;
|
|
ETextureFilter filter;
|
|
ETextureMipFilter mipFilter;
|
|
ETextureWrap wrapX;
|
|
ETextureWrap wrapY;
|
|
if (isDKCTF == 0)
|
|
{
|
|
ETextureWrap wrapZ;
|
|
ETextureAnisotropicRatio aniso;
|
|
}
|
|
};
|
|
|
|
enum <uint32> ETextureType
|
|
{
|
|
TEXTURE_1D = 0,
|
|
TEXTURE_2D = 1,
|
|
TEXTURE_3D = 2,
|
|
TEXTURE_CUBE = 3,
|
|
TEXTURE_1D_ARRAY = 4,
|
|
TEXTURE_2D_ARRAY = 5,
|
|
TEXTURE_2D_MULTISAMPLE = 6,
|
|
TEXTURE_2D_MULTISAMPLE_ARRAY = 7,
|
|
TEXTURE_CUBE_ARRAY = 8,
|
|
};
|
|
|
|
enum <uint32> ETextureFormat
|
|
{
|
|
TEXTURE_FORMAT_R8_UNORM = 0,
|
|
TEXTURE_FORMAT_R8_SNORM = 1,
|
|
TEXTURE_FORMAT_R8_UINT = 2,
|
|
TEXTURE_FORMAT_R8_SINT = 3,
|
|
TEXTURE_FORMAT_R16_UNORM = 4,
|
|
TEXTURE_FORMAT_R16_SNORM = 5,
|
|
TEXTURE_FORMAT_R16_UINT = 6,
|
|
TEXTURE_FORMAT_R16_SINT = 7,
|
|
TEXTURE_FORMAT_R16_FLOAT = 8,
|
|
TEXTURE_FORMAT_R32_UINT = 9,
|
|
TEXTURE_FORMAT_R32_SINT = 10,
|
|
TEXTURE_FORMAT_RGB8_UNORM = 11,
|
|
TEXTURE_FORMAT_RGBA8_UNORM = 12,
|
|
TEXTURE_FORMAT_RGBA8_SRGB = 13,
|
|
TEXTURE_FORMAT_RGBA16_FLOAT = 14,
|
|
TEXTURE_FORMAT_RGBA32_FLOAT = 15,
|
|
TEXTURE_FORMAT_DEPTH16_UNORM = 16,
|
|
TEXTURE_FORMAT_DEPTH16_UNORM_2 = 17, // ?
|
|
TEXTURE_FORMAT_DEPTH24_S8_UNORM = 18,
|
|
TEXTURE_FORMAT_DEPTH32_FLOAT = 19,
|
|
TEXTURE_FORMAT_RGBA_BC1_UNORM = 20, // DXT1
|
|
TEXTURE_FORMAT_RGBA_BC1_SRGB = 21, // DXT1
|
|
TEXTURE_FORMAT_RGBA_BC2_UNORM = 22, // DXT3
|
|
TEXTURE_FORMAT_RGBA_BC2_SRGB = 23, // DXT3
|
|
TEXTURE_FORMAT_RGBA_BC3_UNORM = 24, // DXT5
|
|
TEXTURE_FORMAT_RGBA_BC3_SRGB = 25, // DXT5
|
|
TEXTURE_FORMAT_RGBA_BC4_UNORM = 26, // RGTC1
|
|
TEXTURE_FORMAT_RGBA_BC4_SNORM = 27, // RGTC1
|
|
TEXTURE_FORMAT_RGBA_BC5_UNORM = 28, // RGTC2
|
|
TEXTURE_FORMAT_RGBA_BC5_SNORM = 29, // RGTC2
|
|
TEXTURE_FORMAT_RG11_B10_FLOAT = 30,
|
|
TEXTURE_FORMAT_R32_FLOAT = 31,
|
|
TEXTURE_FORMAT_RG8_UNORM = 32,
|
|
TEXTURE_FORMAT_RG8_SNORM = 33,
|
|
TEXTURE_FORMAT_RG8_UINT = 34,
|
|
TEXTURE_FORMAT_RG8_SINT = 35,
|
|
TEXTURE_FORMAT_RG16_FLOAT = 36,
|
|
TEXTURE_FORMAT_RG16_UNORM = 37,
|
|
TEXTURE_FORMAT_RG16_SNORM = 38,
|
|
TEXTURE_FORMAT_RG16_UINT = 39,
|
|
TEXTURE_FORMAT_RG16_SINT = 40,
|
|
TEXTURE_FORMAT_RGB10_A2_UNORM = 41,
|
|
TEXTURE_FORMAT_RGB10_A2_UINT = 42,
|
|
TEXTURE_FORMAT_RG32_UINT = 43,
|
|
TEXTURE_FORMAT_RG32_SINT = 44,
|
|
TEXTURE_FORMAT_RG32_FLOAT = 45,
|
|
TEXTURE_FORMAT_RGBA16_UNORM = 46,
|
|
TEXTURE_FORMAT_RGBA16_SNORM = 47,
|
|
TEXTURE_FORMAT_RGBA16_UINT = 48,
|
|
TEXTURE_FORMAT_RGBA16_SINT = 49,
|
|
TEXTURE_FORMAT_RGBA32_UINT = 50,
|
|
TEXTURE_FORMAT_RGBA32_SINT = 51,
|
|
TEXTURE_FORMAT_NONE = 52,
|
|
TEXTURE_FORMAT_RGBA_ASTC_4x4 = 53,
|
|
TEXTURE_FORMAT_RGBA_ASTC_5x4 = 54,
|
|
TEXTURE_FORMAT_RGBA_ASTC_5x5 = 55,
|
|
TEXTURE_FORMAT_RGBA_ASTC_6x5 = 56,
|
|
TEXTURE_FORMAT_RGBA_ASTC_6x6 = 57,
|
|
TEXTURE_FORMAT_RGBA_ASTC_8x5 = 58,
|
|
TEXTURE_FORMAT_RGBA_ASTC_8x6 = 59,
|
|
TEXTURE_FORMAT_RGBA_ASTC_8x8 = 60,
|
|
TEXTURE_FORMAT_RGBA_ASTC_10x5 = 61,
|
|
TEXTURE_FORMAT_RGBA_ASTC_10x6 = 62,
|
|
TEXTURE_FORMAT_RGBA_ASTC_10x8 = 63,
|
|
TEXTURE_FORMAT_RGBA_ASTC_10x10 = 64,
|
|
TEXTURE_FORMAT_RGBA_ASTC_12x10 = 65,
|
|
TEXTURE_FORMAT_RGBA_ASTC_12x12 = 66,
|
|
TEXTURE_FORMAT_RGBA_ASTC_4x4_SRGB = 67,
|
|
TEXTURE_FORMAT_RGBA_ASTC_5x4_SRGB = 68,
|
|
TEXTURE_FORMAT_RGBA_ASTC_5x5_SRGB = 69,
|
|
TEXTURE_FORMAT_RGBA_ASTC_6x5_SRGB = 70,
|
|
TEXTURE_FORMAT_RGBA_ASTC_6x6_SRGB = 71,
|
|
TEXTURE_FORMAT_RGBA_ASTC_8x5_SRGB = 72,
|
|
TEXTURE_FORMAT_RGBA_ASTC_8x6_SRGB = 73,
|
|
TEXTURE_FORMAT_RGBA_ASTC_8x8_SRGB = 74,
|
|
TEXTURE_FORMAT_RGBA_ASTC_10x5_SRGB = 75,
|
|
TEXTURE_FORMAT_RGBA_ASTC_10x6_SRGB = 76,
|
|
TEXTURE_FORMAT_RGBA_ASTC_10x8_SRGB = 77,
|
|
TEXTURE_FORMAT_RGBA_ASTC_10x10_SRGB = 78,
|
|
TEXTURE_FORMAT_RGBA_ASTC_12x10_SRGB = 79,
|
|
TEXTURE_FORMAT_RGBA_ASTC_12x12_SRGB = 80,
|
|
TEXTURE_FORMAT_BPTC_UFLOAT = 81,
|
|
TEXTURE_FORMAT_BPTC_SFLOAT = 82,
|
|
TEXTURE_FORMAT_BPTC_UNORM = 83,
|
|
TEXTURE_FORMAT_BPTC_UNORM_SRGB = 84,
|
|
};
|
|
|
|
enum <uint32> EMultiSample
|
|
{
|
|
MULTISAMPLE_NONE = 0,
|
|
MULTISAMPLE_2 = 1,
|
|
MULTISAMPLE_4 = 2,
|
|
MULTISAMPLE_8 = 3,
|
|
};
|
|
|
|
struct STextureHeader
|
|
{
|
|
ETextureType type;
|
|
ETextureFormat format;
|
|
uint32 width;
|
|
uint32 height;
|
|
uint32 layers;
|
|
if (form.readerVersion == 0x41) { // Metroid Prime 4
|
|
uint8 components[4];
|
|
} else {
|
|
uint32 tileMode; // ?
|
|
uint32 swizzle; // ?
|
|
}
|
|
uint32 mips;
|
|
uint32 mipSizes[mips] <format=hex>;
|
|
STextureSamplerData samplerData;
|
|
};
|
|
|
|
typedef struct
|
|
{
|
|
ChunkDescriptor chunk;
|
|
local uint64 start <format=hex, hidden=true> = FTell();
|
|
switch (chunk.id)
|
|
{
|
|
case "HEAD":
|
|
STextureHeader header;
|
|
break;
|
|
case "GPU ":
|
|
if (isDKCTF) {
|
|
CompressionType compressionType;
|
|
byte pad[3] <hidden=true>;
|
|
byte data[chunk.size - 4];
|
|
} else {
|
|
byte data[chunk.size];
|
|
}
|
|
break;
|
|
}
|
|
FSeek(start + chunk.size);
|
|
} TXTRChunk <
|
|
name=(Str("%s chunk", chunk.id))
|
|
>;
|
|
|
|
typedef struct(uint64 size)
|
|
{
|
|
local uint64 start <format=hex, hidden=true> = FTell();
|
|
while (FTell() < start + size)
|
|
{
|
|
TXTRChunk chunk;
|
|
}
|
|
} NTextureFormat <name="TXTR chunks">;
|
|
|
|
|
|
#endif// _NTEXTUREFORMAT
|