From a3b5f4b78920c6933aee61cd06847359ab744ec5 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Thu, 18 Apr 2024 18:22:19 +0200 Subject: [PATCH] Add grid labels drawing to Multi Blend --- .../Archetypes/Animation.MultiBlend.cs | 57 ++++++++++++++++--- 1 file changed, 49 insertions(+), 8 deletions(-) diff --git a/Source/Editor/Surface/Archetypes/Animation.MultiBlend.cs b/Source/Editor/Surface/Archetypes/Animation.MultiBlend.cs index 41b984650..74e0a2b4b 100644 --- a/Source/Editor/Surface/Archetypes/Animation.MultiBlend.cs +++ b/Source/Editor/Surface/Archetypes/Animation.MultiBlend.cs @@ -66,7 +66,8 @@ namespace FlaxEditor.Surface.Archetypes _editor._node.Surface.AddBatchedUndoAction(new EditNodeValuesAction(_editor._node, _mouseMoveStartValues, true)); _mouseMoveStartValues = null; } - _editor._node.Surface.MarkAsEdited(); + if (_mouseMoved) + _editor._node.Surface.MarkAsEdited(); } /// @@ -478,14 +479,47 @@ namespace FlaxEditor.Surface.Archetypes SetAsset((int)b.Tag, Guid.Empty); } + private void DrawAxis(bool vertical, Float2 start, Float2 end, ref Color gridColor, ref Color labelColor, Font labelFont, float value, bool isLast) + { + // Draw line + Render2D.DrawLine(start, end, gridColor); + + // Draw label + var labelWidth = 50.0f; + var labelHeight = 10.0f; + var labelMargin = 2.0f; + string label = Utils.RoundTo2DecimalPlaces(value).ToString(System.Globalization.CultureInfo.InvariantCulture); + var hAlign = TextAlignment.Near; + Rectangle labelRect; + if (vertical) + { + labelRect = new Rectangle(start.X + labelMargin * 2, start.Y, labelWidth, labelHeight); + if (isLast) + return; // Don't overlap with the first horizontal label + } + else + { + labelRect = new Rectangle(start.X + labelMargin, start.Y - labelHeight - labelMargin, labelWidth, labelHeight); + if (isLast) + { + labelRect.X = start.X - labelMargin - labelRect.Width; + hAlign = TextAlignment.Far; + } + } + Render2D.DrawText(labelFont, label, labelRect, labelColor, hAlign, TextAlignment.Center, TextWrapping.NoWrap, 1.0f, 0.7f); + } + /// public override void Draw() { - // Cache data var style = Style.Current; var rect = new Rectangle(Float2.Zero, Size); var containsFocus = ContainsFocus; GetPointsArea(out var pointsArea); + var data0 = (Float4)_node.Values[0]; + var rangeX = new Float2(data0.X, data0.Y); + var rangeY = _is2D ? new Float2(data0.Z, data0.W) : Float2.One; + var grid = new Float2(Mathf.Abs(rangeX.Y - rangeX.X) * 0.01f, Mathf.Abs(rangeY.X - rangeY.Y) * 0.01f); // Background Render2D.DrawRectangle(rect, IsMouseOver ? style.TextBoxBackgroundSelected : style.TextBoxBackground); @@ -494,19 +528,26 @@ namespace FlaxEditor.Surface.Archetypes // Grid int splits = 10; var gridColor = style.TextBoxBackgroundSelected * 1.1f; + var labelColor = style.ForegroundDisabled; + var labelFont = style.FontSmall; //var blendArea = BlendAreaRect; var blendArea = pointsArea; - for (int i = 0; i < splits; i++) + + for (int i = 0; i <= splits; i++) { - float x = blendArea.Left + blendArea.Width * i / splits; - Render2D.DrawLine(new Float2(x, 1), new Float2(x, rect.Height - 2), gridColor); + float alpha = (float)i / splits; + float x = blendArea.Left + blendArea.Width * alpha; + float value = Mathf.Lerp(rangeX.X, rangeX.Y, alpha); + DrawAxis(false, new Float2(x, rect.Height - 2), new Float2(x, 1), ref gridColor, ref labelColor, labelFont, value, i == splits); } if (_is2D) { - for (int i = 0; i < splits; i++) + for (int i = 0; i <= splits; i++) { - float y = blendArea.Top + blendArea.Height * i / splits; - Render2D.DrawLine(new Float2(1, y), new Float2(rect.Width - 2, y), gridColor); + float alpha = (float)i / splits; + float y = blendArea.Top + blendArea.Height * alpha; + float value = Mathf.Lerp(rangeY.X, rangeY.Y, alpha); + DrawAxis(true, new Float2(1, y), new Float2(rect.Width - 2, y), ref gridColor, ref labelColor, labelFont, value, i == splits); } } else