// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "UObject/ObjectMacros.h" #include "Serialization/ArchiveUObject.h" struct FTraceRouteRecord { struct FObjectGraphNode* GraphNode; TArray ReferencerProperties; FTraceRouteRecord(struct FObjectGraphNode* InGraphNode, FProperty* InReferencerProperty) : GraphNode(InGraphNode) { ReferencerProperties.Add(InReferencerProperty); } FTraceRouteRecord(struct FObjectGraphNode* InGraphNode, const TArray& InReferencerProperties) : GraphNode(InGraphNode) { ReferencerProperties = InReferencerProperties; } void Add(FProperty* InReferencerProperty) { ReferencerProperties.Add(InReferencerProperty); } }; struct FObjectGraphNode { /** the object this node represents */ UObject* NodeObject; /** Records for objects which reference this object */ TMap ReferencerRecords; /** Records for objects which are referenced by this object */ TMap ReferencedObjects; /** the number of links between NodeObject and the target object */ int32 ReferenceDepth; /** Used during search - Visited or not */ bool Visited; /** * The property that references NodeObject; only set on nodes which are part * of the calculated shortest route */ TArray ReferencerProperties; /** Default constructor */ FObjectGraphNode(UObject* InNodeObject = NULL) : NodeObject(InNodeObject), ReferenceDepth(MAX_int32), Visited(false) {} }; /*---------------------------------------------------------------------------- FArchiveObjectGraph. ----------------------------------------------------------------------------*/ // This is from FArchiveTraceRoute -This only creates object graph of all objects // This can be used by other classes such as FTraceReferences - trace references of one object class FArchiveObjectGraph: public FArchiveUObject { /** Handles serialization of UObject references */ FArchive& operator<<(class UObject*& Obj); /** * The object currently being serialized; used by the overloaded serialization operator to determine the referencing object. */ UObject* CurrentReferencer; /** The set of objects encountered while serializing CurrentReferencer */ TArray ObjectsToSerialize; /** true if we should serialize objects marked RF_Transient */ bool bIncludeTransients; /** * A bitmask of object flags which indicates which objects should be included in the group of initial objects to be serialized; * RF_RootSet will be automatically added to this bitmask, and OBJECTMARK_TagExp will automatically be removed. */ EObjectFlags RequiredFlags; public: UE_DEPRECATED(4.23, "This class is out of date and misses many references, replace with FReferenceChainSearch or FFindReferencersArchive") FArchiveObjectGraph(bool IncludeTransients, EObjectFlags KeepFlags); ~FArchiveObjectGraph(); /** * Serializes the objects in the specified set; any objects encountered during serialization * of an object are added to the object set and processed until no new objects are added. * DO NOT MAKE THIS VIRTUAL - this is called by constructor. If you wish to do so, please change where be called * @param Objects the original set of objects to serialize; the original set will be preserved. */ void GenerateObjectGraph(TArray& Objects); void ClearSearchFlags(); /** A complete graph of all references between all objects in memory */ TMap ObjectGraph; };