Added support for CAUD dependencies, dropped redundant asset ID in dependency trees, various MP3 fixes

This commit is contained in:
Aruki
2017-02-20 03:42:04 -07:00
parent 5485d42b56
commit a88afe31e3
40 changed files with 370 additions and 755 deletions

View File

@@ -21,7 +21,7 @@ public:
CDependencyTree* BuildDependencyTree() const
{
CDependencyTree *pTree = new CDependencyTree(ID());
CDependencyTree *pTree = new CDependencyTree();
AddDependenciesToTree(pTree);
return pTree;
}

View File

@@ -109,7 +109,7 @@ public:
CDependencyTree* BuildDependencyTree() const
{
CDependencyTree *pTree = new CDependencyTree(ID());
CDependencyTree *pTree = new CDependencyTree();
// Character dependencies
for (u32 iChar = 0; iChar < mCharacters.size(); iChar++)

View File

@@ -18,7 +18,7 @@ CAnimation::CAnimation(CResourceEntry *pEntry /*= 0*/)
CDependencyTree* CAnimation::BuildDependencyTree() const
{
CDependencyTree *pTree = new CDependencyTree(ID());
CDependencyTree *pTree = new CDependencyTree();
pTree->AddDependency(mpEventData);
return pTree;
}

View File

@@ -32,7 +32,7 @@ CGameArea::~CGameArea()
CDependencyTree* CGameArea::BuildDependencyTree() const
{
// Base dependencies
CAreaDependencyTree *pTree = new CAreaDependencyTree(ID());
CAreaDependencyTree *pTree = new CAreaDependencyTree();
std::set<CAssetID> MatTextures;
mpMaterialSet->GetUsedTextureIDs(MatTextures);

View File

@@ -0,0 +1,35 @@
#ifndef CAUDIOMACRO_H
#define CAUDIOMACRO_H
#include "CResource.h"
class CAudioMacro : public CResource
{
DECLARE_RESOURCE_TYPE(eAudioMacro)
friend class CUnsupportedFormatLoader;
TString mMacroName;
std::vector<CAssetID> mSamples;
public:
CAudioMacro(CResourceEntry *pEntry = 0)
: CResource(pEntry)
{}
virtual CDependencyTree* BuildDependencyTree() const
{
CDependencyTree *pTree = new CDependencyTree();
for (u32 iSamp = 0; iSamp < mSamples.size(); iSamp++)
pTree->AddDependency(mSamples[iSamp]);
return pTree;
}
// Accessors
inline TString MacroName() const { return mMacroName; }
inline u32 NumSamples() const { return mSamples.size(); }
inline CAssetID SampleByIndex(u32 Index) const { return mSamples[Index]; }
};
#endif // CAUDIOMACRO_H

View File

@@ -52,7 +52,7 @@ public:
CDependencyTree* BuildDependencyTree() const
{
CDependencyTree *pTree = new CDependencyTree(ID());
CDependencyTree *pTree = new CDependencyTree();
for (auto DepIt = mDependencies.begin(); DepIt != mDependencies.end(); DepIt++)
pTree->AddDependency(*DepIt);

View File

@@ -24,7 +24,7 @@ inline float PtsToFloat(s32 Pt)
CDependencyTree* CFont::BuildDependencyTree() const
{
CDependencyTree *pOut = new CDependencyTree(ID());
CDependencyTree *pOut = new CDependencyTree();
pOut->AddDependency(mpFontTexture);
return pOut;
}

View File

@@ -42,7 +42,7 @@ public:
}
virtual ~CResource() {}
virtual CDependencyTree* BuildDependencyTree() const { return new CDependencyTree(ID()); }
virtual CDependencyTree* BuildDependencyTree() const { return new CDependencyTree(); }
virtual void Serialize(IArchive& /*rArc*/) {}
inline CResourceEntry* Entry() const { return mpEntry; }

View File

@@ -67,7 +67,7 @@ public:
if (Game() >= eCorruptionProto)
Log::Warning("CScan::BuildDependencyTree not handling Corruption dependencies");
CDependencyTree *pTree = new CDependencyTree(ID());
CDependencyTree *pTree = new CDependencyTree();
if (Game() <= ePrime)
pTree->AddDependency(mFrameID);

View File

@@ -45,7 +45,7 @@ public:
CDependencyTree* BuildDependencyTree() const
{
// STRGs can reference FONTs with the &font=; formatting tag and TXTRs with the &image=; tag
CDependencyTree *pTree = new CDependencyTree(ID());
CDependencyTree *pTree = new CDependencyTree();
EIDLength IDLength = (Game() <= eEchoes ? e32Bit : e64Bit);
for (u32 iLang = 0; iLang < mLangTables.size(); iLang++)

View File

@@ -19,7 +19,7 @@ CWorld::~CWorld()
CDependencyTree* CWorld::BuildDependencyTree() const
{
CDependencyTree *pTree = new CDependencyTree(ID());
CDependencyTree *pTree = new CDependencyTree();
for (u32 iArea = 0; iArea < mAreas.size(); iArea++)
{
@@ -81,10 +81,11 @@ TString CWorld::AreaInGameName(u32 AreaIndex) const
// ************ SERIALIZATION ************
void CWorld::Serialize(IArchive& rArc)
{
rArc << SERIAL("WorldNameString", mpWorldName);
rArc << SERIAL("Name", mName)
<< SERIAL("NameString", mpWorldName);
if (rArc.Game() == eEchoesDemo || rArc.Game() == eEchoes)
rArc << SERIAL("DarkWorldNameString", mpDarkWorldName);
rArc << SERIAL("DarkNameString", mpDarkWorldName);
rArc << SERIAL("WorldSaveInfo", mpSaveWorld)
<< SERIAL("WorldMap", mpMapWorld)

View File

@@ -14,6 +14,7 @@ class CWorld : public CResource
friend class CWorldCooker;
// Instances of CResource pointers are placeholders for unimplemented resource types (eg CMapWorld)
TString mName;
TResPtr<CStringTable> mpWorldName;
TResPtr<CStringTable> mpDarkWorldName;
TResPtr<CResource> mpSaveWorld;
@@ -93,8 +94,9 @@ public:
friend void Serialize(IArchive& rArc, SAudioGrp& rAudioGrp);
// Accessors
inline CStringTable* WorldName() const { return mpWorldName; }
inline CStringTable* DarkWorldName() const { return mpDarkWorldName; }
inline TString Name() const { return mName; }
inline CStringTable* NameString() const { return mpWorldName; }
inline CStringTable* DarkNameString() const { return mpDarkWorldName; }
inline CResource* SaveWorld() const { return mpSaveWorld; }
inline CModel* DefaultSkybox() const { return mpDefaultSkybox; }
inline CResource* MapWorld() const { return mpMapWorld; }
@@ -107,6 +109,7 @@ public:
inline CStringTable* AreaName(u32 AreaIndex) const { return mAreas[AreaIndex].pAreaName; }
inline bool DoesAreaAllowPakDuplicates(u32 AreaIndex) const { return mAreas[AreaIndex].AllowPakDuplicates; }
inline void SetName(const TString& rkName) { mName = rkName; }
inline void SetAreaAllowsPakDuplicates(u32 AreaIndex, bool Allow) { mAreas[AreaIndex].AllowPakDuplicates = Allow; }
};

View File

@@ -38,6 +38,7 @@ public:
case eAnimEventData: return new CAnimEventData(pEntry);
case eAnimSet: return new CAnimSet(pEntry);
case eArea: return new CGameArea(pEntry);
case eAudioMacro: return new CAudioMacro(pEntry);
case eAudioGroup: return new CAudioGroup(pEntry);
case eAudioLookupTable: return new CAudioLookupTable(pEntry);
case eCharacter: return new CAnimSet(pEntry);
@@ -69,6 +70,7 @@ public:
case eAnimEventData: pRes = CAnimEventLoader::LoadEVNT(rInput, pEntry); break;
case eAnimSet: pRes = CAnimSetLoader::LoadANCS(rInput, pEntry); break;
case eArea: pRes = CAreaLoader::LoadMREA(rInput, pEntry); break;
case eAudioMacro: pRes = CUnsupportedFormatLoader::LoadCAUD(rInput, pEntry); break;
case eAudioGroup: pRes = CAudioGroupLoader::LoadAGSC(rInput, pEntry); break;
case eAudioLookupTable: pRes = CAudioGroupLoader::LoadATBL(rInput, pEntry); break;
case eBinaryData: pRes = CUnsupportedFormatLoader::LoadDUMB(rInput, pEntry); break;

View File

@@ -1,6 +1,53 @@
#include "CUnsupportedFormatLoader.h"
#include "Core/GameProject/CGameProject.h"
CAudioMacro* CUnsupportedFormatLoader::LoadCAUD(IInputStream& rCAUD, CResourceEntry *pEntry)
{
u32 Magic = rCAUD.ReadLong();
ASSERT(Magic == FOURCC('CAUD'));
u32 Version = rCAUD.ReadLong();
EGame Game = (Version == 0x2 ? eCorruptionProto :
Version == 0x9 ? eCorruption :
Version == 0xE ? eReturns :
eUnknownGame);
ASSERT(Game != eUnknownGame && Game == pEntry->Game());
CAudioMacro *pMacro = new CAudioMacro(pEntry);
pMacro->mMacroName = rCAUD.ReadString();
// DKCR needs some reverse engineering work still in order to parse the file correctly, unfortunately
if (Game == eReturns)
{
Log::Warning("DKCR CAUD dependencies not being handled!");
return pMacro;
}
// Skip past the rest of the header
u32 NumVolGroups = rCAUD.ReadLong();
for (u32 iVol = 0; iVol < NumVolGroups; iVol++)
rCAUD.ReadString();
u32 SkipAmt = (Game == eCorruptionProto ? 0x10 : 0x14);
rCAUD.Seek(SkipAmt, SEEK_CUR);
u32 NumSamples = rCAUD.ReadLong();
for (u32 iSamp = 0; iSamp < NumSamples; iSamp++)
{
u32 SampleDataSize = rCAUD.ReadLong();
u32 SampleDataEnd = rCAUD.Tell() + SampleDataSize;
CAssetID SampleID(rCAUD, Game);
ASSERT(gpResourceStore->IsResourceRegistered(SampleID) == true);
pMacro->mSamples.push_back(SampleID);
rCAUD.Seek(SampleDataEnd, SEEK_SET);
}
return pMacro;
}
CDependencyGroup* CUnsupportedFormatLoader::LoadCSNG(IInputStream& rCSNG, CResourceEntry *pEntry)
{
u32 Magic = rCSNG.ReadLong();

View File

@@ -1,6 +1,7 @@
#ifndef CUNSUPPORTEDFORMATLOADER_H
#define CUNSUPPORTEDFORMATLOADER_H
#include "Core/Resource/CAudioMacro.h"
#include "Core/Resource/CDependencyGroup.h"
// This class is responsible for loading formats that aren't yet fully supported.
@@ -11,6 +12,7 @@ class CUnsupportedFormatLoader
CUnsupportedFormatLoader() {}
public:
static CAudioMacro* LoadCAUD(IInputStream& rCAUD, CResourceEntry *pEntry);
static CDependencyGroup* LoadCSNG(IInputStream& rCSNG, CResourceEntry *pEntry);
static CDependencyGroup* LoadDUMB(IInputStream& rDUMB, CResourceEntry *pEntry);
static CDependencyGroup* LoadFRME(IInputStream& rFRME, CResourceEntry *pEntry);

View File

@@ -32,7 +32,7 @@ CModel::~CModel()
CDependencyTree* CModel::BuildDependencyTree() const
{
CDependencyTree *pTree = new CDependencyTree(ID());
CDependencyTree *pTree = new CDependencyTree();
std::set<CAssetID> TextureIDs;
for (u32 iSet = 0; iSet < mMaterialSets.size(); iSet++)