208 lines
7.0 KiB
C++
208 lines
7.0 KiB
C++
#include "xmodel.h"
|
|
|
|
XModel::XModel()
|
|
: 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)
|
|
{
|
|
|
|
}
|
|
|
|
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();
|
|
}
|