From de88641a578bc3a3daf9d7eafc32e777ed1677ea Mon Sep 17 00:00:00 2001 From: Phillip Stephens Date: Fri, 18 Apr 2025 02:05:48 -0700 Subject: [PATCH] Figure out bone names and hierarchy mappings --- CCharInfo.bt | 84 ++++++++++++++++++++++++++++++++++++++----------- CPASDatabase.bt | 73 +++++++++++++++++++++++------------------- 2 files changed, 106 insertions(+), 51 deletions(-) diff --git a/CCharInfo.bt b/CCharInfo.bt index 7450706..b0f4ce9 100644 --- a/CCharInfo.bt +++ b/CCharInfo.bt @@ -49,7 +49,10 @@ struct SAbsContext(byte unkA, uint16 unkB, uint16 unkC, uint16 unkD, uint16 unkE } SNodeSet nodeSet; - char unk5[unkB * 4]; + struct { + ushort a; + ushort b; + } unk5[unkB]; uchar unk6; }; @@ -117,15 +120,17 @@ struct SRenderContext { int32 unk5; union { struct { - ushort unk[unk1]; + ushort unk[unk1] ; if (unk2 > 0) { - ushort unk2[unk2]; + ushort unk2[unk2] ; } if (unk3 > 0) { - ushort unk3[unk3]; + ushort unk3[unk3] ; } - ushort segIDs[unk4]; + ushort segIDs[unk4] ; CTransform4f xfs[unk1 + 1]; + local int i; + CTransform4f xfs2[unk4]; char unkp[unk5]; } data; @@ -444,7 +449,7 @@ struct CAnimTrans { case 4: uint unk1; char data1[unk1 * 4]; - char data1[(unk1 + 12) * 4]; + char data2[(unk1 + 12) * 4]; break; } }; @@ -542,20 +547,61 @@ struct CCharInfo uint16 flags2; } else { SAnimContextLoad animCtxLoadDummy; - // local int i; - // local int id; - // Printf("=== ANIM CTX ===\n"); - // for (i = 0; i < animCtxLoadDummy.animCtx.nodeSet.nodeCount; ++i) { - // id = animCtxLoadDummy.animCtx.nodeSet.nodeId[i]; - // Printf("%s -> 0x%08X (0x%04X, 0x%04X) -> %i\n", namePool.stringList.text[namePool.hashList[animCtxLoadDummy.animCtx.nodeSet.nameSet].stringIDs[i]].text, id, (id >> 16) & 0xFFFF, id & 0xFFFF, i); - // } + local int i; + local int id; + Printf("=== ANIM CTX ===\n"); + for (i = 0; i < animCtxLoadDummy.animCtx.nodeSet.nodeCount; ++i) { + id = animCtxLoadDummy.animCtx.nodeSet.nodeId[i]; + Printf("%s -> 0x%08X (0x%04X, 0x%04X) -> %i\n", namePool.stringList.text[namePool.hashList[animCtxLoadDummy.animCtx.nodeSet.nameSet].stringIDs[i]].text, id, (id >> 16) & 0xFFFF, id & 0xFFFF, i); + } SAbsContextLoad absCtxLoadDummy; - // Printf("=== ABS CTX ===\n"); - // for (i = 0; i < absCtxLoadDummy.absContext.nodeSet.nodeCount; ++i) { - // id = absCtxLoadDummy.absContext.nodeSet.nodeId[i]; - // Printf("%s -> 0x%08X (0x%04X, 0x%04X) -> %i\n", namePool.stringList.text[namePool.hashList[absCtxLoadDummy.absContext.nodeSet.nameSet].stringIDs[i]].text, id, (id >> 16) & 0xFFFF, id & 0xFFFF, i); - // } + Printf("=== ABS CTX ===\n"); + for (i = 0; i < absCtxLoadDummy.absContext.nodeSet.nodeCount; ++i) { + id = absCtxLoadDummy.absContext.nodeSet.nodeId[i]; + Printf("%s -> 0x%08X (0x%04X, 0x%04X) -> %i\n", namePool.stringList.text[namePool.hashList[absCtxLoadDummy.absContext.nodeSet.nameSet].stringIDs[i]].text, id, (id >> 16) & 0xFFFF, id & 0xFFFF, i); + } SRenderContext renderCtx; + Printf("=== RENDER CTX ===\n"); + local int j; + local int k; + local int a; + local int b; + local int c; + local int d; + local string parentName; + for (i = 0; i < renderCtx.unk4; ++i) { + Printf("v %f %f %f\n", renderCtx.data.data.xfs2[i].m03, renderCtx.data.data.xfs2[i].m13,renderCtx.data.data.xfs2[i].m23); + } + for (i = 0; i < renderCtx.unk4; ++i) { + for (j = 0; j < absCtxLoadDummy.absContext.nodeSet.nodeCount; ++j) { + parentName = ""; + a = absCtxLoadDummy.absContext.nodeSet.nodeId[j] & 0xFFFF; + b = renderCtx.data.data.segIDs[i]; + c = absCtxLoadDummy.absContext.unk5[i].a; + for (k = 0; k < absCtxLoadDummy.absContext.nodeSet.nodeCount; ++k) { + d = absCtxLoadDummy.absContext.nodeSet.nodeId[k] & 0xFFFF; + if (d == c) { + parentName = namePool.stringList.text[namePool.hashList[absCtxLoadDummy.absContext.nodeSet.nameSet].stringIDs[k]].text; + break; + } + } + + for (k = 0; k < renderCtx.unk4; ++k) { + if (renderCtx.data.data.segIDs[k] == d) { + break; + } + } + + if (a == b) { + Printf("o %s %04X -> %s - %04X\n", parentName, c, namePool.stringList.text[namePool.hashList[absCtxLoadDummy.absContext.nodeSet.nameSet].stringIDs[j]].text, b); + if (c != 0xFFFF) { + Printf("l %i %i\n", i + 1, k + 1); + } else { + Printf("f %i %i %i\n", i + 1, i + 1, i + 1); + } + } + } + } SChannelLoad channel; ubyte unk3; ubyte unk4; @@ -625,7 +671,7 @@ struct CCharInfo if (hasActionData) { CActionData actionData; } - + return; uchar hasTransData; if (hasTransData) { STransData transData; diff --git a/CPASDatabase.bt b/CPASDatabase.bt index 9a87d02..711d19c 100644 --- a/CPASDatabase.bt +++ b/CPASDatabase.bt @@ -7,66 +7,76 @@ // Purpose: //-------------------------------------- -enum EParmType -{ - Int32, - Uint32, - Real32, - Bool, - Enum +enum EParmType { + kPT_Int32, + kPT_Uint32, + kPT_Real32, + kPT_Bool, + kPT_Enum }; -struct CPASParmInfo -{ +enum EWeightFunction { + kWF_ExactMatch, + kWF_PercentError, + kWF_AngularPercent, + kWF_NoWeight, +}; + +struct CPASParmInfo { EParmType type; - uint unknown1; - float unknown2; + EWeightFunction weightFunction; + float weight; switch(type) { - case Int32: - int val[2]; + case kPT_Int32: + int min; + int max; break; - case Uint32: - uint val[2]; + case kPT_Uint32: + uint min; + uint max; break; - case Real32: - float val[2]; + case kPT_Real32: + float min; + float max; break; - case Bool: - byte val[2]; + case kPT_Bool: + byte min; + byte max; + break; + case kPT_Enum: + uint min; + uint max; break; - case Enum: - uint val[2]; } }; -struct CPASAnimState -{ - uint unknown1; +struct CPASAnimState { + uint stateId; uint parmInfoCount; uint animInfoCount; CPASParmInfo parmInfo[parmInfoCount] ; local uint i; struct PASAnimInfo { - uint unknown1; + uint animId; for (i = 0; i < parmInfoCount; i++) { switch(parmInfo[i].type) { - case Int32: + case kPT_Int32: int val; break; - case Uint32: + case kPT_Uint32: uint val; break; - case Real32: + case kPT_Real32: float val; break; - case Bool: + case kPT_Bool: byte val; break; - case Enum: + case kPT_Enum: uint val; break; } @@ -74,8 +84,7 @@ struct CPASAnimState } animInfo[animInfoCount] ; }; -struct CPASDatabase -{ +struct CPASDatabase { uint magic; uint animStateCount; uint defaultState;