Applied a bunch of fixes to get the current game exporter functionality working with the resource store system

This commit is contained in:
parax0
2016-07-04 20:28:17 -06:00
parent 2f2ec13ced
commit 24c5ad5cd7
28 changed files with 318 additions and 174 deletions

View File

@@ -60,7 +60,6 @@ class CFont : public CResource
public:
CFont(CResourceEntry *pEntry = 0);
~CFont();
CResource* MakeCopy(CResCache *pCopyCache);
CVector2f RenderString(const TString& rkString, CRenderer *pRenderer, float AspectRatio,
CVector2f Position = CVector2f(0,0),
CColor FillColor = CColor::skWhite, CColor StrokeColor = CColor::skBlack,

View File

@@ -9,8 +9,6 @@
#include <Common/types.h>
#include <Common/TString.h>
class CResCache;
// This macro creates functions that allow us to easily identify this resource type.
// Must be included on every CResource subclass.
#define DECLARE_RESOURCE_TYPE(ResTypeEnum) \
@@ -38,18 +36,17 @@ public:
CResource(CResourceEntry *pEntry = 0)
: mpEntry(pEntry), mRefCount(0)
{
if (!mpEntry) mpEntry = gResourceStore.RegisterTransientResource(Type());
}
virtual ~CResource() {}
inline CResourceEntry* Entry() const { return mpEntry; }
inline TString Source() const { return mpEntry->CookedAssetPath(true).GetFileName(); }
inline TString FullSource() const { return mpEntry->CookedAssetPath(true); }
inline CUniqueID ResID() const { return mpEntry->ID(); }
inline EGame Game() const { return mpEntry->Game(); }
inline TString Source() const { return mpEntry ? mpEntry->CookedAssetPath(true).GetFileName() : ""; }
inline TString FullSource() const { return mpEntry ? mpEntry->CookedAssetPath(true) : ""; }
inline CUniqueID ResID() const { return mpEntry ? mpEntry->ID() : CUniqueID::skInvalidID64; }
inline EGame Game() const { return mpEntry ? mpEntry->Game() : eUnknownVersion; }
inline bool IsReferenced() const { return mRefCount > 0; }
inline void SetGame(EGame Game) { mpEntry->SetGame(Game); }
inline void SetGame(EGame Game) { if (mpEntry) mpEntry->SetGame(Game); }
inline void Lock() { mRefCount++; }
inline void Release() { mRefCount--; }

View File

@@ -60,9 +60,9 @@ public:
if (!IsValid())
return nullptr;
if (mIsPath)
return gResourceStore.LoadResource(mPath);
return gpResourceStore->LoadResource(mPath);
else
return gResourceStore.LoadResource(ID(), Type());
return gpResourceStore->LoadResource(ID(), Type());
}
inline bool IsValid() const

View File

@@ -14,7 +14,7 @@ CAnimSet* CAnimSetLoader::LoadCorruptionCHAR(IInputStream& rCHAR)
CAnimSet::SNode& node = pSet->mNodes[0];
node.Name = rCHAR.ReadString();
node.pModel = gResourceStore.LoadResource(rCHAR.ReadLongLong(), "CMDL");
node.pModel = gpResourceStore->LoadResource(rCHAR.ReadLongLong(), "CMDL");
return pSet;
}
@@ -28,7 +28,7 @@ CAnimSet* CAnimSetLoader::LoadReturnsCHAR(IInputStream& rCHAR)
rNode.Name = rCHAR.ReadString();
rCHAR.Seek(0x14, SEEK_CUR);
rCHAR.ReadString();
rNode.pModel = gResourceStore.LoadResource(rCHAR.ReadLongLong(), "CMDL");
rNode.pModel = gpResourceStore->LoadResource(rCHAR.ReadLongLong(), "CMDL");
return pSet;
}
@@ -238,9 +238,9 @@ CAnimSet* CAnimSetLoader::LoadANCS(IInputStream& rANCS, CResourceEntry *pEntry)
Loader.pSet->SetGame(Loader.mVersion);
}
pNode->Name = rANCS.ReadString();
pNode->pModel = gResourceStore.LoadResource(rANCS.ReadLong(), "CMDL");
pNode->pSkin = gResourceStore.LoadResource(rANCS.ReadLong(), "CSKR");
pNode->pSkeleton = gResourceStore.LoadResource(rANCS.ReadLong(), "CINF");
pNode->pModel = gpResourceStore->LoadResource(rANCS.ReadLong(), "CMDL");
pNode->pSkin = gpResourceStore->LoadResource(rANCS.ReadLong(), "CSKR");
pNode->pSkeleton = gpResourceStore->LoadResource(rANCS.ReadLong(), "CINF");
if (pNode->pModel) pNode->pModel->SetSkin(pNode->pSkin);
// Unfortunately that's all that's actually supported at the moment. Hope to expand later.
@@ -349,7 +349,7 @@ CAnimSet* CAnimSetLoader::LoadANCS(IInputStream& rANCS, CResourceEntry *pEntry)
{
CAnimSet::SAnimation Anim;
Anim.Name = rPrim.Name;
Anim.pAnim = gResourceStore.LoadResource(rPrim.AnimID, "ANIM");
Anim.pAnim = gpResourceStore->LoadResource(rPrim.AnimID, "ANIM");
Loader.pSet->mAnims.push_back(Anim);
}
}

View File

@@ -7,7 +7,6 @@
class CAnimSetLoader
{
TResPtr<CAnimSet> pSet;
CResCache *mpResCache;
EGame mVersion;
CAnimSetLoader();

View File

@@ -603,7 +603,7 @@ void CAreaLoader::ReadEGMC()
Log::FileWrite(mpMREA->GetSourceString(), "Reading EGMC");
mpSectionMgr->ToSection(mEGMCBlockNum);
CUniqueID EGMC(*mpMREA, (mVersion <= eEchoes ? e32Bit : e64Bit));
mpArea->mpPoiToWorldMap = gResourceStore.LoadResource(EGMC, "EGMC");
mpArea->mpPoiToWorldMap = gpResourceStore->LoadResource(EGMC, "EGMC");
}
void CAreaLoader::SetUpObjects()

View File

@@ -18,8 +18,8 @@ CFont* CFontLoader::LoadFont(IInputStream& rFONT)
mpFont->mDefaultSize = rFONT.ReadLong();
mpFont->mFontName = rFONT.ReadString();
if (mVersion <= eEchoes) mpFont->mpFontTexture = gResourceStore.LoadResource(rFONT.ReadLong(), "TXTR");
else mpFont->mpFontTexture = gResourceStore.LoadResource(rFONT.ReadLongLong(), "TXTR");
if (mVersion <= eEchoes) mpFont->mpFontTexture = gpResourceStore->LoadResource(rFONT.ReadLong(), "TXTR");
else mpFont->mpFontTexture = gpResourceStore->LoadResource(rFONT.ReadLongLong(), "TXTR");
mpFont->mTextureFormat = rFONT.ReadLong();
u32 NumGlyphs = rFONT.ReadLong();

View File

@@ -50,7 +50,7 @@ void CMaterialLoader::ReadPrimeMatSet()
for (u32 iTex = 0; iTex < NumTextures; iTex++)
{
u32 TextureID = mpFile->ReadLong();
mTextures[iTex] = gResourceStore.LoadResource(TextureID, "TXTR");
mTextures[iTex] = gpResourceStore->LoadResource(TextureID, "TXTR");
}
// Materials
@@ -366,7 +366,7 @@ CMaterial* CMaterialLoader::ReadCorruptionMaterial()
continue;
}
pPass->mpTexture = gResourceStore.LoadResource(TextureID, "TXTR");
pPass->mpTexture = gpResourceStore->LoadResource(TextureID, "TXTR");
pPass->mTexCoordSource = 4 + (u8) mpFile->ReadLong();
u32 AnimSize = mpFile->ReadLong();

View File

@@ -10,7 +10,7 @@ CScan* CScanLoader::LoadScanMP1(IInputStream& rSCAN)
{
// Basic support at the moment - don't read animation/scan image data
rSCAN.Seek(0x4, SEEK_CUR); // Skip FRME ID
mpScan->mpStringTable = gResourceStore.LoadResource(rSCAN.ReadLong(), "STRG");
mpScan->mpStringTable = gpResourceStore->LoadResource(rSCAN.ReadLong(), "STRG");
mpScan->mIsSlow = (rSCAN.ReadLong() != 0);
mpScan->mCategory = (CScan::ELogbookCategory) rSCAN.ReadLong();
mpScan->mIsImportant = (rSCAN.ReadByte() == 1);
@@ -88,7 +88,7 @@ void CScanLoader::LoadParamsMP2(IInputStream& rSCAN)
switch (PropertyID)
{
case 0x2F5B6423:
mpScan->mpStringTable = gResourceStore.LoadResource(rSCAN.ReadLong(), "STRG");
mpScan->mpStringTable = gpResourceStore->LoadResource(rSCAN.ReadLong(), "STRG");
break;
case 0xC308A322:
@@ -121,7 +121,7 @@ void CScanLoader::LoadParamsMP3(IInputStream& rSCAN)
switch (PropertyID)
{
case 0x2F5B6423:
mpScan->mpStringTable = gResourceStore.LoadResource(rSCAN.ReadLongLong(), "STRG");
mpScan->mpStringTable = gpResourceStore->LoadResource(rSCAN.ReadLongLong(), "STRG");
break;
case 0xC308A322:

View File

@@ -117,7 +117,7 @@ void CScriptLoader::ReadProperty(IProperty *pProp, u32 Size, IInputStream& rSCLY
if (ResID.IsValid())
{
CFourCC Type = gResourceStore.ResourceTypeByID(ResID, rkExtensions);
CFourCC Type = gpResourceStore->ResourceTypeByID(ResID, rkExtensions);
Info = CResourceInfo(ResID, Type);
}

View File

@@ -15,19 +15,19 @@ void CWorldLoader::LoadPrimeMLVL(IInputStream& rMLVL)
// Header
if (mVersion < eCorruptionProto)
{
mpWorld->mpWorldName = gResourceStore.LoadResource(rMLVL.ReadLong(), "STRG");
if (mVersion == eEchoes) mpWorld->mpDarkWorldName = gResourceStore.LoadResource(rMLVL.ReadLong(), "STRG");
mpWorld->mpWorldName = gpResourceStore->LoadResource(rMLVL.ReadLong(), "STRG");
if (mVersion == eEchoes) mpWorld->mpDarkWorldName = gpResourceStore->LoadResource(rMLVL.ReadLong(), "STRG");
if (mVersion >= eEchoes) mpWorld->mUnknown1 = rMLVL.ReadLong();
if (mVersion >= ePrime) mpWorld->mpSaveWorld = gResourceStore.LoadResource(rMLVL.ReadLong(), "SAVW");
mpWorld->mpDefaultSkybox = gResourceStore.LoadResource(rMLVL.ReadLong(), "CMDL");
if (mVersion >= ePrime) mpWorld->mpSaveWorld = gpResourceStore->LoadResource(rMLVL.ReadLong(), "SAVW");
mpWorld->mpDefaultSkybox = gpResourceStore->LoadResource(rMLVL.ReadLong(), "CMDL");
}
else
{
mpWorld->mpWorldName = gResourceStore.LoadResource(rMLVL.ReadLongLong(), "STRG");
mpWorld->mpWorldName = gpResourceStore->LoadResource(rMLVL.ReadLongLong(), "STRG");
rMLVL.Seek(0x4, SEEK_CUR); // Skipping unknown value
mpWorld->mpSaveWorld = gResourceStore.LoadResource(rMLVL.ReadLongLong(), "SAVW");
mpWorld->mpDefaultSkybox = gResourceStore.LoadResource(rMLVL.ReadLongLong(), "CMDL");
mpWorld->mpSaveWorld = gpResourceStore->LoadResource(rMLVL.ReadLongLong(), "SAVW");
mpWorld->mpDefaultSkybox = gpResourceStore->LoadResource(rMLVL.ReadLongLong(), "CMDL");
}
// Memory relays - only in MP1
@@ -58,9 +58,9 @@ void CWorldLoader::LoadPrimeMLVL(IInputStream& rMLVL)
CWorld::SArea *pArea = &mpWorld->mAreas[iArea];
if (mVersion < eCorruptionProto)
pArea->pAreaName = gResourceStore.LoadResource(rMLVL.ReadLong(), "STRG");
pArea->pAreaName = gpResourceStore->LoadResource(rMLVL.ReadLong(), "STRG");
else
pArea->pAreaName = gResourceStore.LoadResource(rMLVL.ReadLongLong(), "STRG");
pArea->pAreaName = gpResourceStore->LoadResource(rMLVL.ReadLongLong(), "STRG");
pArea->Transform = CTransform4f(rMLVL);
pArea->AetherBox = CAABox(rMLVL);
@@ -169,9 +169,9 @@ void CWorldLoader::LoadPrimeMLVL(IInputStream& rMLVL)
// MapWorld
if (mVersion < eCorruptionProto)
mpWorld->mpMapWorld = gResourceStore.LoadResource(rMLVL.ReadLong(), "MAPW");
mpWorld->mpMapWorld = gpResourceStore->LoadResource(rMLVL.ReadLong(), "MAPW");
else
mpWorld->mpMapWorld = gResourceStore.LoadResource(rMLVL.ReadLongLong(), "MAPW");
mpWorld->mpMapWorld = gpResourceStore->LoadResource(rMLVL.ReadLongLong(), "MAPW");
rMLVL.Seek(0x5, SEEK_CUR); // Unknown values which are always 0
// AudioGrps
@@ -221,7 +221,7 @@ void CWorldLoader::LoadPrimeMLVL(IInputStream& rMLVL)
void CWorldLoader::LoadReturnsMLVL(IInputStream& rMLVL)
{
mpWorld->mpWorldName = gResourceStore.LoadResource(rMLVL.ReadLongLong(), "STRG");
mpWorld->mpWorldName = gpResourceStore->LoadResource(rMLVL.ReadLongLong(), "STRG");
bool Check = (rMLVL.ReadByte() != 0);
if (Check)
@@ -230,8 +230,8 @@ void CWorldLoader::LoadReturnsMLVL(IInputStream& rMLVL)
rMLVL.Seek(0x10, SEEK_CUR);
}
mpWorld->mpSaveWorld = gResourceStore.LoadResource(rMLVL.ReadLongLong(), "SAVW");
mpWorld->mpDefaultSkybox = gResourceStore.LoadResource(rMLVL.ReadLongLong(), "CMDL");
mpWorld->mpSaveWorld = gpResourceStore->LoadResource(rMLVL.ReadLongLong(), "SAVW");
mpWorld->mpDefaultSkybox = gpResourceStore->LoadResource(rMLVL.ReadLongLong(), "CMDL");
// Areas
u32 NumAreas = rMLVL.ReadLong();
@@ -242,7 +242,7 @@ void CWorldLoader::LoadReturnsMLVL(IInputStream& rMLVL)
// Area header
CWorld::SArea *pArea = &mpWorld->mAreas[iArea];
pArea->pAreaName = gResourceStore.LoadResource(rMLVL.ReadLongLong(), "STRG");
pArea->pAreaName = gpResourceStore->LoadResource(rMLVL.ReadLongLong(), "STRG");
pArea->Transform = CTransform4f(rMLVL);
pArea->AetherBox = CAABox(rMLVL);
pArea->FileID = rMLVL.ReadLongLong();

View File

@@ -166,7 +166,7 @@ CResource* CScriptTemplate::FindDisplayAsset(CPropertyStruct *pProperties, u32&
if (it->AssetSource == SEditorAsset::eFile)
{
TString Path = "../resources/" + it->AssetLocation;
pRes = gResourceStore.LoadResource(Path);
pRes = gpResourceStore->LoadResource(Path);
}
// Property
@@ -216,7 +216,7 @@ CCollisionMeshGroup* CScriptTemplate::FindCollision(CPropertyStruct *pProperties
if (it->AssetSource == SEditorAsset::eFile)
{
TString path = "../resources/" + it->AssetLocation;
pRes = gResourceStore.LoadResource(path);
pRes = gpResourceStore->LoadResource(path);
}
// Property