Add MaterialArchive

This commit is contained in:
Phillip Stephens
2023-02-14 15:42:04 -08:00
parent 700a13aed9
commit dcd4e3b53c
3 changed files with 405 additions and 0 deletions
+152
View File
@@ -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;
+249
View File
@@ -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;
}
};
+4
View File
@@ -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;