TSharedRef<FObjectBindingNode> FSequencerNodeTree::AddObjectBinding(const FString& ObjectName, const FGuid& ObjectBinding, TMap<FGuid, const FMovieSceneBinding*>& GuidToBindingMap, TArray< TSharedRef<FSequencerDisplayNode> >& OutNodeList) { TSharedPtr<FObjectBindingNode> ObjectNode; TSharedPtr<FObjectBindingNode>* FoundObjectNode = ObjectBindingMap.Find(ObjectBinding); if (FoundObjectNode != nullptr) { ObjectNode = *FoundObjectNode; } else { // The node name is the object guid FName ObjectNodeName = *ObjectBinding.ToString(); // Try to get the parent object node if there is one. TSharedPtr<FObjectBindingNode> ParentNode; TArray<UObject*> RuntimeObjects; UMovieSceneSequence* Animation = Sequencer.GetFocusedMovieSceneSequence(); UObject* RuntimeObject = Animation->FindObject(ObjectBinding); if ( RuntimeObject != nullptr) { UObject* ParentObject = Animation->GetParentObject(RuntimeObject); if (ParentObject != nullptr) { FGuid ParentBinding = Animation->FindObjectId(*ParentObject); TSharedPtr<FObjectBindingNode>* FoundParentNode = ObjectBindingMap.Find( ParentBinding ); if ( FoundParentNode != nullptr ) { ParentNode = *FoundParentNode; } else { const FMovieSceneBinding** FoundParentMovieSceneBinding = GuidToBindingMap.Find( ParentBinding ); if ( FoundParentMovieSceneBinding != nullptr ) { ParentNode = AddObjectBinding( (*FoundParentMovieSceneBinding)->GetName(), ParentBinding, GuidToBindingMap, OutNodeList ); } } } } // Create the node. ObjectNode = MakeShareable( new FObjectBindingNode( ObjectNodeName, ObjectName, ObjectBinding, ParentNode, *this ) ); if (ParentNode.IsValid()) { ParentNode->AddObjectBindingNode(ObjectNode.ToSharedRef()); } else { OutNodeList.Add( ObjectNode.ToSharedRef() ); } // Map the guid to the object binding node for fast lookup later ObjectBindingMap.Add( ObjectBinding, ObjectNode ); } return ObjectNode.ToSharedRef(); }