Files
2025-05-18 13:04:45 +08:00

147 lines
6.6 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "IDetailCustomization.h"
#include "EditorUndoClient.h"
#include "IPropertyTypeCustomization.h"
class ACompositingElement;
class FReply;
class ICompElementManager;
class SComboButton;
class SToolTip;
class SWidget;
class UMaterialInterface;
enum class EParamType : uint8;
namespace ESelectInfo { enum Type : int; }
namespace ETextCommit { enum Type : int; }
struct EVisibility;
struct FCompositingMaterial;
struct FMaterialParameterInfo;
template <typename OptionalType> struct TOptional;
/* FCompElementDetailsCustomization
*****************************************************************************/
class IDetailLayoutBuilder;
class FCompElementDetailsCustomization : public IDetailCustomization
{
public:
static TSharedRef<IDetailCustomization> MakeInstance();
public:
//~ IDetailCustomization interface
virtual void CustomizeDetails(IDetailLayoutBuilder& DetailBuilder) override;
private:
void ForceRefreshLayout();
void GetInstanceCameraSourceComboStrings(TArray<TSharedPtr<FString>>& OutComboBoxStrings, TArray<TSharedPtr<SToolTip>>& OutToolTips, TArray<bool>& OutRestrictedItems);
FString GetInstanceCameraSourceValueStr(TSharedPtr<IPropertyHandle> PropertyHandle);
void OnCameraSourceSelected(const FString& Selection, TSharedPtr<IPropertyHandle> PropertyHandle);
IDetailLayoutBuilder* MyLayout = nullptr;
};
/* FCompositingMaterialPassCustomization
*****************************************************************************/
class ITableRow;
class STableViewBase;
typedef FCompositingMaterial FCompositingMaterialType;
class FCompositingMaterialPassCustomization : public IPropertyTypeCustomization, public FEditorUndoClient
{
public:
static TSharedRef<IPropertyTypeCustomization> MakeInstance();
FCompositingMaterialPassCustomization();
~FCompositingMaterialPassCustomization();
/** Begin IPropertyTypeCustomization interface */
virtual void CustomizeHeader(TSharedRef<IPropertyHandle> PropertyHandle, FDetailWidgetRow& HeaderRow, IPropertyTypeCustomizationUtils& CustomizationUtils) override;
virtual void CustomizeChildren(TSharedRef<IPropertyHandle> StructPropertyHandle, IDetailChildrenBuilder& StructBuilder, IPropertyTypeCustomizationUtils& StructCustomizationUtils) override;
/** End IPropertyTypeCustomization interface */
// Begin FEditorUndoClient
virtual void PostUndo(bool bSuccess) override;
virtual void PostRedo(bool bSuccess) override { PostUndo(bSuccess); }
// End of FEditorUndoClient
protected:
TSharedPtr<ICompElementManager> CompElementManager;
TWeakPtr<IPropertyHandle> CachedPropertyHandle;
TSharedPtr<IPropertyHandle> CachedVectorProxies;
TSharedPtr<IPropertyHandle> CachedMaterialParamMappings;
TSharedPtr<IPropertyUtilities> CachedUtils;
TSharedPtr<IPropertyHandle> MaterialHandle;
TWeakObjectPtr<UMaterialInterface> MaterialReference;
FName* MaterialPassName;
private:
/** Overrides for vector param reset to default*/
void VectorResetToDefault(TSharedPtr<IPropertyHandle> PropertyHandle);
bool VectorShouldShowResetToDefault(TSharedPtr<IPropertyHandle> PropertyHandle);
void OnVectorOverrideChanged(TSharedPtr<IPropertyHandle> PropertyHandle);
void TextureResetToDefault(TSharedPtr<IPropertyHandle> PropertyHandle, TSharedPtr<SComboButton> ComboBoxHandle);
bool TextureShouldShowResetToDefault(TSharedPtr<IPropertyHandle> PropertyHandle);
TOptional<float> GetScalarParameterSliderMin(FMaterialParameterInfo ScalarParam) const;
TOptional<float> GetScalarParameterSliderMax(FMaterialParameterInfo ScalarParam) const;
void OnScalarParameterSlideBegin(FMaterialParameterInfo ScalarParam);
void OnScalarParameterSlideEnd(const float NewValue, FMaterialParameterInfo ScalarParam);
void OnScalarParameterCommitted(const float NewValue, ETextCommit::Type CommitType, FMaterialParameterInfo ScalarParam);
TOptional<float> GetScalarParameterValue(FMaterialParameterInfo ScalarParam) const;
void SetScalarParameterValue(const float NewValue, FMaterialParameterInfo ScalarParam);
EVisibility IsResetScalarParameterVisible(FMaterialParameterInfo ScalarParam) const;
FReply OnResetScalarParameterClicked(FMaterialParameterInfo ScalarParam);
void HandleRequiredParamComboChanged(TSharedPtr<FName> Item, ESelectInfo::Type SelectInfo, TWeakPtr<SComboButton> ComboButtonHandle, FName ParamName);
FText GetRequiredParamComboText(FName TexName) const;
void OnRequiredParamComboTextCommitted(const FText& NewText, ETextCommit::Type InTextCommit, FName ParamName);
TSharedRef<SWidget> GetRequiredParamComboMenu(TWeakPtr<SComboButton> ComboButtonHandle, FName ParamName, EParamType ParamType);
void RebuildRequiredParamSources();
TSharedRef<ITableRow> GenerateComboItem(TSharedPtr<FName> InItem, const TSharedRef<STableViewBase>& OwnerTable);
void HandleComboChanged(TSharedPtr<FName> Item, ESelectInfo::Type SelectInfo, TWeakPtr<SComboButton> ComboButtonHandle, FName TexName);
FText GetComboText(FName TexName) const;
void OnComboTextCommitted(const FText& NewText, ETextCommit::Type InTextCommit, FName TexName);
TSharedRef<SWidget> GetPassComboMenu(TWeakPtr<SComboButton> ComboButtonHandle, FName TexName);
void RebuildTextureSourceList();
static TArray<TSharedPtr<FName>> GetPassNamesRecursive(ACompositingElement* Element, const FString& Prefix = FString());
void ResetParameterOverrides();
void OnRedrawViewports();
FCompositingMaterialType* GetMaterialPass() const;
TArray<TSharedPtr<FName>> TextureComboSource;
TArray<TSharedPtr<FName>> RequiredParamComboSourceScalar;
TArray<TSharedPtr<FName>> RequiredParamComboSourceVector;
TArray<TSharedPtr<FName>> RequiredParamComboSourceTexture;
TArray<TSharedPtr<FName>> RequiredParamComboSourceMedia;
TArray<TSharedPtr<FName>> RequiredParamComboSourceUnknown;
};
/* FCompositingPassCustomization
*****************************************************************************/
class FCompositingPassCustomization : public IPropertyTypeCustomization
{
public:
static TSharedRef<IPropertyTypeCustomization> MakeInstance();
public:
//~ Begin IPropertyTypeCustomization interface
virtual void CustomizeHeader(TSharedRef<IPropertyHandle> PropertyHandle, FDetailWidgetRow& HeaderRow, IPropertyTypeCustomizationUtils& CustomizationUtils) override;
virtual void CustomizeChildren(TSharedRef<IPropertyHandle> PropertyHandle, IDetailChildrenBuilder& ChildBuilder, IPropertyTypeCustomizationUtils& CustomizationUtils) override;
//~ End IPropertyTypeCustomization interface
private:
TSharedPtr<IPropertyHandle> GetInstancedObjectHandle(TSharedRef<IPropertyHandle> PropertyHandle);
TSharedPtr<SWidget> ConditionallyCreatePreviewButton(TSharedRef<IPropertyHandle> PropertyHandle, TSharedPtr<SWidget> ParentWidget);
TWeakPtr<SWidget> HeaderValueWidget;
};