XPlor/libs/xassets/xgfxworld.cpp
2025-09-10 21:58:26 -04:00

289 lines
11 KiB
C++

#include "xgfxworld.h"
#include "xstring.h"
XGfxWorld::XGfxWorld()
: XAsset()
, mName()
, mBaseName()
, mPlaneCount(0)
, mNodeCount(0)
, mIndexCount(0)
, mIndices(0)
, mIndexBuffer()
, mSurfaceCount(0)
, mStreamInfo()
, mSkySurfCount(0)
, mSkyStartSurfs()
, mSkyImage()
, mSkySamplerState(0)
, mVertexCount(0)
, mVertexData()
, mVertexLayerDataSize(0)
, mVertexLayerData()
, mSunParse()
, mSunLight()
, mSunColorFromBsp()
, mSunPrimaryLightIndex(0)
, mPrimaryLightCount(0)
, mCullGroupCount(0)
, mReflectionProbeCount(0)
, mReflectionProbes()
, mReflectionProbeTextures()
, mDpvsPlanes()
, mCellBitsCount(0)
, mCells()
, mLightmapCount(0)
, mLightmaps()
, mLightGrid()
, mLightmapPrimaryTextures()
, mLightmapSecondaryTextures()
, mModelCount(0)
, mModels()
, mMins()
, mMaxs()
, mChecksum(0)
, mMaterialMemoryCount(0)
, mMaterialMemory()
, mSun()
, mOutdoorLookupMatrix()
, mOutdoorImage()
, mCellCasterBits()
, mSceneDynModel()
, mSceneDynBrush()
, mPrimaryLightEntityShadowVis()
, mPrimaryLightDynEntShadowVis()
, mNonSunPrimaryLightForModelDynEnt()
, mShadowGeom()
, mLightRegion()
, mDpvs()
, mDpvsDyn()
{
SetType(ASSET_TYPE_GFXWORLD);
SetName("GFX World");
}
XGfxWorld::~XGfxWorld()
{
}
void XGfxWorld::ParseData(XDataStream *aStream) {
if (GetPtr() == -1) {
mName.ParsePtr(aStream, false);
mBaseName.ParsePtr(aStream, false);
qint32 indicesPtr;
mPlaneCount = aStream->ParseInt32(QString("%1 plane count").arg(GetName()));
mNodeCount = aStream->ParseInt32(QString("%1 node count").arg(GetName()));
mIndexCount = aStream->ParseInt32(QString("%1 index count").arg(GetName()));
indicesPtr = aStream->ParseInt32(QString("%1 indices ptr").arg(GetName()));
mIndexBuffer.ParseData(aStream);
mSurfaceCount = aStream->ParseInt32(QString("%1 surface count").arg(GetName()));
mStreamInfo.SetPtr(-1);
mStreamInfo.ParseData(aStream);
qint32 skyStartSurfPtr, skyImagePtr;
mSkySurfCount = aStream->ParseInt32(QString("%1 sky surf count").arg(GetName()));
skyStartSurfPtr = aStream->ParseInt32(QString("%1 sky start surf ptr").arg(GetName()));
skyImagePtr = aStream->ParseInt32(QString("%1 sky image ptr").arg(GetName()));
mSkySamplerState = aStream->ParseUInt8(QString("%1 sky sampler state").arg(GetName()));
aStream->skipRawData(3);
mVertexCount = aStream->ParseUInt32(QString("%1 vertex count").arg(GetName()));
mVertexData.ParseData(aStream);
mVertexLayerDataSize = aStream->ParseUInt32(QString("%1 vertex layer data size").arg(GetName()));
mVertexLayerData.ParseData(aStream);
mSunParse.ParseData(aStream);
mSunLight.ParsePtr(aStream, false);
float r = aStream->ParseSingle(QString("%1 sun color r").arg(GetName()));
float g = aStream->ParseSingle(QString("%1 sun color g").arg(GetName()));
float b = aStream->ParseSingle(QString("%1 sun color b").arg(GetName()));
mSunColorFromBsp = QColor::fromRgbF(r, g, b);
qint32 reflectionProbesPtr, reflectionProbeTexturesPtr;
mSunPrimaryLightIndex = aStream->ParseUInt32(QString("%1 sun primary light index").arg(GetName()));
mPrimaryLightCount = aStream->ParseUInt32(QString("%1 primary light count").arg(GetName()));
mCullGroupCount = aStream->ParseInt32(QString("%1 cull group count").arg(GetName()));
mReflectionProbeCount = aStream->ParseUInt32(QString("%1 reflection probe count").arg(GetName()));
reflectionProbesPtr = aStream->ParseInt32(QString("%1 reflection probes ptr").arg(GetName()));
reflectionProbeTexturesPtr = aStream->ParseInt32(QString("%1 reflection probe textures ptr").arg(GetName()));
mDpvsPlanes.ParseData(aStream);
qint32 cellsPtr, lightmapsPtr;
mCellBitsCount = aStream->ParseInt32(QString("%1 cell bits count").arg(GetName()));
cellsPtr = aStream->ParseInt32(QString("%1 cells ptr").arg(GetName()));
mLightmapCount = aStream->ParseInt32(QString("%1 lightmap count").arg(GetName()));
lightmapsPtr = aStream->ParseInt32(QString("%1 lightmaps ptr").arg(GetName()));
mLightGrid.ParseData(aStream);
qint32 lightMapsPrimaryPtr, lightmapSecondaryPtr, modelsPtr, materialMemoryPtr;
lightMapsPrimaryPtr = aStream->ParseInt32(QString("%1 lightmaps primary ptr").arg(GetName()));
lightmapSecondaryPtr = aStream->ParseInt32(QString("%1 lightmaps secondary ptr").arg(GetName()));
mModelCount = aStream->ParseInt32(QString("%1 model count").arg(GetName()));
modelsPtr = aStream->ParseInt32(QString("%1 models ptr").arg(GetName()));
mMins.setX(aStream->ParseSingle(QString("%1 mins x").arg(GetName())));
mMins.setY(aStream->ParseSingle(QString("%1 mins y").arg(GetName())));
mMins.setZ(aStream->ParseSingle(QString("%1 mins z").arg(GetName())));
mMaxs.setX(aStream->ParseSingle(QString("%1 maxs x").arg(GetName())));
mMaxs.setY(aStream->ParseSingle(QString("%1 maxs y").arg(GetName())));
mMaxs.setZ(aStream->ParseSingle(QString("%1 maxs z").arg(GetName())));
mChecksum = aStream->ParseUInt32(QString("%1 checksum").arg(GetName()));
mMaterialMemoryCount = aStream->ParseInt32(QString("%1 material memory count").arg(GetName()));
materialMemoryPtr = aStream->ParseInt32(QString("%1 material memory ptr").arg(GetName()));
mSun.ParseData(aStream);
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
mOutdoorLookupMatrix[i][j] = aStream->ParseSingle(QString("%1 outdoor lookup matrix[%2][%3]").arg(GetName()).arg(i).arg(j));
}
}
qint32 outdoorImagePtr, cellCasterBitsPtr, sceneDynModelPtr, sceneDynBrushPtr,
primaryLightEntPtr, primaryLightDynPtr, nonSunPrimaryPtr, shadowGeomPtr, lightRegionPtr;
outdoorImagePtr = aStream->ParseInt32(QString("%1 outdoor image ptr").arg(GetName()));
cellCasterBitsPtr = aStream->ParseInt32(QString("%1 cell caster bits ptr").arg(GetName()));
sceneDynModelPtr = aStream->ParseInt32(QString("%1 scene dyn model ptr").arg(GetName()));
sceneDynBrushPtr = aStream->ParseInt32(QString("%1 scene dyn brush ptr").arg(GetName()));
primaryLightEntPtr = aStream->ParseInt32(QString("%1 primary light entity shadow vis ptr").arg(GetName()));
primaryLightDynPtr = aStream->ParseInt32(QString("%1 primary light dyn ent shadow vis ptr").arg(GetName()));
nonSunPrimaryPtr = aStream->ParseInt32(QString("%1 non sun primary light dyn ent ptr").arg(GetName()));
shadowGeomPtr = aStream->ParseInt32(QString("%1 shadow geom ptr").arg(GetName()));
lightRegionPtr = aStream->ParseInt32(QString("%1 light region ptr").arg(GetName()));
mDpvs.ParseData(aStream);
mDpvsDyn.ParseData(aStream);
mName.ParseData(aStream);
mBaseName.ParseData(aStream);
if (indicesPtr) {
aStream->readRawData(mIndices.data(), 2 * mIndexCount);
}
if (skyStartSurfPtr) {
for (int i = 0; i < mSkySurfCount; i++) {
qint32 newSurface = aStream->ParseInt32(QString("%1 sky start surf %2").arg(GetName()).arg(i));
mSkyStartSurfs.append(newSurface);
}
}
mSkyImage.ParseData(aStream);
mSunLight.ParseData(aStream);
if (reflectionProbesPtr) {
for (quint32 i = 0; i < mReflectionProbeCount; i++) {
XGfxReflectionProbe newProbe;
newProbe.ParseData(aStream);
mReflectionProbes.append(newProbe);
}
}
if (reflectionProbeTexturesPtr) {
for (quint32 i = 0; i < mReflectionProbeCount; i++) {
XGfxTexture newProbeTexture;
newProbeTexture.ParseData(aStream);
mReflectionProbeTextures.append(newProbeTexture);
}
}
mDpvsPlanes.ParseData(aStream);
if (cellsPtr) {
for (int i = 0; i < mDpvsPlanes.GetCellCount(); i++) {
XGfxCell newCell;
newCell.ParseData(aStream);
mCells.append(newCell);
}
}
if (lightmapsPtr) {
for (int i = 0; i < mLightmapCount; i++) {
XGfxLightmapArray lightMapArray;
lightMapArray.ParseData(aStream);
mLightmaps.append(lightMapArray);
}
}
mLightGrid.ParseData(aStream);
if (lightMapsPrimaryPtr) {
for (int i = 0; i < mLightmapCount; i++) {
XGfxTexture primaryTexture;
primaryTexture.ParseData(aStream);
mLightmapPrimaryTextures.append(primaryTexture);
}
}
if (lightmapSecondaryPtr) {
for (int i = 0; i < mLightmapCount; i++) {
XGfxTexture secondaryTexture;
secondaryTexture.ParseData(aStream);
mLightmapSecondaryTextures.append(secondaryTexture);
}
}
if (modelsPtr) {
for (int i = 0; i < mModelCount; i++) {
XGfxBrushModel newModel;
newModel.ParseData(aStream);
mModels.append(newModel);
}
}
if (materialMemoryPtr) {
for (int i = 0; i < mMaterialMemoryCount; i++) {
XMaterialMemory newMaterialMemory;
newMaterialMemory.ParseData(aStream);
mMaterialMemory.append(newMaterialMemory);
}
}
mSun.ParseData(aStream);
mOutdoorImage.ParseData(aStream);
if (cellCasterBitsPtr) {
for (int i = 0; i < ((mDpvsPlanes.GetCellCount() + 31) >> 5) * mDpvsPlanes.GetCellCount(); i++) {
quint32 casterBit = aStream->ParseUInt32(QString("%1 cell caster bit %2").arg(GetName()).arg(i));
mCellCasterBits.append(casterBit);
}
}
if (sceneDynModelPtr) {
for (quint32 i = 0; i < mDpvsDyn.GetClientCount(1); i++) {
XGfxSceneDynModel dynModel;
dynModel.ParseData(aStream);
mSceneDynModel.append(dynModel);
}
}
if (sceneDynBrushPtr) {
for (quint32 i = 0; i < mDpvsDyn.GetClientCount(1); i++) {
XGfxSceneDynBrush dynBrush;
dynBrush.ParseData(aStream);
mSceneDynBrush.append(dynBrush);
}
}
}
// TODO: Finish this... Double ugh
}
void XGfxWorld::Clear()
{
}