void UAnimSet::ClearAllAnimSetLinkupCaches() { double Start = FPlatformTime::Seconds(); TArray<UAnimSet*> AnimSets; TArray<USkeletalMeshComponent*> SkelComps; // Find all AnimSets and SkeletalMeshComponents (just do one iterator) for(TObjectIterator<UObject> It;It;++It) { UAnimSet* AnimSet = Cast<UAnimSet>(*It); if(AnimSet && !AnimSet->IsPendingKill() && !AnimSet->IsTemplate()) { AnimSets.Add(AnimSet); } USkeletalMeshComponent* SkelComp = Cast<USkeletalMeshComponent>(*It); if(SkelComp && !SkelComp->IsPendingKill() && !SkelComp->IsTemplate()) { SkelComps.Add(SkelComp); } } // For all AnimSets, empty their linkup cache for(int32 i=0; i<AnimSets.Num(); i++) { AnimSets[i]->LinkupCache.Empty(); AnimSets[i]->SkelMesh2LinkupCache.Empty(); } UE_LOG(LogAnimation, Log, TEXT("ClearAllAnimSetLinkupCaches - Took %3.2fms"), (FPlatformTime::Seconds() - Start)*1000.f); }
void UAnimSet::ResetAnimSet() { #if WITH_EDITORONLY_DATA // Make sure we handle AnimSequence references properly before emptying the array. for(int32 i=0; i<Sequences.Num(); i++) { UAnimSequence* AnimSeq = Sequences[i]; if( AnimSeq ) { AnimSeq->RecycleAnimSequence(); } } Sequences.Empty(); TrackBoneNames.Empty(); LinkupCache.Empty(); SkelMesh2LinkupCache.Empty(); // We need to re-init any skeleltal mesh components now, because they might still have references to linkups in this set. for(TObjectIterator<USkeletalMeshComponent> It;It;++It) { USkeletalMeshComponent* SkelComp = *It; if(!SkelComp->IsPendingKill() && !SkelComp->IsTemplate()) { SkelComp->InitAnim(true); } } #endif // WITH_EDITORONLY_DATA }