XPlor/libs/xassets/xmodel.cpp

208 lines
7.1 KiB
C++
Raw Normal View History

2025-08-14 17:30:25 -04:00
#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();
}