diff --git a/src/Core/GameProject/CDependencyTree.cpp b/src/Core/GameProject/CDependencyTree.cpp index aa9a1fd5..463b5ef1 100644 --- a/src/Core/GameProject/CDependencyTree.cpp +++ b/src/Core/GameProject/CDependencyTree.cpp @@ -9,11 +9,7 @@ #include // ************ IDependencyNode ************ -IDependencyNode::~IDependencyNode() -{ - for (uint32 iChild = 0; iChild < mChildren.size(); iChild++) - delete mChildren[iChild]; -} +IDependencyNode::~IDependencyNode() = default; bool IDependencyNode::HasDependency(const CAssetID& id) const { @@ -51,8 +47,7 @@ void IDependencyNode::ParseProperties(CResourceEntry* pParentEntry, CStructPrope if (Info.pAudioGroup) { - CPropertyDependency *pDep = new CPropertyDependency(pProp->IDString(true), Info.pAudioGroup->ID()); - mChildren.push_back(pDep); + mChildren.push_back(std::make_unique(pProp->IDString(true), Info.pAudioGroup->ID())); } } } @@ -63,8 +58,7 @@ void IDependencyNode::ParseProperties(CResourceEntry* pParentEntry, CStructPrope if (ID.IsValid()) { - CPropertyDependency *pDep = new CPropertyDependency(pProp->IDString(true), ID); - mChildren.push_back(pDep); + mChildren.push_back(std::make_unique(pProp->IDString(true), ID)); } } @@ -78,13 +72,11 @@ void IDependencyNode::ParseProperties(CResourceEntry* pParentEntry, CStructPrope // Character sets are removed starting in MP3, so we only need char property dependencies in Echoes and earlier if (pProperties->Game() <= EGame::Echoes) { - CCharPropertyDependency *pDep = new CCharPropertyDependency(pProp->IDString(true), ID, Params.CharacterIndex()); - mChildren.push_back(pDep); + mChildren.push_back(std::make_unique(pProp->IDString(true), ID, Params.CharacterIndex())); } else { - CPropertyDependency *pDep = new CPropertyDependency(pProp->IDString(true), ID); - mChildren.push_back(pDep); + mChildren.push_back(std::make_unique(pProp->IDString(true), ID)); } } } @@ -120,22 +112,25 @@ void CDependencyTree::Serialize(IArchive& rArc) rArc << SerialParameter("Children", mChildren); } -void CDependencyTree::AddChild(IDependencyNode *pNode) +void CDependencyTree::AddChild(std::unique_ptr&& pNode) { ASSERT(pNode); - mChildren.push_back(pNode); + mChildren.push_back(std::move(pNode)); } void CDependencyTree::AddDependency(const CAssetID& rkID, bool AvoidDuplicates /*= true*/) { - if (!rkID.IsValid() || (AvoidDuplicates && HasDependency(rkID))) return; - CResourceDependency *pDepend = new CResourceDependency(rkID); - mChildren.push_back(pDepend); + if (!rkID.IsValid() || (AvoidDuplicates && HasDependency(rkID))) + return; + + mChildren.push_back(std::make_unique(rkID)); } void CDependencyTree::AddDependency(CResource *pRes, bool AvoidDuplicates /*= true*/) { - if (!pRes) return; + if (!pRes) + return; + AddDependency(pRes->ID(), AvoidDuplicates); } @@ -146,8 +141,7 @@ void CDependencyTree::AddCharacterDependency(const CAnimationParameters& rkAnimP if (!pSet || rkAnimParams.CharacterIndex() == UINT32_MAX) return; - CCharPropertyDependency *pChar = new CCharPropertyDependency("NULL", pSet->ID(), rkAnimParams.CharacterIndex()); - mChildren.push_back(pChar); + mChildren.push_back(std::make_unique("NULL", pSet->ID(), rkAnimParams.CharacterIndex())); } // ************ CResourceDependency ************ @@ -208,9 +202,9 @@ void CScriptInstanceDependency::Serialize(IArchive& rArc) } // Static -CScriptInstanceDependency* CScriptInstanceDependency::BuildTree(CScriptObject *pInstance) +std::unique_ptr CScriptInstanceDependency::BuildTree(CScriptObject *pInstance) { - CScriptInstanceDependency *pInst = new CScriptInstanceDependency(); + auto pInst = std::make_unique(); pInst->mObjectType = pInstance->ObjectTypeID(); pInst->ParseProperties(pInstance->Area()->Entry(), pInstance->Template()->Properties(), pInstance->PropertyData()); return pInst; @@ -228,9 +222,9 @@ void CSetCharacterDependency::Serialize(IArchive& rArc) << SerialParameter("Children", mChildren); } -CSetCharacterDependency* CSetCharacterDependency::BuildTree(const SSetCharacter& rkChar) +std::unique_ptr CSetCharacterDependency::BuildTree(const SSetCharacter& rkChar) { - CSetCharacterDependency *pTree = new CSetCharacterDependency(rkChar.ID); + auto pTree = std::make_unique(rkChar.ID); pTree->AddDependency(rkChar.pModel); pTree->AddDependency(rkChar.pSkeleton); pTree->AddDependency(rkChar.pSkin); @@ -271,9 +265,9 @@ void CSetAnimationDependency::Serialize(IArchive& rArc) << SerialParameter("Children", mChildren); } -CSetAnimationDependency* CSetAnimationDependency::BuildTree(const CAnimSet *pkOwnerSet, uint32 AnimIndex) +std::unique_ptr CSetAnimationDependency::BuildTree(const CAnimSet *pkOwnerSet, uint32 AnimIndex) { - CSetAnimationDependency *pTree = new CSetAnimationDependency; + auto pTree = std::make_unique(); const SAnimation *pkAnim = pkOwnerSet->Animation(AnimIndex); // Find relevant character indices @@ -281,7 +275,7 @@ CSetAnimationDependency* CSetAnimationDependency::BuildTree(const CAnimSet *pkOw { const SSetCharacter *pkChar = pkOwnerSet->Character(iChar); - if ( pkChar->UsedAnimationIndices.find(AnimIndex) != pkChar->UsedAnimationIndices.end() ) + if (pkChar->UsedAnimationIndices.find(AnimIndex) != pkChar->UsedAnimationIndices.end()) pTree->mCharacterIndices.insert(iChar); } @@ -297,7 +291,7 @@ CSetAnimationDependency* CSetAnimationDependency::BuildTree(const CAnimSet *pkOw { CAnimEventData *pEvents = pkOwnerSet->AnimationEventData(prim.ID()); ASSERT(pEvents && !pEvents->Entry()); - pEvents->AddDependenciesToTree(pTree); + pEvents->AddDependenciesToTree(pTree.get()); } } @@ -330,23 +324,23 @@ void CAreaDependencyTree::Serialize(IArchive& rArc) void CAreaDependencyTree::AddScriptLayer(CScriptLayer *pLayer, const std::vector& rkExtraDeps) { - if (!pLayer) return; + if (!pLayer) + return; + mLayerOffsets.push_back(mChildren.size()); std::set UsedIDs; for (uint32 iInst = 0; iInst < pLayer->NumInstances(); iInst++) { - CScriptInstanceDependency *pTree = CScriptInstanceDependency::BuildTree( pLayer->InstanceByIndex(iInst) ); + auto pTree = CScriptInstanceDependency::BuildTree( pLayer->InstanceByIndex(iInst) ); ASSERT(pTree != nullptr); // Note: MP2+ need to track all instances (not just instances with dependencies) to be able to build the layer module list if (pTree->NumChildren() > 0 || pLayer->Area()->Game() >= EGame::EchoesDemo) { - mChildren.push_back(pTree); pTree->GetAllResourceReferences(UsedIDs); + mChildren.push_back(std::move(pTree)); } - else - delete pTree; } for (uint32 iDep = 0; iDep < rkExtraDeps.size(); iDep++) @@ -372,10 +366,11 @@ void CAreaDependencyTree::GetModuleDependencies(EGame Game, std::vector for (uint32 iInst = StartIdx; iInst < EndIdx; iInst++) { - IDependencyNode *pNode = mChildren[iInst]; - if (pNode->Type() != EDependencyNodeType::ScriptInstance) continue; + auto& pNode = mChildren[iInst]; + if (pNode->Type() != EDependencyNodeType::ScriptInstance) + continue; - CScriptInstanceDependency *pInst = static_cast(pNode); + const auto *pInst = static_cast(pNode.get()); uint32 ObjType = pInst->ObjectType(); if (UsedObjectTypes.find(ObjType) == UsedObjectTypes.end()) diff --git a/src/Core/GameProject/CDependencyTree.h b/src/Core/GameProject/CDependencyTree.h index dd8ea77b..8eb42a33 100644 --- a/src/Core/GameProject/CDependencyTree.h +++ b/src/Core/GameProject/CDependencyTree.h @@ -5,6 +5,7 @@ #include #include #include +#include class CScriptLayer; class CScriptObject; @@ -31,7 +32,7 @@ enum class EDependencyNodeType class IDependencyNode { protected: - std::vector mChildren; + std::vector> mChildren; public: virtual ~IDependencyNode(); @@ -45,8 +46,8 @@ public: static IDependencyNode* ArchiveConstructor(EDependencyNodeType Type); // Accessors - uint NumChildren() const { return mChildren.size(); } - IDependencyNode* ChildByIndex(uint Index) const { return mChildren[Index]; } + uint32 NumChildren() const { return mChildren.size(); } + IDependencyNode* ChildByIndex(uint32 Index) const { return mChildren[Index].get(); } }; // Basic dependency tree; this class is sufficient for most resource types. @@ -58,7 +59,7 @@ public: EDependencyNodeType Type() const override; void Serialize(IArchive& rArc) override; - void AddChild(IDependencyNode *pNode); + void AddChild(std::unique_ptr&& pNode); void AddDependency(const CAssetID& rkID, bool AvoidDuplicates = true); void AddDependency(CResource *pRes, bool AvoidDuplicates = true); void AddCharacterDependency(const CAnimationParameters& rkAnimParams); @@ -72,7 +73,7 @@ protected: public: CResourceDependency() = default; - CResourceDependency(const CAssetID& rkID) : mID(rkID) {} + explicit CResourceDependency(const CAssetID& rkID) : mID(rkID) {} EDependencyNodeType Type() const override; void Serialize(IArchive& rArc) override; @@ -139,7 +140,7 @@ public: uint ObjectType() const { return mObjectType; } // Static - static CScriptInstanceDependency* BuildTree(CScriptObject *pInstance); + static std::unique_ptr BuildTree(CScriptObject *pInstance); }; // Node representing an animset character. Indicates what index the character is within the animset. @@ -159,7 +160,7 @@ public: uint32 CharSetIndex() const { return mCharSetIndex; } // Static - static CSetCharacterDependency* BuildTree(const SSetCharacter& rkChar); + static std::unique_ptr BuildTree(const SSetCharacter& rkChar); }; // Node representing a character animation. Indicates which character indices use this animation. @@ -179,7 +180,7 @@ public: bool IsUsedByAnyCharacter() const { return !mCharacterIndices.empty(); } // Static - static CSetAnimationDependency* BuildTree(const CAnimSet *pkOwnerSet, uint32 AnimIndex); + static std::unique_ptr BuildTree(const CAnimSet *pkOwnerSet, uint32 AnimIndex); }; // Node representing an animation event. Indicates which character index uses this event. diff --git a/src/Core/Resource/Animation/CAnimEventData.h b/src/Core/Resource/Animation/CAnimEventData.h index 05445d81..e2ed02d8 100644 --- a/src/Core/Resource/Animation/CAnimEventData.h +++ b/src/Core/Resource/Animation/CAnimEventData.h @@ -2,6 +2,8 @@ #define CANIMEVENTDATA #include "Core/Resource/CResource.h" +#include +#include class CAnimEventData : public CResource { @@ -36,8 +38,7 @@ public: if (ID.IsValid() && !pTree->HasDependency(ID)) { - auto *pDep = new CAnimEventDependency(ID, event.mCharacterIndex); - pTree->AddChild(pDep); + pTree->AddChild(std::make_unique(ID, event.mCharacterIndex)); } } } diff --git a/src/Core/Resource/Animation/CAnimSet.h b/src/Core/Resource/Animation/CAnimSet.h index ab47f182..184d8f17 100644 --- a/src/Core/Resource/Animation/CAnimSet.h +++ b/src/Core/Resource/Animation/CAnimSet.h @@ -124,9 +124,9 @@ public: // Character dependencies for (const auto& character : mCharacters) { - CSetCharacterDependency *pCharTree = CSetCharacterDependency::BuildTree(character); + auto pCharTree = CSetCharacterDependency::BuildTree(character); ASSERT(pCharTree); - pTree->AddChild(pCharTree); + pTree->AddChild(std::move(pCharTree)); } // Animation dependencies @@ -134,9 +134,9 @@ public: { for (uint32 iAnim = 0; iAnim < mAnimations.size(); iAnim++) { - CSetAnimationDependency *pAnimTree = CSetAnimationDependency::BuildTree(this, iAnim); + auto pAnimTree = CSetAnimationDependency::BuildTree(this, iAnim); ASSERT(pAnimTree); - pTree->AddChild(pAnimTree); + pTree->AddChild(std::move(pAnimTree)); } } else if (Game() <= EGame::Corruption)