Fixed up MP3 asset name generation, implemented a bunch of extra checks and safeguards to ensure asset names/directories are valid

This commit is contained in:
Aruki
2017-05-03 03:07:34 -06:00
parent 3fc35b7c09
commit 9d6798b7ae
16 changed files with 358 additions and 175 deletions

View File

@@ -52,6 +52,18 @@ public:
return new CDependencyTree();
}
void GetUniquePrimitives(std::set<CAnimPrimitive>& rPrimSet) const
{
for (u32 TransIdx = 0; TransIdx < mTransitions.size(); TransIdx++)
mTransitions[TransIdx].pTransition->GetUniquePrimitives(rPrimSet);
for (u32 HalfIdx = 0; HalfIdx < mHalfTransitions.size(); HalfIdx++)
mHalfTransitions[HalfIdx].pTransition->GetUniquePrimitives(rPrimSet);
if (mpDefaultTransition)
mpDefaultTransition->GetUniquePrimitives(rPrimSet);
}
void AddTransitionDependencies(CDependencyTree *pTree)
{
// Note: All CHAR animations must have been added to the tree before this function is run

View File

@@ -174,6 +174,10 @@ void CResTypeInfo::CResTypeInfoFactory::InitTypes()
CResTypeInfo *pType = new CResTypeInfo(eArea, "Area");
AddExtension(pType, "MREA", ePrimeDemo, eReturns);
}
{
CResTypeInfo *pType = new CResTypeInfo(eAudioAmplitudeData, "Audio Amplitude Data");
AddExtension(pType, "CAAD", eCorruption, eCorruption);
}
{
CResTypeInfo *pType = new CResTypeInfo(eAudioGroup, "Audio Group");
AddExtension(pType, "AGSC", ePrimeDemo, eEchoes);
@@ -401,10 +405,6 @@ void CResTypeInfo::CResTypeInfoFactory::InitTypes()
AddExtension(pType, "CTWK", ePrimeDemo, ePrime);
pType->mCanHaveDependencies = false;
}
{
CResTypeInfo *pType = new CResTypeInfo(eUnknown_CAAD, "CAAD");
AddExtension(pType, "CAAD", eCorruption, eCorruption);
}
{
CResTypeInfo *pType = new CResTypeInfo(eUserEvaluatorData, "User Evaluator Data");
AddExtension(pType, "USRC", eCorruptionProto, eCorruption);

View File

@@ -18,6 +18,7 @@ enum EResType
eAreaSurfaceBounds,
eAreaOctree,
eAreaVisibilityTree,
eAudioAmplitudeData,
eAudioGroup,
eAudioMacro,
eAudioSample,
@@ -66,7 +67,6 @@ enum EResType
eStringTable,
eTexture,
eTweak,
eUnknown_CAAD,
eUserEvaluatorData,
eVideo,
eWorld,

View File

@@ -92,6 +92,7 @@ CAnimSet* CAnimSetLoader::LoadCorruptionCHAR(IInputStream& rCHAR)
rChar.SoundEffects.push_back(SoundID);
}
ProcessPrimitives();
return pSet;
}
@@ -282,6 +283,14 @@ void CAnimSetLoader::ProcessPrimitives()
for (u32 iTrans = 0; iTrans < pSet->mHalfTransitions.size(); iTrans++)
pSet->mHalfTransitions[iTrans].pMetaTrans->GetUniquePrimitives(UniquePrimitives);
if (mGame == eCorruptionProto || mGame == eCorruption)
{
CSourceAnimData *pAnimData = (CSourceAnimData*) gpResourceStore->LoadResource( pSet->mCharacters[0].AnimDataID, "SAND" );
if (pAnimData)
pAnimData->GetUniquePrimitives(UniquePrimitives);
}
// Copy anim primitives into the animset
for (auto Iter = UniquePrimitives.begin(); Iter != UniquePrimitives.end(); Iter++)
{
@@ -292,79 +301,82 @@ void CAnimSetLoader::ProcessPrimitives()
pSet->mAnimPrimitives.resize(ID + 1);
pSet->mAnimPrimitives[ID] = rkPrim;
ASSERT(pSet->Animation(ID)->pMetaAnim->Type() == eMAT_Play);
}
// Add animations referenced by default transition
if (pSet->mpDefaultTransition)
// Add used animation indices from the animset to the character's list
if (mGame <= eEchoes)
{
std::set<CAnimPrimitive> DefaultTransPrimitives;
pSet->mpDefaultTransition->GetUniquePrimitives(DefaultTransPrimitives);
// Add animations referenced by default transition
if (pSet->mpDefaultTransition)
{
std::set<CAnimPrimitive> DefaultTransPrimitives;
pSet->mpDefaultTransition->GetUniquePrimitives(DefaultTransPrimitives);
for (u32 iChar = 0; iChar < pSet->mCharacters.size(); iChar++)
{
SSetCharacter& rChar = pSet->mCharacters[iChar];
for (auto Iter = DefaultTransPrimitives.begin(); Iter != DefaultTransPrimitives.end(); Iter++)
{
const CAnimPrimitive& rkPrim = *Iter;
rChar.UsedAnimationIndices.insert(rkPrim.ID());
}
}
}
// Add animations referenced by used transitions
for (u32 iChar = 0; iChar < pSet->mCharacters.size(); iChar++)
{
SSetCharacter& rChar = pSet->mCharacters[iChar];
bool AddedNewAnims = true;
for (auto Iter = DefaultTransPrimitives.begin(); Iter != DefaultTransPrimitives.end(); Iter++)
// Loop this until we run out of new animations. This is in case any animations
// referenced by any transitions are also referenced by earlier transitions.
while (AddedNewAnims)
{
const CAnimPrimitive& rkPrim = *Iter;
rChar.UsedAnimationIndices.insert(rkPrim.ID());
}
}
}
AddedNewAnims = false;
// Add animations referenced by used transitions
for (u32 iChar = 0; iChar < pSet->mCharacters.size(); iChar++)
{
SSetCharacter& rChar = pSet->mCharacters[iChar];
bool AddedNewAnims = true;
// Loop this until we run out of new animations. This is in case any animations
// referenced by any transitions are also referenced by earlier transitions.
while (AddedNewAnims)
{
AddedNewAnims = false;
for (u32 iTrans = 0; iTrans < pSet->mTransitions.size(); iTrans++)
{
STransition& rTrans = pSet->mTransitions[iTrans];
if ( rChar.UsedAnimationIndices.find(rTrans.AnimIdA) != rChar.UsedAnimationIndices.end() &&
rChar.UsedAnimationIndices.find(rTrans.AnimIdB) != rChar.UsedAnimationIndices.end() )
for (u32 iTrans = 0; iTrans < pSet->mTransitions.size(); iTrans++)
{
std::set<CAnimPrimitive> Primitives;
rTrans.pMetaTrans->GetUniquePrimitives(Primitives);
STransition& rTrans = pSet->mTransitions[iTrans];
for (auto Iter = Primitives.begin(); Iter != Primitives.end(); Iter++)
if ( rChar.UsedAnimationIndices.find(rTrans.AnimIdA) != rChar.UsedAnimationIndices.end() &&
rChar.UsedAnimationIndices.find(rTrans.AnimIdB) != rChar.UsedAnimationIndices.end() )
{
const CAnimPrimitive& rkPrim = *Iter;
std::set<CAnimPrimitive> Primitives;
rTrans.pMetaTrans->GetUniquePrimitives(Primitives);
if (rChar.UsedAnimationIndices.find(rkPrim.ID()) == rChar.UsedAnimationIndices.end())
for (auto Iter = Primitives.begin(); Iter != Primitives.end(); Iter++)
{
rChar.UsedAnimationIndices.insert(rkPrim.ID());
AddedNewAnims = true;
const CAnimPrimitive& rkPrim = *Iter;
if (rChar.UsedAnimationIndices.find(rkPrim.ID()) == rChar.UsedAnimationIndices.end())
{
rChar.UsedAnimationIndices.insert(rkPrim.ID());
AddedNewAnims = true;
}
}
}
}
}
for (u32 iHalf = 0; iHalf < pSet->mHalfTransitions.size(); iHalf++)
{
SHalfTransition& rTrans = pSet->mHalfTransitions[iHalf];
if (rChar.UsedAnimationIndices.find(rTrans.AnimID) != rChar.UsedAnimationIndices.end())
for (u32 iHalf = 0; iHalf < pSet->mHalfTransitions.size(); iHalf++)
{
std::set<CAnimPrimitive> Primitives;
rTrans.pMetaTrans->GetUniquePrimitives(Primitives);
SHalfTransition& rTrans = pSet->mHalfTransitions[iHalf];
for (auto Iter = Primitives.begin(); Iter != Primitives.end(); Iter++)
if (rChar.UsedAnimationIndices.find(rTrans.AnimID) != rChar.UsedAnimationIndices.end())
{
const CAnimPrimitive& rkPrim = *Iter;
std::set<CAnimPrimitive> Primitives;
rTrans.pMetaTrans->GetUniquePrimitives(Primitives);
if (rChar.UsedAnimationIndices.find(rkPrim.ID()) == rChar.UsedAnimationIndices.end())
for (auto Iter = Primitives.begin(); Iter != Primitives.end(); Iter++)
{
rChar.UsedAnimationIndices.insert(rkPrim.ID());
AddedNewAnims = true;
const CAnimPrimitive& rkPrim = *Iter;
if (rChar.UsedAnimationIndices.find(rkPrim.ID()) == rChar.UsedAnimationIndices.end())
{
rChar.UsedAnimationIndices.insert(rkPrim.ID());
AddedNewAnims = true;
}
}
}
}