Browse Source

Fixed updating overlay and brightness tool

Krzysztof Krysiński 4 weeks ago
parent
commit
24db4b3ff9

+ 3 - 0
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/LayerNode.cs

@@ -38,6 +38,9 @@ public abstract class LayerNode : StructureNode, IReadOnlyLayerNode, IClipSource
 
     private void RenderContent(SceneObjectRenderContext context, Canvas renderOnto, bool useFilters)
     {
+        if (renderOnto == null)
+            return;
+
         if (!HasOperations())
         {
             if (Background.Value != null)

+ 7 - 8
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/NestedDocumentNode.cs

@@ -35,8 +35,6 @@ public class NestedDocumentNode : LayerNode, IInputDependentOutputs, ITransforma
 
     private IReadOnlyDocument? Instance => NestedDocument.Value?.DocumentInstance;
 
-    private Texture? dummyTexture;
-
     private string[] builtInOutputs;
     private string[] builtInInputs;
 
@@ -86,10 +84,11 @@ public class NestedDocumentNode : LayerNode, IInputDependentOutputs, ITransforma
         brushOutputNodes = document.DocumentInstance.NodeGraph.AllNodes
             .OfType<BrushOutputNode>().ToArray();
 
-        toExecute = cachedExposeNodes.Concat<IReadOnlyNode>(brushOutputNodes).Concat([Instance?.NodeGraph.OutputNode]).ToArray();
+        toExecute = cachedExposeNodes.Concat<IReadOnlyNode>(brushOutputNodes).Concat([Instance?.NodeGraph.OutputNode])
+            .ToArray();
 
-        Instance?.NodeGraph.Execute(cachedExposeNodes.Concat<IReadOnlyNode>(brushOutputNodes), new RenderContext(
-            (dummyTexture ??= Texture.ForProcessing(VecI.One, Instance.ProcessingColorSpace)).DrawingSurface.Canvas, 0,
+        Instance?.NodeGraph.Execute(cachedExposeNodes.Concat<IReadOnlyNode>(brushOutputNodes), new RenderContext(null,
+            0,
             ChunkResolution.Full,
             Instance.Size, Instance.Size,
             Instance.ProcessingColorSpace,
@@ -220,9 +219,7 @@ public class NestedDocumentNode : LayerNode, IInputDependentOutputs, ITransforma
         clonedContext.DocumentSize = Instance.Size;
         clonedContext.ProcessingColorSpace = Instance?.ProcessingColorSpace;
         clonedContext.VisibleDocumentRegion = null;
-        clonedContext.RenderSurface =
-            (dummyTexture ??= Texture.ForProcessing(new VecI(1, 1), context.ProcessingColorSpace)).DrawingSurface
-            .Canvas;
+        clonedContext.RenderSurface = null;
 
         Instance?.NodeGraph.Execute(toExecute, clonedContext);
 
@@ -374,6 +371,8 @@ public class NestedDocumentNode : LayerNode, IInputDependentOutputs, ITransforma
 
     public override void RenderPreview(DrawingSurface renderOn, RenderContext context, string elementToRenderName)
     {
+        if (renderOn is null) return;
+
         if (elementToRenderName == nameof(EmbeddedMask))
         {
             base.RenderPreview(renderOn, context, elementToRenderName);

+ 1 - 1
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/StructureNode.cs

@@ -136,7 +136,7 @@ public abstract class StructureNode : RenderNode, IReadOnlyStructureNode, IRende
 
     protected override void OnPaint(RenderContext context, Canvas renderTarget)
     {
-        if (Output.Connections.Count > 0)
+        if (Output.Connections.Count > 0 && renderTarget != null)
         {
             RenderForOutput(context, renderTarget, Output);
         }

+ 13 - 1
src/PixiEditor/ViewModels/Document/Blackboard/VariableViewModel.cs

@@ -10,6 +10,8 @@ using PixiEditor.ChangeableDocument.Changeables.Interfaces;
 using PixiEditor.Models.BrushEngine;
 using PixiEditor.Models.DocumentModels;
 using PixiEditor.Models.Handlers;
+using PixiEditor.ViewModels.BrushSystem;
+using PixiEditor.ViewModels.Tools.Tools;
 using PixiEditor.ViewModels.Tools.ToolSettings.Settings;
 using PixiEditor.ViewModels.Tools.ToolSettings.Toolbars;
 
@@ -67,7 +69,7 @@ internal class VariableViewModel : ViewModelBase, IVariableHandler
                 return;
 
             internals.ActionAccumulator.AddFinishedActions(
-                new SetBlackboardVariable_Action(Name, SettingView.Value, min, max, unit));
+                new SetBlackboardVariable_Action(Name, AdjustValueForBlackboard(SettingView.Value), min, max, unit));
         };
 
         RemoveCommand = new RelayCommand(() =>
@@ -77,6 +79,11 @@ internal class VariableViewModel : ViewModelBase, IVariableHandler
         });
     }
 
+    protected virtual object AdjustValueForBlackboard(object value)
+    {
+        return value is BrushViewModel brushVm ? brushVm.Brush : value;
+    }
+
     private Setting CreateSettingFromType(Type type, string? unit, double min, double max)
     {
         min = double.IsNaN(min) ? double.MinValue : min;
@@ -151,6 +158,11 @@ internal class VariableViewModel : ViewModelBase, IVariableHandler
 
     public void SetValueInternal(object newValue)
     {
+        if(SettingView is BrushSettingViewModel brushSetting && newValue is Brush brush)
+        {
+            newValue = new BrushViewModel(brush);
+        }
+
         this.value = newValue;
         suppressValueChange = true;
 

+ 6 - 1
src/PixiEditor/ViewModels/SubViewModels/ToolsViewModel.cs

@@ -23,6 +23,7 @@ using Drawie.Numerics;
 using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes.Brushes;
 using PixiEditor.Extensions.CommonApi.UserPreferences.Settings;
 using PixiEditor.Helpers;
+using PixiEditor.Helpers.UI;
 using PixiEditor.Models.BrushEngine;
 using PixiEditor.Models.Commands;
 using PixiEditor.Models.Handlers.Toolbars;
@@ -30,6 +31,7 @@ using PixiEditor.Models.Handlers.Tools;
 using PixiEditor.Models.Input;
 using PixiEditor.Models.IO;
 using PixiEditor.UI.Common.Fonts;
+using PixiEditor.ViewModels.BrushSystem;
 using PixiEditor.ViewModels.Document;
 using PixiEditor.ViewModels.Document.Nodes.Brushes;
 using PixiEditor.ViewModels.Tools;
@@ -123,6 +125,8 @@ internal class ToolsViewModel : SubViewModel<ViewModelMain>, IToolsHandler
         private set => SetProperty(ref _activeToolSet, value);
     }
 
+    public ExecutionTrigger<string> SettingChangedTrigger { get; } = new();
+
     ICollection<IToolSetHandler> IToolsHandler.AllToolSets => AllToolSets;
 
     public ObservableCollection<IToolSetHandler> AllToolSets { get; } = new();
@@ -634,6 +638,7 @@ internal class ToolsViewModel : SubViewModel<ViewModelMain>, IToolsHandler
             return;
 
         document.EventInlet.SettingsChanged(settingName, value);
+        SettingChangedTrigger?.Execute(this, settingName);
     }
 
     private void AddToolSets(List<ToolSet> toolSetConfig)
@@ -712,7 +717,7 @@ internal class ToolsViewModel : SubViewModel<ViewModelMain>, IToolsHandler
                 {
                     var brush = new Brush(uri, "TOOL_CONFIG");
                     KeyCombination? shortcut = TryParseShortcut(toolFromToolset.DefaultShortcut);
-                    return new BrushBasedToolViewModel(brush, toolFromToolset.ToolTip, toolFromToolset.ToolName,
+                    return new BrushBasedToolViewModel(new BrushViewModel(brush), toolFromToolset.ToolTip, toolFromToolset.ToolName,
                         shortcut, toolFromToolset.ActionDisplays);
                 }
             }

+ 2 - 2
src/PixiEditor/ViewModels/Tools/ToolSettings/Settings/BrushSettingViewModel.cs

@@ -50,9 +50,9 @@ internal class BrushSettingViewModel : Setting<BrushViewModel>
         {
             var found = Library.Brushes.Values.FirstOrDefault(b => b.Name == str);
             if (found != null)
-                return found;
+                return new BrushViewModel(found);
 
-            return Library.Brushes.First().Value;
+            return new BrushViewModel(Library.Brushes.First().Value);
         }
 
         return base.AdjustValue(value);

+ 3 - 2
src/PixiEditor/ViewModels/Tools/Tools/BrushBasedToolViewModel.cs

@@ -9,6 +9,7 @@ using PixiEditor.Models.Handlers.Toolbars;
 using PixiEditor.Models.Handlers.Tools;
 using PixiEditor.Models.Input;
 using PixiEditor.UI.Common.Localization;
+using PixiEditor.ViewModels.BrushSystem;
 using PixiEditor.ViewModels.Document.Blackboard;
 using PixiEditor.ViewModels.Tools.ToolSettings.Settings;
 using PixiEditor.ViewModels.Tools.ToolSettings.Toolbars;
@@ -50,7 +51,7 @@ internal class BrushBasedToolViewModel : ToolViewModel, IBrushToolHandler
         (Toolbar as Toolbar).SettingChanged += OnSettingChanged;
     }
 
-    public BrushBasedToolViewModel(Brush brush, string? tooltip, string? toolName, KeyCombination? defaultShortcut,
+    public BrushBasedToolViewModel(BrushViewModel brush, string? tooltip, string? toolName, KeyCombination? defaultShortcut,
         List<ActionDisplayConfig>? actionDisplays)
     {
         Cursor = Cursors.PreciseCursor;
@@ -141,7 +142,7 @@ internal class BrushBasedToolViewModel : ToolViewModel, IBrushToolHandler
 
     private void OnSettingChanged(string name, object value)
     {
-        if (name == nameof(BrushToolbar.Brush))
+        if (value is BrushViewModel)
         {
             AddBrushShapeSettings();
         }

+ 8 - 0
src/PixiEditor/Views/Main/ViewportControls/ViewportOverlays.cs

@@ -499,6 +499,13 @@ internal class ViewportOverlays
             Mode = BindingMode.OneWay
         };
 
+        Binding settingChangedTrigger = new()
+        {
+            Source = ViewModelMain.Current.ToolsSubViewModel,
+            Path = "SettingChangedTrigger",
+            Mode = BindingMode.OneWay
+        };
+
         brushShapeOverlay.Bind(Visual.IsVisibleProperty, isVisibleMultiBinding);
         brushShapeOverlay.Bind(BrushShapeOverlay.BrushDataProperty, brushDataBinding);
         brushShapeOverlay.Bind(BrushShapeOverlay.ActiveFrameTimeProperty, activeFrameTimeBidning);
@@ -506,6 +513,7 @@ internal class ViewportOverlays
         brushShapeOverlay.Bind(BrushShapeOverlay.StabilizationModeProperty, stabilizationModeBinding);
         brushShapeOverlay.Bind(BrushShapeOverlay.StabilizationProperty, stabilizationBinding);
         brushShapeOverlay.Bind(BrushShapeOverlay.LastAppliedPointProperty, lastAppliedPointBinding);
+        brushShapeOverlay.Bind(BrushShapeOverlay.BrushSettingChangedTriggerProperty, settingChangedTrigger);
     }
 
     private void BindTextOverlay()

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

@@ -12,8 +12,11 @@ using PixiEditor.ChangeableDocument.Changeables.Brushes;
 using PixiEditor.ChangeableDocument.Rendering.ContextData;
 using PixiEditor.Helpers;
 using PixiEditor.Helpers.Extensions;
+using PixiEditor.Helpers.UI;
 using PixiEditor.Models.Handlers.Toolbars;
+using PixiEditor.ViewModels.BrushSystem;
 using PixiEditor.Views.Rendering;
+using Brush = PixiEditor.Models.BrushEngine.Brush;
 using Canvas = Drawie.Backend.Core.Surfaces.Canvas;
 using Colors = Drawie.Backend.Core.ColorsImpl.Colors;
 
@@ -82,6 +85,16 @@ internal class BrushShapeOverlay : Overlay
         AvaloniaProperty.Register<BrushShapeOverlay, BrushData>(
             nameof(BrushData));
 
+    public static readonly StyledProperty<ExecutionTrigger<string>> BrushSettingChangedTriggerProperty =
+        AvaloniaProperty.Register<BrushShapeOverlay, ExecutionTrigger<string>>(
+            nameof(BrushSettingChangedTrigger));
+
+    public ExecutionTrigger<string> BrushSettingChangedTrigger
+    {
+        get => GetValue(BrushSettingChangedTriggerProperty);
+        set => SetValue(BrushSettingChangedTriggerProperty, value);
+    }
+
     public BrushData BrushData
     {
         get => GetValue(BrushDataProperty);
@@ -116,7 +129,22 @@ internal class BrushShapeOverlay : Overlay
     static BrushShapeOverlay()
     {
         AffectsOverlayRender(BrushShapeProperty, BrushDataProperty, ActiveFrameTimeProperty, EditorDataProperty);
-        BrushDataProperty.Changed.AddClassHandler<BrushShapeOverlay>((overlay, args) => UpdateBrush(args));
+        BrushDataProperty.Changed.AddClassHandler<BrushShapeOverlay>((overlay, args) =>
+        {
+            UpdateBrush(args);
+        });
+        BrushSettingChangedTriggerProperty.Changed.AddClassHandler<BrushShapeOverlay>((overlay, args) =>
+        {
+            if (args.OldValue is ExecutionTrigger<string> oldTrigger)
+            {
+                oldTrigger.Triggered -= overlay.Triggered;
+            }
+
+            if (args.NewValue is ExecutionTrigger<string> trigger)
+            {
+                trigger.Triggered += overlay.Triggered;
+            }
+        });
         ActiveFrameTimeProperty.Changed.AddClassHandler<BrushShapeOverlay>((overlay, args) => UpdateBrush(args));
         EditorDataProperty.Changed.AddClassHandler<BrushShapeOverlay>((overlay, args) => UpdateBrush(args));
     }
@@ -129,6 +157,13 @@ internal class BrushShapeOverlay : Overlay
         pointColor = ResourceLoader.GetResource<Color>("ThemeAccent3Color").ToColor();
     }
 
+    private void Triggered(object? sender, string s)
+    {
+        ExecuteBrush(lastDirCalculationPoint);
+        UpdateBrushShape(lastDirCalculationPoint);
+        Refresh();
+    }
+
     private static void UpdateBrush(AvaloniaPropertyChangedEventArgs args)
     {
         BrushShapeOverlay overlay = args.Sender as BrushShapeOverlay;