// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved. #include "PolishBuildingsPrivatePCH.h" #include "SBuildingsProxyDialog.h" #include "Dialogs/DlgPickAssetPath.h" #include "SNumericEntryBox.h" #include "STextComboBox.h" #include "BuildingsProxyTool/BuildingsProxyTool.h" #define LOCTEXT_NAMESPACE "SBuildingsProxyDialog" void SBuildingsProxyDialog::Construct(const FArguments& InArgs, FBuildingsProxyTool* InTool) { Tool = InTool; check(Tool != nullptr); CuttingPlaneOptions.Add(MakeShareable(new FString(TEXT("+X")))); CuttingPlaneOptions.Add(MakeShareable(new FString(TEXT("+Y")))); CuttingPlaneOptions.Add(MakeShareable(new FString(TEXT("+Z")))); CuttingPlaneOptions.Add(MakeShareable(new FString(TEXT("-X")))); CuttingPlaneOptions.Add(MakeShareable(new FString(TEXT("-Y")))); CuttingPlaneOptions.Add(MakeShareable(new FString(TEXT("-Z")))); TextureResolutionOptions.Add(MakeShareable(new FString(TEXT("64")))); TextureResolutionOptions.Add(MakeShareable(new FString(TEXT("128")))); TextureResolutionOptions.Add(MakeShareable(new FString(TEXT("256")))); TextureResolutionOptions.Add(MakeShareable(new FString(TEXT("512")))); TextureResolutionOptions.Add(MakeShareable(new FString(TEXT("1024")))); TextureResolutionOptions.Add(MakeShareable(new FString(TEXT("2048")))); CreateLayout(); } BEGIN_SLATE_FUNCTION_BUILD_OPTIMIZATION void SBuildingsProxyDialog::CreateLayout() { int32 TextureResEntryIndex = FindTextureResolutionEntryIndex( Tool->ProxySettings.MaterialSettings.TextureSize.X ); int32 LightMapResEntryIndex = FindTextureResolutionEntryIndex( Tool->ProxySettings.LightMapResolution ); TextureResEntryIndex = FMath::Max( TextureResEntryIndex, 0 ); LightMapResEntryIndex = FMath::Max( LightMapResEntryIndex, 0 ); this->ChildSlot [ SNew(SVerticalBox) +SVerticalBox::Slot() .AutoHeight() .HAlign(HAlign_Center) .VAlign(VAlign_Center) .Padding(10) [ // Simplygon logo SNew(SImage) .Image(FEditorStyle::GetBrush("BuildingsProxy.SimplygonLogo")) ] +SVerticalBox::Slot() .AutoHeight() [ SNew(SBorder) .BorderImage(FEditorStyle::GetBrush("ToolPanel.GroupBorder")) [ // Proxy options SNew(SVerticalBox) +SVerticalBox::Slot() .AutoHeight() .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) [ SNew(SHorizontalBox) +SHorizontalBox::Slot() .FillWidth(0.5f) .VAlign(VAlign_Center) [ SNew(STextBlock) .Text(LOCTEXT("OnScreenSizeLabel", "On Screen Size (pixels)")) .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) .ToolTipText( GetPropertyToolTipText( GET_MEMBER_NAME_CHECKED( FMeshProxySettings, ScreenSize ) ) ) ] + SHorizontalBox::Slot() .FillWidth(0.5f) .HAlign(HAlign_Left) .VAlign(VAlign_Center) [ SNew(SBox) .HAlign(HAlign_Fill) .MinDesiredWidth(100.0f) .MaxDesiredWidth(100.0f) [ SNew(SNumericEntryBox) .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) .MinValue(40) .MaxValue(1200) .MinSliderValue(40) .MaxSliderValue(1200) .AllowSpin(true) .Value(this, &SBuildingsProxyDialog::GetScreenSize) .OnValueChanged(this, &SBuildingsProxyDialog::ScreenSizeChanged) ] ] ] +SVerticalBox::Slot() .AutoHeight() .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) [ SNew(SHorizontalBox) +SHorizontalBox::Slot() .FillWidth(0.5f) .VAlign(VAlign_Center) [ SNew(STextBlock) .Text(LOCTEXT("MergeDistanceLabel", "Merge Distance (pixels)")) .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) .ToolTipText( GetPropertyToolTipText( GET_MEMBER_NAME_CHECKED( FMeshProxySettings, MergeDistance ) ) ) ] + SHorizontalBox::Slot() .FillWidth(0.5f) .HAlign(HAlign_Left) .VAlign(VAlign_Center) [ SNew(SBox) .HAlign(HAlign_Fill) .MinDesiredWidth(100.0f) .MaxDesiredWidth(100.0f) [ SNew(SNumericEntryBox) .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) .MinValue(0) .MaxValue(300) .MinSliderValue(0) .MaxSliderValue(300) .AllowSpin(true) .Value(this, &SBuildingsProxyDialog::GetMergeDistance) .OnValueChanged(this, &SBuildingsProxyDialog::MergeDistanceChanged) ] ] ] +SVerticalBox::Slot() .AutoHeight() .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) [ SNew(SHorizontalBox) +SHorizontalBox::Slot() .FillWidth(0.5f) .VAlign(VAlign_Center) [ SNew(STextBlock) .Text(LOCTEXT("TextureResolutionLabel", "Texture Resolution")) .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) ] + SHorizontalBox::Slot() .FillWidth(0.5f) .HAlign(HAlign_Left) .VAlign(VAlign_Center) [ SNew(STextComboBox) .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) .OptionsSource(&TextureResolutionOptions) .InitiallySelectedItem( TextureResolutionOptions[TextureResEntryIndex] ) .OnSelectionChanged(this, &SBuildingsProxyDialog::SetTextureResolution) ] ] +SVerticalBox::Slot() .AutoHeight() .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) [ SNew( SHorizontalBox ) + SHorizontalBox::Slot() .FillWidth( 0.5f ) .VAlign( VAlign_Center ) [ SNew(STextBlock) .Text( LOCTEXT( "LightMapResolutionLabel", "LightMap Resolution" ) ) .Font( FEditorStyle::GetFontStyle( "StandardDialog.SmallFont" ) ) .ToolTipText( GetPropertyToolTipText( GET_MEMBER_NAME_CHECKED( FMeshProxySettings, LightMapResolution ) ) ) ] + SHorizontalBox::Slot() .FillWidth( 0.5f ) .HAlign( HAlign_Left ) .VAlign( VAlign_Center ) [ SNew( STextComboBox ) .Font( FEditorStyle::GetFontStyle( "StandardDialog.SmallFont" ) ) .OptionsSource( &TextureResolutionOptions ) .InitiallySelectedItem( TextureResolutionOptions[LightMapResEntryIndex] ) .OnSelectionChanged( this, &SBuildingsProxyDialog::SetLightMapResolution ) ] ] +SVerticalBox::Slot() .AutoHeight() .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) [ SNew(SHorizontalBox) +SHorizontalBox::Slot() .FillWidth(0.5f) .VAlign(VAlign_Center) .Padding(0.0, 0.0, 3.0, 0.0) [ SNew( STextBlock ) .Text( LOCTEXT( "HardAngleLabel", "Hard Edge Angle" ) ) .Font( FEditorStyle::GetFontStyle( "StandardDialog.SmallFont" ) ) .ToolTipText( GetPropertyToolTipText( GET_MEMBER_NAME_CHECKED( FMeshProxySettings, HardAngleThreshold ) ) ) ] +SHorizontalBox::Slot() .FillWidth(0.5f) .HAlign(HAlign_Left) .VAlign(VAlign_Center) [ SNew(SBox) .HAlign(HAlign_Fill) .MinDesiredWidth(100.0f) .MaxDesiredWidth(100.0f) [ SNew(SNumericEntryBox) .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) .MinValue(0.f) .MaxValue(180.f) .MinSliderValue(0.f) .MaxSliderValue(180.f) .AllowSpin(true) .Value(this, &SBuildingsProxyDialog::GetHardAngleThreshold) .OnValueChanged(this, &SBuildingsProxyDialog::HardAngleThresholdChanged) .IsEnabled(this, &SBuildingsProxyDialog::HardAngleThresholdEnabled) ] ] ] +SVerticalBox::Slot() .AutoHeight() .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) [ SNew(SCheckBox) .Type(ESlateCheckBoxType::CheckBox) .IsChecked( this, &SBuildingsProxyDialog::GetRecalculateNormals ) .OnCheckStateChanged( this, &SBuildingsProxyDialog::SetRecalculateNormals ) .Content() [ SNew( STextBlock ) .Text( LOCTEXT( "RecalcNormalsLabel", "Recalculate Normals" ) ) .Font( FEditorStyle::GetFontStyle( "StandardDialog.SmallFont" ) ) .ToolTipText( GetPropertyToolTipText( GET_MEMBER_NAME_CHECKED( FMeshProxySettings, bRecalculateNormals ) ) ) ] ] + SVerticalBox::Slot() .AutoHeight() .Padding( FEditorStyle::GetMargin( "StandardDialog.ContentPadding" ) ) [ SNew( SCheckBox ) .Type( ESlateCheckBoxType::CheckBox ) .IsChecked(this, &SBuildingsProxyDialog::GetUseClippingPlane) .OnCheckStateChanged(this, &SBuildingsProxyDialog::SetUseClippingPlane) .Content() [ SNew(STextBlock) .Text(LOCTEXT("ClippingPlaneLabel", "Use Clipping Plane")) .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) ] ] +SVerticalBox::Slot() .AutoHeight() .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) [ SNew(SHorizontalBox) +SHorizontalBox::Slot() .VAlign(VAlign_Center) .FillWidth(0.5f) [ SNew(SHorizontalBox) +SHorizontalBox::Slot() .AutoWidth() [ SNew(SBox) .MinDesiredWidth(30) [ SNullWidget::NullWidget ] ] +SHorizontalBox::Slot() .AutoWidth() .HAlign(HAlign_Left) [ SNew(STextBlock) .IsEnabled(this, &SBuildingsProxyDialog::UseClippingPlaneEnabled) .Text(LOCTEXT("ClippingAxisLabel", "Clipping Axis")) .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) .ToolTipText( GetPropertyToolTipText( GET_MEMBER_NAME_CHECKED( FMeshProxySettings, AxisIndex ) ) ) ] ] +SHorizontalBox::Slot() .FillWidth(0.5f) .HAlign(HAlign_Left) .VAlign(VAlign_Center) .Padding(8.0, 0.0, 8.0, 0.0) [ SNew(STextComboBox) .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) .OptionsSource(&CuttingPlaneOptions) .InitiallySelectedItem(CuttingPlaneOptions[0]) .OnSelectionChanged(this, &SBuildingsProxyDialog::SetClippingAxis) .IsEnabled(this, &SBuildingsProxyDialog::UseClippingPlaneEnabled) ] ] +SVerticalBox::Slot() .AutoHeight() .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) [ SNew(SHorizontalBox) +SHorizontalBox::Slot() .FillWidth(0.5f) .VAlign(VAlign_Center) .Padding(0.0, 0.0, 3.0, 0.0) [ SNew(SHorizontalBox) +SHorizontalBox::Slot() .AutoWidth() [ SNew(SBox) .MinDesiredWidth(30) [ SNullWidget::NullWidget ] ] +SHorizontalBox::Slot() .HAlign(HAlign_Left) .AutoWidth() [ SNew(STextBlock) .Text(LOCTEXT("PlaneLevelLabel", "Plane level")) .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) .IsEnabled(this, &SBuildingsProxyDialog::UseClippingPlaneEnabled) .ToolTipText( GetPropertyToolTipText( GET_MEMBER_NAME_CHECKED( FMeshProxySettings, ClippingLevel ) ) ) ] ] +SHorizontalBox::Slot() .FillWidth(0.5f) .HAlign(HAlign_Left) [ SNew(SBox) .HAlign(HAlign_Fill) .MinDesiredWidth(100.0f) .MaxDesiredWidth(100.0f) [ SNew(SNumericEntryBox) .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) .Value(this, &SBuildingsProxyDialog::GetClippingLevel) .OnValueChanged(this, &SBuildingsProxyDialog::ClippingLevelChanged) .IsEnabled(this, &SBuildingsProxyDialog::UseClippingPlaneEnabled) ] ] ] +SVerticalBox::Slot() .AutoHeight() .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) [ SNew(SCheckBox) .Type(ESlateCheckBoxType::CheckBox) .IsChecked(this, &SBuildingsProxyDialog::GetExportNormalMap) .OnCheckStateChanged(this, &SBuildingsProxyDialog::SetExportNormalMap) .Content() [ SNew(STextBlock) .Text(LOCTEXT("ExportNormalMapLabel", "Export Normal Map")) .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) ] ] +SVerticalBox::Slot() .AutoHeight() .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) [ SNew(SCheckBox) .Type(ESlateCheckBoxType::CheckBox) .IsChecked(this, &SBuildingsProxyDialog::GetExportMetallicMap) .OnCheckStateChanged(this, &SBuildingsProxyDialog::SetExportMetallicMap) .Content() [ SNew(STextBlock) .Text(LOCTEXT("ExportMetallicMapLabel", "Export Metallic Map")) .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) ] ] +SVerticalBox::Slot() .AutoHeight() .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) [ SNew(SCheckBox) .Type(ESlateCheckBoxType::CheckBox) .IsChecked(this, &SBuildingsProxyDialog::GetExportRoughnessMap) .OnCheckStateChanged(this, &SBuildingsProxyDialog::SetExportRoughnessMap) .Content() [ SNew(STextBlock) .Text(LOCTEXT("ExportRoughnessMapLabel", "Export Roughness Map")) .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) ] ] +SVerticalBox::Slot() .AutoHeight() .Padding(FEditorStyle::GetMargin("StandardDialog.ContentPadding")) [ SNew(SCheckBox) .Type(ESlateCheckBoxType::CheckBox) .IsChecked(this, &SBuildingsProxyDialog::GetExportSpecularMap) .OnCheckStateChanged(this, &SBuildingsProxyDialog::SetExportSpecularMap) .Content() [ SNew(STextBlock) .Text(LOCTEXT("ExportSpecularMapLabel", "Export Specular Map")) .Font(FEditorStyle::GetFontStyle("StandardDialog.SmallFont")) ] ] ] ] ]; } END_SLATE_FUNCTION_BUILD_OPTIMIZATION int32 SBuildingsProxyDialog::FindTextureResolutionEntryIndex( int32 InResolution ) const { FString ResolutionStr = TTypeToString::ToString( InResolution ); int32 Result = TextureResolutionOptions.IndexOfByPredicate( [&]( const TSharedPtr& Entry ) { return ( ResolutionStr == *Entry ); } ); return Result; } FText SBuildingsProxyDialog::GetPropertyToolTipText( const FName& PropertyName ) const { UProperty* Property = FMeshProxySettings::StaticStruct()->FindPropertyByName( PropertyName ); if ( Property ) { return Property->GetToolTipText(); } return FText::GetEmpty(); } //Screen size TOptional SBuildingsProxyDialog::GetScreenSize() const { return Tool->ProxySettings.ScreenSize; } void SBuildingsProxyDialog::ScreenSizeChanged(int32 NewValue) { Tool->ProxySettings.ScreenSize = NewValue; } //Recalculate normals ECheckBoxState SBuildingsProxyDialog::GetRecalculateNormals() const { return Tool->ProxySettings.bRecalculateNormals ? ECheckBoxState::Checked: ECheckBoxState::Unchecked; } void SBuildingsProxyDialog::SetRecalculateNormals(ECheckBoxState NewValue) { Tool->ProxySettings.bRecalculateNormals = (NewValue == ECheckBoxState::Checked); } //Hard Angle Threshold bool SBuildingsProxyDialog::HardAngleThresholdEnabled() const { if(Tool->ProxySettings.bRecalculateNormals) { return true; } return false; } TOptional SBuildingsProxyDialog::GetHardAngleThreshold() const { return Tool->ProxySettings.HardAngleThreshold; } void SBuildingsProxyDialog::HardAngleThresholdChanged(float NewValue) { Tool->ProxySettings.HardAngleThreshold = NewValue; } //Merge Distance TOptional SBuildingsProxyDialog::GetMergeDistance() const { return Tool->ProxySettings.MergeDistance; } void SBuildingsProxyDialog::MergeDistanceChanged(int32 NewValue) { Tool->ProxySettings.MergeDistance = NewValue; } //Clipping Plane ECheckBoxState SBuildingsProxyDialog::GetUseClippingPlane() const { return Tool->ProxySettings.bUseClippingPlane ? ECheckBoxState::Checked: ECheckBoxState::Unchecked; } void SBuildingsProxyDialog::SetUseClippingPlane(ECheckBoxState NewValue) { Tool->ProxySettings.bUseClippingPlane = (NewValue == ECheckBoxState::Checked); } bool SBuildingsProxyDialog::UseClippingPlaneEnabled() const { if(Tool->ProxySettings.bUseClippingPlane) { return true; } return false; } void SBuildingsProxyDialog::SetClippingAxis(TSharedPtr NewSelection, ESelectInfo::Type SelectInfo ) { //This is a ugly hack, but it solves the problem for now int32 AxisIndex = CuttingPlaneOptions.Find(NewSelection); //FMessageDialog::Debugf(*FString::Printf(TEXT("%d"), AxisIndex )); if(AxisIndex < 3) { Tool->ProxySettings.bPlaneNegativeHalfspace = false; Tool->ProxySettings.AxisIndex = AxisIndex; return; } else { Tool->ProxySettings.bPlaneNegativeHalfspace = true; Tool->ProxySettings.AxisIndex = AxisIndex - 3; return; } } TOptional SBuildingsProxyDialog::GetClippingLevel() const { return Tool->ProxySettings.ClippingLevel; } void SBuildingsProxyDialog::ClippingLevelChanged(float NewValue) { Tool->ProxySettings.ClippingLevel = NewValue; } //Texture Resolution void SBuildingsProxyDialog::SetTextureResolution(TSharedPtr NewSelection, ESelectInfo::Type SelectInfo) { int32 Resolution = 512; TTypeFromString::FromString(Resolution, **NewSelection); FIntPoint TextureSize(Resolution, Resolution); Tool->ProxySettings.MaterialSettings.TextureSize = TextureSize; } void SBuildingsProxyDialog::SetLightMapResolution( TSharedPtr NewSelection, ESelectInfo::Type SelectInfo ) { int32 Resolution = 256; TTypeFromString::FromString( Resolution, **NewSelection ); Tool->ProxySettings.LightMapResolution = Resolution; } ECheckBoxState SBuildingsProxyDialog::GetExportNormalMap() const { return Tool->ProxySettings.MaterialSettings.bNormalMap ? ECheckBoxState::Checked : ECheckBoxState::Unchecked; } void SBuildingsProxyDialog::SetExportNormalMap(ECheckBoxState NewValue) { Tool->ProxySettings.MaterialSettings.bNormalMap = ( NewValue == ECheckBoxState::Checked ); } ECheckBoxState SBuildingsProxyDialog::GetExportMetallicMap() const { return Tool->ProxySettings.MaterialSettings.bMetallicMap ? ECheckBoxState::Checked : ECheckBoxState::Unchecked; } void SBuildingsProxyDialog::SetExportMetallicMap(ECheckBoxState NewValue) { Tool->ProxySettings.MaterialSettings.bMetallicMap = ( NewValue == ECheckBoxState::Checked ); } ECheckBoxState SBuildingsProxyDialog::GetExportRoughnessMap() const { return Tool->ProxySettings.MaterialSettings.bRoughnessMap ? ECheckBoxState::Checked : ECheckBoxState::Unchecked; } void SBuildingsProxyDialog::SetExportRoughnessMap(ECheckBoxState NewValue) { Tool->ProxySettings.MaterialSettings.bRoughnessMap = ( NewValue == ECheckBoxState::Checked ); } ECheckBoxState SBuildingsProxyDialog::GetExportSpecularMap() const { return Tool->ProxySettings.MaterialSettings.bSpecularMap ? ECheckBoxState::Checked : ECheckBoxState::Unchecked; } void SBuildingsProxyDialog::SetExportSpecularMap(ECheckBoxState NewValue) { Tool->ProxySettings.MaterialSettings.bSpecularMap = ( NewValue == ECheckBoxState::Checked ); } #undef LOCTEXT_NAMESPACE