// Copyright Epic Games, Inc. All Rights Reserved. #include "MeshMergingSettingsCustomization.h" #include "Containers/Array.h" #include "Containers/UnrealString.h" #include "Delegates/Delegate.h" #include "DetailCategoryBuilder.h" #include "DetailLayoutBuilder.h" #include "DetailWidgetRow.h" #include "IDetailChildrenBuilder.h" #include "IDetailPropertyRow.h" #include "Internationalization/Internationalization.h" #include "Misc/AssertionMacros.h" #include "Misc/Attribute.h" #include "PropertyHandle.h" #include "PropertyRestriction.h" #include "UObject/Class.h" #include "UObject/NameTypes.h" #include "UObject/UnrealType.h" #define LOCTEXT_NAMESPACE "FMeshMergingSettingCustomization" FMeshMergingSettingsObjectCustomization::~FMeshMergingSettingsObjectCustomization() { } void FMeshMergingSettingsObjectCustomization::CustomizeDetails(IDetailLayoutBuilder& LayoutBuilder) { TSharedRef SettingsHandle = LayoutBuilder.GetProperty(FName("UMeshMergingSettingsObject.Settings")); FName MeshCategory("MeshSettings"); IDetailCategoryBuilder& MeshCategoryBuilder = LayoutBuilder.EditCategory(MeshCategory); TArray> SimpleDefaultProperties; MeshCategoryBuilder.GetDefaultProperties(SimpleDefaultProperties, true, true); MeshCategoryBuilder.AddProperty(SettingsHandle); FName CategoryMetaData("Category"); for (TSharedRef Property: SimpleDefaultProperties) { const FString& CategoryName = Property->GetMetaData(CategoryMetaData); IDetailCategoryBuilder& CategoryBuilder = LayoutBuilder.EditCategory(*CategoryName); IDetailPropertyRow& PropertyRow = CategoryBuilder.AddProperty(Property); if (Property->GetProperty()->GetFName() == GET_MEMBER_NAME_CHECKED(FMeshMergingSettings, SpecificLOD)) { static const FName EditConditionName = "EnumCondition"; int32 EnumCondition = Property->GetIntMetaData(EditConditionName); PropertyRow.Visibility(TAttribute::Create(TAttribute::FGetter::CreateSP(this, &FMeshMergingSettingsObjectCustomization::ArePropertiesVisible, EnumCondition))); } else if (Property->GetProperty()->GetFName() == GET_MEMBER_NAME_CHECKED(FMeshMergingSettings, LODSelectionType)) { EnumProperty = Property; TSharedPtr EnumRestriction = MakeShareable(new FPropertyRestriction(LOCTEXT("NoSupport","Unable to support this option in Merge Actor"))); const UEnum* const MeshLODSelectionTypeEnum = StaticEnum(); EnumRestriction->AddDisabledValue(MeshLODSelectionTypeEnum->GetNameStringByValue((uint8)EMeshLODSelectionType::CalculateLOD)); EnumProperty->AddRestriction(EnumRestriction.ToSharedRef()); } } FName MaterialCategory("MaterialSettings"); IDetailCategoryBuilder& MaterialCategoryBuilder = LayoutBuilder.EditCategory(MaterialCategory); SimpleDefaultProperties.Empty(); MaterialCategoryBuilder.GetDefaultProperties(SimpleDefaultProperties, true, true); for (TSharedRef Property : SimpleDefaultProperties) { const FString& CategoryName = Property->GetMetaData(CategoryMetaData); IDetailCategoryBuilder& CategoryBuilder = LayoutBuilder.EditCategory(*CategoryName); IDetailPropertyRow& PropertyRow = CategoryBuilder.AddProperty(Property); // Disable material settings if we are exporting all LODs (no support for material baking in this case) if (CategoryName.Compare("MaterialSettings") == 0) { PropertyRow.IsEnabled(TAttribute::Create(TAttribute::FGetter::CreateSP(this, &FMeshMergingSettingsObjectCustomization::AreMaterialPropertiesEnabled))); } } } TSharedRef FMeshMergingSettingsObjectCustomization::MakeInstance() { return MakeShareable(new FMeshMergingSettingsObjectCustomization); } EVisibility FMeshMergingSettingsObjectCustomization::ArePropertiesVisible(const int32 VisibleType) const { uint8 CurrentEnumValue = 0; EnumProperty->GetValue(CurrentEnumValue); return (CurrentEnumValue == VisibleType) ? EVisibility::Visible : EVisibility::Collapsed; } bool FMeshMergingSettingsObjectCustomization::AreMaterialPropertiesEnabled() const { uint8 CurrentEnumValue = 0; EnumProperty->GetValue(CurrentEnumValue); return !(CurrentEnumValue == (uint8)EMeshLODSelectionType::AllLODs); } TSharedRef FMeshMergingSettingsCustomization::MakeInstance() { return MakeShareable(new FMeshMergingSettingsCustomization); } void FMeshMergingSettingsCustomization::CustomizeHeader(TSharedRef StructPropertyHandle, FDetailWidgetRow& HeaderRow, IPropertyTypeCustomizationUtils& StructCustomizationUtils) { HeaderRow .NameContent() [ StructPropertyHandle->CreatePropertyNameWidget(StructPropertyHandle->GetPropertyDisplayName()) ] .ValueContent() [ StructPropertyHandle->CreatePropertyValueWidget(false) ]; } void FMeshMergingSettingsCustomization::CustomizeChildren(TSharedRef StructPropertyHandle, class IDetailChildrenBuilder& ChildBuilder, IPropertyTypeCustomizationUtils& StructCustomizationUtils) { uint32 NumChildren = 0; StructPropertyHandle->GetNumChildren(NumChildren); for (uint32 ChildIndex = 0; ChildIndex < NumChildren; ++ChildIndex) { TSharedRef ChildHandle = StructPropertyHandle->GetChildHandle(ChildIndex).ToSharedRef(); IDetailPropertyRow& NewRow = ChildBuilder.AddProperty(ChildHandle); AddResetToDefaultOverrides(NewRow); } } #undef LOCTEXT_NAMESPACE