// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "Containers/LruCache.h" #include "NiagaraCompileHash.h" #include "NiagaraGraphDigest.h" #include "UObject/GCObject.h" class UNiagaraCompilationGraph; class UNiagaraGraph; class UNiagaraParameterCollection; class UNiagaraScriptSourceBase; using FNiagaraDigestedGraphPtr = TSharedPtr; class FNiagaraCompilationGraphHandle { public: FNiagaraCompilationGraphHandle() = default; FNiagaraCompilationGraphHandle(const UNiagaraGraph* Graph, const FNiagaraGraphChangeIdBuilder& ChangeIdBuilder); protected: TObjectKey AssetKey; FGuid Hash; friend FORCEINLINE uint32 GetTypeHash(const FNiagaraCompilationGraphHandle& CompilationCopy) { return HashCombine(GetTypeHash(CompilationCopy.AssetKey), GetTypeHash(CompilationCopy.Hash)); } friend FORCEINLINE bool operator==(const FNiagaraCompilationGraphHandle& Lhs, const FNiagaraCompilationGraphHandle& Rhs) { return Lhs.AssetKey == Rhs.AssetKey && Lhs.Hash == Rhs.Hash; } }; class FNiagaraCompilationNPC { public: void Create(const UNiagaraParameterCollection* Collection); void AddReferencedObjects(FReferenceCollector& Collector); UNiagaraDataInterface* GetDataInterface(const FNiagaraVariableBase& Variable) const; TArray Variables; FName Namespace; TWeakObjectPtr SourceCollection; FString CollectionPath; FString CollectionFullName; TMap> DefaultDataInterfaces; }; class FNiagaraCompilationNPCHandle { public: using FDigestPtr = TSharedPtr; FNiagaraCompilationNPCHandle() = default; FNiagaraCompilationNPCHandle(const FNiagaraCompilationNPCHandle& Handle) = default; FNiagaraCompilationNPCHandle(const UNiagaraParameterCollection* Collection); bool IsValid() const { return Resolve().IsValid(); } FDigestPtr Resolve() const; FName Namespace = NAME_None; protected: TObjectKey AssetKey; FNiagaraCompileHash Hash; friend FORCEINLINE uint32 GetTypeHash(const FNiagaraCompilationNPCHandle& CompilationCopy) { return HashCombine(GetTypeHash(CompilationCopy.AssetKey), GetTypeHash(CompilationCopy.Hash)); } friend FORCEINLINE bool operator==(const FNiagaraCompilationNPCHandle& Lhs, const FNiagaraCompilationNPCHandle& Rhs) { return Lhs.AssetKey == Rhs.AssetKey && Lhs.Hash == Rhs.Hash; } }; class FNiagaraDigestedParameterCollections { public: TConstArrayView ReadCollections() const { return Collections; } TArray& EditCollections() { return Collections; }; FNiagaraCompilationNPCHandle FindMatchingCollection(FName VariableName, bool bAllowPartialMatch, FNiagaraVariable& OutVar) const; FNiagaraCompilationNPCHandle FindCollection(const FNiagaraVariable& Variable) const; protected: FNiagaraCompilationNPCHandle FindCollectionByName(FName VariableName) const; TArray Collections; }; class FNiagaraDigestDatabase : public FGCObject { public: FNiagaraDigestDatabase(); virtual ~FNiagaraDigestDatabase(); static FNiagaraDigestDatabase& Get(); static void Shutdown(); FNiagaraDigestedGraphPtr CreateGraphDigest(const UNiagaraGraph* Graph, const FNiagaraGraphChangeIdBuilder& Digester); FNiagaraCompilationNPCHandle CreateCompilationCopy(const UNiagaraParameterCollection* Collection); FNiagaraCompilationNPCHandle::FDigestPtr Resolve(const FNiagaraCompilationNPCHandle& Handle) const; void ReleaseDatabase(); virtual void AddReferencedObjects(FReferenceCollector& Collector) override; virtual FString GetReferencerName() const override; protected: void ReleaseGraphCache(); uint32 GraphCacheHits = 0; uint32 GraphCacheMisses = 0; uint32 CollectionCacheHits = 0; uint32 CollectionCacheMisses = 0; using FCompilationGraphCache = TLruCache; FCompilationGraphCache CompilationGraphCache; using FCompilationNPCCache = TMap; FCompilationNPCCache CompilationNPCCache; mutable FRWLock DigestCacheLock; };