// Copyright Epic Games, Inc. All Rights Reserved. #include "MuCOE/CustomizableObjectCustomSettings.h" #include "CustomizableObjectEditor.h" #include "AssetRegistry/AssetRegistryModule.h" #include "Components/SpotLightComponent.h" #include "Framework/Views/TableViewMetadata.h" #include "Misc/Paths.h" #include "MuCOE/CustomizableObjectEditorViewportClient.h" #include "MuCOE/CustomizableObjectEditorViewportLights.h" #include "MuCOE/SCustomizableObjectEditorViewport.h" #include "MuCOE/UnrealEditorPortabilityHelpers.h" #include "PropertyCustomizationHelpers.h" #include "MuCO/CustomizableObject.h" #include "MuCO/CustomizableObjectInstance.h" #include "MuCO/LoadUtils.h" #include "MuCOE/ICustomizableObjectInstanceEditor.h" #include "Subsystems/ImportSubsystem.h" #include "Toolkits/ToolkitManager.h" #include "Widgets/Colors/SColorBlock.h" #include "Widgets/Colors/SColorPicker.h" #include "Widgets/Input/SButton.h" #include "Widgets/Input/SComboButton.h" #include "Widgets/Input/SEditableTextBox.h" #include "Widgets/Input/SNumericEntryBox.h" #include "Widgets/Layout/SExpandableArea.h" #include "Widgets/Views/SListView.h" class ITableRow; class STableViewBase; class SWidget; class UClass; class UFactory; struct FGeometry; const FString SCustomizableObjectCustomSettings::LightPackagePath = "/Game/EditorAssets/Mutable/"; void SCustomizableObjectCustomSettings::Construct(const FArguments& InArgs) { WeakEditor = InArgs._PreviewSettings->GetEditor(); const TSharedPtr Editor = GetEditorChecked(); const TSharedPtr Viewpot = Editor->GetViewport(); WeakViewport = Editor->GetViewport(); TSharedPtr SelectedLight; for (ULightComponent* Light : Viewpot->GetViewportClient()->GetLightComponents()) { TSharedPtr LightName = MakeShareable(new FString(Light->GetName())); LightNames.Add(LightName); if (Light == Editor->GetCustomSettings()->GetSelectedLight()) { SelectedLight = LightName; } } TSharedPtr LightAssetText; // Viewport Lighting AddSlot() .AutoHeight() .Padding(FMargin(0.f, 4.f)) [ SNew(SVerticalBox) + SVerticalBox::Slot() .AutoHeight() .Padding(FMargin(0.f, 0.f, 4.f, 0.f)) [ SNew(SHorizontalBox) + SHorizontalBox::Slot() .AutoWidth() .Padding(FMargin(0.f, 0.f, 4.f, 0.f)) [ SNew(STextBlock) .Font(FSlateFontInfo(FCoreStyle::GetDefaultFont(), 10, "Bold")) .Text(FText::FromString("Lighting")) ] ] + SVerticalBox::Slot() .AutoHeight() .Padding(0.f, 2.f) [ SNew(SHorizontalBox) + SHorizontalBox::Slot() .FillWidth(.2) .VAlign(EVerticalAlignment::VAlign_Center) [ SNew(STextBlock) .Text(FText::FromString("Name: ")) ] + SHorizontalBox::Slot() .FillWidth(0.5) [ SAssignNew(LightsAssetNameInputText, SEditableTextBox) ] + SHorizontalBox::Slot() .FillWidth(.15) [ SNew(SButton) .Text(FText::FromString("Save")) .HAlign(EHorizontalAlignment::HAlign_Center) .OnClicked(this, &SCustomizableObjectCustomSettings::OnSaveViewportLightsAsset) ] + SHorizontalBox::Slot() .FillWidth(.15) [ SNew(SButton) .Text(FText::FromString("New")) .HAlign(EHorizontalAlignment::HAlign_Center) .OnClicked(this, &SCustomizableObjectCustomSettings::OnNewViewportLightsAsset) ] ] + SVerticalBox::Slot() .AutoHeight() .Padding(0.f, 2.f) [ SNew(SHorizontalBox) + SHorizontalBox::Slot() .FillWidth(0.3f) .VAlign(EVerticalAlignment::VAlign_Center) [ SNew(STextBlock) .Text(FText::FromString("Viewport Lights")) ] + SHorizontalBox::Slot() .FillWidth(0.7f) .Padding(0.f, 0.3f, 0.6f, 0.3f) [ SAssignNew(LightComboButton, SComboButton) .ButtonStyle(FAppStyle::Get(), "PropertyEditor.AssetComboStyle") .ForegroundColor(UE_MUTABLE_GET_COLOR("PropertyEditor.AssetName.ColorAndOpacity")) .OnGetMenuContent(this, &SCustomizableObjectCustomSettings::GetLightComboButtonContent) .ContentPadding(2.0f) .ButtonContent() [ SAssignNew(LightAssetText, STextBlock) .TextStyle(FAppStyle::Get(), "PropertyEditor.AssetClass") ] ] ] + SVerticalBox::Slot() .AutoHeight() .Padding(0.f, 2.f) [ SNew(SHorizontalBox) + SHorizontalBox::Slot() .Padding(1.f, 4.f) .FillWidth(0.2f) .VAlign(EVerticalAlignment::VAlign_Center) [ SNew(STextBlock) .Text(FText::FromString("Create:")) ] + SHorizontalBox::Slot() .Padding(1.f, 4.f) .FillWidth(0.4f) [ SNew(SButton) .Text(FText::FromString("Point Light")) .HAlign(EHorizontalAlignment::HAlign_Center) .OnClicked(this, &SCustomizableObjectCustomSettings::OnPointLightAdded) ] + SHorizontalBox::Slot() .Padding(1.f, 4.f) .FillWidth(0.4f) [ SNew(SButton) .Text(FText::FromString("Spot Light")) .HAlign(EHorizontalAlignment::HAlign_Center) .OnClicked(this, &SCustomizableObjectCustomSettings::OnSpotLightAdded) ] ] + SVerticalBox::Slot() .AutoHeight() .Padding(0.f, 2.f) [ SNew(SBorder) .BorderImage(UE_MUTABLE_GET_BRUSH("ToolPanel.GroupBorder")) .Padding(6.f) [ SNew(SVerticalBox) + SVerticalBox::Slot() .AutoHeight() .Padding(4.0f) [ SAssignNew(LightsListView, SListView>) .ListItemsSource(&LightNames) .OnGenerateRow(this, &SCustomizableObjectCustomSettings::OnGenerateWidgetForList) .OnSelectionChanged(this, &SCustomizableObjectCustomSettings::OnListSelectionChanged) .SelectionMode(ESelectionMode::Single) ] + SVerticalBox::Slot() .HAlign(EHorizontalAlignment::HAlign_Right) .AutoHeight() [ SNew(SHorizontalBox) + SHorizontalBox::Slot() .FillWidth(0.5f) [ SNew(SButton) .Text(FText::FromString("Unselect")) .OnClicked(this, &SCustomizableObjectCustomSettings::OnLightUnselected) ] + SHorizontalBox::Slot() .AutoWidth() [ SNew(SButton) .Text(FText::FromString("Remove Selected")) .OnClicked(this, &SCustomizableObjectCustomSettings::OnLightRemoved) ] ] ] ] + SVerticalBox::Slot() .AutoHeight() .Padding(FMargin(0.f, 2.f)) [ SNew(SExpandableArea) .AreaTitle(FText::FromString("Light Properties")) .BodyContent() [ SNew(SVerticalBox) + SVerticalBox::Slot() .AutoHeight() .Padding(0.0f, 3.0f, 6.0f, 3.0f) [ SNew(SHorizontalBox) + SHorizontalBox::Slot() .FillWidth(.65f) .Padding(6.0f, 2.0f, 6.0f, 2.0f) .VAlign(VAlign_Center) [ SNew(STextBlock) .Text(FText::FromString("Brightness")) ] + SHorizontalBox::Slot() .FillWidth(.35f) .Padding(0.0f, 2.0f, 6.0f, 2.0f) .VAlign(VAlign_Center) [ SNew(SNumericEntryBox) .Value(this, &SCustomizableObjectCustomSettings::GetIntensityValue) .MinValue(0.f) .OnValueCommitted(this, &SCustomizableObjectCustomSettings::OnIntensityValueCommited) ] ] + SVerticalBox::Slot() .AutoHeight() .Padding(0.0f, 3.0f, 6.0f, 3.0f) [ SNew(SHorizontalBox) + SHorizontalBox::Slot() .FillWidth(.65f) .Padding(6.0f, 2.0f, 6.0f, 2.0f) .VAlign(VAlign_Center) [ SNew(STextBlock) .Text(FText::FromString("Color")) ] + SHorizontalBox::Slot() .FillWidth(.35) .Padding(0.0f, 2.0f, 6.0f, 2.0f) .VAlign(VAlign_Center) [ SNew(SColorBlock) //.IgnoreAlpha(true) .AlphaDisplayMode(EColorBlockAlphaDisplayMode::Ignore) .Color(this, &SCustomizableObjectCustomSettings::GetLightColorValue) .OnMouseButtonDown(this, &SCustomizableObjectCustomSettings::OnLightColorBlockMouseButtonDown) ] ] + SVerticalBox::Slot() .AutoHeight() .Padding(0.0f, 3.0f, 6.0f, 3.0f) [ SNew(SHorizontalBox) + SHorizontalBox::Slot() .FillWidth(.65f) .Padding(6.0f, 2.0f, 6.0f, 2.0f) .VAlign(VAlign_Center) [ SNew(STextBlock) .Text(FText::FromString("Attenuation Radius")) ] + SHorizontalBox::Slot() .FillWidth(.35f) .Padding(0.0f, 2.0f, 6.0f, 2.0f) .VAlign(VAlign_Center) [ SNew(SNumericEntryBox) .Value(this, &SCustomizableObjectCustomSettings::GetAttenuationRadius) .MinValue(0.f) .OnValueCommitted(this, &SCustomizableObjectCustomSettings::OnAttenuationRadiusValueCommited) ] ] ] ] + SVerticalBox::Slot() .AutoHeight() .Padding(0.f, 2.f) [ SAssignNew(PointLightProperties, SExpandableArea) .AreaTitle(FText::FromString("Point Light Properties")) .Visibility(EVisibility::HitTestInvisible) .InitiallyCollapsed(true) .BodyContent() [ SNew(SVerticalBox) + SVerticalBox::Slot() .AutoHeight() .Padding(0.0f, 3.0f, 6.0f, 3.0f) [ SNew(SHorizontalBox) + SHorizontalBox::Slot() .FillWidth(.65f) .Padding(6.0f, 2.0f, 6.0f, 2.0f) .VAlign(VAlign_Center) [ SNew(STextBlock) .Text(FText::FromString("Source Radius")) ] + SHorizontalBox::Slot() .FillWidth(.35f) .Padding(0.0f, 2.0f, 6.0f, 2.0f) .VAlign(VAlign_Center) [ SNew(SNumericEntryBox) .Value(this, &SCustomizableObjectCustomSettings::GetLightSourceRadius) .MinValue(0.f) .OnValueCommitted(this, &SCustomizableObjectCustomSettings::OnLightSourceRadiusValueCommited) ] ] + SVerticalBox::Slot() .AutoHeight() .Padding(0.0f, 3.0f, 6.0f, 3.0f) [ SNew(SHorizontalBox) + SHorizontalBox::Slot() .FillWidth(.65f) .Padding(6.0f, 2.0f, 6.0f, 2.0f) .VAlign(VAlign_Center) [ SNew(STextBlock) .Text(FText::FromString("Source Length")) ] + SHorizontalBox::Slot() .FillWidth(.35f) .Padding(0.0f, 2.0f, 6.0f, 2.0f) .VAlign(VAlign_Center) [ SNew(SNumericEntryBox) .Value(this, &SCustomizableObjectCustomSettings::GetLightSourceLength) .MinValue(0.f) .OnValueCommitted(this, &SCustomizableObjectCustomSettings::OnLightSourceLengthValueCommited) ] ] ] ] + SVerticalBox::Slot() .AutoHeight() .Padding(0.f, 2.f) [ SAssignNew(SpotLightProperties, SExpandableArea) .AreaTitle(FText::FromString("Spot Light Properties")) .Visibility(EVisibility::HitTestInvisible) .InitiallyCollapsed(true) .BodyContent() [ SNew(SVerticalBox) + SVerticalBox::Slot() .AutoHeight() .Padding(0.0f, 3.0f, 6.0f, 3.0f) [ SNew(SHorizontalBox) + SHorizontalBox::Slot() .FillWidth(.65f) .Padding(6.0f, 2.0f, 6.0f, 2.0f) .VAlign(VAlign_Center) [ SNew(STextBlock) .Text(FText::FromString("Inner Cone Angle")) ] + SHorizontalBox::Slot() .FillWidth(.35f) .Padding(0.0f, 2.0f, 6.0f, 2.0f) .VAlign(VAlign_Center) [ SNew(SNumericEntryBox) .Value(this, &SCustomizableObjectCustomSettings::GetLightInnerConeAngle) .MinValue(0.f) .OnValueCommitted(this, &SCustomizableObjectCustomSettings::OnLightInnerConeAngleValueCommited) ] ] + SVerticalBox::Slot() .AutoHeight() .Padding(0.0f, 3.0f, 6.0f, 3.0f) [ SNew(SHorizontalBox) + SHorizontalBox::Slot() .FillWidth(.65f) .Padding(6.0f, 2.0f, 6.0f, 2.0f) .VAlign(VAlign_Center) [ SNew(STextBlock) .Text(FText::FromString("Outer Cone Angle")) ] + SHorizontalBox::Slot() .FillWidth(.35f) .Padding(0.0f, 2.0f, 6.0f, 2.0f) .VAlign(VAlign_Center) [ SNew(SNumericEntryBox) .Value(this, &SCustomizableObjectCustomSettings::GetLightOuterConeAngle) .MinValue(0.f) .OnValueCommitted(this, &SCustomizableObjectCustomSettings::OnLightOuterConeAngleValueCommited) ] ] ] ] ]; if (const UCustomizableObjectEditorViewportLights* LightPreset = Editor->GetCustomSettings()->GetLightsPreset()) { const FText Name = FText::FromString(LightPreset->GetName()); LightAssetText->SetText(Name); LightsAssetNameInputText->SetText(Name); } else { LightAssetText->SetText(FText::FromString("No Asset Selected")); LightsAssetNameInputText->SetText(FText::FromString("Default Viewport Lights")); } if (SelectedLight) { LightsListView->SetSelection(SelectedLight); } } void SCustomizableObjectCustomSettings::SetViewportLightsByAsset(const FAssetData& InAsset) { const TSharedPtr Editor = GetEditorChecked(); const TSharedPtr Viewport = WeakViewport.Pin(); if (!Viewport) { return; } UCustomizableObjectEditorViewportLights* InLights = Cast(MutablePrivate::LoadObject(InAsset)); if (!InLights) { return; } Editor->GetCustomSettings()->SetLightsPreset(*InLights); OnNewViewportLightsAsset(); for (FViewportLightData& LightData : InLights->LightsData) { UPointLightComponent* NewLight = nullptr; if (LightData.bIsSpotLight) { USpotLightComponent* SpotLight = NewObject(); SpotLight->SetInnerConeAngle(LightData.InnerConeAngle); SpotLight->SetOuterConeAngle(LightData.OuterConeAngle); NewLight = SpotLight; } else { NewLight = NewObject(); } NewLight->SetWorldTransform(LightData.Transform); NewLight->SetIntensity(LightData.Intensity); NewLight->SetLightColor(LightData.Color); NewLight->SetAttenuationRadius(LightData.AttenuationRadius); NewLight->SetSourceLength(LightData.SourceLength); NewLight->SetSourceRadius(LightData.SourceRadius); Viewport->GetViewportClient()->AddLightToScene(NewLight); LightNames.Add(MakeShareable(new FString(NewLight->GetName()))); } Editor->HideGizmoLight(); } TSharedRef SCustomizableObjectCustomSettings::GetLightComboButtonContent() { const TSharedPtr Editor = GetEditorChecked(); TArray filterClasses; filterClasses.Add(UCustomizableObjectEditorViewportLights::StaticClass()); return PropertyCustomizationHelpers::MakeAssetPickerWithMenu( FAssetData(Editor->GetCustomSettings()->GetLightsPreset()), true, filterClasses, TArray(), FOnShouldFilterAsset(), FOnAssetSelected::CreateSP(this, &SCustomizableObjectCustomSettings::SetViewportLightsByAsset), FSimpleDelegate::CreateSP(this, &SCustomizableObjectCustomSettings::CloseLightComboButtonContent)); } void SCustomizableObjectCustomSettings::CloseLightComboButtonContent() { if (!LightComboButton.IsValid()) { return; } LightComboButton->SetIsOpen(false); } FReply SCustomizableObjectCustomSettings::OnSaveViewportLightsAsset() const { const TSharedPtr Editor = GetEditorChecked(); const TSharedPtr Viewport = WeakViewport.Pin(); if (!Viewport) { return FReply::Handled(); } FString ObjName = LightsAssetNameInputText->GetText().ToString(); if (ObjName.IsEmpty() || ObjName == "None") { return FReply::Unhandled(); } RemoveRestrictedChars(ObjName); FString PackageName = LightPackagePath + ObjName; UCustomizableObjectEditorViewportLights* ViewportLights = nullptr; bool bExistingAsset = false; if (UPackage* ExistingPackage = FindPackage(NULL, *PackageName)) { UObject* ExistingObject = ExistingPackage ? StaticFindObject(UCustomizableObjectEditorViewportLights::StaticClass(), ExistingPackage, *ObjName) : nullptr; ViewportLights = ExistingObject ? Cast(ExistingObject) : nullptr; if (ViewportLights) { ViewportLights->LightsData.Empty(); bExistingAsset = true; } } if (!ViewportLights) { ViewportLights = NewObject(CreatePackage(*PackageName), *ObjName, RF_Standalone | RF_Public); } if (ViewportLights) { for (ULightComponent* Light : Viewport->GetViewportClient()->GetLightComponents()) { FViewportLightData& NewData = ViewportLights->LightsData.AddDefaulted_GetRef(); if (const UPointLightComponent* PointLight = Cast(Light)) { NewData.Intensity = PointLight->Intensity; NewData.Color = PointLight->LightColor; NewData.AttenuationRadius = PointLight->AttenuationRadius; NewData.Transform = PointLight->GetComponentTransform(); NewData.SourceLength = PointLight->SourceLength; NewData.SourceRadius = PointLight->SourceRadius; } if (const USpotLightComponent* SpotLight = Cast(Light)) { NewData.bIsSpotLight = true; NewData.InnerConeAngle = SpotLight->InnerConeAngle; NewData.OuterConeAngle = SpotLight->OuterConeAngle; } } ViewportLights->MarkPackageDirty(); if (!bExistingAsset) { FAssetRegistryModule::AssetCreated(ViewportLights); } } return FReply::Handled(); } FReply SCustomizableObjectCustomSettings::OnNewViewportLightsAsset() const { const TSharedPtr Editor = GetEditorChecked(); const TSharedPtr Viewport = WeakViewport.Pin(); if (!Viewport) { return FReply::Handled(); } Viewport->GetViewportClient()->RemoveAllLightsFromScene(); Editor->HideGizmoLight(); return FReply::Handled(); } FReply SCustomizableObjectCustomSettings::OnPointLightAdded() const { const TSharedPtr Editor = GetEditorChecked(); const TSharedPtr Viewport = WeakViewport.Pin(); if (!Viewport) { return FReply::Handled(); } UPointLightComponent* Component = NewObject(GetTransientPackage(), NAME_None, RF_Transactional); Viewport->GetViewportClient()->AddLightToScene(Component); Editor->ShowGizmoLight(*Component); return FReply::Handled(); } FReply SCustomizableObjectCustomSettings::OnSpotLightAdded() const { const TSharedPtr Editor = GetEditorChecked(); const TSharedPtr Viewport = WeakViewport.Pin(); if (!Viewport) { return FReply::Handled(); } USpotLightComponent* Component = NewObject(); Viewport->GetViewportClient()->AddLightToScene(Component); Editor->ShowGizmoLight(*Component); return FReply::Handled(); } FReply SCustomizableObjectCustomSettings::OnLightRemoved() const { const TSharedPtr Editor = GetEditorChecked(); const TSharedPtr Viewport = WeakViewport.Pin(); if (!Viewport) { return FReply::Handled(); } const TArray> SelectedItems = LightsListView->GetSelectedItems(); if (!SelectedItems.Num()) { return FReply::Handled(); } const int32 LightIndex = LightNames.Find(SelectedItems[0]); // Delete Light from ViewportClient if (ULightComponent* LightToRemove = Viewport->GetViewportClient()->GetLightComponents()[LightIndex]) { Viewport->GetViewportClient()->RemoveLightFromScene(LightToRemove); LightToRemove->DestroyComponent(); } Editor->HideGizmoLight(); return FReply::Handled(); } FReply SCustomizableObjectCustomSettings::OnLightUnselected() { const TSharedPtr Editor = GetEditorChecked(); const TArray> SelectedItems = LightsListView->GetSelectedItems(); if (!SelectedItems.Num()) { return FReply::Handled(); } Editor->HideGizmoLight(); return FReply::Handled(); } TSharedRef SCustomizableObjectCustomSettings::OnGenerateWidgetForList(TSharedPtr Item, const TSharedRef& OwnerTable) { return SNew(STableRow>, OwnerTable) .Padding(FMargin(0.2f, 0.1f, 0.2f, 0.1f)) [ SNew(STextBlock) .Text(FText::FromString(*Item.Get())) ]; } void SCustomizableObjectCustomSettings::OnListSelectionChanged(TSharedPtr Selection, ESelectInfo::Type SelectInfo) { const TSharedPtr Editor = GetEditorChecked(); SpotLightProperties->SetVisibility(EVisibility::HitTestInvisible); SpotLightProperties->SetExpanded(false); PointLightProperties->SetVisibility(EVisibility::HitTestInvisible); PointLightProperties->SetExpanded(false); TArray> SelectedItems = LightsListView->GetSelectedItems(); if (SelectedItems.Num() != 1) { return; } const TSharedPtr Viewport = WeakViewport.Pin(); if (!Viewport) { return; } const int32 LightIndex = LightNames.Find(SelectedItems[0]); ULightComponent* SelectedLight = Viewport->GetViewportClient()->GetLightComponents()[LightIndex]; Editor->ShowGizmoLight(*SelectedLight); if (Cast(SelectedLight)) { SpotLightProperties->SetVisibility(EVisibility::Visible); SpotLightProperties->SetExpanded(true); } else { SpotLightProperties->SetExpanded(false); SpotLightProperties->SetVisibility(EVisibility::HitTestInvisible); } PointLightProperties->SetVisibility(EVisibility::Visible); PointLightProperties->SetExpanded(true); } TOptional SCustomizableObjectCustomSettings::GetIntensityValue() const { const TSharedPtr Editor = GetEditorChecked(); ULightComponent* SelectedLight = Editor->GetCustomSettings()->GetSelectedLight(); return (SelectedLight) ? SelectedLight->Intensity : 1.0f; } void SCustomizableObjectCustomSettings::OnIntensityValueCommited(float Value, ETextCommit::Type CommitType) { const TSharedPtr Editor = GetEditorChecked(); ULightComponent* SelectedLight = Editor->GetCustomSettings()->GetSelectedLight(); if (SelectedLight && CommitType != ETextCommit::OnCleared) { SelectedLight->SetIntensity(Value); } } FLinearColor SCustomizableObjectCustomSettings::GetLightColorValue() const { const TSharedPtr Editor = GetEditorChecked(); const ULightComponent* SelectedLight = Editor->GetCustomSettings()->GetSelectedLight(); return (SelectedLight) ? SelectedLight->LightColor : FLinearColor::White; } FReply SCustomizableObjectCustomSettings::OnLightColorBlockMouseButtonDown(const FGeometry& MyGeometry, const FPointerEvent& MouseEvent) { if (MouseEvent.GetEffectingButton() != EKeys::LeftMouseButton) { return FReply::Unhandled(); } FColorPickerArgs args; args.bIsModal = true; args.bUseAlpha = false; args.bOnlyRefreshOnMouseUp = false; args.InitialColor = GetLightColorValue(); args.OnColorCommitted = FOnLinearColorValueChanged::CreateSP(this, &SCustomizableObjectCustomSettings::OnSetLightColorFromColorPicker); OpenColorPicker(args); return FReply::Handled(); } void SCustomizableObjectCustomSettings::OnSetLightColorFromColorPicker(FLinearColor InColor) { const TSharedPtr Editor = GetEditorChecked(); if (ULightComponent* SelectedLight = Editor->GetCustomSettings()->GetSelectedLight()) { SelectedLight->SetLightColor(InColor); } } TOptional SCustomizableObjectCustomSettings::GetAttenuationRadius() const { const TSharedPtr Editor = GetEditorChecked(); ULightComponent* SelectedLight = Editor->GetCustomSettings()->GetSelectedLight(); if (const UPointLightComponent* PointLight = Cast(SelectedLight)) { return PointLight->AttenuationRadius; } return 0.f; } void SCustomizableObjectCustomSettings::OnAttenuationRadiusValueCommited(float Value, ETextCommit::Type CommitType) { const TSharedPtr Editor = GetEditorChecked(); ULightComponent* SelectedLight = Editor->GetCustomSettings()->GetSelectedLight(); if (UPointLightComponent* PointLight = Cast(SelectedLight)) { PointLight->SetAttenuationRadius(Value); } } TOptional SCustomizableObjectCustomSettings::GetLightSourceRadius() const { const TSharedPtr Editor = GetEditorChecked(); ULightComponent* SelectedLight = Editor->GetCustomSettings()->GetSelectedLight(); if (const UPointLightComponent* PointLight = Cast(SelectedLight)) { return PointLight->SourceRadius; } return 0.f; } void SCustomizableObjectCustomSettings::OnLightSourceRadiusValueCommited(float Value, ETextCommit::Type CommitType) { const TSharedPtr Editor = GetEditorChecked(); ULightComponent* SelectedLight = Editor->GetCustomSettings()->GetSelectedLight(); if (UPointLightComponent* PointLight = Cast(SelectedLight)) { PointLight->SetSourceRadius(Value); } } TOptional SCustomizableObjectCustomSettings::GetLightSourceLength() const { const TSharedPtr Editor = GetEditorChecked(); ULightComponent* SelectedLight = Editor->GetCustomSettings()->GetSelectedLight(); if (const UPointLightComponent* PointLight = Cast(SelectedLight)) { return PointLight->SourceLength; } return 0.f; } void SCustomizableObjectCustomSettings::OnLightSourceLengthValueCommited(float Value, ETextCommit::Type CommitType) { const TSharedPtr Editor = GetEditorChecked(); ULightComponent* SelectedLight = Editor->GetCustomSettings()->GetSelectedLight(); if (UPointLightComponent* PointLight = Cast(SelectedLight)) { PointLight->SetSourceLength(Value); } } TOptional SCustomizableObjectCustomSettings::GetLightInnerConeAngle() const { const TSharedPtr Editor = GetEditorChecked(); ULightComponent* SelectedLight = Editor->GetCustomSettings()->GetSelectedLight(); if (const USpotLightComponent* SpotLight = Cast(SelectedLight)) { return SpotLight->InnerConeAngle; } return 0.f; } void SCustomizableObjectCustomSettings::OnLightInnerConeAngleValueCommited(float Value, ETextCommit::Type CommitType) { const TSharedPtr Editor = GetEditorChecked(); ULightComponent* SelectedLight = Editor->GetCustomSettings()->GetSelectedLight(); if (USpotLightComponent* SpotLight = Cast(SelectedLight)) { SpotLight->SetInnerConeAngle(Value); } } TOptional SCustomizableObjectCustomSettings::GetLightOuterConeAngle() const { const TSharedPtr Editor = GetEditorChecked(); ULightComponent* SelectedLight = Editor->GetCustomSettings()->GetSelectedLight(); if (const USpotLightComponent* SpotLight = Cast(SelectedLight)) { return SpotLight->OuterConeAngle; } return 0.f; } void SCustomizableObjectCustomSettings::OnLightOuterConeAngleValueCommited(float Value, ETextCommit::Type CommitType) { const TSharedPtr Editor = GetEditorChecked(); ULightComponent* SelectedLight = Editor->GetCustomSettings()->GetSelectedLight(); if (USpotLightComponent* SpotLight = Cast(SelectedLight)) { SpotLight->SetOuterConeAngle(Value); } } TSharedPtr SCustomizableObjectCustomSettings::GetEditorChecked() const { const TSharedPtr Editor = WeakEditor.Pin(); check(Editor); return Editor; }