// Copyright Epic Games, Inc. All Rights Reserved. #include "SkeletonTreeManager.h" #include "EditableSkeleton.h" #include "ISkeletonTree.h" FSkeletonTreeManager& FSkeletonTreeManager::Get() { static FSkeletonTreeManager TheManager; return TheManager; } TSharedRef FSkeletonTreeManager::CreateSkeletonTree(const TSharedRef& InEditableSkeleton, const FSkeletonTreeArgs& InSkeletonTreeArgs) { TSharedPtr SkeletonTree = StaticCastSharedRef(InEditableSkeleton)->CreateSkeletonTree(InSkeletonTreeArgs); // compact skeletons that are no longer being edited bool bRemoved = false; do { bRemoved = false; for (auto Iter = EditableSkeletons.CreateIterator(); Iter; ++Iter) { TSharedPtr CompactionCandidate = Iter.Value().Pin(); if (!CompactionCandidate.IsValid() || !CompactionCandidate->IsEdited()) { Iter.RemoveCurrent(); bRemoved = true; break; } } } while (bRemoved); return SkeletonTree.ToSharedRef(); } TSharedRef FSkeletonTreeManager::CreateSkeletonTree(class USkeleton* InSkeleton, const FSkeletonTreeArgs& InSkeletonTreeArgs) { return CreateSkeletonTree(CreateEditableSkeleton(InSkeleton), InSkeletonTreeArgs); } TSharedRef FSkeletonTreeManager::CreateEditableSkeleton(class USkeleton* InSkeleton) { check(InSkeleton); TWeakPtr* EditableSkeletonPtr = EditableSkeletons.Find(InSkeleton); if (EditableSkeletonPtr == nullptr || !(*EditableSkeletonPtr).IsValid()) { TSharedRef NewEditableSkeleton = MakeShareable(new FEditableSkeleton(InSkeleton)); EditableSkeletons.Add(InSkeleton, NewEditableSkeleton); return NewEditableSkeleton; } else { return (*EditableSkeletonPtr).Pin().ToSharedRef(); } }