// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "ICompElementManager.h" #include "UObject/GCObject.h" #include "UObject/WeakObjectPtr.h" class UEditorCompElementContainer; class AActor; class UPackage; class UEditorEngine; class FCompositingViewportClient; class ULevel; /** Management class for interfacing with editor compositing element objects. */ class FCompElementManager : public ICompElementManager, public FGCObject { public: /** * Factory method which creates a new FCompElementManager object. * * @param InEditor The UEditorEngine to register delegates with, etc. */ static TSharedRef Create(const TWeakObjectPtr& InEditor) { TSharedRef CompShots = MakeShareable( new FCompElementManager(InEditor) ); CompShots->Initialize(); return CompShots; } virtual ~FCompElementManager(); public: //~ Begin ICompElementManager interface virtual TWeakObjectPtr CreateElement(const FName& ElementName, TSubclassOf ClassType, AActor* LevelContext = nullptr, EObjectFlags ObjectFlags = EObjectFlags::RF_NoFlags) override; virtual TWeakObjectPtr GetElement(const FName& ElementName) const override; virtual bool TryGetElement(const FName& ElementName, TWeakObjectPtr& OutElement) override; virtual void AddAllCompElementsTo(TArray< TWeakObjectPtr >& OutElements) const override; virtual void DeleteElementAndChildren(const FName& ElementToDelete, bool isCalledFromEditor = true) override; virtual void DeleteElements(const TArray& ElementsToDelete, bool isCalledFromEditor = true) override; virtual bool RenameElement(const FName OriginalElementName, const FName& NewElementName) override; virtual bool AttachCompElement(const FName ParentName, const FName ElementName) override; virtual bool SelectElementActors(const TArray& ElementNames, bool bSelect, bool bNotify, bool bSelectEvenIfHidden = false, const TSharedPtr& Filter = TSharedPtr(nullptr)) override; virtual void ToggleElementRendering(const FName& ElementName) override; virtual void ToggleElementFreezeFrame(const FName& ElementName) override; virtual void ToggleMediaCapture(const FName& ElementName) override; virtual UCompositingMediaCaptureOutput* ResetMediaCapture(const FName& ElementName) override; virtual void RemoveMediaCapture(const FName& ElementName) override; virtual void RefreshElementsList() override; void RequestRedraw() override; virtual bool IsDrawing(ACompositingElement* CompElement) const override; virtual void OnCreateNewElement(AActor* NewElement) override; virtual void OnDeleteElement(AActor* ElementToDelete) override; DECLARE_DERIVED_EVENT(FCompElementManager, ICompElementManager::FOnElementsChanged, FOnElementsChanged); virtual FOnElementsChanged& OnElementsChanged() override { return CompsChanged; } //~ End ICompElementManager interface //~ Begin FGCObject interface virtual void AddReferencedObjects(FReferenceCollector& Collector) override; virtual FString GetReferencerName() const override { return TEXT("FCompElementManager"); } //~ End FGCObject interface private: /** Private constructor to force users to go through Create(), which properly initializes the manager. */ FCompElementManager(const TWeakObjectPtr& InEditor); /** Prepares for use. */ void Initialize(); /** */ UWorld* GetWorld() const; /** Utility function for looking up and creating a element if it doesn't already exist. */ TWeakObjectPtr EnsureElementExists(const FName& ElementName); /** * Find all the child elements' FName given a parent element. * * @param ElementName The name of the parent element. * @return TArray Array containing all the child elements' FName. */ TArray FindNamesOfAllChildElements(FName ElementName) const; void OnLevelActorAdded(AActor* InActor); void OnLevelActorRemoved(AActor* InActor); void OnBlueprintCompiled(); void OnCompElementConstructed(ACompositingElement* ConstructedElement); void OnEditorMapChange(uint32 MapChangeFlags); void OnWorldAdded(UWorld* NewWorld); void OnWorldRemoved(UWorld* NewWorld); void OnWorldLevelsChange(ULevel* InLevel, UWorld* InWorld); void OnLevelActorsListChange(); private: /** The associated UEditorEngine to bind/un-bind with. */ TWeakObjectPtr Editor; /** UObject in charge of tracking all editor element actors. Separated as a UObject to more easily facilitate undo/redo actions. */ TObjectPtr ElementsContainer; /** Hidden editor viewport, in charge on enqueuing compositing render commands. */ TSharedPtr EditorCompositingViewport; /** * List which tracks elements queued for delete - used to circumvent broken * child/parent link warnings. Tracked in case the user cancels the delete op and we need to restore the links. */ TArray< TWeakObjectPtr > PendingDeletion; /** Event broadcasted whenever one or more elements are modified. */ FOnElementsChanged CompsChanged; };