mirror of
https://github.com/AxioDL/PrimeWorldEditor.git
synced 2025-12-21 02:39:17 +00:00
Added support for tracking AGSC dependencies
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user