mirror of
https://github.com/AxioDL/PrimeWorldEditor.git
synced 2025-12-17 08:57:09 +00:00
Cleanup & refactoring
This commit is contained in:
@@ -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));
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user