XPlor/libs/xassets/xmodel.cpp

208 lines
7.0 KiB
C++
Raw Normal View History

2025-08-14 17:30:25 -04:00
#include "xmodel.h"
XModel::XModel()
2025-09-03 13:02:54 -04:00
: XAsset()
, mName("")
, mNumBones(0)
, mNumRootBones(0)
, mNumSurfs(0)
, mLodRampType(0)
, mBoneNames()
, mParentList()
, mQuats()
, mTrans(0)
, mPartClassification(0)
, mBaseMat(0)
, mSurfs()
, mMaterialHandles()
, mLodInfo()
, mCollSurfs()
, mNumCollSurfs(0)
, mContents(0)
, mBoneInfo(new XBoneInfo())
, mRadius(0)
, mMins()
, mMaxs()
, mNumLods(0)
, mCollLod(0)
, mStreamInfo()
, mMemUsage(0)
, mFlags(0)
, mPhysPreset(new XPhysPreset)
, mPhysGeoms(new XPhysGeomList)
{
2025-08-14 17:30:25 -04:00
}
void XModel::ParseData(QDataStream *aStream) {
qint32 namePtr, boneNamesPtr;
*aStream
>> namePtr;
mName = Load_XString(aStream);
if (boneNamesPtr == -1)
{
Load_ScriptStringArray(1, numBones);
}
if ( parentList )
{
if ( parentList == (unsigned __int8 *)-1 )
{
v5 = g_streamPos;
v6 = v1->numBones - v1->numRootBones;
varbyte = g_streamPos;
v1->parentList = g_streamPos;
Load_Stream(1, v5, v6);
v1 = varXModel;
}
else
{
v1->parentList = &(*(unsigned __int8 **)((char *)&g_streamBlocks->data
+ (((unsigned int)(v1->parentList - 1) >> 26) & 0x38)))[(int)(v1->parentList - 1) & 0x1FFFFFFF];
}
}
quats = v1->quats;
if ( quats )
{
if ( quats == (__int16 *)-1 )
{
v8 = (unsigned __int8 *)((unsigned int)(g_streamPos + 1) & 0xFFFFFFFE);
v9 = 8 * (v1->numBones - v1->numRootBones);
g_streamPos = v8;
v1->quats = (__int16 *)v8;
varshort = (__int16 *)v8;
Load_Stream(1, v8, v9);
v1 = varXModel;
}
else
{
v1->quats = (__int16 *)&(*(unsigned __int8 **)((char *)&g_streamBlocks->data
+ ((((unsigned int)v1->quats - 1) >> 26) & 0x38)))[((int)v1->quats - 1) & 0x1FFFFFFF];
}
}
trans = v1->trans;
if ( trans )
{
if ( trans == (float *)-1 )
{
v11 = (unsigned __int8 *)((unsigned int)(g_streamPos + 3) & 0xFFFFFFFC);
v12 = 16 * (v1->numBones - v1->numRootBones);
g_streamPos = v11;
v1->trans = (float *)v11;
varfloat = (float *)v11;
Load_Stream(1, v11, v12);
v1 = varXModel;
}
else
{
v1->trans = (float *)&(*(unsigned __int8 **)((char *)&g_streamBlocks->data
+ ((((unsigned int)v1->trans - 1) >> 26) & 0x38)))[((int)v1->trans - 1) & 0x1FFFFFFF];
}
}
partClassification = v1->partClassification;
if ( partClassification )
{
if ( partClassification == (unsigned __int8 *)-1 )
{
v14 = g_streamPos;
v15 = v1->numBones;
varbyte = g_streamPos;
v1->partClassification = g_streamPos;
Load_Stream(1, v14, v15);
v1 = varXModel;
}
else
{
v1->partClassification = &(*(unsigned __int8 **)((char *)&g_streamBlocks->data
+ (((unsigned int)(v1->partClassification - 1) >> 26) & 0x38)))[(int)(v1->partClassification - 1) & 0x1FFFFFFF];
}
}
baseMat = v1->baseMat;
if ( baseMat )
{
if ( baseMat == (DObjAnimMat *)-1 )
{
v17 = __ROL4__(v1->numBones, 5);
v18 = (unsigned __int8 *)((unsigned int)(g_streamPos + 3) & 0xFFFFFFFC);
g_streamPos = v18;
varDObjAnimMat = (DObjAnimMat *)v18;
v1->baseMat = (DObjAnimMat *)v18;
Load_Stream(1, v18, v17);
v1 = varXModel;
}
else
{
v1->baseMat = (DObjAnimMat *)&(*(unsigned __int8 **)((char *)&g_streamBlocks->data
+ ((((unsigned int)&v1->baseMat[-1].transWeight + 3) >> 26) & 0x38)))[((int)&v1->baseMat[-1].transWeight + 3) & 0x1FFFFFFF];
}
}
if ( v1->surfs )
{
numsurfs = v1->numsurfs;
g_streamPos = (unsigned __int8 *)((unsigned int)(g_streamPos + 3) & 0xFFFFFFFC);
varXSurface = (XSurface *)g_streamPos;
v1->surfs = (XSurface *)g_streamPos;
Load_XSurfaceArray(1, numsurfs);
v1 = varXModel;
}
if ( v1->materialHandles )
{
v20 = v1->numsurfs;
g_streamPos = (unsigned __int8 *)((unsigned int)(g_streamPos + 3) & 0xFFFFFFFC);
varMaterialHandle = (Material **)g_streamPos;
v1->materialHandles = (Material **)g_streamPos;
Load_MaterialHandleArray(1, v20);
v1 = varXModel;
}
if ( v1->collSurfs )
{
numCollSurfs = v1->numCollSurfs;
g_streamPos = (unsigned __int8 *)((unsigned int)(g_streamPos + 3) & 0xFFFFFFFC);
varXModelCollSurf = (XModelCollSurf_s *)g_streamPos;
v1->collSurfs = (XModelCollSurf_s *)g_streamPos;
Load_XModelCollSurfArray(1, numCollSurfs);
v1 = varXModel;
}
if ( v1->boneInfo )
{
v22 = v1->numBones;
v23 = (unsigned __int8 *)((unsigned int)(g_streamPos + 3) & 0xFFFFFFFC);
v1->boneInfo = (XBoneInfo *)v23;
g_streamPos = v23;
varXBoneInfo = (XBoneInfo *)v23;
Load_Stream(1, v23, 8 * (v22 + __ROL4__(v22, 2)));
v1 = varXModel;
}
varXModelStreamInfo = &v1->streamInfo;
Load_Stream(0, &v1->streamInfo, 4u);
if ( varXModelStreamInfo->highMipBounds )
{
v24 = (XModelHighMipBounds *)((unsigned int)(g_streamPos + 3) & 0xFFFFFFFC);
varXModelStreamInfo->highMipBounds = v24;
varXModelHighMipBounds = v24;
g_streamPos = (unsigned __int8 *)v24;
Load_Stream(1, v24, 8 * (varXModel->lodInfo[0].numsurfs + __ROL4__(varXModel->lodInfo[0].numsurfs, 1)));
}
varPhysPresetPtr = &varXModel->physPreset;
Load_PhysPresetPtr(0);
physGeoms = varXModel->physGeoms;
if ( physGeoms )
{
if ( physGeoms == (PhysGeomList *)-1 )
{
g_streamPos = (unsigned __int8 *)((unsigned int)(g_streamPos + 3) & 0xFFFFFFFC);
varPhysGeomList = (PhysGeomList *)g_streamPos;
varXModel->physGeoms = (PhysGeomList *)g_streamPos;
Load_PhysGeomList(1);
DB_PopStreamPos();
return;
}
varXModel->physGeoms = (PhysGeomList *)&(*(unsigned __int8 **)((char *)&g_streamBlocks->data
+ ((((unsigned int)&varXModel->physGeoms[-1].mass.productsOfInertia[2]
+ 3) >> 26) & 0x38)))[((int)&varXModel->physGeoms[-1].mass.productsOfInertia[2]
+ 3) & 0x1FFFFFFF];
}
DB_PopStreamPos();
}