mirror of
https://github.com/PrimeDecomp/PrimeRemasterStructs.git
synced 2026-07-12 18:18:58 -07:00
Add MaterialArchive
This commit is contained in:
@@ -102,6 +102,158 @@ typedef struct{
|
||||
}
|
||||
} CMaterialData <read=CMaterialDataRead>;
|
||||
|
||||
/* MaterialID Mappings:
|
||||
MFTR = 0,
|
||||
MFMT = 1,
|
||||
TXTR = 1,
|
||||
CBUF = 1,
|
||||
ZBUF = 2,
|
||||
COLR = 2,
|
||||
MFSR = 2,
|
||||
SCLR = 3,
|
||||
GBUF = 3,
|
||||
MFSK = 3,
|
||||
INT1 = 4,
|
||||
GFLG = 4,
|
||||
MFVC = 4,
|
||||
CPLX = 5,
|
||||
TCPO = 5,
|
||||
MF1B = 5,
|
||||
DIFT = 6,
|
||||
INT4 = 6,
|
||||
MFAV = 6,
|
||||
MAT4 = 7,
|
||||
ICAN = 7,
|
||||
MFIN = 7,
|
||||
SINC = 8,
|
||||
MFCA = 8,
|
||||
NMAP = 9,
|
||||
MFIN = 9,
|
||||
MNMP = 10,
|
||||
MTSM = 10,
|
||||
REFL = 11,
|
||||
MFRL = 11,
|
||||
REFS = 12,
|
||||
MFOE = 12,
|
||||
REFV = 13,
|
||||
MFOT = 13,
|
||||
SPCT = 14,
|
||||
MFCI = 14,
|
||||
LIDB = 15,
|
||||
MFOI = 15,
|
||||
LIBS = 16,
|
||||
MFVA = 16,
|
||||
FOGR = 17,
|
||||
MFSU = 17,
|
||||
INDI = 18,
|
||||
MFBP = 18,
|
||||
OTMP = 19,
|
||||
MFBL = 19,
|
||||
CGMP = 20,
|
||||
MFLB = 20,
|
||||
OGMP = 21,
|
||||
MF1E = 21,
|
||||
VAND = 22,
|
||||
MFC0 = 22,
|
||||
MFC1 = 23,
|
||||
BLAT = 23,
|
||||
BCLR = 24,
|
||||
MFC2 = 24,
|
||||
MFC3 = 25,
|
||||
METL = 25,
|
||||
MFC4 = 26,
|
||||
TCH0 = 26,
|
||||
TCH1 = 27,
|
||||
TCH2 = 28,
|
||||
TCH3 = 29,
|
||||
TCH4 = 30,
|
||||
TCH5 = 31,
|
||||
DIFC = 32,
|
||||
SHRC = 33,
|
||||
SPCC = 34,
|
||||
ICNC = 35,
|
||||
ICMC = 36,
|
||||
ODAT = 37,
|
||||
MDCI = 38,
|
||||
MODI = 39,
|
||||
LODC = 40,
|
||||
LODP = 41,
|
||||
VANP = 42,
|
||||
BLAL = 43,
|
||||
BLCM = 44,
|
||||
INDP = 45,
|
||||
PVLO = 46,
|
||||
PSXT = 47,
|
||||
PTAI = 48,
|
||||
PCMD = 49,
|
||||
BSAO = 50,
|
||||
CCH0 = 51,
|
||||
CCH1 = 52,
|
||||
CCH2 = 53,
|
||||
CCH3 = 54,
|
||||
CCH4 = 55,
|
||||
CCH5 = 56,
|
||||
CCH6 = 57,
|
||||
BKLT = 58,
|
||||
BKLB = 59,
|
||||
BKLA = 60,
|
||||
BKGL = 61,
|
||||
DYIN = 62,
|
||||
CLP0 = 63,
|
||||
HOTP = 64,
|
||||
SHID = 65,
|
||||
GBFF = 66,
|
||||
PMOD = 67,
|
||||
PFLG = 68,
|
||||
BLPI = 69,
|
||||
ICH0 = 70,
|
||||
ICH1 = 71,
|
||||
ICH2 = 72,
|
||||
AUVI = 73,
|
||||
ECH0 = 74,
|
||||
OPCS = 75,
|
||||
SPCP = 76,
|
||||
INDS = 77,
|
||||
BLSM = 78,
|
||||
LITS = 79,
|
||||
MDOE = 80,
|
||||
VANF = 81,
|
||||
OTHS = 82,
|
||||
PZSO = 83,
|
||||
RCH0 = 84,
|
||||
RCH1 = 85,
|
||||
RCH2 = 86,
|
||||
PXFM = 87,
|
||||
MCH0 = 88,
|
||||
SHDD = 89,
|
||||
BCLR = 89,
|
||||
SKIN = 90,
|
||||
MTLL = 90,
|
||||
NRML = 91,
|
||||
DIMD = 94,
|
||||
"TIL " = 95,
|
||||
ALLD = 96,
|
||||
DLLD = 97,
|
||||
DLLC = 98,
|
||||
AUXF = 99,
|
||||
WIND = 100,
|
||||
WATR = 101,
|
||||
DFXS = 102,
|
||||
DXFN = 103,
|
||||
MCDD = 104,
|
||||
CAUS = 105,
|
||||
PLDB = 106,
|
||||
BLPT = 107,
|
||||
FOGS = 108,
|
||||
VOLF = 109,
|
||||
VFXB = 110,
|
||||
VFXD = 111,
|
||||
REFP = 112,
|
||||
RAIN = 113,
|
||||
XCH0 = 114,
|
||||
XCH1 = 115,
|
||||
*/
|
||||
|
||||
string CMaterialDataRead(CMaterialData &mat)
|
||||
{
|
||||
string s;
|
||||
|
||||
@@ -0,0 +1,249 @@
|
||||
struct SBufferTOCEntry {
|
||||
uint unk1;
|
||||
uint unk2;
|
||||
};
|
||||
|
||||
struct CPermutation {
|
||||
uint64 unk1;
|
||||
uint64 unk2;
|
||||
};
|
||||
|
||||
enum <char> EMaterialTechnique {
|
||||
kMT_None = 'x', /* offset 0x10 = 9, offset 0x20 = 0, offset 0x28 = 1, type = 0 */
|
||||
kMT_DepthOnly = 'z',/* offset 0x10 = 15, offset 0x20 = 0, offset 0x28 = 1, type 1 */
|
||||
kMT_DeferredGBuffer = 'g',/* offset 0x10 = 15, offset 0x20 = 0, offset 0x28 = 1, type 2 */
|
||||
kMT_DeferredInstance = 'i',/* offset 0x10 = 16, offset 0x20 = 0, offset 0x28 = 1, type 3 */
|
||||
kMT_ForwardRender = 'f', /* offset 0x10 = 13, offset 0x20 = 0, offset 0x28 = 1, type 4 */
|
||||
kMT_ParticleTechniqueSprite = 's', /* offset 0x10 = 23, offset 0x20 = 0, offset 0x28 = 1, type 5 */
|
||||
kMT_ParticleTechniqueSwoosh = 'w', /* offset 0x10 = 23, offset 0x20 = 0, offset 0x28 = 1, type 6 */
|
||||
kMT_ParticleTechniqueModel = 'm', /* offset 0x10 = 22, offset 0x20 = 0, offset 0x28 = 1, type 7 */
|
||||
};
|
||||
|
||||
struct CShaderIdentifier {
|
||||
EMaterialTechnique matTechnique;
|
||||
CPermutation perm;
|
||||
};
|
||||
|
||||
struct SShaderTOCEntry {
|
||||
CShaderIdentifier identifier;
|
||||
uint unk1;
|
||||
uint unk2;
|
||||
};
|
||||
|
||||
struct SMaterialTOCEntry {
|
||||
GUID guid;
|
||||
uint unk1;
|
||||
uint nameLen;
|
||||
char name[nameLen];
|
||||
ushort unk2;
|
||||
uint shaderEntryCount;
|
||||
SShaderTOCEntry shaderEntries[shaderEntryCount];
|
||||
SBufferTOCEntry bufferToc;
|
||||
};
|
||||
|
||||
struct SShaderSource {
|
||||
uchar unk;
|
||||
uint strLen;
|
||||
if (strLen)
|
||||
char str[strLen];
|
||||
uint dataLen;
|
||||
uchar data[dataLen];
|
||||
};
|
||||
|
||||
struct CShaderDefines {
|
||||
struct Name {
|
||||
uint str1Len;
|
||||
char str1[str1Len];
|
||||
};
|
||||
|
||||
uint namesCount;
|
||||
if (namesCount)
|
||||
Name names[namesCount] <optimize = false>;
|
||||
uint unk;
|
||||
};
|
||||
|
||||
struct CShaderVariable {
|
||||
|
||||
};
|
||||
struct SShaderImportDesc {
|
||||
CShaderIdentifier ident;
|
||||
uint64 unk1;
|
||||
uint unk2;
|
||||
uint unk3;
|
||||
uint unk4;
|
||||
uint unk5;
|
||||
uint unk6;
|
||||
CShaderDefines defines;
|
||||
uint dataSize;
|
||||
union {
|
||||
struct {
|
||||
uint variableCount;
|
||||
CShaderVariable variables[1];
|
||||
} meta;
|
||||
char data[dataSize];
|
||||
} data;
|
||||
};
|
||||
|
||||
|
||||
struct SExpression {
|
||||
uint unk1;
|
||||
uint unk2;
|
||||
};
|
||||
|
||||
|
||||
struct CBooleanExpressionEvaluator {
|
||||
uint expressionCount;
|
||||
SExpression expressions[expressionCount];
|
||||
};
|
||||
|
||||
struct SSimpleFeatureInstanceInternalOptionRequirement {
|
||||
uint unk;
|
||||
CBooleanExpressionEvaluator evaluator;
|
||||
};
|
||||
|
||||
struct SSimpleFeatureInstanceShaderBinding {
|
||||
CStringFixed name;
|
||||
CStringFixed binding;
|
||||
};
|
||||
|
||||
struct SSimpleFeatureInstanceInternalOption {
|
||||
uint unk;
|
||||
CShaderDefines shaderDefines;
|
||||
uint bindingCount;
|
||||
if (bindingCount) {
|
||||
SSimpleFeatureInstanceShaderBinding binding[bindingCount] <optimize = false>;
|
||||
}
|
||||
};
|
||||
|
||||
struct IFeatureInstance;
|
||||
struct CFeatureSet {
|
||||
uint count;
|
||||
IFeatureInstance features[count] <optimize = false>;
|
||||
CBooleanExpressionEvaluator evaluator;
|
||||
};
|
||||
|
||||
struct CSimpleFeatureInstance {
|
||||
FourCC unk1;
|
||||
uint fccCount;
|
||||
uint fccs[fccCount];
|
||||
uint boolExpresionEvalCount;
|
||||
CBooleanExpressionEvaluator evaluators[boolExpresionEvalCount] <optimize = false>;
|
||||
uint internalOptionCount;
|
||||
SSimpleFeatureInstanceInternalOption internalOption[internalOptionCount] <optimize = false>;
|
||||
uint unk;
|
||||
uint unkIntCount;
|
||||
Assert(unkIntCount <= 32);
|
||||
uint unkInts[unkIntCount];
|
||||
uint optionRequirementCount;
|
||||
if (optionRequirementCount)
|
||||
SSimpleFeatureInstanceInternalOptionRequirement optionRequirements[optionRequirementCount] <optimize = false>;
|
||||
};
|
||||
|
||||
struct SCompositeFeatureInstanceInternalOptionRequirement {
|
||||
uint unk;
|
||||
CBooleanExpressionEvaluator eval;
|
||||
};
|
||||
|
||||
struct SCompositeFeatureInstanceInternalOption {
|
||||
CStringFixed name;
|
||||
CPermutation perm;
|
||||
CShaderDefines defines;
|
||||
};
|
||||
|
||||
struct SCompositeFeatureInstanceArgument {
|
||||
CStringFixed name;
|
||||
CBooleanExpressionEvaluator evaluator;
|
||||
};
|
||||
|
||||
struct CCompositeFeatureInstance {
|
||||
CFeatureSet subSet;
|
||||
uint argumentCount1;
|
||||
if (argumentCount1) {
|
||||
SCompositeFeatureInstanceArgument arguments1[argumentCount1] <optimize = false>;
|
||||
}
|
||||
uint argumentCount2;
|
||||
if (argumentCount2) {
|
||||
SCompositeFeatureInstanceArgument arguments2[argumentCount2] <optimize = false>;
|
||||
}
|
||||
|
||||
uint optionCount;
|
||||
SCompositeFeatureInstanceInternalOption optionRequirements1[optionCount] <optimize = false>;
|
||||
uint optionRequirementsCount;
|
||||
SCompositeFeatureInstanceInternalOptionRequirement optionRequirements2[optionRequirementsCount] <optimize = false>;
|
||||
};
|
||||
|
||||
struct IFeatureInstance;
|
||||
struct CExplicitCompositeFeatureInstance;
|
||||
struct CExplicitCompositeFeatureInstance {
|
||||
CCompositeFeatureInstance base;
|
||||
IFeatureInstance sub;
|
||||
};
|
||||
|
||||
struct IFeatureInstance {
|
||||
uint type;
|
||||
CStringFixed name;
|
||||
uint unk1;
|
||||
uint unk2;
|
||||
switch(type) {
|
||||
case 0:
|
||||
CSimpleFeatureInstance simple <optimize = false>;
|
||||
break;
|
||||
case 1:
|
||||
CCompositeFeatureInstance composite <optimize = false>;
|
||||
break;
|
||||
case 2:
|
||||
CExplicitCompositeFeatureInstance explicitComposite <optimize = false>;
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
struct SMaterialImportDesc {
|
||||
GUID guid;
|
||||
uint unk1;
|
||||
uint nameLen;
|
||||
char name[nameLen];
|
||||
ushort unk2;
|
||||
uint shaderImportCount;
|
||||
SShaderImportDesc shaderImportDescs[shaderImportCount] <optimize = false>;
|
||||
uint dataSize;
|
||||
union {
|
||||
struct {
|
||||
uchar hasFeatureSet;
|
||||
if (hasFeatureSet) {
|
||||
CFeatureSet featureSet;
|
||||
}
|
||||
} meta;
|
||||
char data[dataSize];
|
||||
} data;
|
||||
};
|
||||
|
||||
struct MaterialBackend {
|
||||
ChunkDescriptor chunk;
|
||||
local uint64 start <format=hex, hidden=true> = FTell();
|
||||
uint unk1;
|
||||
uint unk2;
|
||||
if (unk1 != 0) {
|
||||
uint bufferEntryCount;
|
||||
SBufferTOCEntry bufferEntries[bufferEntryCount];
|
||||
uint materialEntryCount;
|
||||
SMaterialTOCEntry materialEntries[materialEntryCount] <optimize = false>;
|
||||
uint shaderSourceCount;
|
||||
SShaderSource shaderSources[shaderSourceCount] <optimize = false>;
|
||||
uint materialImportDescCount;
|
||||
SMaterialImportDesc materialImportDescs[materialImportDescCount] <optimize = false>;
|
||||
};
|
||||
break;
|
||||
|
||||
|
||||
if ((FTell() - start) != chunk.size) {
|
||||
char data[chunk.size - (FTell() - start)];
|
||||
}
|
||||
};
|
||||
|
||||
struct MaterialArchive(uint64 size) {
|
||||
local uint64 start <format=hex, hidden=true> = FTell();
|
||||
while (FTell() < start + size) {
|
||||
MaterialBackend backend;
|
||||
}
|
||||
};
|
||||
@@ -12,6 +12,7 @@
|
||||
#include "CGraphicsModel.bt"
|
||||
#include "CPakFile.bt"
|
||||
#include "MessageStudioBinaryText.bt"
|
||||
#include "MaterialArchive.bt"
|
||||
|
||||
// Custom footer
|
||||
#include "Footer.bt"
|
||||
@@ -22,6 +23,9 @@ typedef struct
|
||||
local uint64 start <format=hex, hidden=true> = FTell();
|
||||
switch (form.id)
|
||||
{
|
||||
case "MTRL":
|
||||
MaterialArchive materialArchive(form.size);
|
||||
break;
|
||||
case "CHPR":
|
||||
FCharInf charInfo;
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user