From dcd4e3b53c00a7d6d872ac591a340e41ff28ba62 Mon Sep 17 00:00:00 2001 From: Phillip Stephens Date: Tue, 14 Feb 2023 15:42:04 -0800 Subject: [PATCH] Add MaterialArchive --- CGraphicsModel.bt | 152 +++++++++++++++++++++++++++ MaterialArchive.bt | 249 +++++++++++++++++++++++++++++++++++++++++++++ Run.bt | 4 + 3 files changed, 405 insertions(+) create mode 100644 MaterialArchive.bt diff --git a/CGraphicsModel.bt b/CGraphicsModel.bt index 3912a68..c2c320b 100644 --- a/CGraphicsModel.bt +++ b/CGraphicsModel.bt @@ -102,6 +102,158 @@ typedef struct{ } } CMaterialData ; +/* 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; diff --git a/MaterialArchive.bt b/MaterialArchive.bt new file mode 100644 index 0000000..882d6bc --- /dev/null +++ b/MaterialArchive.bt @@ -0,0 +1,249 @@ +struct SBufferTOCEntry { + uint unk1; + uint unk2; +}; + +struct CPermutation { + uint64 unk1; + uint64 unk2; +}; + +enum 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] ; + 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] ; + } +}; + +struct IFeatureInstance; +struct CFeatureSet { + uint count; + IFeatureInstance features[count] ; + CBooleanExpressionEvaluator evaluator; +}; + +struct CSimpleFeatureInstance { + FourCC unk1; + uint fccCount; + uint fccs[fccCount]; + uint boolExpresionEvalCount; + CBooleanExpressionEvaluator evaluators[boolExpresionEvalCount] ; + uint internalOptionCount; + SSimpleFeatureInstanceInternalOption internalOption[internalOptionCount] ; + uint unk; + uint unkIntCount; + Assert(unkIntCount <= 32); + uint unkInts[unkIntCount]; + uint optionRequirementCount; + if (optionRequirementCount) + SSimpleFeatureInstanceInternalOptionRequirement optionRequirements[optionRequirementCount] ; +}; + +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] ; + } + uint argumentCount2; + if (argumentCount2) { + SCompositeFeatureInstanceArgument arguments2[argumentCount2] ; + } + + uint optionCount; + SCompositeFeatureInstanceInternalOption optionRequirements1[optionCount] ; + uint optionRequirementsCount; + SCompositeFeatureInstanceInternalOptionRequirement optionRequirements2[optionRequirementsCount] ; +}; + +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 ; + break; + case 1: + CCompositeFeatureInstance composite ; + break; + case 2: + CExplicitCompositeFeatureInstance explicitComposite ; + break; + } +}; + + +struct SMaterialImportDesc { + GUID guid; + uint unk1; + uint nameLen; + char name[nameLen]; + ushort unk2; + uint shaderImportCount; + SShaderImportDesc shaderImportDescs[shaderImportCount] ; + uint dataSize; + union { + struct { + uchar hasFeatureSet; + if (hasFeatureSet) { + CFeatureSet featureSet; + } + } meta; + char data[dataSize]; + } data; +}; + +struct MaterialBackend { + ChunkDescriptor chunk; + local uint64 start