Files
UnrealEngine/Engine/Plugins/FX/Niagara/Source/NiagaraEditor/Public/NiagaraNodeCustomHlsl.h
Brandyn / Techy fcc1b09210 init
2026-04-04 15:40:51 -05:00

104 lines
4.9 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "NiagaraNodeFunctionCall.h"
#include "NiagaraNodeInput.h"
#include "NiagaraNodeCustomHlsl.generated.h"
class UNiagaraScript;
struct FNiagaraCustomHlslInclude;
UCLASS(MinimalAPI)
class UNiagaraNodeCustomHlsl : public UNiagaraNodeFunctionCall
{
GENERATED_UCLASS_BODY()
public:
const FString& GetCustomHlsl() const;
void SetCustomHlsl(const FString& InCustomHlsl);
bool IsShaderCodeShown() const;
void SetShaderCodeShown(bool bInShown);
void GetIncludeFilePaths(TArray<FNiagaraCustomHlslInclude>& OutCustomHlslIncludeFilePaths) const;
UPROPERTY()
ENiagaraScriptUsage ScriptUsage;
virtual TSharedPtr<SGraphNode> CreateVisualWidget() override;
virtual void OnRenameNode(const FString& NewName) override;
virtual FLinearColor GetNodeTitleColor() const override;
virtual FText GetTooltipText() const override;
FText GetHlslText() const;
void OnCustomHlslTextCommitted(const FText& InText, ETextCommit::Type InType);
bool GetTokens(TArray<FStringView>& OutTokens, bool IncludeComments = true, bool IncludeWhitespace = true) const;
virtual void BuildParameterMapHistory(FNiagaraParameterMapHistoryBuilder& OutHistory, bool bRecursive = true, bool bFilterForCompilation = true) const override;
virtual void GatherExternalDependencyData(ENiagaraScriptUsage InUsage, const FGuid& InUsageId, FNiagaraScriptHashCollector& HashCollector) const override;
// Replace items in the tokens array if they start with the src string or optionally src string and a namespace delimiter
static uint32 ReplaceExactMatchTokens(TArray<FString>& Tokens, FStringView SrcString, FStringView ReplaceString, bool bAllowNamespaceSeparation);
virtual bool AllowNiagaraTypeForAddPin(const FNiagaraTypeDefinition& InType) const override;
virtual bool AllowNiagaraTypeForAddPin(const FNiagaraTypeDefinition& InType, EEdGraphPinDirection InDirection) const override;
virtual bool ReferencesVariable(const FNiagaraVariableBase& InVar) const;
static bool GetTokensFromString(const FString& InHlsl, TArray<FStringView>& OutTokens, bool IncludeComments = true, bool IncludeWhitespace = true);
virtual void PostEditChangeProperty(struct FPropertyChangedEvent& PropertyChangedEvent) override;
void InitAsCustomHlslDynamicInput(const FNiagaraTypeDefinition& OutputType);
bool CallsImpureDataInterfaceFunctions() const;
protected:
virtual bool AllowDynamicPins() const override { return true; }
virtual bool GetValidateDataInterfaces() const override { return false; }
virtual bool VerifyEditablePinName(const FText& InName, FText& OutErrorMessage, const UEdGraphPin* InGraphPinObj) const override;
virtual bool IsPinNameEditableUponCreation(const UEdGraphPin* Pin) const override;
virtual bool IsPinNameEditable(const UEdGraphPin* Pin) const override;
virtual bool CommitEditablePinName(const FText& InName, UEdGraphPin* InGraphPinObj, bool bSuppressEvents = false) override;
virtual bool CancelEditablePinName(const FText& InName, UEdGraphPin* InGraphPinObj) override;
virtual bool CanModifyPin(const UEdGraphPin* Pin) const override { return UNiagaraNodeWithDynamicPins::CanModifyPin(Pin); }
virtual bool CanRenamePin(const UEdGraphPin* Pin) const override { return UNiagaraNodeWithDynamicPins::CanRenamePin(Pin); }
virtual bool CanRemovePin(const UEdGraphPin* Pin) const override { return UNiagaraNodeWithDynamicPins::CanRemovePin(Pin); }
virtual bool CanMovePin(const UEdGraphPin* Pin, int32 DirectionToMove) const override { return UNiagaraNodeWithDynamicPins::CanMovePin(Pin, DirectionToMove); }
/** Called when a new typed pin is added by the user. */
virtual void OnNewTypedPinAdded(UEdGraphPin*& NewPin) override;
/** Called when a pin is renamed. */
virtual void OnPinRenamed(UEdGraphPin* RenamedPin, const FString& OldPinName) override;
/** Removes a pin from this node with a transaction. */
virtual void RemoveDynamicPin(UEdGraphPin* Pin) override;
virtual void MoveDynamicPin(UEdGraphPin* Pin, int32 DirectionToMove) override;
void RebuildSignatureFromPins();
UEdGraphPin* PinPendingRename;
private:
UPROPERTY(EditAnywhere, Category = "HLSL", meta = (MultiLine = true))
FString CustomHlsl;
// Links to hlsl files that will be included by the translator. These external files are not watched by the engine, so changes to them do not automatically trigger a recompile of Niagara scripts.
UPROPERTY(EditAnywhere, Category = "HLSL")
TArray<FFilePath> AbsoluteIncludeFilePaths;
// Links to hlsl files that will be included by the translator. These paths are resolved with the virtual shader paths registered in the engine.
// For example, /Plugin/FX/Niagara maps to /Engine/Plugins/FX/Niagara/Shaders. Custom mappings can be added via AddShaderSourceDirectoryMapping().
UPROPERTY(EditAnywhere, Category = "HLSL")
TArray<FString> VirtualIncludeFilePaths;
// Is the shader code UI shown?
UPROPERTY()
bool bIsShaderCodeShown;
};