Initial Prime 4 updates

This commit is contained in:
Phillip Stephens
2025-12-07 10:37:47 -08:00
parent 98e3320d43
commit ce1b00a893
4 changed files with 52 additions and 36 deletions
+22 -13
View File
@@ -114,7 +114,7 @@ struct ModelHeader {
}
};
typedef struct {
typedef struct(int readerVersion, int writerVersion) {
FourCC id <read=ReadMaterialDataId>;
FourCC type <read=ReadMaterialDataType>;
} MaterialType <read=(Str("%s %s", id, type))>;
@@ -258,7 +258,7 @@ struct CLayeredTextureData
CMaterialTextureTokenData textures[3];
};
typedef struct {
typedef struct(int readerVersion, int writerVersion) {
FourCC id <read=ReadMaterialDataId>;
if (ReadByte() == 0) //Fix DKCTF WiiU models
{
@@ -351,9 +351,10 @@ string CMaterialDataRead(CMaterialData &mat) {
case DATA_TYPE_COMPLEX:
return Str("Complex %s", mat.id);
}
return "";
}
typedef struct {
typedef struct(int readerVersion, int writerVersion) {
if (ReadByte() == 0 || !isDKCTF) //NS, use anti isDKCTF so MP1R models don't break
{
local uint useMaterialTypeChunk <hidden=true> = 1;
@@ -391,13 +392,18 @@ typedef struct {
}
}
//material data types
uint dataCount;
if (useMaterialTypeChunk || !isDKCTF)
{
MaterialType dataTypes[dataCount];
if (readerVersion != 163) {
// Metroid Prime remastered and earlier
uint dataCount;
if (useMaterialTypeChunk || !isDKCTF)
{
MaterialType dataTypes(readerVersion, writerVersion)[dataCount];
}
} else {
uint dataCount;
}
//data parse
CMaterialData data[dataCount] <optimize=false>;
// data parse
CMaterialData materialData(readerVersion, writerVersion)[dataCount] <optimize = false>;
} CMaterialCache <name=(Str("%s %s", this.name.text, GUIDToString(this.shaderID)))>;
typedef struct {
@@ -517,7 +523,7 @@ struct CGraphicsIndexBufferToken {
EBufferType type[count];
};
typedef struct {
typedef struct(int readerVersion, int writerVersion) {
ChunkDescriptor chunk;
local uint pos<format = hex, hidden = true> = FTell();
@@ -548,10 +554,13 @@ typedef struct {
case "MTRL":
if (isDKCTF == 0)
{
if (readerVersion == 163) {
FourCC unkFcc;// LEGA?
}
uint unk;
}
uint numMaterials;
CMaterialCache materials[numMaterials]<optimize = false>;
CMaterialCache materials(readerVersion, writerVersion)[numMaterials]<optimize = false>;
break;
case "MESH":
SMeshLoadInformation loadInformation;
@@ -566,10 +575,10 @@ typedef struct {
FSeek(pos + chunk.size);
} ModelChunk <name=(Str("%s chunk", chunk.id))>;
typedef struct(uint64 size) {
typedef struct(uint64 size, int readerVersion, int writerVersion) {
local uint64 start <format=hex, hidden=true> = FTell();
while (FTell() < start + size) {
ModelChunk chunk;
ModelChunk chunk(readerVersion, writerVersion);
}
} ModelFile <name="Model chunks">;
+8 -3
View File
@@ -1,5 +1,6 @@
#ifndef _CPAKFILE
#define _CPAKFILE
#include "Common.bt"
struct File;
struct CPakFile;
@@ -22,19 +23,23 @@ typedef struct
{
local uint64 decompressedSize <hidden=true> = size;
}
if (pak.toc.readerVersion == 4) {
uint64 unk;
}
local uint64 pos <format=hex, hidden=true> = FTell();
FSeek(offset);
if (size == decompressedSize) {
File data <size=size>;
} else {
} else {
CompressionType compressionType;
byte pad[3] <hidden=true>;
byte compressedData[size - 4];
}
FSeek(pos);
} AssetDirectoryEntry <
size=(isDKCTF ? 36 : 52), // Parse on-demand
//size=(isDKCTF ? 36 : 52), // Parse on-demand
name=AssetDirectoryEntryName,
comment=(SizeComment(this.size))
>;
+1
View File
@@ -439,6 +439,7 @@ EMaterialDataId MapMaterialDataId(FourCC value) {
case "XCH1":
return DATA_ID_XCH1;
}
return -1;
}
string ReadMaterialDataId(FourCC value) {
+21 -20
View File
@@ -58,30 +58,30 @@ typedef struct {
}
break;
case "MATI":
CMaterialInstanceResource materialInstance;
//CMaterialInstanceResource materialInstance;
break;
case "CAUD":
CAudioSoundEffect audioSoundEffect;
//CAudioSoundEffect audioSoundEffect;
break;
case "CBNK":
CAudioSampleBank audioSampleBank;
//CAudioSampleBank audioSampleBank;
break;
case "CABH":
CAudioBusHierarchy audioBusHierarchy;
//CAudioBusHierarchy audioBusHierarchy;
break;
case "ENUM":
CDataEnumObject dataEnum;
// CDataEnumObject dataEnum;
break;
case "UINF":
CUniverseInfo universeInfo(form.size);
// CUniverseInfo universeInfo(form.size);
break;
case "LTPB":
CLightProbeData lightProbe(form.size);
//CLightProbeData lightProbe(form.size);
break;
case "LFSM":
if (!isDKCTF)
BigEndian();
CLegacyStateMachine legacyStateMachine;
// CLegacyStateMachine legacyStateMachine;
if (!isDKCTF)
LittleEndian();
break;
@@ -89,24 +89,25 @@ typedef struct {
CCollisionTree obboxCollisionTree(form.size, kCOL_OBBox);
break;
case "CMAP":
CGuiMap guiMap;
Printf("FOUND! 0x%08X", startof(this));
// CGuiMap guiMap;
break;
case "CLSN":
CCollisionTree aaboxCollisionTree(form.size, kCOL_AABox);
// CCollisionTree aaboxCollisionTree(form.size, kCOL_AABox);
break;
case "CHPR":
FCharInfo charInfo;
break;
case "CHAR":
FCharInfo charInfo;
// FCharInfo charInfo;
break;
case "CMDL":
case "SMDL":
case "WMDL":
ModelFile model(form.size);
ModelFile model(form.size, form.readerVersion, form.writerVersion);
break;
case "MSBT":
MessageStudioBinaryText text;
// MessageStudioBinaryText text;
break;
case "PACK":
CPakFile pak;
@@ -115,34 +116,34 @@ typedef struct {
NTextureFormat texture(form.size);
break;
case "REFL":
CReflectionProbeData probeData;
// CReflectionProbeData probeData;
break;
/*case "RULE":
CRuleSet rulesetconfig(form.size);
break;*/
case "GFXL":
CScaleformFlashLibrary scaleformflashlibrary;
//CScaleformFlashLibrary scaleformflashlibrary;
break;
/*case "GFX ":
CFlashMovieResource flashmovieresource(form.size);
break;*/
case "VECF":
CVectorField vectorField;
// CVectorField vectorField;
break;
case "ROOM":
CGameAreaResource room(form.size);
break;
case "GUIF":
CGuiFrame frame;
//CGuiFrame frame;
break;
case "SHNT":
NShaderHint shaderHints;
//NShaderHint shaderHints;
break;
case "FONT":
CFont font;
//CFont font;
break;
case "DGRP":
DependencyGroup data;
//DependencyGroup data;
break;
case "MCON":
CModConData data(form.size);