Added support for tracking AGSC dependencies

This commit is contained in:
parax0
2016-09-16 02:47:46 -06:00
parent 2e1add84be
commit 10c87779b3
15 changed files with 224 additions and 74 deletions

View File

@@ -49,6 +49,7 @@ bool CWorldCooker::CookMLVL(CWorld *pWorld, IOutputStream& rMLVL)
// Areas
rMLVL.WriteLong(pWorld->mAreas.size());
if (Game <= ePrime) rMLVL.WriteLong(1); // Unknown
std::set<CAssetID> AudioGroups;
for (u32 iArea = 0; iArea < pWorld->mAreas.size(); iArea++)
{
@@ -79,7 +80,7 @@ bool CWorldCooker::CookMLVL(CWorld *pWorld, IOutputStream& rMLVL)
std::list<CAssetID> Dependencies;
std::list<u32> LayerDependsOffsets;
CAreaDependencyListBuilder Builder(pAreaEntry);
Builder.BuildDependencyList(Dependencies, LayerDependsOffsets);
Builder.BuildDependencyList(Dependencies, LayerDependsOffsets, &AudioGroups);
rMLVL.WriteLong(0);
rMLVL.WriteLong( Dependencies.size() );
@@ -156,6 +157,59 @@ bool CWorldCooker::CookMLVL(CWorld *pWorld, IOutputStream& rMLVL)
// Audio Groups
if (Game <= ePrime)
{
#if 0
// Debug: make sure our generated list matches the original, no missing or extra audio groups
std::set<CAssetID> OriginalGroups;
for (u32 iGrp = 0; iGrp < pWorld->mAudioGrps.size(); iGrp++)
{
CWorld::SAudioGrp& rAudioGroup = pWorld->mAudioGrps[iGrp];
OriginalGroups.insert(rAudioGroup.ResID);
if (AudioGroups.find(rAudioGroup.ResID) == AudioGroups.end())
{
CResourceEntry *pEntry = gpResourceStore->FindEntry(rAudioGroup.ResID);
Log::Error("Missing audio group: " + pEntry->Name().ToUTF8());
}
}
for (auto It = AudioGroups.begin(); It != AudioGroups.end(); It++)
{
if (OriginalGroups.find(*It) == OriginalGroups.end())
{
CResourceEntry *pEntry = gpResourceStore->FindEntry(*It);
Log::Error("Extra audio group: " + pEntry->Name().ToUTF8());
}
}
#endif
#if 0
// Create sorted list of audio groups (sort by group ID)
std::vector<CAudioGroup*> SortedAudioGroups;
for (auto It = AudioGroups.begin(); It != AudioGroups.end(); It++)
{
CAudioGroup *pGroup = (CAudioGroup*) gpResourceStore->LoadResource(*It, "AGSC");
ASSERT(pGroup);
SortedAudioGroups.push_back(pGroup);
}
std::sort(SortedAudioGroups.begin(), SortedAudioGroups.end(), [](CAudioGroup *pLeft, CAudioGroup *pRight) -> bool {
return pLeft->GroupID() < pRight->GroupID();
});
// Write sorted audio group list to file
rMLVL.WriteLong(SortedAudioGroups.size());
for (u32 iGrp = 0; iGrp < pWorld->mAudioGrps.size(); iGrp++)
{
CAudioGroup *pGroup = SortedAudioGroups[iGroup];
rMLVL.WriteLong(pGroup->GroupID());
pGroup->ID().Write(rMLVL);
}
#endif
#if 1
rMLVL.WriteLong(pWorld->mAudioGrps.size());
for (u32 iGrp = 0; iGrp < pWorld->mAudioGrps.size(); iGrp++)
@@ -164,6 +218,7 @@ bool CWorldCooker::CookMLVL(CWorld *pWorld, IOutputStream& rMLVL)
rMLVL.WriteLong(rAudioGroup.GroupID);
rAudioGroup.ResID.Write(rMLVL);
}
#endif
rMLVL.WriteByte(0);
}

View File

@@ -1,4 +1,5 @@
#include "CUnsupportedFormatLoader.h"
#include "Core/GameProject/CGameProject.h"
#include "Core/Resource/ParticleParameters.h"
CDependencyGroup* CUnsupportedFormatLoader::LoadCSNG(IInputStream& rCSNG, CResourceEntry *pEntry)
@@ -67,8 +68,16 @@ CDependencyGroup* CUnsupportedFormatLoader::LoadEVNT(IInputStream& rEVNT, CResou
{
rEVNT.Seek(0x2, SEEK_CUR);
rEVNT.ReadString();
rEVNT.Seek(0x27, SEEK_CUR);
rEVNT.Seek(0x1B, SEEK_CUR);
u32 SoundID = rEVNT.ReadLong() & 0xFFFF;
rEVNT.Seek(0x8, SEEK_CUR);
if (IsEchoes) rEVNT.Seek(0xC, SEEK_CUR);
if (SoundID != 0xFFFF)
{
SSoundInfo SoundInfo = CGameProject::ActiveProject()->AudioManager()->GetSoundInfo(SoundID);
pGroup->AddDependency(SoundInfo.pAudioGroup);
}
}
}

View File

@@ -1,4 +1,5 @@
#include "CUnsupportedParticleLoader.h"
#include <Core/GameProject/CGameProject.h>
// ************ PARAMETER LOADING ************
bool CUnsupportedParticleLoader::ParseParticleParameter(IInputStream& rPART)
@@ -462,8 +463,7 @@ bool CUnsupportedParticleLoader::ParseWeaponParameter(IInputStream& rWPSC)
case kWeaponVMD2:
ParseBoolFunction(rWPSC);
break;
case kWeaponPJFX:
case kWeaponPSLT:
ParseIntFunction(rWPSC);
break;
@@ -509,6 +509,10 @@ bool CUnsupportedParticleLoader::ParseWeaponParameter(IInputStream& rWPSC)
case kWeaponTTEX:
ParseUVFunction(rWPSC);
break;
case kWeaponPJFX:
ParseSoundFunction(rWPSC);
break;
case kWeaponAPSM:
case kWeaponAPS1:
@@ -570,26 +574,12 @@ bool CUnsupportedParticleLoader::ParseCollisionResponseParameter(IInputStream& r
case kColi6GRN:
case kColi2MUD:
case kColi2SAN:
case kColiBHFX:
case kColiCHFX:
case kColiCSFX:
case kColiCZFX:
case kColiDCSH:
case kColiDSFX:
case kColiDSHX:
case kColiGOFX:
case kColiGRFX:
case kColiHBFX:
case kColiICFX:
case kColiMSFX:
case kColiPBHX:
case kColiPBOS:
case kColiPBSX:
case kColiSHFX:
case kColiTAFX:
case kColiTASP:
case kColiWSFX:
case kColiWTFX:
ParseIntFunction(rCRSC);
break;
@@ -597,7 +587,24 @@ bool CUnsupportedParticleLoader::ParseCollisionResponseParameter(IInputStream& r
case kColiRNGE:
ParseFloatFunction(rCRSC);
break;
case kColiBHFX:
case kColiCHFX:
case kColiCSFX:
case kColiCZFX:
case kColiDSFX:
case kColiGOFX:
case kColiGRFX:
case kColiHBFX:
case kColiICFX:
case kColiMSFX:
case kColiSHFX:
case kColiTAFX:
case kColiWSFX:
case kColiWTFX:
ParseSoundFunction(rCRSC);
break;
case kColi1LAV:
case kColi3LAV:
case kColi1MUD:
@@ -1275,6 +1282,35 @@ void CUnsupportedParticleLoader::ParseEmitterFunction(IInputStream& rFile)
}
}
void CUnsupportedParticleLoader::ParseSoundFunction(IInputStream& rFile)
{
u32 FuncOffset = rFile.Tell();
CFourCC Func = rFile.ReadLong();
switch (Func.ToLong())
{
case kFuncNONE:
break;
case kSoundCNST:
{
u32 SoundID = rFile.ReadLong() & 0xFFFF;
if (SoundID != 0xFFFF)
{
SSoundInfo SoundInfo = CGameProject::ActiveProject()->AudioManager()->GetSoundInfo(SoundID);
mpGroup->AddDependency(SoundInfo.pAudioGroup);
}
break;
}
default:
Log::FileError(rFile.GetSourceString(), FuncOffset, "Unknown sound function: " + Func.ToString());
break;
}
}
void CUnsupportedParticleLoader::ParseAssetFunction(IInputStream& rFile)
{
u32 FuncOffset = rFile.Tell();

View File

@@ -31,6 +31,7 @@ class CUnsupportedParticleLoader
void ParseColorFunction(IInputStream& rFile);
void ParseUVFunction(IInputStream& rFile);
void ParseEmitterFunction(IInputStream& rFile);
void ParseSoundFunction(IInputStream& rFile);
void ParseAssetFunction(IInputStream& rFile);
void ParseSpawnSystemKeyframeData(IInputStream& rFile);
void ParseKeyframeEmitterData(IInputStream& rFile, const CFourCC& rkFunc, u32 ElemSize);

View File

@@ -515,6 +515,8 @@ FUNC(Color, VRTC, 'V', 'R', 'T', 'C') // Vector, Float
// UV Functions
FUNC(UV, CNST, 'C', 'N', 'S', 'T') // Asset (TXTR)
FUNC(UV, ATEX, 'A', 'T', 'E', 'X') // Asset (TXTR), Int, Int, Int, Int, Int, Bool
// Sound Functions
FUNC(Sound, CNST, 'C', 'N', 'S', 'T') // Sound ID
// Asset Functions
FUNC(Asset, CNST, 'C', 'N', 'S', 'T') // Asset ID
// Emitter Functions