Unify directory structure for cooked/raw assets

This commit is contained in:
Aruki 2017-07-01 19:03:56 -06:00
parent 4dc11023df
commit c6e6ccaa89
12 changed files with 42 additions and 61 deletions

View File

@ -71,8 +71,7 @@ bool CGameExporter::Export(nod::DiscBase *pDisc, const TString& rkOutputDir, CAs
mpProject->SetProjectName(mGameName);
mpStore = mpProject->ResourceStore();
mContentDir = mpStore->RawDir(false);
mCookedDir = mpStore->CookedDir(false);
mResourcesDir = mpStore->ResourcesDir();
CResourceStore *pOldStore = gpResourceStore;
gpResourceStore = mpStore;
@ -467,7 +466,7 @@ void CGameExporter::LoadResource(const SResourceInstance& rkResource, std::vecto
void CGameExporter::ExportCookedResources()
{
SCOPED_TIMER(ExportCookedResources);
FileUtil::MakeDirectory(mCookedDir);
FileUtil::MakeDirectory(mResourcesDir);
mpProgress->SetTask(eES_ExportCooked, "Unpacking cooked assets");
int ResIndex = 0;
@ -502,7 +501,7 @@ void CGameExporter::ExportResourceEditorData()
for (CResourceIterator It(mpStore); It && !mpProgress->ShouldCancel(); ++It, ++ResIndex)
{
// Update progress
if ((ResIndex & 0x3) == 0)
if ((ResIndex & 0x3) == 0 || It->ResourceType() == eArea)
mpProgress->Report(ResIndex, mpStore->NumTotalResources(), TString::Format("Processing asset %d/%d: %s",
ResIndex, mpStore->NumTotalResources(), *It->CookedAssetPath(true).GetFileName()) );

View File

@ -31,8 +31,7 @@ class CGameExporter
// Directories
TString mExportDir;
TString mDiscDir;
TString mContentDir;
TString mCookedDir;
TString mResourcesDir;
TString mWorldsDirName;

View File

@ -211,7 +211,7 @@ CGameProject* CGameProject::CreateProjectForExport(
pProj->mProjectRoot = rkProjRootDir;
pProj->mProjectRoot.Replace("\\", "/");
pProj->mpResourceStore = new CResourceStore(pProj, "Content/", "Cooked/", Game);
pProj->mpResourceStore = new CResourceStore(pProj);
pProj->mpGameInfo->LoadGameInfo(Game);
pProj->mLoadSuccess = true;
return pProj;

View File

@ -90,8 +90,8 @@ public:
inline TString ProjectRoot() const { return mProjectRoot; }
inline TString ResourceDBPath(bool Relative) const { return Relative ? mResourceDBPath : mProjectRoot + mResourceDBPath; }
inline TString DiscDir(bool Relative) const { return Relative ? "Disc/" : mProjectRoot + "Disc/"; }
inline TString CacheDir(bool Relative) const { return Relative ? "Cache/" : mProjectRoot + "Cache/"; }
inline TString PackagesDir(bool Relative) const { return Relative ? "Packages/" : mProjectRoot + "Packages/"; }
inline TString ResourcesDir(bool Relative) const { return Relative ? "Resources/" : mProjectRoot + "Resources/"; }
inline TString ProjectPath() const { return mProjectRoot + FileUtil::SanitizeName(mProjectName, false) + ".prj"; }
inline TString ResourceCachePath(bool Relative) const { return ResourceDBPath(Relative).GetFileDirectory() + "ResourceCacheData.rcd"; }

View File

@ -92,15 +92,12 @@ bool CResourceEntry::HasCookedVersion() const
TString CResourceEntry::RawAssetPath(bool Relative) const
{
TString Ext = RawExtension();
TString Path = mpDirectory ? mpDirectory->FullPath() : "";
TString Name = mName + "." + Ext;
return Relative ? Path + Name : mpStore->RawDir(false) + Path + Name;
return CookedAssetPath(Relative) + ".raw";
}
TString CResourceEntry::RawExtension() const
{
return mpTypeInfo->RawExtension();
return CookedExtension().ToString() + ".raw";
}
TString CResourceEntry::CookedAssetPath(bool Relative) const
@ -108,7 +105,7 @@ TString CResourceEntry::CookedAssetPath(bool Relative) const
TString Ext = CookedExtension().ToString();
TString Path = mpDirectory ? mpDirectory->FullPath() : "";
TString Name = mName + "." + Ext;
return Relative ? Path + Name : mpStore->CookedDir(false) + Path + Name;
return Relative ? Path + Name : mpStore->ResourcesDir() + Path + Name;
}
CFourCC CResourceEntry::CookedExtension() const
@ -383,7 +380,7 @@ bool CResourceEntry::Move(const TString& rkDir, const TString& rkName)
TString NewCookedPath = CookedAssetPath();
TString NewRawPath = RawAssetPath();
Log::Write("MOVING RESOURCE: " + FileUtil::MakeRelative(OldCookedPath, mpStore->CookedDir(false)) + " --> " + FileUtil::MakeRelative(NewCookedPath, mpStore->CookedDir(false)));
Log::Write("MOVING RESOURCE: " + FileUtil::MakeRelative(OldCookedPath, mpStore->ResourcesDir()) + " --> " + FileUtil::MakeRelative(NewCookedPath, mpStore->ResourcesDir()));
// If the old/new paths are the same then we should have already exited as CanMoveTo() should have returned false
ASSERT(OldCookedPath != NewCookedPath && OldRawPath != NewRawPath);
@ -432,7 +429,6 @@ bool CResourceEntry::Move(const TString& rkDir, const TString& rkName)
FSMoveSuccess = pOldDir->RemoveChildResource(this);
ASSERT(FSMoveSuccess == true); // this shouldn't be able to fail
mpDirectory->AddChild("", this);
mpStore->ConditionalDeleteDirectory(pOldDir);
}
mpStore->SetDatabaseDirty();

View File

@ -26,19 +26,7 @@ CResourceStore::CResourceStore(const TString& rkDatabasePath)
mDatabaseName = rkDatabasePath.GetFileName();
}
// Constructor for game exporter
CResourceStore::CResourceStore(CGameProject *pProject, const TString& rkRawDir, const TString& rkCookedDir, EGame Game)
: mpProj(nullptr)
, mGame(Game)
, mRawDir(rkRawDir)
, mCookedDir(rkCookedDir)
, mDatabaseDirty(false)
, mCacheFileDirty(false)
{
SetProject(pProject);
}
// Main constructor for game projects
// Main constructor for game projects and game exporter
CResourceStore::CResourceStore(CGameProject *pProject)
: mpProj(nullptr)
, mGame(eUnknownGame)
@ -84,9 +72,7 @@ void CResourceStore::SerializeResourceDatabase(IArchive& rArc)
}
// Serialize
rArc << SERIAL("RawDir", mRawDir)
<< SERIAL("CookedDir", mCookedDir)
<< SERIAL_CONTAINER_AUTO(Resources, "Resource");
rArc << SERIAL_CONTAINER_AUTO(Resources, "Resource");
// Register resources
if (rArc.IsReader())
@ -310,10 +296,9 @@ void CResourceStore::ConditionalDeleteDirectory(CVirtualDirectory *pDir)
if (pDir->IsEmpty())
{
// If this directory is part of the project, then we should delete the corresponding filesystem directories
if (pDir->GetRoot() == mpDatabaseRoot)
if (pDir->GetRoot() == mpDatabaseRoot && !pDir->IsRoot())
{
FileUtil::DeleteDirectory(RawDir(false) + pDir->FullPath(), true);
FileUtil::DeleteDirectory(CookedDir(false) + pDir->FullPath(), true);
FileUtil::DeleteDirectory(ResourcesDir() + pDir->FullPath(), true);
}
CVirtualDirectory *pParent = pDir->Parent();
@ -419,11 +404,11 @@ CResource* CResourceStore::LoadResource(const TString& rkPath)
{
if (Ext.Length() == 4)
{
ASSERT(Ext.CaseInsensitiveCompare(pEntry->CookedExtension().ToString()));
ASSERT( Ext.CaseInsensitiveCompare(pEntry->CookedExtension().ToString()) );
}
else
{
ASSERT(Ext.CaseInsensitiveCompare(pEntry->RawExtension()));
ASSERT( rkPath.EndsWith(pEntry->RawExtension()) );
}
}

View File

@ -30,8 +30,6 @@ class CResourceStore
// Directory paths
TString mDatabasePath;
TString mDatabaseName;
TString mRawDir;
TString mCookedDir;
enum EDatabaseVersion
{
@ -43,7 +41,6 @@ class CResourceStore
public:
CResourceStore(const TString& rkDatabasePath);
CResourceStore(CGameProject *pProject, const TString& rkRawDir, const TString& rkCookedDir, EGame Game);
CResourceStore(CGameProject *pProject);
~CResourceStore();
void SerializeResourceDatabase(IArchive& rArc);
@ -78,10 +75,9 @@ public:
inline CGameProject* Project() const { return mpProj; }
inline EGame Game() const { return mGame; }
inline TString DatabaseRootPath() const { return mDatabasePath; }
inline TString RawDir(bool Relative) const { return Relative ? mRawDir : mDatabasePath + mRawDir; }
inline TString CookedDir(bool Relative) const { return Relative ? mCookedDir : mDatabasePath + mCookedDir; }
inline TString DatabasePath() const { return DatabaseRootPath() + mDatabaseName; }
inline TString CacheDataPath() const { return DatabaseRootPath() + "ResourceCacheData.rcd"; }
inline TString ResourcesDir() const { return IsEditorStore() ? DatabaseRootPath() : DatabaseRootPath() + "Resources/"; }
inline TString DatabasePath() const { return DatabaseRootPath() + "ResourceDatabase.xml"; }
inline TString CacheDataPath() const { return DatabaseRootPath() + "ResourceCacheData.bin"; }
inline CVirtualDirectory* RootDirectory() const { return mpDatabaseRoot; }
inline u32 NumTotalResources() const { return mResourceEntries.size(); }
inline u32 NumLoadedResources() const { return mLoadedResources.size(); }
@ -89,6 +85,7 @@ public:
inline void SetDatabaseDirty() { mDatabaseDirty = true; }
inline void SetCacheDataDirty() { mCacheFileDirty = true; }
inline bool IsEditorStore() const { return mpProj == nullptr; }
};
extern CResourceStore *gpResourceStore;

View File

@ -4,7 +4,7 @@
#include "Core/GameProject/DependencyListBuilders.h"
#include <Common/Log.h>
const bool gkForceDisableCompression = true;
const bool gkForceDisableCompression = false;
CAreaCooker::CAreaCooker()
: mGeometrySecNum(-1)

View File

@ -614,24 +614,27 @@ void CAreaLoader::SetUpObjects(CScriptLayer *pGenLayer)
}
// Merge objects from the generated layer back into the regular script layers
while (pGenLayer->NumInstances() != 0)
if (pGenLayer)
{
CScriptObject *pInst = pGenLayer->InstanceByIndex(0);
u32 InstanceID = pInst->InstanceID();
// Check if this is a duplicate of an existing instance (this only happens with DKCR GenericCreature as far as I'm aware)
if (mpArea->InstanceByID(InstanceID) != nullptr)
while (pGenLayer->NumInstances() != 0)
{
Log::Write("Duplicate SCGN object: [" + pInst->Template()->Name() + "] " + pInst->InstanceName() + " (" + TString::HexString(pInst->InstanceID(), 8, false) + ")");
pGenLayer->RemoveInstance(pInst);
delete pInst;
}
CScriptObject *pInst = pGenLayer->InstanceByIndex(0);
u32 InstanceID = pInst->InstanceID();
else
{
u32 LayerIdx = (InstanceID >> 26) & 0x3F;
pInst->SetLayer( mpArea->ScriptLayer(LayerIdx) );
mpArea->mObjectMap[InstanceID] = pInst;
// Check if this is a duplicate of an existing instance (this only happens with DKCR GenericCreature as far as I'm aware)
if (mpArea->InstanceByID(InstanceID) != nullptr)
{
Log::Write("Duplicate SCGN object: [" + pInst->Template()->Name() + "] " + pInst->InstanceName() + " (" + TString::HexString(pInst->InstanceID(), 8, false) + ")");
pGenLayer->RemoveInstance(pInst);
delete pInst;
}
else
{
u32 LayerIdx = (InstanceID >> 26) & 0x3F;
pInst->SetLayer( mpArea->ScriptLayer(LayerIdx) );
mpArea->mObjectMap[InstanceID] = pInst;
}
}
}

View File

@ -101,7 +101,9 @@ public:
case eStateMachine:
// AFSM currently unsupported
if (pEntry->Game() == eCorruptionProto || pEntry->Game() == eCorruption)
if (pEntry->Game() <= eEchoes)
pRes = new CDependencyGroup(pEntry);
else if (pEntry->Game() <= eCorruption)
pRes = CUnsupportedFormatLoader::LoadFSM2(rInput, pEntry);
else if (pEntry->Game() == eReturns)
pRes = CUnsupportedFormatLoader::LoadFSMC(rInput, pEntry);