diff --git a/Source/Editor/Viewport/Previews/AnimatedModelPreview.cs b/Source/Editor/Viewport/Previews/AnimatedModelPreview.cs index aae48fe11..4a1c57757 100644 --- a/Source/Editor/Viewport/Previews/AnimatedModelPreview.cs +++ b/Source/Editor/Viewport/Previews/AnimatedModelPreview.cs @@ -3,8 +3,6 @@ using System; using FlaxEditor.GUI.ContextMenu; using FlaxEngine; -using FlaxEditor.GUI.Input; -using FlaxEngine.GUI; using Object = FlaxEngine.Object; namespace FlaxEditor.Viewport.Previews @@ -15,13 +13,10 @@ namespace FlaxEditor.Viewport.Previews /// public class AnimatedModelPreview : AssetPreview { - /// public AnimatedModel _previewModel; - private ContextMenuButton _showNodesButton, _showBoundsButton, _showFloorButton, _showNodesNamesButton; private bool _showNodes, _showBounds, _showFloor, _showNodesNames; private StaticModel _floorModel; - private bool _playAnimation, _playAnimationOnce; private float _playSpeed = 1.0f; @@ -404,9 +399,9 @@ namespace FlaxEditor.Viewport.Previews } /// - /// Calls SetArcBallView from ViewportCamera + /// Resets the camera to focus on a object. /// - public void CallSetArcBallView() + public void ResetCamera() { ViewportCamera.SetArcBallView(_previewModel.Box); } @@ -417,8 +412,7 @@ namespace FlaxEditor.Viewport.Previews switch (key) { case KeyboardKeys.F: - // Pay respect.. - CallSetArcBallView(); + ResetCamera(); return true; case KeyboardKeys.Spacebar: PlayAnimation = !PlayAnimation; diff --git a/Source/Editor/Viewport/Previews/MaterialPreview.cs b/Source/Editor/Viewport/Previews/MaterialPreview.cs index 3dfab1cff..5520d6c4c 100644 --- a/Source/Editor/Viewport/Previews/MaterialPreview.cs +++ b/Source/Editor/Viewport/Previews/MaterialPreview.cs @@ -48,6 +48,7 @@ namespace FlaxEditor.Viewport.Previews private int _selectedModelIndex; private Image _guiMaterialControl; private readonly MaterialBase[] _postFxMaterialsCache = new MaterialBase[1]; + private ContextMenu _modelWidgetButtonMenu; /// /// Gets or sets the material asset to preview. It can be or . @@ -65,11 +66,6 @@ namespace FlaxEditor.Viewport.Previews } } - /// - /// The "Model" widget button context menu. - /// - private ContextMenu modelWidgetButtonMenu; - /// /// Gets or sets the selected preview model index. /// @@ -87,27 +83,6 @@ namespace FlaxEditor.Viewport.Previews } } - /// - /// Fill out all models - /// - /// - private void ModelWidgetMenuOnVisibleChanged(Control control) - { - 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 += (button) => SelectedModelIndex = index; - button.Checked = SelectedModelIndex == index; - button.Tag = index; - } - } - /// /// Initializes a new instance of the class. /// @@ -127,9 +102,24 @@ namespace FlaxEditor.Viewport.Previews { // Model mode widget var modelMode = new ViewportWidgetsContainer(ViewportWidgetLocation.UpperRight); - modelWidgetButtonMenu = new ContextMenu(); - modelWidgetButtonMenu.VisibleChanged += ModelWidgetMenuOnVisibleChanged; - var previewLODSModeButton = new ViewportWidgetButton("Model", SpriteHandle.Invalid, modelWidgetButtonMenu) + _modelWidgetButtonMenu = new ContextMenu(); + _modelWidgetButtonMenu.VisibleChanged += control => + { + 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; + } + }; + new ViewportWidgetButton("Model", SpriteHandle.Invalid, _modelWidgetButtonMenu) { TooltipText = "Change material model", Parent = modelMode, diff --git a/Source/Editor/Viewport/Previews/ModelBasePreview.cs b/Source/Editor/Viewport/Previews/ModelBasePreview.cs index e5834edc9..e4f1109d4 100644 --- a/Source/Editor/Viewport/Previews/ModelBasePreview.cs +++ b/Source/Editor/Viewport/Previews/ModelBasePreview.cs @@ -1,6 +1,5 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. -using FlaxEditor.GUI.Input; using FlaxEngine; using Object = FlaxEngine.Object; @@ -59,9 +58,9 @@ namespace FlaxEditor.Viewport.Previews } /// - /// Calls SetArcBallView from ViewportCamera + /// Resets the camera to focus on a object. /// - public void CallSetArcBallView() + public void ResetCamera() { ViewportCamera.SetArcBallView(StaticModel.Model != null ? StaticModel.Box : AnimatedModel.Box); } @@ -92,8 +91,7 @@ namespace FlaxEditor.Viewport.Previews switch (key) { case KeyboardKeys.F: - // Pay respect.. - CallSetArcBallView(); + ResetCamera(); break; } return base.OnKeyDown(key); diff --git a/Source/Editor/Viewport/Previews/ModelPreview.cs b/Source/Editor/Viewport/Previews/ModelPreview.cs index dc0de37da..a0b6d0ca0 100644 --- a/Source/Editor/Viewport/Previews/ModelPreview.cs +++ b/Source/Editor/Viewport/Previews/ModelPreview.cs @@ -1,7 +1,6 @@ // Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. using FlaxEditor.GUI.ContextMenu; -using FlaxEditor.GUI.Input; using FlaxEngine; using FlaxEngine.GUI; using FlaxEngine.Utilities; @@ -17,15 +16,11 @@ namespace FlaxEditor.Viewport.Previews public class ModelPreview : AssetPreview { private ContextMenuButton _showBoundsButton, _showCurrentLODButton, _showNormalsButton, _showTangentsButton, _showBitangentsButton, _showFloorButton; + private ContextMenu _previewLODsWidgetButtonMenu; private StaticModel _previewModel, _floorModel; private bool _showBounds, _showCurrentLOD, _showNormals, _showTangents, _showBitangents, _showFloor; private MeshDataCache _meshDatas; - /// - /// The "PreviewLODS" widget button context menu. - /// - private ContextMenu previewLODSWidgetButtonMenu; - /// /// Gets or sets a value that shows LOD statistics /// @@ -37,8 +32,6 @@ namespace FlaxEditor.Viewport.Previews if (_showCurrentLOD == value) return; _showCurrentLOD = value; - if (value) - ShowDebugDraw = true; if (_showCurrentLODButton != null) _showCurrentLODButton.Checked = value; } @@ -222,42 +215,36 @@ namespace FlaxEditor.Viewport.Previews }); _showCurrentLODButton.IndexInParent = 2; - // PreviewLODS mode widget - var PreviewLODSMode = new ViewportWidgetsContainer(ViewportWidgetLocation.UpperRight); - previewLODSWidgetButtonMenu = new ContextMenu(); - previewLODSWidgetButtonMenu.VisibleChanged += PreviewLODSWidgetMenuOnVisibleChanged; - var previewLODSModeButton = new ViewportWidgetButton("Preview LOD", SpriteHandle.Invalid, previewLODSWidgetButtonMenu) + // Preview LODs mode widget + var PreviewLODsMode = new ViewportWidgetsContainer(ViewportWidgetLocation.UpperRight); + _previewLODsWidgetButtonMenu = new ContextMenu(); + _previewLODsWidgetButtonMenu.VisibleChanged += control => + { + if (!control.Visible) + return; + var model = _previewModel.Model; + if (model && !model.WaitForLoaded()) + { + _previewLODsWidgetButtonMenu.ItemsContainer.DisposeChildren(); + var lods = model.LODs.Length; + for (int i = -1; i < lods; i++) + { + var index = i; + var button = _previewLODsWidgetButtonMenu.AddButton("LOD " + (index == -1 ? "Auto" : index)); + button.ButtonClicked += _ => _previewModel.ForcedLOD = index; + button.Checked = _previewModel.ForcedLOD == index; + button.Tag = index; + if (lods <= 1) + break; + } + } + }; + new ViewportWidgetButton("Preview LOD", SpriteHandle.Invalid, _previewLODsWidgetButtonMenu) { TooltipText = "Preview LOD properties", - Parent = PreviewLODSMode, + Parent = PreviewLODsMode, }; - PreviewLODSMode.Parent = this; - } - } - - /// - /// Fill out all Model LODS - /// - /// - private void PreviewLODSWidgetMenuOnVisibleChanged(Control control) - { - if (!control.Visible) - return; - - var model = _previewModel.Model; - if (model && !model.WaitForLoaded() && model.IsLoaded) - { - previewLODSWidgetButtonMenu.ItemsContainer.DisposeChildren(); - var lods = model.LODs.Length; - for (int i = -1; i < lods; i++) - { - var index = i; - var button = previewLODSWidgetButtonMenu.AddButton("LOD " + (index == -1 ? "Auto" : index)); - button.ButtonClicked += (button) => _previewModel.ForcedLOD = index; - button.Checked = _previewModel.ForcedLOD == index; - button.Tag = index; - if (lods <= 1) return; - } + PreviewLODsMode.Parent = this; } } @@ -361,7 +348,7 @@ namespace FlaxEditor.Viewport.Previews var distSqr = Vector3.DistanceSquared(ref sphere.Center, ref viewOrigin); var screenRadiusSquared = Mathf.Square(screenMultiple * sphere.Radius) / Mathf.Max(1.0f, distSqr); screenSize = Mathf.Sqrt((float)screenRadiusSquared) * 2.0f; - + // Check if model is being culled if (Mathf.Square(model.MinScreenSize * 0.5f) > screenRadiusSquared) return -1; @@ -422,9 +409,9 @@ namespace FlaxEditor.Viewport.Previews } /// - /// Calls SetArcBallView from ViewportCamera + /// Resets the camera to focus on a object. /// - public void CallSetArcBallView() + public void ResetCamera() { ViewportCamera.SetArcBallView(_previewModel.Box); } @@ -435,8 +422,7 @@ namespace FlaxEditor.Viewport.Previews switch (key) { case KeyboardKeys.F: - // Pay respect.. - CallSetArcBallView(); + ResetCamera(); break; } return base.OnKeyDown(key); @@ -449,6 +435,7 @@ namespace FlaxEditor.Viewport.Previews Object.Destroy(ref _previewModel); _showBoundsButton = null; _showCurrentLODButton = null; + _previewLODsWidgetButtonMenu = null; _showNormalsButton = null; _showTangentsButton = null; _showBitangentsButton = null; diff --git a/Source/Editor/Viewport/Previews/SkinnedModelPreview.cs b/Source/Editor/Viewport/Previews/SkinnedModelPreview.cs index a8b98b423..c11ea9ea4 100644 --- a/Source/Editor/Viewport/Previews/SkinnedModelPreview.cs +++ b/Source/Editor/Viewport/Previews/SkinnedModelPreview.cs @@ -1,4 +1,5 @@ -using System; +// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved. + using FlaxEditor.GUI.ContextMenu; using FlaxEngine; using FlaxEngine.GUI; @@ -14,11 +15,7 @@ namespace FlaxEditor.Viewport.Previews { private bool _showCurrentLOD; private ContextMenuButton _showCurrentLODButton; - - /// - /// The "PreviewLODS" widget button context menu. - /// - private ContextMenu previewLODSWidgetButtonMenu; + private ContextMenu _previewLODsWidgetButtonMenu; /// /// Gets or sets a value that shows LOD statistics @@ -31,8 +28,6 @@ namespace FlaxEditor.Viewport.Previews if (_showCurrentLOD == value) return; _showCurrentLOD = value; - if (value) - ShowDebugDraw = true; if (_showCurrentLODButton != null) _showCurrentLODButton.Checked = value; } @@ -57,9 +52,29 @@ namespace FlaxEditor.Viewport.Previews // PreviewLODS mode widget var PreviewLODSMode = new ViewportWidgetsContainer(ViewportWidgetLocation.UpperRight); - previewLODSWidgetButtonMenu = new ContextMenu(); - previewLODSWidgetButtonMenu.VisibleChanged += PreviewLODSWidgetMenuOnVisibleChanged; - var previewLODSModeButton = new ViewportWidgetButton("Preview LOD", SpriteHandle.Invalid, previewLODSWidgetButtonMenu) + _previewLODsWidgetButtonMenu = new ContextMenu(); + _previewLODsWidgetButtonMenu.VisibleChanged += control => + { + if (!control.Visible) + return; + var skinned = _previewModel.SkinnedModel; + if (skinned && !skinned.WaitForLoaded()) + { + _previewLODsWidgetButtonMenu.ItemsContainer.DisposeChildren(); + var lods = skinned.LODs.Length; + for (int i = -1; i < lods; i++) + { + var index = i; + var button = _previewLODsWidgetButtonMenu.AddButton("LOD " + (index == -1 ? "Auto" : index)); + button.ButtonClicked += (button) => _previewModel.ForcedLOD = index; + button.Checked = _previewModel.ForcedLOD == index; + button.Tag = index; + if (lods <= 1) + break; + } + } + }; + new ViewportWidgetButton("Preview LOD", SpriteHandle.Invalid, _previewLODsWidgetButtonMenu) { TooltipText = "Preview LOD properties", Parent = PreviewLODSMode, @@ -68,33 +83,6 @@ namespace FlaxEditor.Viewport.Previews } } - /// - /// Fill out all SkinnedModel LODS - /// - /// - private void PreviewLODSWidgetMenuOnVisibleChanged(Control control) - { - if (!control.Visible) - return; - - var skinned = _previewModel.SkinnedModel; - if (skinned && !skinned.WaitForLoaded() && skinned.IsLoaded) - { - previewLODSWidgetButtonMenu.ItemsContainer.DisposeChildren(); - var lods = skinned.LODs.Length; - for (int i = -1; i < lods; i++) - { - var index = i; - var button = previewLODSWidgetButtonMenu.AddButton("LOD " + (index == -1 ? "Auto" : index)); - button.ButtonClicked += (button) => _previewModel.ForcedLOD = index; - button.Checked = _previewModel.ForcedLOD == index; - button.Tag = index; - if (lods <= 1) return; - } - } - } - - /// private int ComputeLODIndex(SkinnedModel model, out float screenSize) { screenSize = 1.0f; @@ -181,6 +169,7 @@ namespace FlaxEditor.Viewport.Previews public override void OnDestroy() { _showCurrentLODButton = null; + _previewLODsWidgetButtonMenu = null; base.OnDestroy(); } diff --git a/Source/Editor/Windows/Assets/CollisionDataWindow.cs b/Source/Editor/Windows/Assets/CollisionDataWindow.cs index 82e0681fa..cc1daa45b 100644 --- a/Source/Editor/Windows/Assets/CollisionDataWindow.cs +++ b/Source/Editor/Windows/Assets/CollisionDataWindow.cs @@ -182,9 +182,7 @@ namespace FlaxEditor.Windows.Assets { // Toolstrip _toolstrip.AddSeparator(); - - _toolstrip.AddButton(editor.Icons.CenterView64, () => _preview.CallSetArcBallView()).LinkTooltip("Show whole collision"); - + _toolstrip.AddButton(editor.Icons.CenterView64, () => _preview.ResetCamera()).LinkTooltip("Show whole collision"); _toolstrip.AddButton(editor.Icons.Docs64, () => Platform.OpenUrl(Utilities.Constants.DocsUrl + "manual/physics/colliders/collision-data.html")).LinkTooltip("See documentation to learn more"); // Split Panel diff --git a/Source/Editor/Windows/Assets/ModelWindow.cs b/Source/Editor/Windows/Assets/ModelWindow.cs index cc7657fc7..f70f6a3b5 100644 --- a/Source/Editor/Windows/Assets/ModelWindow.cs +++ b/Source/Editor/Windows/Assets/ModelWindow.cs @@ -788,9 +788,7 @@ namespace FlaxEditor.Windows.Assets // Toolstrip _toolstrip.AddSeparator(); _showCurrentLODButton = (ToolStripButton)_toolstrip.AddButton(editor.Icons.Info64, () => _preview.ShowCurrentLOD = !_preview.ShowCurrentLOD).LinkTooltip("Show LOD statistics"); - - _toolstrip.AddButton(editor.Icons.CenterView64, () => _preview.CallSetArcBallView()).LinkTooltip("Show whole model"); - + _toolstrip.AddButton(editor.Icons.CenterView64, () => _preview.ResetCamera()).LinkTooltip("Show whole model"); _toolstrip.AddSeparator(); _toolstrip.AddButton(editor.Icons.Docs64, () => Platform.OpenUrl(Utilities.Constants.DocsUrl + "manual/graphics/models/index.html")).LinkTooltip("See documentation to learn more"); diff --git a/Source/Editor/Windows/Assets/SkinnedModelWindow.cs b/Source/Editor/Windows/Assets/SkinnedModelWindow.cs index 367fc3a1a..a7ee6e767 100644 --- a/Source/Editor/Windows/Assets/SkinnedModelWindow.cs +++ b/Source/Editor/Windows/Assets/SkinnedModelWindow.cs @@ -1117,13 +1117,9 @@ namespace FlaxEditor.Windows.Assets { // Toolstrip _toolstrip.AddSeparator(); - _showCurrentLODButton = (ToolStripButton)_toolstrip.AddButton(editor.Icons.Info64, () => _preview.ShowCurrentLOD = !_preview.ShowCurrentLOD).LinkTooltip("Show LOD statistics"); - _showNodesButton = (ToolStripButton)_toolstrip.AddButton(editor.Icons.Bone64, () => _preview.ShowNodes = !_preview.ShowNodes).LinkTooltip("Show animated model nodes debug view"); - - _toolstrip.AddButton(editor.Icons.CenterView64, () => _preview.CallSetArcBallView()).LinkTooltip("Show whole model"); - + _toolstrip.AddButton(editor.Icons.CenterView64, () => _preview.ResetCamera()).LinkTooltip("Show whole model"); _toolstrip.AddSeparator(); _toolstrip.AddButton(editor.Icons.Docs64, () => Platform.OpenUrl(Utilities.Constants.DocsUrl + "manual/animation/skinned-model/index.html")).LinkTooltip("See documentation to learn more");