Add custom material option to Material Preview.

This commit is contained in:
Menotdan
2023-10-23 22:08:50 -04:00
parent 9c4382dffb
commit 8982961254

View File

@@ -7,6 +7,9 @@ using FlaxEngine.GUI;
using FlaxEditor.Viewport.Widgets;
using FlaxEditor.GUI.ContextMenu;
using Object = FlaxEngine.Object;
using FlaxEditor.CustomEditors.Editors;
using FlaxEditor.GUI;
using FlaxEditor.Scripting;
namespace FlaxEditor.Viewport.Previews
{
@@ -49,6 +52,8 @@ namespace FlaxEditor.Viewport.Previews
private Image _guiMaterialControl;
private readonly MaterialBase[] _postFxMaterialsCache = new MaterialBase[1];
private ContextMenu _modelWidgetButtonMenu;
private AssetPicker _customModelPicker;
private Model _customModel;
/// <summary>
/// Gets or sets the material asset to preview. It can be <see cref="FlaxEngine.Material"/> or <see cref="FlaxEngine.MaterialInstance"/>.
@@ -74,15 +79,72 @@ namespace FlaxEditor.Viewport.Previews
get => _selectedModelIndex;
set
{
if (value == -1) // Using Custom Model
{
return;
}
if (value < 0 || value > Models.Length)
throw new ArgumentOutOfRangeException();
if (_customModelPicker != null)
{
_customModelPicker.SelectedAsset = null;
}
_selectedModelIndex = value;
_previewModel.Model = FlaxEngine.Content.LoadAsyncInternal<Model>("Editor/Primitives/" + Models[value]);
_previewModel.Transform = Transforms[value];
}
}
// Used to automatically update which entry is checked.
// TODO: Maybe a better system with predicate bool checks could be used?
private void ResetModelContextMenu()
{
_modelWidgetButtonMenu.ItemsContainer.DisposeChildren();
// Fill out all models
for (int i = 0; i < Models.Length; i++)
{
var index = i;
var button = _modelWidgetButtonMenu.AddButton(Models[index]);
button.ButtonClicked += _ => SelectedModelIndex = index;
button.Checked = SelectedModelIndex == index && _customModel == null;
button.Tag = index;
}
_modelWidgetButtonMenu.AddSeparator();
_customModelPicker = new AssetPicker(new ScriptType(typeof(Model)), Float2.Zero);
// Label Button
var customModelPickerLabel = _modelWidgetButtonMenu.AddButton("Custom Model:");
customModelPickerLabel.CloseMenuOnClick = false;
customModelPickerLabel.Checked = _customModel != null;
// Container button
var customModelPickerButton = _modelWidgetButtonMenu.AddButton("");
customModelPickerButton.Height = _customModelPicker.Height + 4;
customModelPickerButton.CloseMenuOnClick = false;
_customModelPicker.Parent = customModelPickerButton;
_customModelPicker.SelectedAsset = _customModel;
_customModelPicker.SelectedItemChanged += () =>
{
_customModel = _customModelPicker.SelectedAsset as Model;
if (_customModelPicker.SelectedAsset == null)
{
SelectedModelIndex = 0;
ResetModelContextMenu();
return;
}
_previewModel.Model = _customModel;
_previewModel.Transform = Transforms[0];
SelectedModelIndex = -1;
ResetModelContextMenu();
};
}
/// <summary>
/// Initializes a new instance of the <see cref="MaterialPreview"/> class.
/// </summary>
@@ -107,17 +169,7 @@ namespace FlaxEditor.Viewport.Previews
{
if (!control.Visible)
return;
_modelWidgetButtonMenu.ItemsContainer.DisposeChildren();
// Fill out all models
for (int i = 0; i < Models.Length; i++)
{
var index = i;
var button = _modelWidgetButtonMenu.AddButton(Models[index]);
button.ButtonClicked += _ => SelectedModelIndex = index;
button.Checked = SelectedModelIndex == index;
button.Tag = index;
}
ResetModelContextMenu();
};
new ViewportWidgetButton("Model", SpriteHandle.Invalid, _modelWidgetButtonMenu)
{