Cleanup & refactoring

This commit is contained in:
Aruki
2018-12-16 14:00:40 -07:00
parent 2287b05bc3
commit c4829f5fda
197 changed files with 2461 additions and 2345 deletions

View File

@@ -9,26 +9,26 @@ CMaterialCooker::CMaterialCooker()
uint32 CMaterialCooker::ConvertFromVertexDescription(FVertexDescription VtxDesc)
{
uint32 Flags = 0;
if (VtxDesc & ePosition) Flags |= 0x00000003;
if (VtxDesc & eNormal) Flags |= 0x0000000C;
if (VtxDesc & eColor0) Flags |= 0x00000030;
if (VtxDesc & eColor1) Flags |= 0x000000C0;
if (VtxDesc & eTex0) Flags |= 0x00000300;
if (VtxDesc & eTex1) Flags |= 0x00000C00;
if (VtxDesc & eTex2) Flags |= 0x00003000;
if (VtxDesc & eTex3) Flags |= 0x0000C000;
if (VtxDesc & eTex4) Flags |= 0x00030000;
if (VtxDesc & eTex5) Flags |= 0x000C0000;
if (VtxDesc & eTex6) Flags |= 0x00300000;
if (VtxDesc & eTex7) Flags |= 0x00C00000;
if (VtxDesc & ePosMtx) Flags |= 0x01000000;
if (VtxDesc & eTex0Mtx) Flags |= 0x02000000;
if (VtxDesc & eTex1Mtx) Flags |= 0x04000000;
if (VtxDesc & eTex2Mtx) Flags |= 0x08000000;
if (VtxDesc & eTex3Mtx) Flags |= 0x10000000;
if (VtxDesc & eTex4Mtx) Flags |= 0x20000000;
if (VtxDesc & eTex5Mtx) Flags |= 0x40000000;
if (VtxDesc & eTex6Mtx) Flags |= 0x80000000;
if (VtxDesc & EVertexAttribute::Position) Flags |= 0x00000003;
if (VtxDesc & EVertexAttribute::Normal) Flags |= 0x0000000C;
if (VtxDesc & EVertexAttribute::Color0) Flags |= 0x00000030;
if (VtxDesc & EVertexAttribute::Color1) Flags |= 0x000000C0;
if (VtxDesc & EVertexAttribute::Tex0) Flags |= 0x00000300;
if (VtxDesc & EVertexAttribute::Tex1) Flags |= 0x00000C00;
if (VtxDesc & EVertexAttribute::Tex2) Flags |= 0x00003000;
if (VtxDesc & EVertexAttribute::Tex3) Flags |= 0x0000C000;
if (VtxDesc & EVertexAttribute::Tex4) Flags |= 0x00030000;
if (VtxDesc & EVertexAttribute::Tex5) Flags |= 0x000C0000;
if (VtxDesc & EVertexAttribute::Tex6) Flags |= 0x00300000;
if (VtxDesc & EVertexAttribute::Tex7) Flags |= 0x00C00000;
if (VtxDesc & EVertexAttribute::PosMtx) Flags |= 0x01000000;
if (VtxDesc & EVertexAttribute::Tex0Mtx) Flags |= 0x02000000;
if (VtxDesc & EVertexAttribute::Tex1Mtx) Flags |= 0x04000000;
if (VtxDesc & EVertexAttribute::Tex2Mtx) Flags |= 0x08000000;
if (VtxDesc & EVertexAttribute::Tex3Mtx) Flags |= 0x10000000;
if (VtxDesc & EVertexAttribute::Tex4Mtx) Flags |= 0x20000000;
if (VtxDesc & EVertexAttribute::Tex5Mtx) Flags |= 0x40000000;
if (VtxDesc & EVertexAttribute::Tex6Mtx) Flags |= 0x80000000;
return Flags;
}
@@ -98,19 +98,20 @@ void CMaterialCooker::WriteMatSetCorruption(IOutputStream& /*rOut*/)
void CMaterialCooker::WriteMaterialPrime(IOutputStream& rOut)
{
// Gather data from the passes before we start writing
uint32 TexFlags = 0;
uint32 NumKonst = 0;
std::vector<uint32> TexIndices;
uint TexFlags = 0;
uint NumKonst = 0;
std::vector<uint> TexIndices;
for (uint32 iPass = 0; iPass < mpMat->mPasses.size(); iPass++)
for (uint iPass = 0; iPass < mpMat->mPasses.size(); iPass++)
{
CMaterialPass *pPass = mpMat->Pass(iPass);
if ((pPass->KColorSel() >= 0xC) || (pPass->KAlphaSel() >= 0x10))
if ((pPass->KColorSel() >= kKonst0_RGB) ||
(pPass->KAlphaSel() >= kKonst0_R))
{
// Determine the highest Konst index being used
uint32 KColorIndex = pPass->KColorSel() % 4;
uint32 KAlphaIndex = pPass->KAlphaSel() % 4;
uint KColorIndex = ((uint) pPass->KColorSel()) % 4;
uint KAlphaIndex = ((uint) pPass->KAlphaSel()) % 4;
if (KColorIndex >= NumKonst)
NumKonst = KColorIndex + 1;
@@ -272,14 +273,14 @@ void CMaterialCooker::WriteMaterialPrime(IOutputStream& rOut)
CMaterialPass *pPass = mpMat->Pass(iPass);
if (pPass->Texture() == nullptr) continue;
uint32 AnimType = pPass->AnimMode();
EUVAnimMode AnimType = pPass->AnimMode();
uint32 CoordSource = pPass->TexCoordSource();
uint32 TexMtxIdx, PostMtxIdx;
bool Normalize;
// No animation - set TexMtx and PostMtx to identity, disable normalization
if (AnimType == eNoUVAnim)
if (AnimType == EUVAnimMode::NoUVAnim)
{
TexMtxIdx = 30;
PostMtxIdx = 61;
@@ -291,7 +292,7 @@ void CMaterialCooker::WriteMaterialPrime(IOutputStream& rOut)
{
TexMtxIdx = CurTexMtx;
if ((AnimType < 2) || (AnimType > 5))
if ((AnimType <= EUVAnimMode::InverseMVTranslated) || (AnimType >= EUVAnimMode::ModelMatrix))
{
PostMtxIdx = CurTexMtx;
Normalize = true;
@@ -318,17 +319,17 @@ void CMaterialCooker::WriteMaterialPrime(IOutputStream& rOut)
for (uint32 iPass = 0; iPass < NumPasses; iPass++)
{
CMaterialPass *pPass = mpMat->Pass(iPass);
uint32 AnimMode = pPass->AnimMode();
if (AnimMode == eNoUVAnim) continue;
EUVAnimMode AnimMode = pPass->AnimMode();
if (AnimMode == EUVAnimMode::NoUVAnim) continue;
rOut.WriteLong(AnimMode);
rOut.WriteLong((int) AnimMode);
if ((AnimMode > 1) && (AnimMode != 6))
if ((AnimMode >= EUVAnimMode::UVScroll) && (AnimMode != EUVAnimMode::ModelMatrix))
{
rOut.WriteFloat(pPass->AnimParam(0));
rOut.WriteFloat(pPass->AnimParam(1));
if ((AnimMode == 2) || (AnimMode == 4) || (AnimMode == 5))
if ((AnimMode == EUVAnimMode::UVScroll) || (AnimMode == EUVAnimMode::HFilmstrip) || (AnimMode == EUVAnimMode::VFilmstrip))
{
rOut.WriteFloat(pPass->AnimParam(2));
rOut.WriteFloat(pPass->AnimParam(3));

View File

@@ -18,7 +18,7 @@ void CModelCooker::GenerateSurfaceData()
mVertices.resize(mNumVertices);
// Get vertex attributes
mVtxAttribs = eNoAttributes;
mVtxAttribs = EVertexAttribute::None;
for (uint32 iMat = 0; iMat < mpModel->GetMatCount(); iMat++)
{
@@ -115,7 +115,8 @@ void CModelCooker::WriteModelPrime(IOutputStream& rOut)
// Float UV coordinates
for (uint32 iTexSlot = 0; iTexSlot < 8; iTexSlot++)
{
bool HasTexSlot = (mVtxAttribs & (eTex0 << iTexSlot)) != 0;
uint TexSlotBit = ((uint) (EVertexAttribute::Tex0)) << iTexSlot;
bool HasTexSlot = (mVtxAttribs & TexSlotBit) != 0;
if (HasTexSlot)
{
for (uint32 iTex = 0; iTex < mNumVertices; iTex++)
@@ -171,28 +172,35 @@ void CModelCooker::WriteModelPrime(IOutputStream& rOut)
if (mVersion == EGame::Echoes)
{
for (uint32 iMtxAttribs = 0; iMtxAttribs < 8; iMtxAttribs++)
if (VtxAttribs & (ePosMtx << iMtxAttribs))
{
uint MatrixBit = ((uint) (EVertexAttribute::PosMtx) << iMtxAttribs);
if (VtxAttribs & MatrixBit)
{
rOut.WriteByte(pVert->MatrixIndices[iMtxAttribs]);
}
}
}
uint16 VertexIndex = (uint16) pVert->ArrayPosition;
if (VtxAttribs & ePosition)
if (VtxAttribs & EVertexAttribute::Position)
rOut.WriteShort(VertexIndex);
if (VtxAttribs & eNormal)
if (VtxAttribs & EVertexAttribute::Normal)
rOut.WriteShort(VertexIndex);
if (VtxAttribs & eColor0)
if (VtxAttribs & EVertexAttribute::Color0)
rOut.WriteShort(VertexIndex);
if (VtxAttribs & eColor1)
if (VtxAttribs & EVertexAttribute::Color1)
rOut.WriteShort(VertexIndex);
uint16 TexOffset = 0;
for (uint32 iTex = 0; iTex < 8; iTex++)
{
if (VtxAttribs & (eTex0 << iTex))
uint TexBit = ((uint) EVertexAttribute::Tex0) << iTex;
if (VtxAttribs & TexBit)
{
rOut.WriteShort(VertexIndex + TexOffset);
TexOffset += (uint16) mNumVertices;

View File

@@ -20,10 +20,10 @@ public:
switch (pEntry->ResourceType())
{
case eArea: return CAreaCooker::CookMREA((CGameArea*) pRes, rOutput);
case eModel: return CModelCooker::CookCMDL((CModel*) pRes, rOutput);
case eStaticGeometryMap: return CPoiToWorldCooker::CookEGMC((CPoiToWorld*) pRes, rOutput);
case eWorld: return CWorldCooker::CookMLVL((CWorld*) pRes, rOutput);
case EResourceType::Area: return CAreaCooker::CookMREA((CGameArea*) pRes, rOutput);
case EResourceType::Model: return CModelCooker::CookCMDL((CModel*) pRes, rOutput);
case EResourceType::StaticGeometryMap: return CPoiToWorldCooker::CookEGMC((CPoiToWorld*) pRes, rOutput);
case EResourceType::World: return CWorldCooker::CookMLVL((CWorld*) pRes, rOutput);
default:
warnf("Failed to cook %s asset; this resource type is not supported for cooking", *pEntry->CookedExtension().ToString());

View File

@@ -250,12 +250,12 @@ void CScriptCooker::WriteInstance(IOutputStream& rOut, CScriptObject *pInstance)
uint32 InstanceID = (pInstance->Layer()->AreaIndex() << 26) | pInstance->InstanceID();
rOut.WriteLong(InstanceID);
uint32 NumLinks = pInstance->NumLinks(eOutgoing);
uint32 NumLinks = pInstance->NumLinks(ELinkType::Outgoing);
IsPrime1 ? rOut.WriteLong(NumLinks) : rOut.WriteShort((uint16) NumLinks);
for (uint32 LinkIdx = 0; LinkIdx < NumLinks; LinkIdx++)
{
CLink *pLink = pInstance->Link(eOutgoing, LinkIdx);
CLink *pLink = pInstance->Link(ELinkType::Outgoing, LinkIdx);
rOut.WriteLong(pLink->State());
rOut.WriteLong(pLink->Message());
rOut.WriteLong(pLink->ReceiverID());
@@ -298,9 +298,9 @@ void CScriptCooker::WriteLayer(IOutputStream& rOut, CScriptLayer *pLayer)
// Generate/Attach message (MP3+) should be written to SCGN, not SCLY
else
{
for (uint32 LinkIdx = 0; LinkIdx < pInstance->NumLinks(eIncoming); LinkIdx++)
for (uint32 LinkIdx = 0; LinkIdx < pInstance->NumLinks(ELinkType::Incoming); LinkIdx++)
{
CLink *pLink = pInstance->Link(eIncoming, LinkIdx);
CLink *pLink = pInstance->Link(ELinkType::Incoming, LinkIdx);
if (mGame <= EGame::Echoes)
{

View File

@@ -9,14 +9,14 @@ CTextureEncoder::CTextureEncoder()
void CTextureEncoder::WriteTXTR(IOutputStream& rTXTR)
{
// Only DXT1->CMPR supported at the moment
rTXTR.WriteLong(mOutputFormat);
rTXTR.WriteLong((uint) mOutputFormat);
rTXTR.WriteShort(mpTexture->mWidth);
rTXTR.WriteShort(mpTexture->mHeight);
rTXTR.WriteLong(mpTexture->mNumMipMaps);
uint32 MipW = mpTexture->Width() / 4;
uint32 MipH = mpTexture->Height() / 4;
CMemoryInStream Image(mpTexture->mpImgDataBuffer, mpTexture->mImgDataSize, IOUtil::eLittleEndian);
CMemoryInStream Image(mpTexture->mpImgDataBuffer, mpTexture->mImgDataSize, EEndian::LittleEndian);
uint32 MipOffset = Image.Tell();
for (uint32 iMip = 0; iMip < mpTexture->mNumMipMaps; iMip++)
@@ -61,7 +61,7 @@ void CTextureEncoder::ReadSubBlockCMPR(IInputStream& rSource, IOutputStream& rDe
// ************ STATIC ************
void CTextureEncoder::EncodeTXTR(IOutputStream& rTXTR, CTexture *pTex)
{
if (pTex->mTexelFormat != eDXT1)
if (pTex->mTexelFormat != ETexelFormat::DXT1)
{
errorf("Unsupported texel format for decoding");
return;
@@ -69,8 +69,8 @@ void CTextureEncoder::EncodeTXTR(IOutputStream& rTXTR, CTexture *pTex)
CTextureEncoder Encoder;
Encoder.mpTexture = pTex;
Encoder.mSourceFormat = eDXT1;
Encoder.mOutputFormat = eGX_CMPR;
Encoder.mSourceFormat = ETexelFormat::DXT1;
Encoder.mOutputFormat = ETexelFormat::GX_CMPR;
Encoder.WriteTXTR(rTXTR);
}
@@ -84,13 +84,13 @@ ETexelFormat CTextureEncoder::GetGXFormat(ETexelFormat Format)
{
switch (Format)
{
case eLuminance: return eGX_I8;
case eLuminanceAlpha: return eGX_IA8;
case eRGBA4: return eGX_RGB5A3;
case eRGB565: return eGX_RGB565;
case eRGBA8: return eGX_RGBA8;
case eDXT1: return eGX_CMPR;
default: return eInvalidTexelFormat;
case ETexelFormat::Luminance: return ETexelFormat::GX_I8;
case ETexelFormat::LuminanceAlpha: return ETexelFormat::GX_IA8;
case ETexelFormat::RGBA4: return ETexelFormat::GX_RGB5A3;
case ETexelFormat::RGB565: return ETexelFormat::GX_RGB565;
case ETexelFormat::RGBA8: return ETexelFormat::GX_RGBA8;
case ETexelFormat::DXT1: return ETexelFormat::GX_CMPR;
default: return ETexelFormat::Invalid;
}
}
@@ -98,12 +98,12 @@ ETexelFormat CTextureEncoder::GetFormat(ETexelFormat Format)
{
switch (Format)
{
case eGX_I4: return eLuminance;
case eGX_I8: return eLuminance;
case eGX_IA4: return eLuminanceAlpha;
case eGX_IA8: return eLuminanceAlpha;
case ETexelFormat::GX_I4: return ETexelFormat::Luminance;
case ETexelFormat::GX_I8: return ETexelFormat::Luminance;
case ETexelFormat::GX_IA4: return ETexelFormat::LuminanceAlpha;
case ETexelFormat::GX_IA8: return ETexelFormat::LuminanceAlpha;
// todo rest of these
case eGX_CMPR: return eDXT1;
default: return eInvalidTexelFormat;
case ETexelFormat::GX_CMPR: return ETexelFormat::DXT1;
default: return ETexelFormat::Invalid;
}
}

View File

@@ -73,7 +73,7 @@ bool CWorldCooker::CookMLVL(CWorld *pWorld, IOutputStream& rMLVL)
// Area Header
CWorld::SArea& rArea = pWorld->mAreas[iArea];
CResourceEntry *pAreaEntry = gpResourceStore->FindEntry(rArea.AreaResID);
ASSERT(pAreaEntry && pAreaEntry->ResourceType() == eArea);
ASSERT(pAreaEntry && pAreaEntry->ResourceType() == EResourceType::Area);
CAssetID AreaNameID = rArea.pAreaName ? rArea.pAreaName->ID() : CAssetID::InvalidID(Game);
AreaNameID.Write(rMLVL);