Files
UnrealEngineUWP/Engine/Source/Editor/MeshPaintMode/Private/SPaintModeWidget.cpp
matt kuhlenschmidt 05bee58d80 Fix vertex color mode not showing how much memory instanced vertex colors are taking.
#ROBOMERGE-OWNER: ryan.vance
#ROBOMERGE-AUTHOR: matt.kuhlenschmidt
#ROBOMERGE-SOURCE: CL 5062473 via CL 5062898 via CL 5062961
#ROBOMERGE-BOT: DEVVR (Main -> Dev-VR)

[CL 5139131 by matt kuhlenschmidt in Dev-VR branch]
2019-02-22 05:50:39 -05:00

249 lines
10 KiB
C++

// Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.
#include "SPaintModeWidget.h"
#include "PropertyEditorModule.h"
#include "IDetailsView.h"
#include "Widgets/Layout/SScrollBox.h"
#include "Widgets/SBoxPanel.h"
#include "Widgets/Layout/SWrapBox.h"
#include "Widgets/Layout/SBox.h"
#include "Widgets/Input/SButton.h"
#include "Widgets/Images/SImage.h"
#include "Framework/MultiBox/MultiBoxBuilder.h"
#include "PropertyCustomizationHelpers.h"
#include "PaintModeSettingsCustomization.h"
#include "PaintModePainter.h"
#include "PaintModeSettings.h"
#include "Modules/ModuleManager.h"
#include "PaintModeCommands.h"
#include "DetailLayoutBuilder.h"
#define LOCTEXT_NAMESPACE "PaintModePainter"
void SPaintModeWidget::Construct(const FArguments& InArgs, FPaintModePainter* InPainter)
{
MeshPainter = InPainter;
PaintModeSettings = Cast<UPaintModeSettings>(MeshPainter->GetPainterSettings());
SettingsObjects.Add(MeshPainter->GetBrushSettings());
SettingsObjects.Add(PaintModeSettings);
CreateDetailsView();
FMargin StandardPadding(0.0f, 4.0f, 0.0f, 4.0f);
ChildSlot
[
SNew(SScrollBox)
+ SScrollBox::Slot()
.Padding(0.0f)
[
SNew(SVerticalBox)
/** Toolbar containing buttons to switch between different paint modes */
+ SVerticalBox::Slot()
.AutoHeight()
[
SNew(SBorder)
.BorderImage(FEditorStyle::GetBrush("ToolPanel.GroupBorder"))
.HAlign(HAlign_Center)
[
CreateToolBarWidget()->AsShared()
]
]
/** (Instance) Vertex paint action buttons widget */
+ SVerticalBox::Slot()
.AutoHeight()
[
CreateVertexPaintWidget()->AsShared()
]
/** Texture paint action buttons widget */
+ SVerticalBox::Slot()
.AutoHeight()
[
CreateTexturePaintWidget()->AsShared()
]
+ SVerticalBox::Slot()
.Padding(2.0f, 4.0f)
.HAlign(HAlign_Right)
.AutoHeight()
[
SNew(STextBlock)
.Font(IDetailLayoutBuilder::GetDetailFont())
.Visibility_Lambda([this]() -> EVisibility
{
return PaintModeSettings->PaintMode == EPaintMode::Vertices ? EVisibility::Visible : EVisibility::Collapsed;
})
.Text_Lambda([this]() -> FText
{
if (MeshPainter)
{
return FText::Format(FTextFormat::FromString(TEXT("Instance Color Size: {0} KB")), MeshPainter->GetVertexPaintColorBufferSize() / 1024.f);
}
return FText::GetEmpty();
})
]
/** DetailsView containing brush and paint settings */
+ SVerticalBox::Slot()
.AutoHeight()
[
SettingsDetailsView->AsShared()
]
]
];
}
void SPaintModeWidget::CreateDetailsView()
{
FPropertyEditorModule& EditModule = FModuleManager::Get().GetModuleChecked<FPropertyEditorModule>("PropertyEditor");
FDetailsViewArgs DetailsViewArgs(
/*bUpdateFromSelection=*/ false,
/*bLockable=*/ false,
/*bAllowSearch=*/ false,
FDetailsViewArgs::HideNameArea,
/*bHideSelectionTip=*/ true,
/*InNotifyHook=*/ nullptr,
/*InSearchInitialKeyFocus=*/ false,
/*InViewIdentifier=*/ NAME_None);
DetailsViewArgs.DefaultsOnlyVisibility = EEditDefaultsOnlyNodeVisibility::Automatic;
DetailsViewArgs.bShowOptions = false;
DetailsViewArgs.bAllowMultipleTopLevelObjects = true;
SettingsDetailsView = EditModule.CreateDetailView(DetailsViewArgs);
SettingsDetailsView->SetRootObjectCustomizationInstance(MakeShareable(new FPaintModeSettingsRootObjectCustomization));
SettingsDetailsView->SetObjects(SettingsObjects);
}
TSharedPtr<SWidget> SPaintModeWidget::CreateVertexPaintWidget()
{
FMargin StandardPadding(0.0f, 4.0f, 0.0f, 4.0f);
TSharedPtr<SWidget> VertexColorWidget;
TSharedPtr<SHorizontalBox> VertexColorActionBox;
TSharedPtr<SHorizontalBox> InstanceColorActionBox;
SAssignNew(VertexColorWidget, SVerticalBox)
.Visibility(this, &SPaintModeWidget::IsVertexPaintModeVisible)
+ SVerticalBox::Slot()
.AutoHeight()
.Padding(StandardPadding)
.HAlign(HAlign_Center)
[
SAssignNew(VertexColorActionBox, SHorizontalBox)
]
+ SVerticalBox::Slot()
.AutoHeight()
.Padding(StandardPadding)
.HAlign(HAlign_Center)
[
SAssignNew(InstanceColorActionBox, SHorizontalBox)
];
FToolBarBuilder ColorToolbarBuilder(MeshPainter->GetUICommandList(), FMultiBoxCustomization::None);
ColorToolbarBuilder.SetLabelVisibility(EVisibility::Collapsed);
ColorToolbarBuilder.AddToolBarButton(FPaintModeCommands::Get().Fill, NAME_None, FText::GetEmpty(), TAttribute<FText>(), FSlateIcon(FEditorStyle::GetStyleSetName(), "MeshPaint.Fill"));
ColorToolbarBuilder.AddToolBarButton(FPaintModeCommands::Get().Propagate, NAME_None, FText::GetEmpty(), TAttribute<FText>(), FSlateIcon(FEditorStyle::GetStyleSetName(), "MeshPaint.Propagate"));
ColorToolbarBuilder.AddToolBarButton(FPaintModeCommands::Get().Import, NAME_None, FText::GetEmpty(), TAttribute<FText>(), FSlateIcon(FEditorStyle::GetStyleSetName(), "MeshPaint.Import"));
ColorToolbarBuilder.AddToolBarButton(FPaintModeCommands::Get().Save, NAME_None, FText::GetEmpty(), TAttribute<FText>(), FSlateIcon(FEditorStyle::GetStyleSetName(), "MeshPaint.Save"));
VertexColorActionBox->AddSlot()
.FillWidth(1.0f)
[
ColorToolbarBuilder.MakeWidget()
];
FToolBarBuilder InstanceToolbarBuilder(MeshPainter->GetUICommandList(), FMultiBoxCustomization::None);
InstanceToolbarBuilder.SetLabelVisibility(EVisibility::Collapsed);
InstanceToolbarBuilder.AddToolBarButton(FPaintModeCommands::Get().Copy, NAME_None, FText::GetEmpty(), TAttribute<FText>(), FSlateIcon(FEditorStyle::GetStyleSetName(), "MeshPaint.Copy"));
InstanceToolbarBuilder.AddToolBarButton(FPaintModeCommands::Get().Paste, NAME_None, FText::GetEmpty(), TAttribute<FText>(), FSlateIcon(FEditorStyle::GetStyleSetName(), "MeshPaint.Paste"));
InstanceToolbarBuilder.AddToolBarButton(FPaintModeCommands::Get().Remove, NAME_None, FText::GetEmpty(), TAttribute<FText>(), FSlateIcon(FEditorStyle::GetStyleSetName(), "MeshPaint.Remove"));
InstanceToolbarBuilder.AddToolBarButton(FPaintModeCommands::Get().Fix, NAME_None, FText::GetEmpty(), TAttribute<FText>(), FSlateIcon(FEditorStyle::GetStyleSetName(), "MeshPaint.Fix"));
InstanceToolbarBuilder.AddToolBarButton(FPaintModeCommands::Get().PropagateVertexColorsToLODs, NAME_None, FText::GetEmpty(), TAttribute<FText>(), FSlateIcon(FEditorStyle::GetStyleSetName(), "MeshPaint.Propagate"));
InstanceColorActionBox->AddSlot()
.FillWidth(1.0f)
[
InstanceToolbarBuilder.MakeWidget()
];
return VertexColorWidget->AsShared();
}
TSharedPtr<SWidget> SPaintModeWidget::CreateTexturePaintWidget()
{
FMargin StandardPadding(0.0f, 4.0f, 0.0f, 4.0f);
TSharedPtr<SWidget> TexturePaintWidget;
TSharedPtr<SHorizontalBox> ActionBox;
SAssignNew(TexturePaintWidget, SVerticalBox)
.Visibility(this, &SPaintModeWidget::IsTexturePaintModeVisible)
+ SVerticalBox::Slot()
.AutoHeight()
.Padding(StandardPadding)
.HAlign(HAlign_Center)
[
SAssignNew(ActionBox, SHorizontalBox)
];
FToolBarBuilder TexturePaintToolbarBuilder(MeshPainter->GetUICommandList(), FMultiBoxCustomization::None);
TexturePaintToolbarBuilder.SetLabelVisibility(EVisibility::Collapsed);
TexturePaintToolbarBuilder.AddToolBarButton(FPaintModeCommands::Get().PropagateTexturePaint, NAME_None, FText::GetEmpty(), TAttribute<FText>(), FSlateIcon(FEditorStyle::GetStyleSetName(), "MeshPaint.Propagate"));
TexturePaintToolbarBuilder.AddToolBarButton(FPaintModeCommands::Get().SaveTexturePaint, NAME_None, FText::GetEmpty(), TAttribute<FText>(), FSlateIcon(FEditorStyle::GetStyleSetName(), "MeshPaint.Save"));
ActionBox->AddSlot()
.FillWidth(1.0f)
[
TexturePaintToolbarBuilder.MakeWidget()
];
return TexturePaintWidget->AsShared();
}
TSharedPtr<SWidget> SPaintModeWidget::CreateToolBarWidget()
{
FToolBarBuilder ModeSwitchButtons(MakeShareable(new FUICommandList()), FMultiBoxCustomization::None);
{
FSlateIcon ColorPaintIcon(FEditorStyle::GetStyleSetName(), "LevelEditor.MeshPaintMode.ColorPaint");
ModeSwitchButtons.AddToolBarButton(FUIAction(FExecuteAction::CreateLambda([=]()
{
PaintModeSettings->PaintMode = EPaintMode::Vertices;
PaintModeSettings->VertexPaintSettings.MeshPaintMode = EMeshPaintMode::PaintColors;
SettingsDetailsView->SetObjects(SettingsObjects, true);
}), FCanExecuteAction(), FIsActionChecked::CreateLambda([=]() -> bool { return PaintModeSettings->PaintMode == EPaintMode::Vertices && PaintModeSettings->VertexPaintSettings.MeshPaintMode == EMeshPaintMode::PaintColors; })), NAME_None, LOCTEXT("Mode.VertexColorPainting", "Colors"), LOCTEXT("Mode.VertexColor.Tooltip", "Vertex Color Painting mode allows painting of Vertex Colors"), ColorPaintIcon, EUserInterfaceActionType::ToggleButton);
FSlateIcon WeightPaintIcon(FEditorStyle::GetStyleSetName(), "LevelEditor.MeshPaintMode.WeightPaint");
ModeSwitchButtons.AddToolBarButton(FUIAction(FExecuteAction::CreateLambda([=]()
{
PaintModeSettings->PaintMode = EPaintMode::Vertices;
PaintModeSettings->VertexPaintSettings.MeshPaintMode = EMeshPaintMode::PaintWeights;
SettingsDetailsView->SetObjects(SettingsObjects, true);
}), FCanExecuteAction(), FIsActionChecked::CreateLambda([=]() -> bool { return PaintModeSettings->PaintMode == EPaintMode::Vertices && PaintModeSettings->VertexPaintSettings.MeshPaintMode == EMeshPaintMode::PaintWeights; })), NAME_None, LOCTEXT("Mode.VertexWeightPainting", " Weights"), LOCTEXT("Mode.VertexWeight.Tooltip", "Vertex Weight Painting mode allows painting of Vertex Weights"), WeightPaintIcon, EUserInterfaceActionType::ToggleButton);
FSlateIcon TexturePaintIcon(FEditorStyle::GetStyleSetName(), "LevelEditor.MeshPaintMode.TexturePaint");
ModeSwitchButtons.AddToolBarButton(FUIAction(FExecuteAction::CreateLambda([=]()
{
PaintModeSettings->PaintMode = EPaintMode::Textures;
SettingsDetailsView->SetObjects(SettingsObjects, true);
}), FCanExecuteAction(), FIsActionChecked::CreateLambda([=]() -> bool { return PaintModeSettings->PaintMode == EPaintMode::Textures; })), NAME_None, LOCTEXT("Mode.TexturePainting", "Textures"), LOCTEXT("Mode.Texture.Tooltip", "Texture Weight Painting mode allows painting on Textures"), TexturePaintIcon, EUserInterfaceActionType::ToggleButton);
}
return ModeSwitchButtons.MakeWidget();
}
EVisibility SPaintModeWidget::IsVertexPaintModeVisible() const
{
UPaintModeSettings* MeshPaintSettings = (UPaintModeSettings*)MeshPainter->GetPainterSettings();
return (MeshPaintSettings->PaintMode == EPaintMode::Vertices) ? EVisibility::Visible : EVisibility::Collapsed;
}
EVisibility SPaintModeWidget::IsTexturePaintModeVisible() const
{
UPaintModeSettings* MeshPaintSettings = (UPaintModeSettings*)MeshPainter->GetPainterSettings();
return (MeshPaintSettings->PaintMode == EPaintMode::Textures) ? EVisibility::Visible : EVisibility::Collapsed;
}
#undef LOCTEXT_NAMESPACE // "PaintModePainter"