Procházet zdrojové kódy

Improved time based stabilization and overlayrender

Krzysztof Krysiński před 1 měsícem
rodič
revize
7b5de63557

+ 1 - 1
src/PixiEditor/Models/DocumentModels/UpdateableChangeExecutors/BrushBasedExecutor.cs

@@ -140,7 +140,7 @@ internal class BrushBasedExecutor : UpdateableChangeExecutor
     private VecD GetStabilizedPointTimeBased()
     {
         float timeConstant = (float)BrushToolbar.Stabilization / 100f;
-        float elapsed = (float)(DateTime.Now - lastTime).TotalSeconds;
+        float elapsed = Math.Min((float)(DateTime.Now - lastTime).TotalSeconds, 0.1f);
         float alpha = elapsed / Math.Max(timeConstant + elapsed, 0.0001f);
         VecD smoothed = lastSmoothed + (controller.LastPrecisePosition - lastSmoothed) * alpha;
         lastTime = DateTime.Now;

+ 25 - 1
src/PixiEditor/Views/Overlays/BrushShapeOverlay/BrushShapeOverlay.cs

@@ -159,6 +159,7 @@ internal class BrushShapeOverlay : Overlay
 
     protected override void OnOverlayPointerMoved(OverlayPointerArgs args)
     {
+        isMouseDown = args.Properties.IsLeftButtonPressed;
         if (!args.Properties.IsLeftButtonPressed && BrushData.BrushGraph != null)
         {
             ExecuteBrush(args.Point);
@@ -180,6 +181,16 @@ internal class BrushShapeOverlay : Overlay
         isMouseDown = false;
     }
 
+    protected override void OnOverlayPointerExited(OverlayPointerArgs args)
+    {
+        isMouseDown = false;
+    }
+
+    protected override void OnOverlayPointerEntered(OverlayPointerArgs args)
+    {
+        isMouseDown = args.Properties.IsLeftButtonPressed;
+    }
+
     protected override void OnKeyPressed(KeyEventArgs args)
     {
         UpdateBrushShape(lastDirCalculationPoint);
@@ -216,12 +227,25 @@ internal class BrushShapeOverlay : Overlay
 
                     DrawConstrainedRope(targetCanvas, lastPoint, LastAppliedPoint, radius, paint);
 
+                    paint.Color = pointColor;
+                    targetCanvas.DrawCircle(lastPoint, 5f / (float)ZoomScale, paint);
+                }
+                else if (StabilizationMode == StabilizationMode.TimeBased)
+                {
+                    paint.Style = PaintStyle.Stroke;
+
+                    paint.Color = pointColor;
+                    targetCanvas.DrawCircle(LastAppliedPoint, 5f / (float)ZoomScale, paint);
+
+                    paint.Color = ropeColor;
+                    targetCanvas.DrawLine(LastAppliedPoint, lastPoint, paint);
+
                     paint.Color = pointColor;
                     targetCanvas.DrawCircle(lastPoint, 5f / (float)ZoomScale, paint);
                 }
             }
 
-            if (StabilizationMode == StabilizationMode.None)
+            if (StabilizationMode == StabilizationMode.None || !isMouseDown)
             {
                 paint.Color = Colors.LightGray;
                 targetCanvas.DrawPath(BrushShape, paint);

+ 1 - 1
src/PixiEditor/Views/Rendering/Scene.cs

@@ -490,7 +490,7 @@ internal class Scene : Zoombox.Zoombox, ICustomHitTest
             OverlayPointerArgs args = ConstructPointerArgs(e);
             foreach (Overlay overlay in AllOverlays)
             {
-                if (!overlay.IsVisible || mouseOverOverlays.Contains(overlay) || !overlay.TestHit(args.Point)) continue;
+                if ((!overlay.IsHitTestVisible || !overlay.TestHit(args.Point)) && !overlay.AlwaysPassPointerEvents) continue;
                 overlay.EnterPointer(args);
                 mouseOverOverlays.Add(overlay);
             }