XPlor/libs/xassets/xgfxworld.cpp

289 lines
11 KiB
C++
Raw Normal View History

2025-08-17 13:14:17 -04:00
#include "xgfxworld.h"
2025-09-05 18:35:17 -04:00
#include "xstring.h"
2025-08-17 13:14:17 -04:00
XGfxWorld::XGfxWorld()
2025-09-05 18:35:17 -04:00
: XAsset()
2025-09-07 23:12:00 -04:00
, mName()
, mBaseName()
, mPlaneCount(0)
, mNodeCount(0)
, mIndexCount(0)
, mIndices(0)
, mIndexBuffer()
, mSurfaceCount(0)
, mStreamInfo()
, mSkySurfCount(0)
, mSkyStartSurfs()
, mSkyImage()
, mSkySamplerState(0)
, mVertexCount(0)
2025-09-05 18:35:17 -04:00
, mVertexData()
2025-09-07 23:12:00 -04:00
, mVertexLayerDataSize(0)
, mVertexLayerData()
, mSunParse()
, mSunLight()
, mSunColorFromBsp()
, mSunPrimaryLightIndex(0)
, mPrimaryLightCount(0)
, mCullGroupCount(0)
, mReflectionProbeCount(0)
2025-09-05 18:35:17 -04:00
, mReflectionProbes()
2025-09-07 23:12:00 -04:00
, 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()
2025-09-05 18:35:17 -04:00
{
SetType(ASSET_TYPE_GFXWORLD);
2025-09-10 21:58:26 -04:00
SetName("GFX World");
2025-09-05 18:35:17 -04:00
}
XGfxWorld::~XGfxWorld()
{
2025-08-17 13:14:17 -04:00
}
2025-09-10 21:58:26 -04:00
void XGfxWorld::ParseData(XDataStream *aStream) {
2025-08-17 13:14:17 -04:00
if (GetPtr() == -1) {
2025-09-07 23:12:00 -04:00
mName.ParsePtr(aStream, false);
mBaseName.ParsePtr(aStream, false);
2025-08-17 13:14:17 -04:00
2025-09-07 23:12:00 -04:00
qint32 indicesPtr;
2025-09-10 21:58:26 -04:00
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()));
2025-09-07 23:12:00 -04:00
mIndexBuffer.ParseData(aStream);
2025-09-10 21:58:26 -04:00
mSurfaceCount = aStream->ParseInt32(QString("%1 surface count").arg(GetName()));
2025-09-07 23:12:00 -04:00
mStreamInfo.SetPtr(-1);
mStreamInfo.ParseData(aStream);
qint32 skyStartSurfPtr, skyImagePtr;
2025-09-10 21:58:26 -04:00
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()));
2025-09-07 23:12:00 -04:00
aStream->skipRawData(3);
2025-09-10 21:58:26 -04:00
mVertexCount = aStream->ParseUInt32(QString("%1 vertex count").arg(GetName()));
2025-08-17 13:14:17 -04:00
mVertexData.ParseData(aStream);
2025-09-10 21:58:26 -04:00
mVertexLayerDataSize = aStream->ParseUInt32(QString("%1 vertex layer data size").arg(GetName()));
2025-09-07 23:12:00 -04:00
mVertexLayerData.ParseData(aStream);
mSunParse.ParseData(aStream);
mSunLight.ParsePtr(aStream, false);
2025-09-10 21:58:26 -04:00
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);
2025-09-07 23:12:00 -04:00
qint32 reflectionProbesPtr, reflectionProbeTexturesPtr;
2025-09-10 21:58:26 -04:00
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()));
2025-09-07 23:12:00 -04:00
mDpvsPlanes.ParseData(aStream);
qint32 cellsPtr, lightmapsPtr;
2025-09-10 21:58:26 -04:00
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()));
2025-09-07 23:12:00 -04:00
mLightGrid.ParseData(aStream);
qint32 lightMapsPrimaryPtr, lightmapSecondaryPtr, modelsPtr, materialMemoryPtr;
2025-09-10 21:58:26 -04:00
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()));
2025-09-07 23:12:00 -04:00
mSun.ParseData(aStream);
2025-09-10 21:58:26 -04:00
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));
2025-09-07 23:12:00 -04:00
}
}
qint32 outdoorImagePtr, cellCasterBitsPtr, sceneDynModelPtr, sceneDynBrushPtr,
primaryLightEntPtr, primaryLightDynPtr, nonSunPrimaryPtr, shadowGeomPtr, lightRegionPtr;
2025-09-10 21:58:26 -04:00
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()));
2025-09-07 23:12:00 -04:00
mDpvs.ParseData(aStream);
mDpvsDyn.ParseData(aStream);
mName.ParseData(aStream);
mBaseName.ParseData(aStream);
2025-09-10 21:58:26 -04:00
if (indicesPtr) {
2025-09-07 23:12:00 -04:00
aStream->readRawData(mIndices.data(), 2 * mIndexCount);
}
2025-09-10 21:58:26 -04:00
if (skyStartSurfPtr) {
for (int i = 0; i < mSkySurfCount; i++) {
qint32 newSurface = aStream->ParseInt32(QString("%1 sky start surf %2").arg(GetName()).arg(i));
2025-09-07 23:12:00 -04:00
mSkyStartSurfs.append(newSurface);
}
}
mSkyImage.ParseData(aStream);
mSunLight.ParseData(aStream);
2025-09-10 21:58:26 -04:00
if (reflectionProbesPtr) {
for (quint32 i = 0; i < mReflectionProbeCount; i++) {
2025-09-07 23:12:00 -04:00
XGfxReflectionProbe newProbe;
newProbe.ParseData(aStream);
mReflectionProbes.append(newProbe);
}
}
2025-09-10 21:58:26 -04:00
if (reflectionProbeTexturesPtr) {
for (quint32 i = 0; i < mReflectionProbeCount; i++) {
2025-09-07 23:12:00 -04:00
XGfxTexture newProbeTexture;
newProbeTexture.ParseData(aStream);
mReflectionProbeTextures.append(newProbeTexture);
}
}
mDpvsPlanes.ParseData(aStream);
2025-09-10 21:58:26 -04:00
if (cellsPtr) {
for (int i = 0; i < mDpvsPlanes.GetCellCount(); i++) {
2025-09-07 23:12:00 -04:00
XGfxCell newCell;
newCell.ParseData(aStream);
mCells.append(newCell);
}
}
2025-09-10 21:58:26 -04:00
if (lightmapsPtr) {
for (int i = 0; i < mLightmapCount; i++) {
2025-09-07 23:12:00 -04:00
XGfxLightmapArray lightMapArray;
lightMapArray.ParseData(aStream);
mLightmaps.append(lightMapArray);
}
}
mLightGrid.ParseData(aStream);
2025-08-17 13:14:17 -04:00
2025-09-10 21:58:26 -04:00
if (lightMapsPrimaryPtr) {
for (int i = 0; i < mLightmapCount; i++) {
2025-09-07 23:12:00 -04:00
XGfxTexture primaryTexture;
primaryTexture.ParseData(aStream);
mLightmapPrimaryTextures.append(primaryTexture);
}
}
2025-09-10 21:58:26 -04:00
if (lightmapSecondaryPtr) {
for (int i = 0; i < mLightmapCount; i++) {
2025-09-07 23:12:00 -04:00
XGfxTexture secondaryTexture;
secondaryTexture.ParseData(aStream);
mLightmapSecondaryTextures.append(secondaryTexture);
}
}
2025-09-10 21:58:26 -04:00
if (modelsPtr) {
for (int i = 0; i < mModelCount; i++) {
2025-09-07 23:12:00 -04:00
XGfxBrushModel newModel;
newModel.ParseData(aStream);
mModels.append(newModel);
}
}
2025-09-10 21:58:26 -04:00
if (materialMemoryPtr) {
for (int i = 0; i < mMaterialMemoryCount; i++) {
2025-09-07 23:12:00 -04:00
XMaterialMemory newMaterialMemory;
newMaterialMemory.ParseData(aStream);
mMaterialMemory.append(newMaterialMemory);
}
2025-08-17 13:14:17 -04:00
}
2025-09-07 23:12:00 -04:00
mSun.ParseData(aStream);
mOutdoorImage.ParseData(aStream);
2025-09-10 21:58:26 -04:00
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));
2025-09-07 23:12:00 -04:00
mCellCasterBits.append(casterBit);
}
}
2025-09-10 21:58:26 -04:00
if (sceneDynModelPtr) {
for (quint32 i = 0; i < mDpvsDyn.GetClientCount(1); i++) {
2025-09-07 23:12:00 -04:00
XGfxSceneDynModel dynModel;
dynModel.ParseData(aStream);
mSceneDynModel.append(dynModel);
}
}
2025-09-10 21:58:26 -04:00
if (sceneDynBrushPtr) {
for (quint32 i = 0; i < mDpvsDyn.GetClientCount(1); i++) {
2025-09-07 23:12:00 -04:00
XGfxSceneDynBrush dynBrush;
dynBrush.ParseData(aStream);
mSceneDynBrush.append(dynBrush);
}
2025-08-17 13:14:17 -04:00
}
}
2025-09-07 23:12:00 -04:00
// TODO: Finish this... Double ugh
2025-08-17 13:14:17 -04:00
}
2025-09-05 18:35:17 -04:00
void XGfxWorld::Clear()
{
2025-08-17 13:14:17 -04:00
}