Files
UnrealEngine/Engine/Source/Editor/DetailCustomizations/Private/AttenuationSettingsCustomizations.cpp
2025-05-18 13:04:45 +08:00

1114 lines
51 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "AttenuationSettingsCustomizations.h"
#include "Containers/Map.h"
#include "Containers/UnrealString.h"
#include "Delegates/Delegate.h"
#include "DetailCategoryBuilder.h"
#include "DetailLayoutBuilder.h"
#include "DetailWidgetRow.h"
#include "Engine/Attenuation.h"
#include "Fonts/SlateFontInfo.h"
#include "IDetailChildrenBuilder.h"
#include "IDetailPropertyRow.h"
#include "Internationalization/Internationalization.h"
#include "Internationalization/Text.h"
#include "Math/UnrealMathSSE.h"
#include "Math/Vector.h"
#include "Misc/AssertionMacros.h"
#include "PropertyHandle.h"
#include "PropertyRestriction.h"
#include "Sound/AudioSettings.h"
#include "Sound/SoundAttenuation.h"
#include "UObject/Class.h"
#include "UObject/NameTypes.h"
#include "UObject/UObjectGlobals.h"
#include "UObject/UnrealType.h"
#include "Widgets/DeclarativeSyntaxSupport.h"
#include "Widgets/Text/STextBlock.h"
#define LOCTEXT_NAMESPACE "AttenuationSettings"
namespace AttenuationSettingsUtils
{
bool GetValue(TSharedPtr<IPropertyHandle> InProp)
{
if (InProp.IsValid())
{
bool Val;
InProp->GetValue(Val);
return Val;
}
return true;
}
void SortCategories(const TMap<FName, IDetailCategoryBuilder*>& AllCategoryMap)
{
const IDetailCategoryBuilder* AttenuationBuilder = AllCategoryMap.FindRef("Attenuation");
if (!AttenuationBuilder)
{
return;
}
for (const TPair<FName, IDetailCategoryBuilder*>& Pair : AllCategoryMap)
{
int32 SortOrder = AttenuationBuilder->GetSortOrder();
const FName CategoryName = Pair.Key;
// Early out if attenuation category
if (CategoryName == "Attenuation")
{
continue;
}
// Organize related categories
if (CategoryName == "AttenuationDistance")
{
SortOrder += 1;
}
else if (CategoryName == "AttenuationSpatialization")
{
SortOrder += 2;
}
else if (CategoryName == "AttenuationOcclusion")
{
SortOrder += 3;
}
else if (CategoryName == "AttenuationSubmixSend")
{
SortOrder += 4;
}
else if (CategoryName == "AttenuationReverbSend")
{
SortOrder += 5;
}
else if (CategoryName == "AttenuationListenerFocus")
{
SortOrder += 6;
}
else if (CategoryName == "AttenuationPriority")
{
SortOrder += 7;
}
else if (CategoryName == "AttenuationAirAbsorption")
{
SortOrder += 8;
}
else if (CategoryName == "AttenuationPluginSettings")
{
SortOrder += 9;
}
else
{
// Add space to any other categories interfering with space for attenuation-related categories
const int32 ValueSortOrder = Pair.Value->GetSortOrder();
if (ValueSortOrder>= SortOrder && ValueSortOrder <SortOrder + 10)
{
SortOrder += 10;
}
// Else, leave current sort order alone
else
{
continue;
}
}
Pair.Value->SetSortOrder(SortOrder);
}
}
}
TSharedRef<IPropertyTypeCustomization> FSoundAttenuationSettingsCustomization::MakeInstance()
{
return MakeShared<FSoundAttenuationSettingsCustomization>();
}
TSharedRef<IPropertyTypeCustomization> FForceFeedbackAttenuationSettingsCustomization::MakeInstance()
{
return MakeShared<FForceFeedbackAttenuationSettingsCustomization>();
}
void FBaseAttenuationSettingsCustomization::CustomizeHeader(TSharedRef<class IPropertyHandle> StructPropertyHandle, class FDetailWidgetRow& HeaderRow, IPropertyTypeCustomizationUtils& StructCustomizationUtils)
{
HeaderRow
.NameContent()
[
StructPropertyHandle->CreatePropertyNameWidget()
];
}
TSharedPtr<IPropertyHandle> FBaseAttenuationSettingsCustomization::GetOverrideAttenuationHandle(TSharedRef<IPropertyHandle> StructPropertyHandle)
{
TSharedPtr<IPropertyHandle> ParentHandle = StructPropertyHandle->GetParentHandle();
if (TSharedPtr<IPropertyHandle> GrandParentHandle = ParentHandle->GetParentHandle())
{
ParentHandle = GrandParentHandle;
}
return ParentHandle->GetChildHandle(TEXT("bOverrideAttenuation"), true);
}
void FBaseAttenuationSettingsCustomization::CustomizeChildren(TSharedRef<IPropertyHandle> StructPropertyHandle, class IDetailChildrenBuilder& ChildBuilder, IPropertyTypeCustomizationUtils& StructCustomizationUtils)
{
uint32 NumChildren;
StructPropertyHandle->GetNumChildren(NumChildren);
TMap<FName, TSharedPtr<IPropertyHandle>> PropertyHandles;
// Get the override attenuation handle, if it exists
bOverrideAttenuationHandle = GetOverrideAttenuationHandle(StructPropertyHandle);
for (uint32 ChildIndex = 0; ChildIndex <NumChildren; ++ChildIndex)
{
TSharedRef<IPropertyHandle> ChildHandle = StructPropertyHandle->GetChildHandle(ChildIndex).ToSharedRef();
const FName PropertyName = ChildHandle->GetProperty()->GetFName();
PropertyHandles.Add(PropertyName, ChildHandle);
}
AttenuationShapeHandle = PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FBaseAttenuationSettings, AttenuationShape));
DistanceAlgorithmHandle = PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FBaseAttenuationSettings, DistanceAlgorithm));
TSharedRef<IPropertyHandle> AttenuationExtentsHandle = PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FBaseAttenuationSettings, AttenuationShapeExtents)).ToSharedRef();
uint32 NumExtentChildren;
AttenuationExtentsHandle->GetNumChildren(NumExtentChildren);
TSharedPtr<IPropertyHandle> ExtentXHandle;
TSharedPtr<IPropertyHandle> ExtentYHandle;
TSharedPtr<IPropertyHandle> ExtentZHandle;
for(uint32 ExtentChildIndex = 0; ExtentChildIndex <NumExtentChildren; ++ExtentChildIndex)
{
TSharedRef<IPropertyHandle> ChildHandle = AttenuationExtentsHandle->GetChildHandle(ExtentChildIndex).ToSharedRef();
const FName PropertyName = ChildHandle->GetProperty()->GetFName();
if (PropertyName == GET_MEMBER_NAME_CHECKED(FVector, X))
{
ExtentXHandle = ChildHandle;
}
else if (PropertyName == GET_MEMBER_NAME_CHECKED(FVector, Y))
{
ExtentYHandle = ChildHandle;
}
else
{
check(PropertyName == GET_MEMBER_NAME_CHECKED(FVector, Z));
ExtentZHandle = ChildHandle;
}
}
// Get layout build of category so properties can be added to categories
IDetailLayoutBuilder& LayoutBuilder = ChildBuilder.GetParentCategory().GetParentLayout();
LayoutBuilder.AddPropertyToCategory(DistanceAlgorithmHandle)
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsAttenuationEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FBaseAttenuationSettings, CustomAttenuationCurve)))
.Visibility(TAttribute<EVisibility>(this, &FBaseAttenuationSettingsCustomization::IsCustomCurveSelected))
.EditCondition(GetIsAttenuationEnabledAttribute(), nullptr);
DbAttenuationAtMaxHandle = PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FBaseAttenuationSettings, dBAttenuationAtMax));
LayoutBuilder.AddPropertyToCategory(DbAttenuationAtMaxHandle)
.Visibility(TAttribute<EVisibility>(this, &FBaseAttenuationSettingsCustomization::IsNaturalSoundSelected))
.EditCondition(GetIsAttenuationEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FBaseAttenuationSettings, FalloffMode)))
.Visibility(TAttribute<EVisibility>(this, &FBaseAttenuationSettingsCustomization::IsNaturalSoundSelected))
.EditCondition(GetIsFalloffModeEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(AttenuationShapeHandle)
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsAttenuationEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(AttenuationExtentsHandle)
.Visibility(TAttribute<EVisibility>(this, &FBaseAttenuationSettingsCustomization::IsBoxSelected))
.DisplayName(LOCTEXT("BoxExtentsLabel", "Extents"))
.ToolTip(LOCTEXT("BoxExtents", "The dimensions of the of the box."))
.EditCondition(GetIsAttenuationEnabledAttribute(), nullptr);
// Get the attenuation category directly here otherwise our category is going to be incorrect for the following custom rows (e.g. "Vector" vs "Attenuation")
IDetailCategoryBuilder& AttenuationCategory = LayoutBuilder.EditCategory("AttenuationDistance");
const FText RadiusLabel(LOCTEXT("RadiusLabel", "Inner Radius"));
AttenuationCategory.AddCustomRow(RadiusLabel)
.NameContent()
[
SNew(STextBlock)
.Text(RadiusLabel)
.ToolTipText(LOCTEXT("RadiusToolTip", "The radius that defines when sound attenuation begins (or when a custom attenuation curve begins). Sounds played at a distance less than this will not be attenuated."))
.Font(StructCustomizationUtils.GetRegularFont())
.IsEnabled(GetIsAttenuationEnabledAttribute())
]
.ValueContent()
[
ExtentXHandle->CreatePropertyValueWidget()
]
.Visibility(TAttribute<EVisibility>(this, &FBaseAttenuationSettingsCustomization::IsSphereSelected))
.IsEnabled(GetIsAttenuationEnabledAttribute());
AttenuationCategory.AddCustomRow(LOCTEXT("CapsuleHalfHeightLabel", "Capsule Half Height"))
.NameContent()
[
SNew(STextBlock)
.Text(LOCTEXT("CapsuleHalfHeightLabel", "Capsule Half Height"))
.ToolTipText(LOCTEXT("CapsuleHalfHeightToolTip", "The attenuation capsule's half height."))
.Font(StructCustomizationUtils.GetRegularFont())
]
.ValueContent()
[
ExtentXHandle->CreatePropertyValueWidget()
]
.Visibility(TAttribute<EVisibility>(this, &FBaseAttenuationSettingsCustomization::IsCapsuleSelected))
.IsEnabled(GetIsAttenuationEnabledAttribute());
AttenuationCategory.AddCustomRow(LOCTEXT("CapsuleRadiusLabel", "Capsule Radius"))
.NameContent()
[
SNew(STextBlock)
.Text(LOCTEXT("CapsuleRadiusLabel", "Capsule Radius"))
.ToolTipText(LOCTEXT("CapsuleRadiusToolTip", "The attenuation capsule's radius."))
.Font(StructCustomizationUtils.GetRegularFont())
]
.ValueContent()
[
ExtentYHandle->CreatePropertyValueWidget()
]
.Visibility(TAttribute<EVisibility>(this, &FBaseAttenuationSettingsCustomization::IsCapsuleSelected))
.IsEnabled(GetIsAttenuationEnabledAttribute());
AttenuationCategory.AddCustomRow(LOCTEXT("ConeRadiusLabel", "Cone Radius"))
.NameContent()
[
SNew(STextBlock)
.Text(LOCTEXT("ConeRadiusLabel", "Cone Radius"))
.ToolTipText(LOCTEXT("ConeRadiusToolTip", "The attenuation cone's radius."))
.Font(StructCustomizationUtils.GetRegularFont())
]
.ValueContent()
[
ExtentXHandle->CreatePropertyValueWidget()
]
.Visibility(TAttribute<EVisibility>(this, &FBaseAttenuationSettingsCustomization::IsConeSelected))
.IsEnabled(GetIsAttenuationEnabledAttribute());
AttenuationCategory.AddCustomRow(LOCTEXT("ConeAngleLabel", "Cone Angle"))
.NameContent()
[
SNew(STextBlock)
.Text(LOCTEXT("ConeAngleLabel", "Cone Angle"))
.ToolTipText(LOCTEXT("ConeAngleToolTip", "The angle of the inner edge of the attenuation cone's falloff. Inside this angle sounds will be at full volume."))
.Font(StructCustomizationUtils.GetRegularFont())
]
.ValueContent()
[
ExtentYHandle->CreatePropertyValueWidget()
]
.Visibility(TAttribute<EVisibility>(this, &FBaseAttenuationSettingsCustomization::IsConeSelected))
.IsEnabled(GetIsAttenuationEnabledAttribute());
AttenuationCategory.AddCustomRow(LOCTEXT("ConeFalloffAngleLabel", "Cone Falloff Angle"))
.NameContent()
[
SNew(STextBlock)
.Text(LOCTEXT("ConeFalloffAngleLabel", "Cone Falloff Angle"))
.ToolTipText(LOCTEXT("ConeFalloffAngleToolTip", "The angle of the outer edge of the attenuation cone's falloff. Outside this angle sounds will be inaudible."))
.Font(StructCustomizationUtils.GetRegularFont())
]
.ValueContent()
[
ExtentZHandle->CreatePropertyValueWidget()
]
.Visibility(TAttribute<EVisibility>(this, &FBaseAttenuationSettingsCustomization::IsConeSelected))
.IsEnabled(GetIsAttenuationEnabledAttribute());
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FBaseAttenuationSettings, ConeOffset)))
.Visibility(TAttribute<EVisibility>(this, &FBaseAttenuationSettingsCustomization::IsConeSelected))
.EditCondition(GetIsAttenuationEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FBaseAttenuationSettings, FalloffDistance)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsAttenuationEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FBaseAttenuationSettings, ConeSphereRadius)))
.Visibility(TAttribute<EVisibility>(this, &FBaseAttenuationSettingsCustomization::IsConeSelected))
.EditCondition(GetIsAttenuationEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FBaseAttenuationSettings, ConeSphereFalloffDistance)))
.Visibility(TAttribute<EVisibility>(this, &FBaseAttenuationSettingsCustomization::IsConeSelected))
.EditCondition(GetIsAttenuationEnabledAttribute(), nullptr);
}
TAttribute<bool> FBaseAttenuationSettingsCustomization::IsAttenuationOverriddenAttribute() const
{
return TAttribute<bool>::Create(TAttribute<bool>::FGetter::CreateLambda([bInOverrideAttenuationHandle = bOverrideAttenuationHandle]()
{
return AttenuationSettingsUtils::GetValue(bInOverrideAttenuationHandle);
}
));
}
TAttribute<EVisibility> FBaseAttenuationSettingsCustomization::IsAttenuationOverriddenVisibleAttribute() const
{
return TAttribute<EVisibility>::Create(TAttribute<EVisibility>::FGetter::CreateLambda([bInOverrideAttenuationHandle = bOverrideAttenuationHandle]()
{
return AttenuationSettingsUtils::GetValue(bInOverrideAttenuationHandle)
? EVisibility::Visible
: EVisibility::Hidden;
}
));
}
TAttribute<bool> FBaseAttenuationSettingsCustomization::GetIsAttenuationEnabledAttribute() const
{
TWeakPtr<IPropertyHandle> bOverrideAttenuationPropertyWeakPtr = bOverrideAttenuationHandle;
TWeakPtr<IPropertyHandle> bIsAttenuatedPropertyWeakPtr = bIsAttenuatedHandle;
auto Lambda = [bOverrideAttenuationPropertyWeakPtr, bIsAttenuatedPropertyWeakPtr]()
{
TSharedPtr<IPropertyHandle> bOverrideAttenuationPropertyWeakHandle = bOverrideAttenuationPropertyWeakPtr.Pin();
TSharedPtr<IPropertyHandle> bIsAttenuatedPropertyWeakHandle = bIsAttenuatedPropertyWeakPtr.Pin();
bool Value = AttenuationSettingsUtils::GetValue(bOverrideAttenuationPropertyWeakHandle);
Value &= AttenuationSettingsUtils::GetValue(bIsAttenuatedPropertyWeakHandle);
return Value;
};
return TAttribute<bool>::Create(TAttribute<bool>::FGetter::CreateLambda(Lambda));
}
TAttribute<bool> FBaseAttenuationSettingsCustomization::GetIsFalloffModeEnabledAttribute() const
{
TWeakPtr<IPropertyHandle> bOverrideAttenuationPropertyWeakPtr = bOverrideAttenuationHandle;
TWeakPtr<IPropertyHandle> bIsAttenuatedPropertyWeakPtr = bIsAttenuatedHandle;
TWeakPtr<IPropertyHandle> DbAttenuationAtMaxHandleWeakPtr = DbAttenuationAtMaxHandle;
auto Lambda = [bOverrideAttenuationPropertyWeakPtr, bIsAttenuatedPropertyWeakPtr, DbAttenuationAtMaxHandleWeakPtr]()
{
TSharedPtr<IPropertyHandle> bOverrideAttenuationPropertyPtr = bOverrideAttenuationPropertyWeakPtr.Pin();
TSharedPtr<IPropertyHandle> bIsAttenuatedPropertyPtr = bIsAttenuatedPropertyWeakPtr.Pin();
TSharedPtr<IPropertyHandle> DbAttenuationAtMaxHandlePtr = DbAttenuationAtMaxHandleWeakPtr.Pin();
float AttenuationValue = -60.f;
if (DbAttenuationAtMaxHandlePtr.IsValid())
{
DbAttenuationAtMaxHandlePtr->GetValue(AttenuationValue);
}
bool Value = AttenuationSettingsUtils::GetValue(bOverrideAttenuationPropertyPtr);
Value &= AttenuationSettingsUtils::GetValue(bIsAttenuatedPropertyPtr);
Value &= AttenuationValue> -60.f;
return Value;
};
return TAttribute<bool>::Create(TAttribute<bool>::FGetter::CreateLambda(Lambda));
}
void FSoundAttenuationSettingsCustomization::CustomizeHeader(TSharedRef<IPropertyHandle> PropertyHandle, class FDetailWidgetRow& HeaderRow, IPropertyTypeCustomizationUtils& CustomizationUtils)
{
// Property handle here is the base struct. We are going to hide it since we're showing it's properties directly.
PropertyHandle->MarkHiddenByCustomization();
}
void FSoundAttenuationSettingsCustomization::CustomizeChildren(TSharedRef<IPropertyHandle> StructPropertyHandle, class IDetailChildrenBuilder& ChildBuilder, IPropertyTypeCustomizationUtils& StructCustomizationUtils)
{
// Get handle to layout builder to enable adding properties to categories
IDetailLayoutBuilder& LayoutBuilder = ChildBuilder.GetParentCategory().GetParentLayout();
uint32 NumChildren;
StructPropertyHandle->GetNumChildren(NumChildren);
TMap<FName, TSharedPtr<IPropertyHandle>> PropertyHandles;
for(uint32 ChildIndex = 0; ChildIndex <NumChildren; ++ChildIndex)
{
TSharedRef<IPropertyHandle> ChildHandle = StructPropertyHandle->GetChildHandle(ChildIndex).ToSharedRef();
const FName PropertyName = ChildHandle->GetProperty()->GetFName();
PropertyHandles.Add(PropertyName, ChildHandle);
}
// Get the override attenuation handle, if it exists
bOverrideAttenuationHandle = GetOverrideAttenuationHandle(StructPropertyHandle);
bIsOcclusionEnabledHandle = PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, bEnableOcclusion)).ToSharedRef();
bIsSpatializedHandle = PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, bSpatialize)).ToSharedRef();
bIsAirAbsorptionEnabledHandle = PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, bAttenuateWithLPF)).ToSharedRef();
bIsReverbSendEnabledHandle = PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, bEnableReverbSend)).ToSharedRef();
bIsPriorityAttenuationEnabledHandle = PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, bEnablePriorityAttenuation)).ToSharedRef();
bIsSubmixSendAttenuationEnabledHandle = PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, bEnableSubmixSends)).ToSharedRef();
bIsSourceDataOverrideEnabledHandle = PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, bEnableSourceDataOverride)).ToSharedRef();
bIsSendToAudioLinkEnabledHandle = PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, bEnableSendToAudioLink)).ToSharedRef();
ReverbSendMethodHandle = PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, ReverbSendMethod)).ToSharedRef();
PriorityAttenuationMethodHandle = PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, PriorityAttenuationMethod)).ToSharedRef();
AbsorptionMethodHandle = PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, AbsorptionMethod)).ToSharedRef();
bIsFocusedHandle = PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, bEnableListenerFocus)).ToSharedRef();
// Set protected member so FBaseAttenuationSettingsCustomization knows how to make attenuation settings editable
bIsAttenuatedHandle = PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, bAttenuate)).ToSharedRef();
LayoutBuilder.AddPropertyToCategory(bIsAttenuatedHandle)
.Visibility(IsAttenuationOverriddenVisibleAttribute());
FBaseAttenuationSettingsCustomization::CustomizeChildren(StructPropertyHandle, ChildBuilder, StructCustomizationUtils);
LayoutBuilder.AddPropertyToCategory(bIsSpatializedHandle)
.Visibility(IsAttenuationOverriddenVisibleAttribute());
// Check to see if a spatialization plugin is enabled
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, SpatializationAlgorithm)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsSpatializationEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, BinauralRadius)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsSpatializationEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, NonSpatializedRadiusStart)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsSpatializationEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, NonSpatializedRadiusEnd)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsSpatializationEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, NonSpatializedRadiusMode)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsSpatializationEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, StereoSpread)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsSpatializationEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, bApplyNormalizationToStereoSounds)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsSpatializationEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, bAttenuateWithLPF)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(IsAttenuationOverriddenAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, bEnableListenerFocus)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(IsAttenuationOverriddenAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, LPFRadiusMin)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsAirAbsorptionEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, LPFRadiusMax)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsAirAbsorptionEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, LPFFrequencyAtMin)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsAirAbsorptionEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, LPFFrequencyAtMax)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsAirAbsorptionEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, HPFFrequencyAtMin)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsAirAbsorptionEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, HPFFrequencyAtMax)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsAirAbsorptionEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, bEnableLogFrequencyScaling)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsAirAbsorptionEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(AbsorptionMethodHandle)
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsAirAbsorptionEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, CustomLowpassAirAbsorptionCurve)))
.Visibility(TAttribute<EVisibility>(this, &FSoundAttenuationSettingsCustomization::IsCustomAirAbsorptionCurveSelected))
.EditCondition(GetIsAirAbsorptionEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, CustomHighpassAirAbsorptionCurve)))
.Visibility(TAttribute<EVisibility>(this, &FSoundAttenuationSettingsCustomization::IsCustomAirAbsorptionCurveSelected))
.EditCondition(GetIsAirAbsorptionEnabledAttribute(), nullptr);
// Add the reverb send enabled handle
LayoutBuilder.AddPropertyToCategory(bIsReverbSendEnabledHandle)
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(IsAttenuationOverriddenAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(ReverbSendMethodHandle)
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsReverbSendEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, ReverbWetLevelMin)))
.Visibility(TAttribute<EVisibility>(this, &FSoundAttenuationSettingsCustomization::IsLinearMethodSelected))
.EditCondition(GetIsReverbSendEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, ReverbWetLevelMax)))
.Visibility(TAttribute<EVisibility>(this, &FSoundAttenuationSettingsCustomization::IsLinearMethodSelected))
.EditCondition(GetIsReverbSendEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, CustomReverbSendCurve)))
.Visibility(TAttribute<EVisibility>(this, &FSoundAttenuationSettingsCustomization::IsCustomReverbSendCurveSelected))
.EditCondition(GetIsReverbSendEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, ReverbDistanceMin)))
.Visibility(TAttribute<EVisibility>(this, &FSoundAttenuationSettingsCustomization::IsLinearOrCustomReverbMethodSelected))
.EditCondition(GetIsReverbSendEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, ReverbDistanceMax)))
.Visibility(TAttribute<EVisibility>(this, &FSoundAttenuationSettingsCustomization::IsLinearOrCustomReverbMethodSelected))
.EditCondition(GetIsReverbSendEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, ManualReverbSendLevel)))
.Visibility(TAttribute<EVisibility>(this, &FSoundAttenuationSettingsCustomization::IsManualReverbSendSelected))
.EditCondition(GetIsReverbSendEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, FocusAzimuth)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsFocusEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, NonFocusAzimuth)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsFocusEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, FocusDistanceScale)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsFocusEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, NonFocusDistanceScale)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsFocusEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, FocusPriorityScale)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsFocusEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, NonFocusPriorityScale)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsFocusEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, FocusVolumeAttenuation)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsFocusEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, NonFocusVolumeAttenuation)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsFocusEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, bEnableFocusInterpolation)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsFocusEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, FocusAttackInterpSpeed)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsFocusEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, FocusReleaseInterpSpeed)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsFocusEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(bIsOcclusionEnabledHandle)
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(IsAttenuationOverriddenAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, OcclusionTraceChannel)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsOcclusionEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, OcclusionLowPassFilterFrequency)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsOcclusionEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, OcclusionVolumeAttenuation)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsOcclusionEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, OcclusionInterpolationTime)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsOcclusionEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, bUseComplexCollisionForOcclusion)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsOcclusionEnabledAttribute(), nullptr);
// Add the attenuation priority
LayoutBuilder.AddPropertyToCategory(bIsPriorityAttenuationEnabledHandle)
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(IsAttenuationOverriddenAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PriorityAttenuationMethodHandle)
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsPriorityAttenuationEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, PriorityAttenuationMin)))
.Visibility(TAttribute<EVisibility>(this, &FSoundAttenuationSettingsCustomization::IsPriorityAttenuationLinearMethodSelected))
.EditCondition(GetIsPriorityAttenuationEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, PriorityAttenuationMax)))
.Visibility(TAttribute<EVisibility>(this, &FSoundAttenuationSettingsCustomization::IsPriorityAttenuationLinearMethodSelected))
.EditCondition(GetIsPriorityAttenuationEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, CustomPriorityAttenuationCurve)))
.Visibility(TAttribute<EVisibility>(this, &FSoundAttenuationSettingsCustomization::IsCustomPriorityAttenuationCurveSelected))
.EditCondition(GetIsPriorityAttenuationEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, PriorityAttenuationDistanceMin)))
.Visibility(TAttribute<EVisibility>(this, &FSoundAttenuationSettingsCustomization::IsLinearOrCustomPriorityAttenuationSelected))
.EditCondition(GetIsPriorityAttenuationEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, PriorityAttenuationDistanceMax)))
.Visibility(TAttribute<EVisibility>(this, &FSoundAttenuationSettingsCustomization::IsLinearOrCustomPriorityAttenuationSelected))
.EditCondition(GetIsPriorityAttenuationEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, ManualPriorityAttenuation)))
.Visibility(TAttribute<EVisibility>(this, &FSoundAttenuationSettingsCustomization::IsManualPriorityAttenuationSelected))
.EditCondition(GetIsPriorityAttenuationEnabledAttribute(), nullptr);
// Add the submix send priority
LayoutBuilder.AddPropertyToCategory(bIsSubmixSendAttenuationEnabledHandle)
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(IsAttenuationOverriddenAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, SubmixSendSettings)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(GetIsSubmixSendAttenuationEnabledAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, bEnableSourceDataOverride)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(IsAttenuationOverriddenAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, bEnableSendToAudioLink)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(IsAttenuationOverriddenAttribute(), nullptr);
LayoutBuilder.AddPropertyToCategory(PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, AudioLinkSettingsOverride)))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(IsAttenuationOverriddenAttribute(), nullptr);
TSharedPtr<IPropertyHandle> PluginProperty = PropertyHandles.FindChecked(GET_MEMBER_NAME_CHECKED(FSoundAttenuationSettings, PluginSettings));
uint32 NumPluginChildren = 0;
PluginProperty->GetNumChildren(NumPluginChildren);
for (uint32 i = 0; i < NumPluginChildren; ++i)
{
LayoutBuilder.AddPropertyToCategory(PluginProperty->GetChildHandle(i))
.Visibility(IsAttenuationOverriddenVisibleAttribute())
.EditCondition(IsAttenuationOverriddenAttribute(), nullptr);
}
// Set category display names
LayoutBuilder.EditCategory("AttenuationDistance", LOCTEXT("AttenuationVolume", "Attenuation (Volume)"));
LayoutBuilder.EditCategory("AttenuationSpatialization", LOCTEXT("AttenuationSpatialization", "Attenuation (Spatialization)"));
LayoutBuilder.EditCategory("AttenuationOcclusion", LOCTEXT("AttenuationOcclusion", "Attenuation (Occlusion)"));
LayoutBuilder.EditCategory("AttenuationSubmixSend", LOCTEXT("AttenuationSubmixSend", "Attenuation (Submix)"));
LayoutBuilder.EditCategory("AttenuationReverbSend", LOCTEXT("AttenuationReverbSend", "Attenuation (Reverb)"));
LayoutBuilder.EditCategory("AttenuationListenerFocus", LOCTEXT("AttenuationListenerFocus", "Attenuation (Focus)"));
LayoutBuilder.EditCategory("AttenuationPriority", LOCTEXT("AttenuationPriority", "Attenuation (Priority)"));
LayoutBuilder.EditCategory("AttenuationAirAbsorption", LOCTEXT("AttenuationAirAbsorption", "Attenuation (Air Absorption)"));
LayoutBuilder.EditCategory("AttenuationPluginSettings", LOCTEXT("AttenuationPluginSettings", "Attenuation (Plugin Settings)"));
LayoutBuilder.EditCategory("AttenuationSourceDataOverride", LOCTEXT("AttenuationSourceDataOverride", "Attenuation (Source Data Override)"));
LayoutBuilder.EditCategory("AttenuationAudioLink", LOCTEXT("AttenuationAudioLink", "Attenuation (AudioLink)"));
LayoutBuilder.SortCategories(AttenuationSettingsUtils::SortCategories);
if (PropertyHandles.Num() != 70)
{
ensureMsgf(false, TEXT("Unexpected property handle(s) customizing FSoundAttenuationSettings. %d handles found"), PropertyHandles.Num());
}
}
void FForceFeedbackAttenuationSettingsCustomization::CustomizeHeader(TSharedRef<IPropertyHandle> PropertyHandle, class FDetailWidgetRow& HeaderRow, IPropertyTypeCustomizationUtils& CustomizationUtils)
{
// Property handle here is the base struct. We are going to hide it since we're showing it's properties directly.
PropertyHandle->MarkHiddenByCustomization();
}
void FForceFeedbackAttenuationSettingsCustomization::CustomizeChildren(TSharedRef<IPropertyHandle> StructPropertyHandle, class IDetailChildrenBuilder& ChildBuilder, IPropertyTypeCustomizationUtils& StructCustomizationUtils)
{
FBaseAttenuationSettingsCustomization::CustomizeChildren(StructPropertyHandle, ChildBuilder, StructCustomizationUtils);
uint32 NumChildren;
StructPropertyHandle->GetNumChildren(NumChildren);
TMap<FName, TSharedPtr<IPropertyHandle>> PropertyHandles;
for(uint32 ChildIndex = 0; ChildIndex <NumChildren; ++ChildIndex)
{
TSharedRef<IPropertyHandle> ChildHandle = StructPropertyHandle->GetChildHandle(ChildIndex).ToSharedRef();
const FName PropertyName = ChildHandle->GetProperty()->GetFName();
PropertyHandles.Add(PropertyName, ChildHandle);
}
TSharedPtr<FPropertyRestriction> EnumRestriction = MakeShareable(new FPropertyRestriction(LOCTEXT("NoNaturalSound", "Natural Sound is only available for Sound Attenuation")));
const UEnum* const AttenuationDistanceModelEnum = StaticEnum<EAttenuationDistanceModel>();
EnumRestriction->AddHiddenValue(AttenuationDistanceModelEnum->GetNameStringByValue((uint8)EAttenuationDistanceModel::NaturalSound));
DistanceAlgorithmHandle->AddRestriction(EnumRestriction.ToSharedRef());
if (PropertyHandles.Num() != 10)
{
FString PropertyList;
for (auto It(PropertyHandles.CreateConstIterator()); It; ++It)
{
PropertyList += It.Key().ToString() + TEXT(", ");
}
ensureMsgf(false, TEXT("Unexpected property handle(s) customizing FForceFeedbackAttenuationSettings: %s"), *PropertyList);
}
}
TAttribute<bool> FSoundAttenuationSettingsCustomization::GetIsFocusEnabledAttribute() const
{
TWeakPtr<IPropertyHandle> bOverrideAttenuationPropertyWeakPtr = bOverrideAttenuationHandle;
TWeakPtr<IPropertyHandle> bIsFocusedPropertyWeakPtr = bIsFocusedHandle;
auto Lambda = [bOverrideAttenuationPropertyWeakPtr, bIsFocusedPropertyWeakPtr]()
{
TSharedPtr<IPropertyHandle> bOverrideAttenuationProperty = bOverrideAttenuationPropertyWeakPtr.Pin();
TSharedPtr<IPropertyHandle> bIsFocusedProperty = bIsFocusedPropertyWeakPtr.Pin();
bool Value = AttenuationSettingsUtils::GetValue(bOverrideAttenuationProperty);
Value &= AttenuationSettingsUtils::GetValue(bIsFocusedProperty);
return Value;
};
return TAttribute<bool>::Create(TAttribute<bool>::FGetter::CreateLambda(Lambda));
}
TAttribute<bool> FSoundAttenuationSettingsCustomization::GetIsOcclusionEnabledAttribute() const
{
TWeakPtr<IPropertyHandle> bOverrideAttenuationPropertyWeakPtr = bOverrideAttenuationHandle;
TWeakPtr<IPropertyHandle> bIsOcclusionPropertyWeakPtr = bIsOcclusionEnabledHandle;
auto Lambda = [bOverrideAttenuationPropertyWeakPtr, bIsOcclusionPropertyWeakPtr]()
{
TSharedPtr<IPropertyHandle> bOverrideAttenuationProperty = bOverrideAttenuationPropertyWeakPtr.Pin();
TSharedPtr<IPropertyHandle> bOcclusionProperty = bIsOcclusionPropertyWeakPtr.Pin();
bool Value = AttenuationSettingsUtils::GetValue(bOverrideAttenuationProperty);
Value &= AttenuationSettingsUtils::GetValue(bOcclusionProperty);
return Value;
};
return TAttribute<bool>::Create(TAttribute<bool>::FGetter::CreateLambda(Lambda));
}
TAttribute<bool> FSoundAttenuationSettingsCustomization::GetIsSpatializationEnabledAttribute() const
{
TWeakPtr<IPropertyHandle> bOverrideAttenuationPropertyWeakPtr = bOverrideAttenuationHandle;
TWeakPtr<IPropertyHandle> bIsSpatializedHandleWeakPtr = bIsSpatializedHandle;
auto Lambda = [bOverrideAttenuationPropertyWeakPtr, bIsSpatializedHandleWeakPtr]()
{
TSharedPtr<IPropertyHandle> bOverrideAttenuationProperty = bOverrideAttenuationPropertyWeakPtr.Pin();
TSharedPtr<IPropertyHandle> bIsSpatializedProperty = bIsSpatializedHandleWeakPtr.Pin();
bool Value = AttenuationSettingsUtils::GetValue(bOverrideAttenuationProperty);
Value &= AttenuationSettingsUtils::GetValue(bIsSpatializedProperty);
return Value;
};
return TAttribute<bool>::Create(TAttribute<bool>::FGetter::CreateLambda(Lambda));
}
TAttribute<bool> FSoundAttenuationSettingsCustomization::GetIsAirAbsorptionEnabledAttribute() const
{
TWeakPtr<IPropertyHandle> bOverrideAttenuationPropertyWeakPtr = bOverrideAttenuationHandle;
TWeakPtr<IPropertyHandle> bIsAirAbsorptionHandleWeakPtr = bIsAirAbsorptionEnabledHandle;
auto Lambda = [bOverrideAttenuationPropertyWeakPtr, bIsAirAbsorptionHandleWeakPtr]()
{
TSharedPtr<IPropertyHandle> bOverrideAttenuationProperty = bOverrideAttenuationPropertyWeakPtr.Pin();
TSharedPtr<IPropertyHandle> bIsAirAbsorptionProperty = bIsAirAbsorptionHandleWeakPtr.Pin();
bool Value = AttenuationSettingsUtils::GetValue(bOverrideAttenuationProperty);
Value &= AttenuationSettingsUtils::GetValue(bIsAirAbsorptionProperty);
return Value;
};
return TAttribute<bool>::Create(TAttribute<bool>::FGetter::CreateLambda(Lambda));
}
TAttribute<bool> FSoundAttenuationSettingsCustomization::GetIsReverbSendEnabledAttribute() const
{
TWeakPtr<IPropertyHandle> bOverrideAttenuationPropertyWeakPtr = bOverrideAttenuationHandle;
TWeakPtr<IPropertyHandle> bIsReverbSendWeakPtr = bIsReverbSendEnabledHandle;
auto Lambda = [bOverrideAttenuationPropertyWeakPtr, bIsReverbSendWeakPtr]()
{
TSharedPtr<IPropertyHandle> bOverrideAttenuationProperty = bOverrideAttenuationPropertyWeakPtr.Pin();
TSharedPtr<IPropertyHandle> bIsReverbSendProperty = bIsReverbSendWeakPtr.Pin();
bool Value = AttenuationSettingsUtils::GetValue(bOverrideAttenuationProperty);
Value &= AttenuationSettingsUtils::GetValue(bIsReverbSendProperty);
return Value;
};
return TAttribute<bool>::Create(TAttribute<bool>::FGetter::CreateLambda(Lambda));
}
TAttribute<bool> FSoundAttenuationSettingsCustomization::GetIsPriorityAttenuationEnabledAttribute() const
{
TWeakPtr<IPropertyHandle> bOverrideAttenuationPropertyWeakPtr = bOverrideAttenuationHandle;
TWeakPtr<IPropertyHandle> bIsPriorityAttenuationEnabledWeakPtr = bIsPriorityAttenuationEnabledHandle;
auto Lambda = [bOverrideAttenuationPropertyWeakPtr, bIsPriorityAttenuationEnabledWeakPtr]()
{
TSharedPtr<IPropertyHandle> bOverrideAttenuationProperty = bOverrideAttenuationPropertyWeakPtr.Pin();
TSharedPtr<IPropertyHandle> bIsPriorityAttenuationEnabledProperty = bIsPriorityAttenuationEnabledWeakPtr.Pin();
bool Value = AttenuationSettingsUtils::GetValue(bOverrideAttenuationProperty);
Value &= AttenuationSettingsUtils::GetValue(bIsPriorityAttenuationEnabledProperty);
return Value;
};
return TAttribute<bool>::Create(TAttribute<bool>::FGetter::CreateLambda(Lambda));
}
TAttribute<bool> FSoundAttenuationSettingsCustomization::GetIsSubmixSendAttenuationEnabledAttribute() const
{
TWeakPtr<IPropertyHandle> bOverrideAttenuationPropertyWeakPtr = bOverrideAttenuationHandle;
TWeakPtr<IPropertyHandle> bIsSubmixSendWeakPtr = bIsSubmixSendAttenuationEnabledHandle;
auto Lambda = [bOverrideAttenuationPropertyWeakPtr, bIsSubmixSendWeakPtr]()
{
TSharedPtr<IPropertyHandle> bOverrideAttenuationProperty = bOverrideAttenuationPropertyWeakPtr.Pin();
TSharedPtr<IPropertyHandle> bIsSubmixSendAttenuationEnabledProperty = bIsSubmixSendWeakPtr.Pin();
bool Value = AttenuationSettingsUtils::GetValue(bOverrideAttenuationProperty);
Value &= AttenuationSettingsUtils::GetValue(bIsSubmixSendAttenuationEnabledProperty);
return Value;
};
return TAttribute<bool>::Create(TAttribute<bool>::FGetter::CreateLambda(Lambda));
}
EVisibility FSoundAttenuationSettingsCustomization::IsLinearMethodSelected() const
{
if (!AttenuationSettingsUtils::GetValue(bOverrideAttenuationHandle))
{
return EVisibility::Hidden;
}
uint8 SendMethodValue;
ReverbSendMethodHandle->GetValue(SendMethodValue);
const EReverbSendMethod SendMethodType = (EReverbSendMethod)SendMethodValue;
return (SendMethodType == EReverbSendMethod::Linear ? EVisibility::Visible : EVisibility::Hidden);
}
EVisibility FSoundAttenuationSettingsCustomization::IsCustomReverbSendCurveSelected() const
{
if (!AttenuationSettingsUtils::GetValue(bOverrideAttenuationHandle))
{
return EVisibility::Hidden;
}
uint8 SendMethodValue;
ReverbSendMethodHandle->GetValue(SendMethodValue);
const EReverbSendMethod SendMethodType = (EReverbSendMethod)SendMethodValue;
return (SendMethodType == EReverbSendMethod::CustomCurve ? EVisibility::Visible : EVisibility::Hidden);
}
EVisibility FSoundAttenuationSettingsCustomization::IsCustomAirAbsorptionCurveSelected() const
{
if (!AttenuationSettingsUtils::GetValue(bOverrideAttenuationHandle))
{
return EVisibility::Hidden;
}
uint8 MethodValue;
AbsorptionMethodHandle->GetValue(MethodValue);
const EAirAbsorptionMethod MethodType = (EAirAbsorptionMethod)MethodValue;
return (MethodType == EAirAbsorptionMethod::CustomCurve ? EVisibility::Visible : EVisibility::Hidden);
}
EVisibility FSoundAttenuationSettingsCustomization::IsLinearOrCustomReverbMethodSelected() const
{
if (!AttenuationSettingsUtils::GetValue(bOverrideAttenuationHandle))
{
return EVisibility::Hidden;
}
uint8 SendMethodValue;
ReverbSendMethodHandle->GetValue(SendMethodValue);
const EReverbSendMethod SendMethodType = (EReverbSendMethod)SendMethodValue;
return (SendMethodType != EReverbSendMethod::Manual ? EVisibility::Visible : EVisibility::Hidden);
}
EVisibility FSoundAttenuationSettingsCustomization::IsManualReverbSendSelected() const
{
if (!AttenuationSettingsUtils::GetValue(bOverrideAttenuationHandle))
{
return EVisibility::Hidden;
}
uint8 SendMethodValue;
ReverbSendMethodHandle->GetValue(SendMethodValue);
const EReverbSendMethod SendMethodType = (EReverbSendMethod)SendMethodValue;
return (SendMethodType == EReverbSendMethod::Manual ? EVisibility::Visible : EVisibility::Hidden);
}
EVisibility FSoundAttenuationSettingsCustomization::IsPriorityAttenuationLinearMethodSelected() const
{
if (!AttenuationSettingsUtils::GetValue(bOverrideAttenuationHandle))
{
return EVisibility::Hidden;
}
uint8 Value;
PriorityAttenuationMethodHandle->GetValue(Value);
const EPriorityAttenuationMethod MethodType = (EPriorityAttenuationMethod)Value;
return (MethodType == EPriorityAttenuationMethod::Linear ? EVisibility::Visible : EVisibility::Hidden);
}
EVisibility FSoundAttenuationSettingsCustomization::IsCustomPriorityAttenuationCurveSelected() const
{
if (!AttenuationSettingsUtils::GetValue(bOverrideAttenuationHandle))
{
return EVisibility::Hidden;
}
uint8 Value;
PriorityAttenuationMethodHandle->GetValue(Value);
const EPriorityAttenuationMethod MethodType = (EPriorityAttenuationMethod)Value;
return (MethodType == EPriorityAttenuationMethod::CustomCurve ? EVisibility::Visible : EVisibility::Hidden);
}
EVisibility FSoundAttenuationSettingsCustomization::IsLinearOrCustomPriorityAttenuationSelected() const
{
if (!AttenuationSettingsUtils::GetValue(bOverrideAttenuationHandle))
{
return EVisibility::Hidden;
}
uint8 Value;
PriorityAttenuationMethodHandle->GetValue(Value);
const EPriorityAttenuationMethod MethodType = (EPriorityAttenuationMethod)Value;
return (MethodType != EPriorityAttenuationMethod::Manual ? EVisibility::Visible : EVisibility::Hidden);
}
EVisibility FSoundAttenuationSettingsCustomization::IsManualPriorityAttenuationSelected() const
{
if (!AttenuationSettingsUtils::GetValue(bOverrideAttenuationHandle))
{
return EVisibility::Hidden;
}
uint8 Value;
PriorityAttenuationMethodHandle->GetValue(Value);
const EPriorityAttenuationMethod MethodType = (EPriorityAttenuationMethod)Value;
return (MethodType == EPriorityAttenuationMethod::Manual ? EVisibility::Visible : EVisibility::Hidden);
}
EVisibility FBaseAttenuationSettingsCustomization::IsConeSelected() const
{
if (!AttenuationSettingsUtils::GetValue(bOverrideAttenuationHandle))
{
return EVisibility::Hidden;
}
uint8 AttenuationShapeValue;
AttenuationShapeHandle->GetValue(AttenuationShapeValue);
const EAttenuationShape::Type AttenuationShape = (EAttenuationShape::Type)AttenuationShapeValue;
return (AttenuationShape == EAttenuationShape::Cone ? EVisibility::Visible : EVisibility::Hidden);
}
EVisibility FBaseAttenuationSettingsCustomization::IsSphereSelected() const
{
if (!AttenuationSettingsUtils::GetValue(bOverrideAttenuationHandle))
{
return EVisibility::Hidden;
}
uint8 AttenuationShapeValue;
AttenuationShapeHandle->GetValue(AttenuationShapeValue);
const EAttenuationShape::Type AttenuationShape = (EAttenuationShape::Type)AttenuationShapeValue;
return (AttenuationShape == EAttenuationShape::Sphere ? EVisibility::Visible : EVisibility::Hidden);
}
EVisibility FBaseAttenuationSettingsCustomization::IsBoxSelected() const
{
if (!AttenuationSettingsUtils::GetValue(bOverrideAttenuationHandle))
{
return EVisibility::Hidden;
}
uint8 AttenuationShapeValue;
AttenuationShapeHandle->GetValue(AttenuationShapeValue);
const EAttenuationShape::Type AttenuationShape = (EAttenuationShape::Type)AttenuationShapeValue;
return (AttenuationShape == EAttenuationShape::Box ? EVisibility::Visible : EVisibility::Hidden);
}
EVisibility FBaseAttenuationSettingsCustomization::IsCapsuleSelected() const
{
if (!AttenuationSettingsUtils::GetValue(bOverrideAttenuationHandle))
{
return EVisibility::Hidden;
}
uint8 AttenuationShapeValue;
AttenuationShapeHandle->GetValue(AttenuationShapeValue);
const EAttenuationShape::Type AttenuationShape = (EAttenuationShape::Type)AttenuationShapeValue;
return (AttenuationShape == EAttenuationShape::Capsule ? EVisibility::Visible : EVisibility::Hidden);
}
EVisibility FBaseAttenuationSettingsCustomization::IsNaturalSoundSelected() const
{
if (!AttenuationSettingsUtils::GetValue(bOverrideAttenuationHandle))
{
return EVisibility::Hidden;
}
uint8 DistanceAlgorithmValue;
DistanceAlgorithmHandle->GetValue(DistanceAlgorithmValue);
const EAttenuationDistanceModel DistanceAlgorithm = (EAttenuationDistanceModel)DistanceAlgorithmValue;
return (DistanceAlgorithm == EAttenuationDistanceModel::NaturalSound ? EVisibility::Visible : EVisibility::Hidden);
}
EVisibility FBaseAttenuationSettingsCustomization::IsCustomCurveSelected() const
{
if (!AttenuationSettingsUtils::GetValue(bOverrideAttenuationHandle))
{
return EVisibility::Hidden;
}
uint8 DistanceAlgorithmValue;
DistanceAlgorithmHandle->GetValue(DistanceAlgorithmValue);
const EAttenuationDistanceModel DistanceAlgorithm = (EAttenuationDistanceModel)DistanceAlgorithmValue;
return (DistanceAlgorithm == EAttenuationDistanceModel::Custom ? EVisibility::Visible : EVisibility::Hidden);
}
#undef LOCTEXT_NAMESPACE