// Copyright 1998-2017 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(class USkeleton* InSkeleton, const FSkeletonTreeArgs& InSkeletonTreeArgs) { TSharedPtr EditableSkeleton = CreateEditableSkeleton(InSkeleton); TSharedPtr SkeletonTree = EditableSkeleton->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::CreateEditableSkeleton(class USkeleton* 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(); } }