XPlor/libs/xassets/xmaterialpass.cpp

92 lines
2.7 KiB
C++

#include "xmaterialpass.h"
#include "xmaterialvertexdeclaration.h"
#include "xmaterialvertexshader.h"
#include "xmaterialpixelshader.h"
#include <QDebug>
#include <QIODevice>
XMaterialPass::XMaterialPass()
: XAsset()
, mVertexDecl()
, mVertexShaderArray(15)
, mVertexShader()
, mPixelShader()
, mPerPrimArgCount(0)
, mPerObjArgCount(0)
, mStableArgCount(0)
, mCustomSamplerFlags(0)
//, mPrecompiledIndex(0)
, mArgs()
{
SetName("Material Pass");
}
void XMaterialPass::Clear()
{
}
void XMaterialPass::ParseData(XDataStream *aStream)
{
if (IsDebug())
{
qDebug() << QString("[%1] Parsing data for %2").arg(aStream->device()->pos(), 10, 10, QChar('0')).arg(GetName());
}
mVertexDecl.ParsePtr(aStream, false);
if (GetCommonInfo()->GetGame() != GAME_COD4)
{
for (int i = 0; i < 15; i++)
{
mVertexShaderArray[i].ParsePtr(aStream, false);
}
}
mVertexShader.ParsePtr(aStream, false);
mPixelShader.ParsePtr(aStream, false);
if (GetCommonInfo()->GetGame() == GAME_COD4)
{
mPerPrimArgCount = aStream->ParseUInt8(QString("%1 per primary arg count").arg(GetName()));
mPerObjArgCount = aStream->ParseUInt8(QString("%1 per object arg count").arg(GetName()));
mStableArgCount = aStream->ParseUInt8(QString("%1 stable arg count").arg(GetName()));
mCustomSamplerFlags = aStream->ParseUInt8(QString("%1 custom sampler flags").arg(GetName()));
}
else
{
mPerPrimArgCount = aStream->ParseUInt32(QString("%1 per primary arg count").arg(GetName()));
mPerObjArgCount = aStream->ParseUInt32(QString("%1 per object arg count").arg(GetName()));
mStableArgCount = aStream->ParseUInt32(QString("%1 stable arg count").arg(GetName()));
mCustomSamplerFlags = aStream->ParseUInt32(QString("%1 custom sampler flags").arg(GetName()));
mPrecompiledIndex = aStream->ParseUInt32(QString("%1 precompiled index").arg(GetName()));
aStream->skipRawData(3);
}
qint32 argsPtr = aStream->ParseInt32(QString("%1 args ptr").arg(GetName()));
mVertexDecl.ParseDataSafe(aStream);
if (GetCommonInfo()->GetGame() != GAME_COD4)
{
for (int i = 0; i < mVertexShaderArray.size(); i++)
{
mVertexShaderArray[i].ParseData(aStream);
}
}
mVertexShader.ParseDataSafe(aStream);
mPixelShader.ParseDataSafe(aStream);
if (argsPtr)
{
int argCount = mStableArgCount + mPerObjArgCount + mPerPrimArgCount;
for (int i = 0; i < argCount; i++)
{
XMaterialShaderArgument arg;
arg.ParseData(aStream);
mArgs.append(arg);
}
}
}