mirror of
https://github.com/AxioDL/PrimeWorldEditor.git
synced 2025-12-21 02:39:17 +00:00
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:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user