From 3674d149dc04e673e9fa47aadb28d9084c950149 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Mon, 5 Aug 2024 13:25:35 -0500 Subject: [PATCH 01/23] Add check return for index in `Level.GetScene` --- Source/Engine/Level/Level.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Source/Engine/Level/Level.h b/Source/Engine/Level/Level.h index 4ae1e5bae..b9c6b698a 100644 --- a/Source/Engine/Level/Level.h +++ b/Source/Engine/Level/Level.h @@ -123,6 +123,7 @@ public: /// The scene object (loaded). API_FUNCTION() static Scene* GetScene(int32 index) { + CHECK_RETURN(index < GetScenesCount(), nullptr); return Scenes[index]; } From 850107944c9fd95462e15c3a5212ad38e3c1a546 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Thu, 15 Aug 2024 21:44:40 -0500 Subject: [PATCH 02/23] Hide parameters for animated model on end play. --- .../Dedicated/AnimatedModelEditor.cs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Source/Editor/CustomEditors/Dedicated/AnimatedModelEditor.cs b/Source/Editor/CustomEditors/Dedicated/AnimatedModelEditor.cs index 6f1ac91d0..8a6508346 100644 --- a/Source/Editor/CustomEditors/Dedicated/AnimatedModelEditor.cs +++ b/Source/Editor/CustomEditors/Dedicated/AnimatedModelEditor.cs @@ -1,5 +1,7 @@ // Copyright (c) 2012-2024 Wojciech Figat. All rights reserved. +using System; +using FlaxEditor.CustomEditors.Elements; using FlaxEditor.Surface; using FlaxEngine; @@ -33,5 +35,21 @@ namespace FlaxEditor.CustomEditors.Dedicated Values); } } + + /// + public override void Refresh() + { + base.Refresh(); + + // Check if parameters group is still showing if not in play mode and hide it. + if (!Editor.Instance.StateMachine.IsPlayMode) + { + var group = Layout.Children.Find(x => x is GroupElement g && g.Panel.HeaderText.Equals("Parameters", StringComparison.Ordinal)); + if (group != null) + { + RebuildLayout(); + } + } + } } } From fb9cc7fea5f6ddd7654fdf1512a531be82813221 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Thu, 15 Aug 2024 21:48:25 -0500 Subject: [PATCH 03/23] Add boolean check for if paramters are showing. --- .../Editor/CustomEditors/Dedicated/AnimatedModelEditor.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Source/Editor/CustomEditors/Dedicated/AnimatedModelEditor.cs b/Source/Editor/CustomEditors/Dedicated/AnimatedModelEditor.cs index 8a6508346..3070fd19a 100644 --- a/Source/Editor/CustomEditors/Dedicated/AnimatedModelEditor.cs +++ b/Source/Editor/CustomEditors/Dedicated/AnimatedModelEditor.cs @@ -14,6 +14,8 @@ namespace FlaxEditor.CustomEditors.Dedicated [CustomEditor(typeof(AnimatedModel)), DefaultEditor] public class AnimatedModelEditor : ActorEditor { + private bool _parametersAdded = false; + /// public override void Initialize(LayoutElementsContainer layout) { @@ -33,6 +35,7 @@ namespace FlaxEditor.CustomEditors.Dedicated (instance, parameter, tag) => ((AnimatedModel)instance).GetParameterValue(parameter.Identifier), (instance, value, parameter, tag) => ((AnimatedModel)instance).SetParameterValue(parameter.Identifier, value), Values); + _parametersAdded = true; } } @@ -42,12 +45,13 @@ namespace FlaxEditor.CustomEditors.Dedicated base.Refresh(); // Check if parameters group is still showing if not in play mode and hide it. - if (!Editor.Instance.StateMachine.IsPlayMode) + if (!Editor.Instance.StateMachine.IsPlayMode && _parametersAdded) { var group = Layout.Children.Find(x => x is GroupElement g && g.Panel.HeaderText.Equals("Parameters", StringComparison.Ordinal)); if (group != null) { RebuildLayout(); + _parametersAdded = false; } } } From 134c2570817e2d352d9880c23892c83d7b4f5917 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Fri, 16 Aug 2024 07:23:28 -0500 Subject: [PATCH 04/23] Keep property declared order if similar meta data token. --- Source/Editor/CustomEditors/Editors/GenericEditor.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Source/Editor/CustomEditors/Editors/GenericEditor.cs b/Source/Editor/CustomEditors/Editors/GenericEditor.cs index f624600b4..1eb1c5f90 100644 --- a/Source/Editor/CustomEditors/Editors/GenericEditor.cs +++ b/Source/Editor/CustomEditors/Editors/GenericEditor.cs @@ -178,6 +178,8 @@ namespace FlaxEditor.CustomEditors.Editors return 1; if (Info.MetadataToken < other.Info.MetadataToken) return -1; + // Keep declaration order if same metadata token. + return 0; } // By name From 1047911cfe613a3d67ca1224cfbf8e75675f9552 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Fri, 16 Aug 2024 07:40:52 -0500 Subject: [PATCH 05/23] Fix initial lerp jumping for Progress bar on first update. --- Source/Engine/UI/GUI/Common/ProgressBar.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Source/Engine/UI/GUI/Common/ProgressBar.cs b/Source/Engine/UI/GUI/Common/ProgressBar.cs index 4852865bf..61e31b074 100644 --- a/Source/Engine/UI/GUI/Common/ProgressBar.cs +++ b/Source/Engine/UI/GUI/Common/ProgressBar.cs @@ -169,6 +169,9 @@ namespace FlaxEngine.GUI [EditorDisplay("Bar Style"), EditorOrder(2012), Tooltip("The brush used for progress bar drawing.")] public IBrush BarBrush { get; set; } + // Used to remove initial lerp from the value on play. + private bool _firstUpdate = true; + /// /// Initializes a new instance of the class. /// @@ -202,7 +205,7 @@ namespace FlaxEngine.GUI { // Lerp or not if running slow bool isDeltaSlow = deltaTime > (1 / 20.0f); - if (!isDeltaSlow && UseSmoothing) + if (!isDeltaSlow && UseSmoothing && !_firstUpdate) value = Mathf.Lerp(_current, _value, Mathf.Saturate(deltaTime * 5.0f * SmoothingScale)); _current = value; } @@ -213,6 +216,9 @@ namespace FlaxEngine.GUI } base.Update(deltaTime); + + if (_firstUpdate) + _firstUpdate = false; } /// From 7772669148f44b9ac4b4f364f550f50f81a30fbd Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Fri, 16 Aug 2024 07:46:31 -0500 Subject: [PATCH 06/23] Better fix. --- Source/Engine/UI/GUI/Common/ProgressBar.cs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/Source/Engine/UI/GUI/Common/ProgressBar.cs b/Source/Engine/UI/GUI/Common/ProgressBar.cs index 61e31b074..67f521c4a 100644 --- a/Source/Engine/UI/GUI/Common/ProgressBar.cs +++ b/Source/Engine/UI/GUI/Common/ProgressBar.cs @@ -143,9 +143,11 @@ namespace FlaxEngine.GUI if (!Mathf.NearEqual(value, _value)) { _value = value; - if (!UseSmoothing) + if (!UseSmoothing || _firstUpdate) { _current = _value; + if (_firstUpdate) + _firstUpdate = false; } } } @@ -205,7 +207,7 @@ namespace FlaxEngine.GUI { // Lerp or not if running slow bool isDeltaSlow = deltaTime > (1 / 20.0f); - if (!isDeltaSlow && UseSmoothing && !_firstUpdate) + if (!isDeltaSlow && UseSmoothing) value = Mathf.Lerp(_current, _value, Mathf.Saturate(deltaTime * 5.0f * SmoothingScale)); _current = value; } @@ -216,9 +218,6 @@ namespace FlaxEngine.GUI } base.Update(deltaTime); - - if (_firstUpdate) - _firstUpdate = false; } /// From cc157718cd1cf89ab2fbcc299fb0b7fb163fad2f Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Fri, 16 Aug 2024 11:17:25 -0500 Subject: [PATCH 07/23] Only allow adding unique proxy types to content database Proxy list. --- Source/Editor/Modules/ContentDatabaseModule.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Source/Editor/Modules/ContentDatabaseModule.cs b/Source/Editor/Modules/ContentDatabaseModule.cs index 6d2821a28..688454542 100644 --- a/Source/Editor/Modules/ContentDatabaseModule.cs +++ b/Source/Editor/Modules/ContentDatabaseModule.cs @@ -735,6 +735,8 @@ namespace FlaxEditor.Modules /// Should rebuild entire database after addition. public void AddProxy(ContentProxy proxy, bool rebuild = false) { + if (Proxy.Find(x => x.GetType().ToString().Equals(proxy.GetType().ToString(), StringComparison.Ordinal)) != null) + return; Proxy.Insert(0, proxy); if (rebuild) Rebuild(true); From e21c8848412255c6056851a1aa789f7d06d0b988 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Fri, 16 Aug 2024 13:49:50 -0500 Subject: [PATCH 08/23] Add removing old proxy to add new one. --- Source/Editor/Modules/ContentDatabaseModule.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Source/Editor/Modules/ContentDatabaseModule.cs b/Source/Editor/Modules/ContentDatabaseModule.cs index 688454542..aab5d1b39 100644 --- a/Source/Editor/Modules/ContentDatabaseModule.cs +++ b/Source/Editor/Modules/ContentDatabaseModule.cs @@ -735,8 +735,9 @@ namespace FlaxEditor.Modules /// Should rebuild entire database after addition. public void AddProxy(ContentProxy proxy, bool rebuild = false) { - if (Proxy.Find(x => x.GetType().ToString().Equals(proxy.GetType().ToString(), StringComparison.Ordinal)) != null) - return; + var oldProxy = Proxy.Find(x => x.GetType().ToString().Equals(proxy.GetType().ToString(), StringComparison.Ordinal)); + if (oldProxy != null) + RemoveProxy(oldProxy); Proxy.Insert(0, proxy); if (rebuild) Rebuild(true); From 5a7080c9c070efc3efb17063a3b2193fa65e9915 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Sat, 17 Aug 2024 18:10:16 +0200 Subject: [PATCH 09/23] Fix crash in particle emitter load #2840 --- Source/Engine/Particles/ParticleEmitter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/Engine/Particles/ParticleEmitter.cpp b/Source/Engine/Particles/ParticleEmitter.cpp index eaeb92922..570b026c6 100644 --- a/Source/Engine/Particles/ParticleEmitter.cpp +++ b/Source/Engine/Particles/ParticleEmitter.cpp @@ -219,7 +219,7 @@ Asset::LoadResult ParticleEmitter::load() ClearDependencies(); for (const auto& node : Graph.Nodes) { - if (node.Type == GRAPH_NODE_MAKE_TYPE(14, 300)) + if (node.Type == GRAPH_NODE_MAKE_TYPE(14, 300) && node.Assets.Count() > 0) { const auto function = node.Assets[0].As(); if (function) From 2542adba92bc3ef519b4d15a7ed80292efaa2f70 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Tue, 20 Aug 2024 16:10:03 +0200 Subject: [PATCH 10/23] Fix `ConvertMouseToRay` for orthographic projection #2748 --- Source/Editor/Viewport/EditorViewport.cs | 29 +++++++++++----- Source/Engine/Level/Actors/Camera.cpp | 44 +++++++++++------------- 2 files changed, 41 insertions(+), 32 deletions(-) diff --git a/Source/Editor/Viewport/EditorViewport.cs b/Source/Editor/Viewport/EditorViewport.cs index d30fb6cbc..731b433db 100644 --- a/Source/Editor/Viewport/EditorViewport.cs +++ b/Source/Editor/Viewport/EditorViewport.cs @@ -1385,15 +1385,32 @@ namespace FlaxEditor.Viewport /// /// Converts the mouse position to the ray (in world space of the viewport). /// - /// The mouse position. + /// The mouse position (in UI space of the viewport [0; Size]). /// The result ray. public Ray ConvertMouseToRay(ref Float2 mousePosition) { - // Prepare var viewport = new FlaxEngine.Viewport(0, 0, Width, Height); - CreateProjectionMatrix(out var p); + if (viewport.Width < Mathf.Epsilon || viewport.Height < Mathf.Epsilon) + return ViewRay; + Vector3 viewOrigin = Task.View.Origin; Float3 position = ViewPosition - viewOrigin; + + // Use different logic in orthographic projection + if (_isOrtho) + { + var screenPosition = new Float2(mousePosition.X / viewport.Width - 0.5f, -mousePosition.Y / viewport.Height + 0.5f); + var orientation = ViewOrientation; + var direction = Float3.Forward * orientation; + var rayOrigin = new Vector3(screenPosition.X * viewport.Width * _orthoSize, screenPosition.Y * viewport.Height * _orthoSize, 0); + rayOrigin = position + Vector3.Transform(rayOrigin, orientation); + rayOrigin += direction * _nearPlane; + rayOrigin += viewOrigin; + return new Ray(rayOrigin, direction); + } + + // Create view frustum + CreateProjectionMatrix(out var p); CreateViewMatrix(position, out var v); Matrix.Multiply(ref v, ref p, out var ivp); ivp.Invert(); @@ -1404,11 +1421,7 @@ namespace FlaxEditor.Viewport viewport.Unproject(ref nearPoint, ref ivp, out nearPoint); viewport.Unproject(ref farPoint, ref ivp, out farPoint); - // Create direction vector - Vector3 direction = farPoint - nearPoint; - direction.Normalize(); - - return new Ray(nearPoint + viewOrigin, direction); + return new Ray(nearPoint + viewOrigin, Vector3.Normalize(farPoint - nearPoint)); } /// diff --git a/Source/Engine/Level/Actors/Camera.cpp b/Source/Engine/Level/Actors/Camera.cpp index b2affbc2a..008f00520 100644 --- a/Source/Engine/Level/Actors/Camera.cpp +++ b/Source/Engine/Level/Actors/Camera.cpp @@ -191,39 +191,35 @@ Ray Camera::ConvertMouseToRay(const Float2& mousePosition) const Ray Camera::ConvertMouseToRay(const Float2& mousePosition, const Viewport& viewport) const { -#if 1 - // Gather camera properties + Vector3 position = GetPosition(); + if (viewport.Width < ZeroTolerance || viewport.Height < ZeroTolerance) + return Ray(position, GetDirection()); + + // Use different logic in orthographic projection + if (!_usePerspective) + { + Float2 screenPosition(mousePosition.X / viewport.Width - 0.5f, -mousePosition.Y / viewport.Height + 0.5f); + Quaternion orientation = GetOrientation(); + Float3 direction = orientation * Float3::Forward; + Vector3 rayOrigin(screenPosition.X * viewport.Width * _orthoScale, screenPosition.Y * viewport.Height * _orthoScale, 0); + rayOrigin = position + Vector3::Transform(rayOrigin, orientation); + rayOrigin += direction * _near; + return Ray(rayOrigin, direction); + } + + // Create view frustum Matrix v, p, ivp; GetMatrices(v, p, viewport); Matrix::Multiply(v, p, ivp); ivp.Invert(); // Create near and far points - Vector3 nearPoint(mousePosition, 0.0f); - Vector3 farPoint(mousePosition, 1.0f); + Vector3 nearPoint(mousePosition, _near); + Vector3 farPoint(mousePosition, _far); viewport.Unproject(nearPoint, ivp, nearPoint); viewport.Unproject(farPoint, ivp, farPoint); - // Create direction vector - Vector3 direction = farPoint - nearPoint; - direction.Normalize(); - - return Ray(nearPoint, direction); -#else - // Create near and far points - Vector3 nearPoint, farPoint; - Matrix ivp; - _frustum.GetInvMatrix(&ivp); - viewport.Unproject(Vector3(mousePosition, 0.0f), ivp, nearPoint); - viewport.Unproject(Vector3(mousePosition, 1.0f), ivp, farPoint); - - // Create direction vector - Vector3 direction = farPoint - nearPoint; - direction.Normalize(); - - // Return result - return Ray(nearPoint, direction); -#endif + return Ray(nearPoint, Vector3::Normalize(farPoint - nearPoint)); } Viewport Camera::GetViewport() const From 6534136632a655e6a5fe15ca52b8fbb2f5ff9b43 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Tue, 20 Aug 2024 18:56:38 +0200 Subject: [PATCH 11/23] Fix editor viewport mouse control bug when using `Alt` key #2816 --- Source/Editor/Gizmo/TransformGizmoBase.cs | 55 ++++++++++++----------- Source/Editor/Viewport/EditorViewport.cs | 3 ++ 2 files changed, 31 insertions(+), 27 deletions(-) diff --git a/Source/Editor/Gizmo/TransformGizmoBase.cs b/Source/Editor/Gizmo/TransformGizmoBase.cs index 81f76d392..8fe91c252 100644 --- a/Source/Editor/Gizmo/TransformGizmoBase.cs +++ b/Source/Editor/Gizmo/TransformGizmoBase.cs @@ -138,18 +138,17 @@ namespace FlaxEditor.Gizmo private void UpdateGizmoPosition() { + var position = Vector3.Zero; + // Get gizmo pivot switch (_activePivotType) { case PivotType.ObjectCenter: if (SelectionCount > 0) - Position = GetSelectedTransform(0).Translation; + position = GetSelectedTransform(0).Translation; break; case PivotType.SelectionCenter: - Position = GetSelectionCenter(); - break; - case PivotType.WorldOrigin: - Position = Vector3.Zero; + position = GetSelectionCenter(); break; } @@ -157,11 +156,13 @@ namespace FlaxEditor.Gizmo if (_vertexSnapObject != null) { Vector3 vertexSnapPoint = _vertexSnapObject.Transform.LocalToWorld(_vertexSnapPoint); - Position += vertexSnapPoint - Position; + position += vertexSnapPoint - position; } // Apply current movement - Position += _translationDelta; + position += _translationDelta; + + Position = position; } private void UpdateMatrices() @@ -213,10 +214,11 @@ namespace FlaxEditor.Gizmo ray.Position = Vector3.Transform(ray.Position, invRotationMatrix); Vector3.TransformNormal(ref ray.Direction, ref invRotationMatrix, out ray.Direction); - var planeXY = new Plane(Vector3.Backward, Vector3.Transform(Position, invRotationMatrix).Z); - var planeYZ = new Plane(Vector3.Left, Vector3.Transform(Position, invRotationMatrix).X); - var planeZX = new Plane(Vector3.Down, Vector3.Transform(Position, invRotationMatrix).Y); - var dir = Vector3.Normalize(ray.Position - Position); + var position = Position; + var planeXY = new Plane(Vector3.Backward, Vector3.Transform(position, invRotationMatrix).Z); + var planeYZ = new Plane(Vector3.Left, Vector3.Transform(position, invRotationMatrix).X); + var planeZX = new Plane(Vector3.Down, Vector3.Transform(position, invRotationMatrix).Y); + var dir = Vector3.Normalize(ray.Position - position); var planeDotXY = Mathf.Abs(Vector3.Dot(planeXY.Normal, dir)); var planeDotYZ = Mathf.Abs(Vector3.Dot(planeYZ.Normal, dir)); var planeDotZX = Mathf.Abs(Vector3.Dot(planeZX.Normal, dir)); @@ -229,8 +231,8 @@ namespace FlaxEditor.Gizmo var plane = planeDotXY > planeDotZX ? planeXY : planeZX; if (ray.Intersects(ref plane, out intersection)) { - _intersectPosition = ray.Position + ray.Direction * intersection; - if (_lastIntersectionPosition != Vector3.Zero) + _intersectPosition = ray.GetPoint(intersection); + if (!_lastIntersectionPosition.IsZero) _tDelta = _intersectPosition - _lastIntersectionPosition; delta = new Vector3(_tDelta.X, 0, 0); } @@ -241,8 +243,8 @@ namespace FlaxEditor.Gizmo var plane = planeDotXY > planeDotYZ ? planeXY : planeYZ; if (ray.Intersects(ref plane, out intersection)) { - _intersectPosition = ray.Position + ray.Direction * intersection; - if (_lastIntersectionPosition != Vector3.Zero) + _intersectPosition = ray.GetPoint(intersection); + if (!_lastIntersectionPosition.IsZero) _tDelta = _intersectPosition - _lastIntersectionPosition; delta = new Vector3(0, _tDelta.Y, 0); } @@ -253,8 +255,8 @@ namespace FlaxEditor.Gizmo var plane = planeDotZX > planeDotYZ ? planeZX : planeYZ; if (ray.Intersects(ref plane, out intersection)) { - _intersectPosition = ray.Position + ray.Direction * intersection; - if (_lastIntersectionPosition != Vector3.Zero) + _intersectPosition = ray.GetPoint(intersection); + if (!_lastIntersectionPosition.IsZero) _tDelta = _intersectPosition - _lastIntersectionPosition; delta = new Vector3(0, 0, _tDelta.Z); } @@ -264,8 +266,8 @@ namespace FlaxEditor.Gizmo { if (ray.Intersects(ref planeYZ, out intersection)) { - _intersectPosition = ray.Position + ray.Direction * intersection; - if (_lastIntersectionPosition != Vector3.Zero) + _intersectPosition = ray.GetPoint(intersection); + if (!_lastIntersectionPosition.IsZero) _tDelta = _intersectPosition - _lastIntersectionPosition; delta = new Vector3(0, _tDelta.Y, _tDelta.Z); } @@ -275,8 +277,8 @@ namespace FlaxEditor.Gizmo { if (ray.Intersects(ref planeXY, out intersection)) { - _intersectPosition = ray.Position + ray.Direction * intersection; - if (_lastIntersectionPosition != Vector3.Zero) + _intersectPosition = ray.GetPoint(intersection); + if (!_lastIntersectionPosition.IsZero) _tDelta = _intersectPosition - _lastIntersectionPosition; delta = new Vector3(_tDelta.X, _tDelta.Y, 0); } @@ -286,8 +288,8 @@ namespace FlaxEditor.Gizmo { if (ray.Intersects(ref planeZX, out intersection)) { - _intersectPosition = ray.Position + ray.Direction * intersection; - if (_lastIntersectionPosition != Vector3.Zero) + _intersectPosition = ray.GetPoint(intersection); + if (!_lastIntersectionPosition.IsZero) _tDelta = _intersectPosition - _lastIntersectionPosition; delta = new Vector3(_tDelta.X, 0, _tDelta.Z); } @@ -299,8 +301,8 @@ namespace FlaxEditor.Gizmo var plane = new Plane(-Vector3.Normalize(gizmoToView), gizmoToView.Length); if (ray.Intersects(ref plane, out intersection)) { - _intersectPosition = ray.Position + ray.Direction * intersection; - if (_lastIntersectionPosition != Vector3.Zero) + _intersectPosition = ray.GetPoint(intersection); + if (!_lastIntersectionPosition.IsZero) _tDelta = _intersectPosition - _lastIntersectionPosition; } delta = _tDelta; @@ -412,10 +414,8 @@ namespace FlaxEditor.Gizmo public override void Update(float dt) { LastDelta = Transform.Identity; - if (!IsActive) return; - bool isLeftBtnDown = Owner.IsLeftMouseButtonDown; // Snap to ground @@ -516,6 +516,7 @@ namespace FlaxEditor.Gizmo { // Clear cache _accMoveDelta = Vector3.Zero; + _lastIntersectionPosition = _intersectPosition = Vector3.Zero; EndTransforming(); } } diff --git a/Source/Editor/Viewport/EditorViewport.cs b/Source/Editor/Viewport/EditorViewport.cs index 731b433db..722075fa9 100644 --- a/Source/Editor/Viewport/EditorViewport.cs +++ b/Source/Editor/Viewport/EditorViewport.cs @@ -111,6 +111,9 @@ namespace FlaxEditor.Viewport IsMouseRightDown = useMouse && window.GetMouseButton(MouseButton.Right); IsMouseMiddleDown = useMouse && window.GetMouseButton(MouseButton.Middle); IsMouseLeftDown = useMouse && window.GetMouseButton(MouseButton.Left); + + if (WasAltDownBefore && !IsMouseLeftDown && !IsAltDown) + WasAltDownBefore = false; } /// From a69a3812c2c3d3dcb236afa3853d014536f7ded8 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Tue, 20 Aug 2024 18:30:02 -0500 Subject: [PATCH 12/23] Add Bindings for handling MAX c++ defines and converting them to c#. --- .../Bindings/BindingsGenerator.CSharp.cs | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs index a437a4158..b0f4ab48f 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs @@ -2042,13 +2042,18 @@ namespace Flax.Build.Bindings GenerateCSharpAttributes(buildData, contents, indent, enumInfo, true); contents.Append(indent).Append(GenerateCSharpAccessLevel(enumInfo.Access)); contents.Append("enum ").Append(enumInfo.Name); + string managedType = string.Empty; if (enumInfo.UnderlyingType != null) - contents.Append(" : ").Append(GenerateCSharpNativeToManaged(buildData, enumInfo.UnderlyingType, enumInfo)); + { + managedType = GenerateCSharpNativeToManaged(buildData, enumInfo.UnderlyingType, enumInfo); + contents.Append(" : ").Append(managedType); + } contents.AppendLine(); contents.Append(indent + "{"); indent += " "; // Entries + bool usedMax = false; foreach (var entryInfo in enumInfo.Entries) { contents.AppendLine(); @@ -2056,7 +2061,25 @@ namespace Flax.Build.Bindings GenerateCSharpAttributes(buildData, contents, indent, enumInfo, entryInfo.Attributes, entryInfo.Comment, true, false); contents.Append(indent).Append(entryInfo.Name); if (!string.IsNullOrEmpty(entryInfo.Value)) - contents.Append(" = ").Append(entryInfo.Value); + { + string value; + if (enumInfo.UnderlyingType != null) + { + value = GenerateCSharpDefaultValueNativeToManaged(buildData, entryInfo.Value, enumInfo, enumInfo.UnderlyingType, false, managedType); + if (value.Contains($"{managedType}.MaxValue", StringComparison.Ordinal)) + usedMax = true; + } + else + { + value = entryInfo.Value; + } + contents.Append(" = ").Append(value); + } + else if (string.IsNullOrEmpty(entryInfo.Value) && usedMax) + { + contents.Append(" = ").Append('0'); + usedMax = false; + } contents.Append(','); contents.AppendLine(); } From b7b23dce5f65ab40d74108e8a39472f16b68dbb3 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Wed, 21 Aug 2024 08:48:35 -0500 Subject: [PATCH 13/23] Fix bug with usedMax not only setting zero after max. --- Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs index b0f4ab48f..a972f1b78 100644 --- a/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs +++ b/Source/Tools/Flax.Build/Bindings/BindingsGenerator.CSharp.cs @@ -2062,6 +2062,9 @@ namespace Flax.Build.Bindings contents.Append(indent).Append(entryInfo.Name); if (!string.IsNullOrEmpty(entryInfo.Value)) { + if (usedMax) + usedMax = false; + string value; if (enumInfo.UnderlyingType != null) { @@ -2075,6 +2078,7 @@ namespace Flax.Build.Bindings } contents.Append(" = ").Append(value); } + // Handle case of next value after Max value being zero if a value is not defined. else if (string.IsNullOrEmpty(entryInfo.Value) && usedMax) { contents.Append(" = ").Append('0'); From 6b0098bb091238bbd96f0c726ff6f00a9dc88678 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Wed, 21 Aug 2024 12:48:46 -0500 Subject: [PATCH 14/23] Remove bindings for InputEvent and InputAxis on dispose. --- Source/Engine/Engine/InputAxis.cs | 2 ++ Source/Engine/Engine/InputEvent.cs | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/Source/Engine/Engine/InputAxis.cs b/Source/Engine/Engine/InputAxis.cs index ca77d2465..a0c916e65 100644 --- a/Source/Engine/Engine/InputAxis.cs +++ b/Source/Engine/Engine/InputAxis.cs @@ -60,6 +60,7 @@ namespace FlaxEngine ~InputAxis() { Input.AxisValueChanged -= Handler; + ValueChanged = null; } /// @@ -68,6 +69,7 @@ namespace FlaxEngine public void Dispose() { Input.AxisValueChanged -= Handler; + ValueChanged = null; GC.SuppressFinalize(this); } diff --git a/Source/Engine/Engine/InputEvent.cs b/Source/Engine/Engine/InputEvent.cs index e5653631f..05e71463b 100644 --- a/Source/Engine/Engine/InputEvent.cs +++ b/Source/Engine/Engine/InputEvent.cs @@ -70,6 +70,10 @@ namespace FlaxEngine ~InputEvent() { Input.ActionTriggered -= Handler; + Triggered = null; + Pressed = null; + Pressing = null; + Released = null; } private void Handler(string name, InputActionState state) @@ -100,6 +104,10 @@ namespace FlaxEngine public void Dispose() { Input.ActionTriggered -= Handler; + Triggered = null; + Pressed = null; + Pressing = null; + Released = null; GC.SuppressFinalize(this); } From aa3cf2e07776b0c1dc2e107b89e4673155eec1d2 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Wed, 21 Aug 2024 13:34:33 -0500 Subject: [PATCH 15/23] Add Gamepad buttons to Axis Config. --- Source/Engine/Input/Input.cpp | 6 ++++-- Source/Engine/Input/VirtualInput.h | 12 ++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/Source/Engine/Input/Input.cpp b/Source/Engine/Input/Input.cpp index 0faa26f39..7d267f21b 100644 --- a/Source/Engine/Input/Input.cpp +++ b/Source/Engine/Input/Input.cpp @@ -157,6 +157,8 @@ void InputSettings::Deserialize(DeserializeStream& stream, ISerializeModifier* m config.Gamepad = JsonTools::GetEnum(v, "Gamepad", InputGamepadIndex::All); config.PositiveButton = JsonTools::GetEnum(v, "PositiveButton", KeyboardKeys::None); config.NegativeButton = JsonTools::GetEnum(v, "NegativeButton", KeyboardKeys::None); + config.GamepadPositiveButton = JsonTools::GetEnum(v, "GamepadPositiveButton", GamepadButton::None); + config.GamepadNegativeButton = JsonTools::GetEnum(v, "GamepadNegativeButton", GamepadButton::None); config.DeadZone = JsonTools::GetFloat(v, "DeadZone", 0.1f); config.Sensitivity = JsonTools::GetFloat(v, "Sensitivity", 0.4f); config.Gravity = JsonTools::GetFloat(v, "Gravity", 1.0f); @@ -873,8 +875,8 @@ void InputService::Update() const AxisData& data = Axes[name]; // Get key raw value - const bool isPositiveKey = Input::GetKey(config.PositiveButton); - const bool isNegativeKey = Input::GetKey(config.NegativeButton); + const bool isPositiveKey = Input::GetKey(config.PositiveButton) || Input::GetGamepadButton(config.Gamepad, config.GamepadPositiveButton); + const bool isNegativeKey = Input::GetKey(config.NegativeButton) || Input::GetGamepadButton(config.Gamepad, config.GamepadNegativeButton); float keyRawValue = 0; if (isPositiveKey && !isNegativeKey) { diff --git a/Source/Engine/Input/VirtualInput.h b/Source/Engine/Input/VirtualInput.h index 3028fc661..1adad2056 100644 --- a/Source/Engine/Input/VirtualInput.h +++ b/Source/Engine/Input/VirtualInput.h @@ -87,6 +87,18 @@ API_STRUCT() struct AxisConfig API_FIELD(Attributes="EditorOrder(40)") KeyboardKeys NegativeButton; + /// + /// The button to be pressed for movement in positive direction. Use to ignore it. + /// + API_FIELD(Attributes="EditorOrder(45)") + GamepadButton GamepadPositiveButton; + + /// + /// The button to be pressed for movement in negative direction. Use to ignore it. + /// + API_FIELD(Attributes="EditorOrder(46)") + GamepadButton GamepadNegativeButton; + /// /// Any positive or negative values that are less than this number will register as zero. Useful for gamepads to specify the deadzone. /// From 6fad87002d304b60d1a6d6fffdb0b267cc34acd9 Mon Sep 17 00:00:00 2001 From: Chandler Cox Date: Wed, 21 Aug 2024 14:32:47 -0500 Subject: [PATCH 16/23] Add option to invert the y-axis mouse rotation in the editor viewport. --- Source/Editor/Options/ViewportOptions.cs | 7 +++++++ Source/Editor/Viewport/EditorViewport.cs | 2 ++ 2 files changed, 9 insertions(+) diff --git a/Source/Editor/Options/ViewportOptions.cs b/Source/Editor/Options/ViewportOptions.cs index 454315b91..ceebf594b 100644 --- a/Source/Editor/Options/ViewportOptions.cs +++ b/Source/Editor/Options/ViewportOptions.cs @@ -24,6 +24,13 @@ namespace FlaxEditor.Options [DefaultValue(1.0f), Limit(0.01f, 100.0f)] [EditorDisplay("General"), EditorOrder(101), Tooltip("The mouse wheel sensitivity applied to zoom in orthographic mode.")] public float MouseWheelSensitivity { get; set; } = 1.0f; + + /// + /// Gets or sets whether to invert the Y rotation of the mouse in the editor viewport. + /// + [DefaultValue(false)] + [EditorDisplay("General"), EditorOrder(102), Tooltip("Whether to invert the Y rotation of the mouse in the editor viewport.")] + public bool InvertMouseYAxisRotation { get; set; } = false; /// /// Gets or sets the total amount of steps the camera needs to go from minimum to maximum speed. diff --git a/Source/Editor/Viewport/EditorViewport.cs b/Source/Editor/Viewport/EditorViewport.cs index d30fb6cbc..f3654caa7 100644 --- a/Source/Editor/Viewport/EditorViewport.cs +++ b/Source/Editor/Viewport/EditorViewport.cs @@ -1704,6 +1704,8 @@ namespace FlaxEditor.Viewport // Update moveDelta *= dt * (60.0f * 4.0f); mouseDelta *= 0.1833f * MouseSpeed * _mouseSensitivity; + if (options.Viewport.InvertMouseYAxisRotation) + mouseDelta *= new Float2(1, -1); UpdateView(dt, ref moveDelta, ref mouseDelta, out var centerMouse); // Move mouse back to the root position From 73a596cb2f06c41f2ea49b4ea3ea1abe0621c977 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Wed, 21 Aug 2024 21:54:22 +0200 Subject: [PATCH 17/23] Add `OrthographicSize` to Camera for fixed ortho projection size #1970 --- Source/Engine/Level/Actors/Camera.cpp | 25 ++++++++++++++++++++++--- Source/Engine/Level/Actors/Camera.h | 14 +++++++++++++- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/Source/Engine/Level/Actors/Camera.cpp b/Source/Engine/Level/Actors/Camera.cpp index 008f00520..a2822b09e 100644 --- a/Source/Engine/Level/Actors/Camera.cpp +++ b/Source/Engine/Level/Actors/Camera.cpp @@ -39,6 +39,7 @@ Camera::Camera(const SpawnParams& params) , _customAspectRatio(0.0f) , _near(10.0f) , _far(40000.0f) + , _orthoSize(0.0f) , _orthoScale(1.0f) { #if USE_EDITOR @@ -120,6 +121,21 @@ void Camera::SetFarPlane(float value) } } +float Camera::GetOrthographicSize() const +{ + return _orthoSize; +} + +void Camera::SetOrthographicSize(float value) +{ + value = Math::Clamp(value, 0.0f, 1000000.0f); + if (Math::NotNearEqual(_orthoSize, value)) + { + _orthoSize = value; + UpdateCache(); + } +} + float Camera::GetOrthographicScale() const { return _orthoScale; @@ -201,7 +217,9 @@ Ray Camera::ConvertMouseToRay(const Float2& mousePosition, const Viewport& viewp Float2 screenPosition(mousePosition.X / viewport.Width - 0.5f, -mousePosition.Y / viewport.Height + 0.5f); Quaternion orientation = GetOrientation(); Float3 direction = orientation * Float3::Forward; - Vector3 rayOrigin(screenPosition.X * viewport.Width * _orthoScale, screenPosition.Y * viewport.Height * _orthoScale, 0); + const float orthoSize = (_orthoSize > 0.0f ? _orthoSize : viewport.Height) * _orthoScale; + const float aspect = _customAspectRatio <= 0.0f ? viewport.GetAspectRatio() : _customAspectRatio; + Vector3 rayOrigin(screenPosition.X * orthoSize * aspect, screenPosition.Y * orthoSize, 0); rayOrigin = position + Vector3::Transform(rayOrigin, orientation); rayOrigin += direction * _near; return Ray(rayOrigin, direction); @@ -260,14 +278,15 @@ void Camera::GetMatrices(Matrix& view, Matrix& projection, const Viewport& viewp void Camera::GetMatrices(Matrix& view, Matrix& projection, const Viewport& viewport, const Vector3& origin) const { // Create projection matrix + const float aspect = _customAspectRatio <= 0.0f ? viewport.GetAspectRatio() : _customAspectRatio; if (_usePerspective) { - const float aspect = _customAspectRatio <= 0.0f ? viewport.GetAspectRatio() : _customAspectRatio; Matrix::PerspectiveFov(_fov * DegreesToRadians, aspect, _near, _far, projection); } else { - Matrix::Ortho(viewport.Width * _orthoScale, viewport.Height * _orthoScale, _near, _far, projection); + const float orthoSize = (_orthoSize > 0.0f ? _orthoSize : viewport.Height) * _orthoScale; + Matrix::Ortho(orthoSize * aspect, orthoSize, _near, _far, projection); } // Create view matrix diff --git a/Source/Engine/Level/Actors/Camera.h b/Source/Engine/Level/Actors/Camera.h index 190126e54..7da37c4b6 100644 --- a/Source/Engine/Level/Actors/Camera.h +++ b/Source/Engine/Level/Actors/Camera.h @@ -44,6 +44,7 @@ private: float _customAspectRatio; float _near; float _far; + float _orthoSize; float _orthoScale; #if USE_EDITOR @@ -88,7 +89,7 @@ public: /// /// Gets the custom aspect ratio. 0 if not use custom value. /// - API_PROPERTY(Attributes="EditorOrder(50), DefaultValue(0.0f), Limit(0, 10, 0.01f), EditorDisplay(\"Camera\"), VisibleIf(nameof(UsePerspective))") + API_PROPERTY(Attributes="EditorOrder(50), DefaultValue(0.0f), Limit(0, 10, 0.01f), EditorDisplay(\"Camera\")") float GetCustomAspectRatio() const; /// @@ -118,6 +119,17 @@ public: /// API_PROPERTY() void SetFarPlane(float value); + /// + /// Gets the orthographic projection view height (width is based on the aspect ratio). Use `0` for size to be based on the viewport size. + /// + API_PROPERTY(Attributes="EditorOrder(59), DefaultValue(0.0f), Limit(0.0f), EditorDisplay(\"Camera\"), VisibleIf(nameof(UsePerspective), true)") + float GetOrthographicSize() const; + + /// + /// Sets the orthographic projection view height (width is based on the aspect ratio). Use `0` for size to be based on the viewport size. + /// + API_PROPERTY() void SetOrthographicSize(float value); + /// /// Gets the orthographic projection scale. /// From 1c840539c65abfdace34b3055fb34e71cf3974f3 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Wed, 21 Aug 2024 22:04:30 +0200 Subject: [PATCH 18/23] Fix crash in audio clip if it's still streaming after unload #2866 --- Source/Engine/Audio/AudioClip.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Source/Engine/Audio/AudioClip.cpp b/Source/Engine/Audio/AudioClip.cpp index 0204dd222..021bd8cef 100644 --- a/Source/Engine/Audio/AudioClip.cpp +++ b/Source/Engine/Audio/AudioClip.cpp @@ -396,6 +396,7 @@ void AudioClip::unload(bool isReloading) } StopStreaming(); + CancelStreamingTasks(); StreamingQueue.Clear(); if (hasAnyBuffer && AudioBackend::Instance) { From acd338981c68ffe74fcc44835a58be054c15844d Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Wed, 21 Aug 2024 22:33:05 +0200 Subject: [PATCH 19/23] Add caching review model in Animation window #2508 --- .../Editor/Windows/Assets/AnimationWindow.cs | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/Source/Editor/Windows/Assets/AnimationWindow.cs b/Source/Editor/Windows/Assets/AnimationWindow.cs index 2411daf86..84fedc9f8 100644 --- a/Source/Editor/Windows/Assets/AnimationWindow.cs +++ b/Source/Editor/Windows/Assets/AnimationWindow.cs @@ -80,6 +80,7 @@ namespace FlaxEditor.Windows.Assets private AnimationWindow Window; private Animation Asset; private ModelImportSettings ImportSettings = new ModelImportSettings(); + private bool EnablePreviewModelCache = true; [EditorDisplay("Preview"), NoSerialize, AssetReference(true), Tooltip("The skinned model to preview the animation playback.")] public SkinnedModel PreviewModel @@ -134,6 +135,15 @@ namespace FlaxEditor.Windows.Assets value.WaitForLoaded(500); Window._preview.ViewportCamera.SetArcBallView(Window._preview.PreviewActor.Sphere); } + + if (EnablePreviewModelCache) + { + var customDataName = Window.GetPreviewModelCacheName(); + if (value) + Window.Editor.ProjectCache.SetCustomData(customDataName, value.ID.ToString()); + else + Window.Editor.ProjectCache.RemoveCustomData(customDataName); + } } } @@ -142,6 +152,7 @@ namespace FlaxEditor.Windows.Assets // Link Window = window; Asset = window.Asset; + EnablePreviewModelCache = true; // Try to restore target asset import options (useful for fast reimport) Editor.TryRestoreImportOptions(ref ImportSettings.Settings, window.Item.Path); @@ -150,6 +161,7 @@ namespace FlaxEditor.Windows.Assets public void OnClean() { // Unlink + EnablePreviewModelCache = false; PreviewModel = null; Window = null; Asset = null; @@ -287,12 +299,23 @@ namespace FlaxEditor.Windows.Assets UpdateToolstrip(); } + private string GetPreviewModelCacheName() + { + return _asset.ID + ".PreviewModel"; + } + /// protected override void OnAssetLoaded() { _properties.OnLoad(this); _propertiesPresenter.BuildLayout(); ClearEditedFlag(); + if (!_initialPreviewModel && + Editor.ProjectCache.TryGetCustomData(GetPreviewModelCacheName(), out string str) && + Guid.TryParse(str, out var id)) + { + _initialPreviewModel = FlaxEngine.Content.LoadAsync(id); + } if (_initialPreviewModel) { _properties.PreviewModel = _initialPreviewModel; From 6b63e91391d3ba882067f1f603fc5c8cdd69de21 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Wed, 21 Aug 2024 22:53:05 +0200 Subject: [PATCH 20/23] Add PVS-Studio as new toool that we use for codequality --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 1b0d06bf6..5e1374e02 100644 --- a/README.md +++ b/README.md @@ -124,3 +124,7 @@ Install `.NET SDK`, `NuGet package manager` and `NuGet targets and build tasks` Using Flax source code is strictly governed by the Flax Engine End User License Agreement. If you don't agree to those terms, as amended from time to time, you are not permitted to access or use Flax Engine. We welcome any contributions to Flax Engine development through pull requests on GitHub. Most of our active development is in the master branch, so we prefer to take pull requests there (particularly for new features). We try to make sure that all new code adheres to the Flax coding standards. All contributions are governed by the terms of the [EULA](https://flaxengine.com/licensing/). + +## SAST Tools + +[PVS-Studio](https://pvs-studio.com/en/pvs-studio/?utm_source=website&utm_medium=github&utm_campaign=open_source) - static analyzer for C, C++, C#, and Java code. From e6745e43ecbd3e9bb2cbf164cf53a8cff60ce171 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Wed, 21 Aug 2024 23:28:44 +0200 Subject: [PATCH 21/23] Fix drawing physics colliders in debug view mode #2622 #2833 --- Source/Editor/Viewport/PrefabWindowViewport.cs | 10 ++++------ Source/Engine/Debug/DebugDraw.cpp | 7 ++++--- Source/Engine/Debug/DebugDraw.h | 2 ++ 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/Source/Editor/Viewport/PrefabWindowViewport.cs b/Source/Editor/Viewport/PrefabWindowViewport.cs index ceba98073..fb5e74d4d 100644 --- a/Source/Editor/Viewport/PrefabWindowViewport.cs +++ b/Source/Editor/Viewport/PrefabWindowViewport.cs @@ -627,8 +627,8 @@ namespace FlaxEditor.Viewport } // Debug draw all actors in prefab and collect actors - var viewFlags = Task.ViewFlags; - var collectActors = (viewFlags & ViewFlags.PhysicsDebug) != 0 || (viewFlags & ViewFlags.LightsDebug) != 0; + var view = Task.View; + var collectActors = (view.Flags & ViewFlags.PhysicsDebug) != 0 || view.Mode == ViewMode.PhysicsColliders || (view.Flags & ViewFlags.LightsDebug) != 0; _debugDrawActors.Clear(); foreach (var child in SceneGraphRoot.ChildNodes) { @@ -641,19 +641,17 @@ namespace FlaxEditor.Viewport } // Draw physics debug - if ((viewFlags & ViewFlags.PhysicsDebug) != 0) + if ((view.Flags & ViewFlags.PhysicsDebug) != 0 || view.Mode == ViewMode.PhysicsColliders) { foreach (var actor in _debugDrawActors) { if (actor is Collider c && c.IsActiveInHierarchy) - { DebugDraw.DrawColliderDebugPhysics(c, renderContext.View); - } } } // Draw lights debug - if ((viewFlags & ViewFlags.LightsDebug) != 0) + if ((view.Flags & ViewFlags.LightsDebug) != 0) { foreach (var actor in _debugDrawActors) { diff --git a/Source/Engine/Debug/DebugDraw.cpp b/Source/Engine/Debug/DebugDraw.cpp index 2f20ae158..0e23040a4 100644 --- a/Source/Engine/Debug/DebugDraw.cpp +++ b/Source/Engine/Debug/DebugDraw.cpp @@ -788,7 +788,7 @@ void DebugDraw::Draw(RenderContext& renderContext, GPUTextureView* target, GPUTe Matrix vp; Matrix::Multiply(view.View, view.Projection, vp); Matrix::Transpose(vp, data.ViewProjection); - data.ClipPosZBias = -0.2f; // Reduce Z-fighting artifacts (eg. editor grid) + data.ClipPosZBias = view.IsPerspectiveProjection() ? -0.2f : 0.0f; // Reduce Z-fighting artifacts (eg. editor grid) data.EnableDepthTest = enableDepthTest; context->UpdateCB(cb, &data); context->BindCB(0, cb); @@ -953,11 +953,11 @@ void DebugDraw::DrawActorsTree(Actor* actor) } #if USE_EDITOR + void DebugDraw::DrawColliderDebugPhysics(Collider* collider, RenderView& view) { if (!collider) return; - collider->DrawPhysicsDebug(view); } @@ -965,10 +965,11 @@ void DebugDraw::DrawLightDebug(Light* light, RenderView& view) { if (!light) return; - light->DrawLightsDebug(view); } + #endif + void DebugDraw::DrawAxisFromDirection(const Vector3& origin, const Vector3& direction, float size, float duration, bool depthTest) { CHECK_DEBUG(direction.IsNormalized()); diff --git a/Source/Engine/Debug/DebugDraw.h b/Source/Engine/Debug/DebugDraw.h index 13b556b1b..97788431d 100644 --- a/Source/Engine/Debug/DebugDraw.h +++ b/Source/Engine/Debug/DebugDraw.h @@ -75,6 +75,7 @@ API_CLASS(Static) class FLAXENGINE_API DebugDraw /// /// The actor to start drawing at. API_FUNCTION() static void DrawActorsTree(Actor* actor); + #if USE_EDITOR /// /// Draws the physics debug shapes for the given collider. Editor Only @@ -90,6 +91,7 @@ API_CLASS(Static) class FLAXENGINE_API DebugDraw /// The render view to draw in. API_FUNCTION() static void DrawLightDebug(Light* light, RenderView& view); #endif + /// /// Draws the lines axis from direction. /// From d0240a54c7fc7b7e99d0d0e13697ca3307001261 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Fri, 9 Aug 2024 18:39:47 +0200 Subject: [PATCH 22/23] Add `MaterialInstance.ResetParameters` --- Source/Engine/Content/Assets/MaterialInstance.cpp | 8 ++++++++ Source/Engine/Content/Assets/MaterialInstance.h | 5 +++++ 2 files changed, 13 insertions(+) diff --git a/Source/Engine/Content/Assets/MaterialInstance.cpp b/Source/Engine/Content/Assets/MaterialInstance.cpp index 2c436f396..1cf795e7d 100644 --- a/Source/Engine/Content/Assets/MaterialInstance.cpp +++ b/Source/Engine/Content/Assets/MaterialInstance.cpp @@ -293,6 +293,14 @@ void MaterialInstance::SetBaseMaterial(MaterialBase* baseMaterial) } } +void MaterialInstance::ResetParameters() +{ + for (auto& param : Params) + { + param.SetIsOverride(false); + } +} + #if USE_EDITOR bool MaterialInstance::Save(const StringView& path) diff --git a/Source/Engine/Content/Assets/MaterialInstance.h b/Source/Engine/Content/Assets/MaterialInstance.h index 5a99cdb41..9b0442a54 100644 --- a/Source/Engine/Content/Assets/MaterialInstance.h +++ b/Source/Engine/Content/Assets/MaterialInstance.h @@ -28,6 +28,11 @@ public: /// The base material. API_PROPERTY() void SetBaseMaterial(MaterialBase* baseMaterial); + /// + /// Resets all parameters back to the base material (including disabling parameter overrides). + /// + API_FUNCTION() void ResetParameters(); + #if USE_EDITOR /// From 3ecb7c1d81aeb74b77f2e3965ee6bf6c67c2caf2 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Thu, 22 Aug 2024 13:20:53 +0200 Subject: [PATCH 23/23] Fix SpriteRender all parameters override #2233 --- Source/Engine/UI/SpriteRender.cpp | 34 ++++++++++++++++++++++--------- Source/Engine/UI/SpriteRender.h | 3 ++- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/Source/Engine/UI/SpriteRender.cpp b/Source/Engine/UI/SpriteRender.cpp index c7b31f358..4f28551b7 100644 --- a/Source/Engine/UI/SpriteRender.cpp +++ b/Source/Engine/UI/SpriteRender.cpp @@ -18,7 +18,7 @@ SpriteRender::SpriteRender(const SpawnParams& params) { _quadModel = Content::LoadAsyncInternal(TEXT("Engine/Models/Quad")); Material.Loaded.Bind(this); - Image.Changed.Bind(this); + Image.Changed.Bind(this); } Float2 SpriteRender::GetSize() const @@ -42,8 +42,7 @@ Color SpriteRender::GetColor() const void SpriteRender::SetColor(const Color& value) { _color = value; - if (_paramColor) - _paramColor->SetValue(value); + SetColorParam(); } SpriteHandle SpriteRender::GetSprite() const @@ -54,7 +53,7 @@ SpriteHandle SpriteRender::GetSprite() const void SpriteRender::SetSprite(const SpriteHandle& value) { _sprite = value; - SetImage(); + SetImageParam(); } void SpriteRender::OnMaterialLoaded() @@ -66,6 +65,7 @@ void SpriteRender::OnMaterialLoaded() _materialInstance->AddReference(); } _materialInstance->SetBaseMaterial(Material); + _materialInstance->ResetParameters(); // Cache parameters _paramImageMAD = _materialInstance->GetParameter(TEXT("ImageMAD")); @@ -75,15 +75,15 @@ void SpriteRender::OnMaterialLoaded() if (_paramImage && _paramImage->GetParameterType() != MaterialParameterType::Texture) _paramImage = nullptr; else if (_paramImage) - SetImage(); + SetImageParam(); _paramColor = _materialInstance->GetParameter(TEXT("Color")); if (_paramColor && _paramColor->GetParameterType() != MaterialParameterType::Color && _paramColor->GetParameterType() != MaterialParameterType::Vector4 && _paramColor->GetParameterType() != MaterialParameterType::Vector3) _paramColor = nullptr; else if (_paramColor) - _paramColor->SetValue(_color); + SetColorParam(); } -void SpriteRender::SetImage() +void SpriteRender::SetImageParam() { TextureBase* image = Image.Get(); Vector4 imageMAD(Vector2::One, Vector2::Zero); @@ -94,9 +94,24 @@ void SpriteRender::SetImage() imageMAD = Vector4(sprite->Area.Size, sprite->Area.Location); } if (_paramImage) + { _paramImage->SetValue(image); + _paramImage->SetIsOverride(true); + } if (_paramImageMAD) + { _paramImageMAD->SetValue(imageMAD); + _paramImageMAD->SetIsOverride(true); + } +} + +void SpriteRender::SetColorParam() +{ + if (_paramColor) + { + _paramColor->SetValue(_color); + _paramColor->SetIsOverride(true); + } } bool SpriteRender::HasContentLoaded() const @@ -164,9 +179,8 @@ void SpriteRender::Deserialize(DeserializeStream& stream, ISerializeModifier* mo DESERIALIZE(DrawModes); DESERIALIZE(SortOrder); - SetImage(); - if (_paramColor) - _paramColor->SetValue(_color); + SetImageParam(); + SetColorParam(); } void SpriteRender::OnLayerChanged() diff --git a/Source/Engine/UI/SpriteRender.h b/Source/Engine/UI/SpriteRender.h index d9eb769c2..8092be8f2 100644 --- a/Source/Engine/UI/SpriteRender.h +++ b/Source/Engine/UI/SpriteRender.h @@ -92,7 +92,8 @@ public: private: void OnMaterialLoaded(); - void SetImage(); + void SetImageParam(); + void SetColorParam(); public: // [Actor]