// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "IPropertyTypeCustomization.h" #include "Materials/MaterialLayersFunctions.h" #include "IDetailCustomNodeBuilder.h" #include "Input/Reply.h" struct FAssetData; enum EMaterialLayerRowType { Layer, Blend }; /** Customize the appearance of an FMaterialLayersFunction */ class FMaterialLayersFunctionsCustomization : public IDetailCustomNodeBuilder, public TSharedFromThis< FMaterialLayersFunctionsCustomization > { public: FMaterialLayersFunctionsCustomization(const TSharedPtr& StructPropertyHandle, const class IDetailLayoutBuilder* InDetailLayout); /** Adds a layer and the corresponding blend to the FMaterialLayerFunctions */ void AddLayer(); /** Removes a layer and any corresponding blend from the FMaterialLayerFunctions */ void RemoveLayer(int32 Index); void RefreshOnAssetChange(const struct FAssetData& InAssetData, int32 Index, EMaterialParameterAssociation MaterialType); /** Getter for the FMaterialLayersFunctions for this customization */ FMaterialLayersFunctions* GetMaterialLayersFunctions() const { return MaterialLayersFunctions; } TSharedPtr GetPropertyUtilities() const { return PropertyUtilities.Pin(); } void RebuildChildren(); protected: void OnObjectChanged(const FAssetData&) {}; void ResetToDefault(); bool IsResetToDefaultVisible() const; /** IDetailCustomNodeBuilder interface */ virtual bool RequiresTick() const override { return false; } virtual void Tick(float DeltaTime) override {}; virtual void GenerateHeaderRowContent(FDetailWidgetRow& NodeRow) override; virtual void GenerateChildContent(IDetailChildrenBuilder& ChildrenBuilder) override; virtual FName GetName() const override { return TEXT("MaterialLayerFunction"); } virtual bool InitiallyCollapsed() const override { return false; } virtual void SetOnRebuildChildren(FSimpleDelegate InOnRegenerateChildren) override { OnRebuildChildren = InOnRegenerateChildren; }; /** Callback when user click the Group reset button */ void OnDetailGroupReset() {}; #if WITH_EDITOR /* Returns the user-editable name of a layer within the Material Layers Function */ FText GetLayerName(int32 Counter) const; /* Called when a layer is renamed by the user */ void OnNameChanged(const FText& InText, ETextCommit::Type CommitInfo, int32 Counter); #endif private: /** Called to rebuild the children of the detail tree */ FSimpleDelegate OnRebuildChildren; /** Layer array handle */ TSharedPtr LayerHandle; /** Blend array handle */ TSharedPtr BlendHandle; /** Property handle for the FMaterialLayerFunction */ TSharedPtr SavedStructPropertyHandle; /** Layout builder that contains this custom builder */ class IDetailLayoutBuilder* SavedLayoutBuilder; /** Associated FMaterialLayerFunction utilities */ TWeakPtr PropertyUtilities; /** FMaterialLayersFunctions instance this customization is currently editing */ FMaterialLayersFunctions* MaterialLayersFunctions; TArray DetailGroups; public: FString GetLayerAssetPath(FMaterialParameterInfo InInfo) const; }; class FMaterialLayerFunctionElement : public IDetailCustomNodeBuilder, public TSharedFromThis< FMaterialLayerFunctionElement > { public: FMaterialLayerFunctionElement(FMaterialLayersFunctionsCustomization* InCustomization, TWeakPtr InPropertyHandle, EMaterialLayerRowType InRowType); /** Callback when user click the reset button of the material row property */ static void ResetLayerAssetToDefault(TSharedPtr PropertyHandle, TSharedPtr InPropertyHandle, FMaterialLayersFunctionsCustomization* InCustomization, int32 InIndex, EMaterialLayerRowType MaterialType); static bool CanResetLayerAssetToDefault(TSharedPtr PropertyHandle, TSharedPtr InPropertyHandle, FMaterialLayersFunctionsCustomization* InCustomization, int32 InIndex, EMaterialLayerRowType MaterialType); /** Getter for the index of this row */ uint32 GetIndex() const { return Index; }; virtual void GenerateHeaderRowContent(FDetailWidgetRow& NodeRow) override; /** Function used to filter targets for the value of this row */ private: /** IDetailCustomNodeBuilder interface */ virtual bool RequiresTick() const override { return false; } virtual void Tick(float DeltaTime) override {}; virtual void GenerateChildContent(IDetailChildrenBuilder& ChildrenBuilder) override {}; virtual FName GetName() const override { return NAME_None; } virtual bool InitiallyCollapsed() const override { return false; } virtual void SetOnRebuildChildren(FSimpleDelegate InOnRegenerateChildren) override {}; void OnDetailGroupReset() {}; private: /** The property handle for the property displayed by this row */ TSharedPtr RowPropertyHandle; /** The parent customization that created this row */ FMaterialLayersFunctionsCustomization* ParentCustomization; /** Whether this row is for a layer or a blend */ EMaterialLayerRowType RowType; /** The array index of this row in the Layers or Blends array*/ int32 Index; };