208 lines
7.1 KiB
C++
208 lines
7.1 KiB
C++
|
|
#include "xmodel.h"
|
||
|
|
|
||
|
|
XModel::XModel()
|
||
|
|
: XAsset() {
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
void XModel::ParseData(QDataStream *aStream) {
|
||
|
|
qint32 namePtr, boneNamesPtr;
|
||
|
|
|
||
|
|
const char *name;
|
||
|
|
unsigned __int8 numBones;
|
||
|
|
unsigned __int8 numRootBones;
|
||
|
|
unsigned __int8 numsurfs;
|
||
|
|
unsigned __int8 lodRampType;
|
||
|
|
unsigned __int16 *boneNames;
|
||
|
|
unsigned __int8 *parentList;
|
||
|
|
__int16 *quats;
|
||
|
|
float *trans;
|
||
|
|
unsigned __int8 *partClassification;
|
||
|
|
DObjAnimMat *baseMat;
|
||
|
|
XSurface *surfs;
|
||
|
|
Material **materialHandles;
|
||
|
|
XModelLodInfo lodInfo[4];
|
||
|
|
XModelCollSurf_s *collSurfs;
|
||
|
|
int numCollSurfs;
|
||
|
|
int contents;
|
||
|
|
XBoneInfo *boneInfo;
|
||
|
|
float radius;
|
||
|
|
float mins[3];
|
||
|
|
float maxs[3];
|
||
|
|
__int16 numLods;
|
||
|
|
__int16 collLod;
|
||
|
|
XModelStreamInfo streamInfo;
|
||
|
|
int memUsage;
|
||
|
|
unsigned __int8 flags;
|
||
|
|
PhysPreset *physPreset;
|
||
|
|
PhysGeomList *physGeoms;
|
||
|
|
|
||
|
|
*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();
|
||
|
|
}
|