Browse Source

Made custom mask node connection

flabbet 11 months ago
parent
commit
92fe7585ef
20 changed files with 126 additions and 111 deletions
  1. 2 2
      src/PixiEditor.ChangeableDocument/ChangeInfos/Structure/CreateFolder_ChangeInfo.cs
  2. 2 2
      src/PixiEditor.ChangeableDocument/ChangeInfos/Structure/CreateLayer_ChangeInfo.cs
  3. 5 2
      src/PixiEditor.ChangeableDocument/Changeables/Graph/Interfaces/IReadOnlyStructureNode.cs
  4. 3 11
      src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/ImageLayerNode.cs
  5. 36 16
      src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/StructureNode.cs
  6. 8 8
      src/PixiEditor.ChangeableDocument/Changes/Drawing/ApplyLayerMask_Change.cs
  7. 5 5
      src/PixiEditor.ChangeableDocument/Changes/Drawing/DrawingChangeHelper.cs
  8. 6 6
      src/PixiEditor.ChangeableDocument/Changes/Properties/LayerStructure/CreateStructureMemberMask_Change.cs
  9. 7 7
      src/PixiEditor.ChangeableDocument/Changes/Properties/LayerStructure/DeleteStructureMemberMask_Change.cs
  10. 4 4
      src/PixiEditor.ChangeableDocument/Changes/Properties/LayerStructure/StructureMemberClipToMemberBelow_Change.cs
  11. 2 2
      src/PixiEditor.ChangeableDocument/Changes/Root/ClipCanvas_Change.cs
  12. 2 2
      src/PixiEditor.ChangeableDocument/Changes/Root/Crop_Change.cs
  13. 4 4
      src/PixiEditor.ChangeableDocument/Changes/Root/FlipImage_Change.cs
  14. 4 4
      src/PixiEditor.ChangeableDocument/Changes/Root/ResizeBasedChangeBase.cs
  15. 2 2
      src/PixiEditor.ChangeableDocument/Changes/Root/ResizeCanvas_Change.cs
  16. 10 10
      src/PixiEditor.ChangeableDocument/Changes/Root/ResizeImage_Change.cs
  17. 9 9
      src/PixiEditor.ChangeableDocument/Changes/Root/RotateImage_Change.cs
  18. 2 2
      src/PixiEditor.ChangeableDocument/Changes/Structure/ApplyMask_Change.cs
  19. 5 5
      src/PixiEditor/Models/Rendering/AffectedAreasGatherer.cs
  20. 8 8
      src/PixiEditor/Models/Rendering/MemberPreviewUpdater.cs

+ 2 - 2
src/PixiEditor.ChangeableDocument/ChangeInfos/Structure/CreateFolder_ChangeInfo.cs

@@ -31,11 +31,11 @@ public record class CreateFolder_ChangeInfo : CreateStructureMember_ChangeInfo
             folder.GetNodeTypeUniqueName(),
             folder.Opacity.Value,
             folder.IsVisible.Value,
-            folder.ClipToPreviousMember.Value,
+            folder.ClipToPreviousMember,
             folder.MemberName,
             folder.BlendMode.Value,
             folder.Id,
-            folder.Mask.Value is not null,
+            folder.EmbeddedMask is not null,
             folder.MaskIsVisible.Value, CreatePropertyInfos(folder.InputProperties, true, folder.Id),
             CreatePropertyInfos(folder.OutputProperties, false, folder.Id),
             new NodeMetadata(folder));

+ 2 - 2
src/PixiEditor.ChangeableDocument/ChangeInfos/Structure/CreateLayer_ChangeInfo.cs

@@ -37,11 +37,11 @@ public record class CreateLayer_ChangeInfo : CreateStructureMember_ChangeInfo
             layer.GetNodeTypeUniqueName(),
             layer.Opacity.Value,
             layer.IsVisible.Value,
-            layer.ClipToPreviousMember.Value,
+            layer.ClipToPreviousMember,
             layer.MemberName,
             layer.BlendMode.Value,
             layer.Id,
-            layer.Mask.Value is not null,
+            layer.EmbeddedMask is not null,
             layer.MaskIsVisible.Value,
             layer is ITransparencyLockable { LockTransparency: true },
             CreatePropertyInfos(layer.InputProperties, true, layer.Id),

+ 5 - 2
src/PixiEditor.ChangeableDocument/Changeables/Graph/Interfaces/IReadOnlyStructureNode.cs

@@ -1,5 +1,6 @@
 using PixiEditor.ChangeableDocument.Changeables.Animations;
 using PixiEditor.ChangeableDocument.Enums;
+using PixiEditor.DrawingApi.Core;
 using PixiEditor.Numerics;
 
 namespace PixiEditor.ChangeableDocument.Changeables.Graph.Interfaces;
@@ -8,10 +9,12 @@ public interface IReadOnlyStructureNode : IReadOnlyNode
 {
     public InputProperty<float> Opacity { get; }
     public InputProperty<bool> IsVisible { get; }
-    public InputProperty<bool> ClipToPreviousMember { get; }
+    public bool ClipToPreviousMember { get; }
     public InputProperty<BlendMode> BlendMode { get; }
-    public InputProperty<ChunkyImage?> Mask { get; }
+    public InputProperty<Texture?> CustomMask { get; }
     public InputProperty<bool> MaskIsVisible { get; }
     public string MemberName { get; set; }
     public RectI? GetTightBounds(KeyFrameTime frameTime);
+    
+    public ChunkyImage? EmbeddedMask { get; }
 }

+ 3 - 11
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/ImageLayerNode.cs

@@ -15,13 +15,13 @@ public class ImageLayerNode : LayerNode, IReadOnlyImageNode
 {
     public const string ImageFramesKey = "Frames";
     public const string ImageLayerKey = "LayerImage";
-
     public OutputProperty<Texture> RawOutput { get; }
 
-    public InputProperty<bool> LockTransparency { get; }
+    public bool LockTransparency { get; set; }
 
     private VecI size;
     private ChunkyImage layerImage => keyFrames[0]?.Data as ChunkyImage;
+    
 
     protected Dictionary<(ChunkResolution, int), Texture> workingSurfaces =
         new Dictionary<(ChunkResolution, int), Texture>();
@@ -43,8 +43,6 @@ public class ImageLayerNode : LayerNode, IReadOnlyImageNode
     {
         RawOutput = CreateOutput<Texture>(nameof(RawOutput), "RAW_LAYER_OUTPUT", null);
 
-        LockTransparency = CreateInput<bool>("LockTransparency", "LOCK_TRANSPARENCY", false);
-
         if (keyFrames.Count == 0)
         {
             keyFrames.Add(new KeyFrameData(Guid.NewGuid(), 0, 0, ImageLayerKey) { Data = new ChunkyImage(size) });
@@ -315,6 +313,7 @@ public class ImageLayerNode : LayerNode, IReadOnlyImageNode
     protected override bool CacheChanged(RenderingContext context)
     {
         var frame = GetFrameWithImage(context.FrameTime);
+        
         return base.CacheChanged(context) || frame?.RequiresUpdate == true;
     }
 
@@ -358,13 +357,6 @@ public class ImageLayerNode : LayerNode, IReadOnlyImageNode
 
     void IReadOnlyImageNode.ForEveryFrame(Action<IReadOnlyChunkyImage> action) => ForEveryFrame(action);
 
-    bool ITransparencyLockable.LockTransparency
-    {
-        get => LockTransparency.Value; // TODO: I wonder if it should be NonOverridenValue
-        set => LockTransparency.NonOverridenValue = value;
-    }
-
-
     public void ForEveryFrame(Action<ChunkyImage> action)
     {
         foreach (var frame in keyFrames)

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

@@ -17,16 +17,17 @@ public abstract class StructureNode : Node, IReadOnlyStructureNode, IBackgroundI
     public InputProperty<Texture?> Background { get; }
     public InputProperty<float> Opacity { get; }
     public InputProperty<bool> IsVisible { get; }
-    public InputProperty<bool> ClipToPreviousMember { get; }
+    public bool ClipToPreviousMember { get; set; }
     public InputProperty<BlendMode> BlendMode { get; }
-    public InputProperty<ChunkyImage?> Mask { get; }
+    public InputProperty<Texture?> CustomMask { get; }
     public InputProperty<bool> MaskIsVisible { get; }
     public InputProperty<Filter> Filters { get; }
-
     public OutputProperty<Texture?> Output { get; }
 
     public OutputProperty<Texture?> FilterlessOutput { get; }
 
+    public ChunkyImage? EmbeddedMask { get; set; }
+
     public string MemberName
     {
         get => DisplayName;
@@ -35,15 +36,16 @@ public abstract class StructureNode : Node, IReadOnlyStructureNode, IBackgroundI
     
     private Paint maskPaint = new Paint() { BlendMode = DrawingApi.Core.Surfaces.BlendMode.DstIn };
     protected Paint blendPaint = new Paint();
+    
+    private int maskCacheHash = 0;
 
     protected StructureNode()
     {
         Background = CreateInput<Texture?>("Background", "BACKGROUND", null);
         Opacity = CreateInput<float>("Opacity", "OPACITY", 1);
         IsVisible = CreateInput<bool>("IsVisible", "IS_VISIBLE", true);
-        ClipToPreviousMember = CreateInput<bool>("ClipToMemberBelow", "CLIP_TO_MEMBER_BELOW", false);
         BlendMode = CreateInput<BlendMode>("BlendMode", "BLEND_MODE", Enums.BlendMode.Normal);
-        Mask = CreateInput<ChunkyImage?>("Mask", "MASK", null);
+        CustomMask = CreateInput<Texture?>("Mask", "MASK", null);
         MaskIsVisible = CreateInput<bool>("MaskIsVisible", "MASK_IS_VISIBLE", true);
         Filters = CreateInput<Filter>(nameof(Filters), "FILTERS", null);
 
@@ -60,34 +62,52 @@ public abstract class StructureNode : Node, IReadOnlyStructureNode, IBackgroundI
 
     protected void ApplyMaskIfPresent(Texture surface, RenderingContext context)
     {
-        if (Mask.Value != null && MaskIsVisible.Value)
+        if (MaskIsVisible.Value)
         {
-            Mask.Value.DrawMostUpToDateChunkOn(
-                context.ChunkToUpdate,
-                context.ChunkResolution,
-                surface.DrawingSurface,
-                context.ChunkToUpdate * context.ChunkResolution.PixelSize(),
-                maskPaint);
+            if (CustomMask.Value != null)
+            {
+                surface.DrawingSurface.Canvas.DrawSurface(CustomMask.Value.DrawingSurface, 0, 0, maskPaint); 
+            }
+            else if (EmbeddedMask != null)
+            {
+                EmbeddedMask.DrawMostUpToDateChunkOn(
+                    context.ChunkToUpdate,
+                    context.ChunkResolution,
+                    surface.DrawingSurface,
+                    context.ChunkToUpdate * context.ChunkResolution.PixelSize(),
+                    maskPaint);
+            }
         }
     }
 
+    protected override bool CacheChanged(RenderingContext context)
+    {
+        int cacheHash = EmbeddedMask?.GetCacheHash() ?? 0;
+        return base.CacheChanged(context) || maskCacheHash != cacheHash;
+    }
+
+    protected override void UpdateCache(RenderingContext context)
+    {
+        base.UpdateCache(context);
+        maskCacheHash = EmbeddedMask?.GetCacheHash() ?? 0;
+    }
+
     protected void ApplyRasterClip(Texture toClip, Texture clipSource)
     {
-        if (ClipToPreviousMember.Value && Background.Value != null)
+        if (ClipToPreviousMember && Background.Value != null)
         {
              toClip.DrawingSurface.Canvas.DrawSurface(clipSource.DrawingSurface, 0, 0, maskPaint);
         }
     }
 
-
     protected bool IsEmptyMask()
     {
-        return Mask.Value != null && MaskIsVisible.Value && !Mask.Value.LatestOrCommittedChunkExists();
+        return EmbeddedMask != null && MaskIsVisible.Value && !EmbeddedMask.LatestOrCommittedChunkExists();
     }
 
     protected bool HasOperations()
     {
-        return (MaskIsVisible.Value && Mask.Value != null) || ClipToPreviousMember.Value;
+        return (MaskIsVisible.Value && (EmbeddedMask != null || CustomMask.Value != null)) || ClipToPreviousMember;
     }
 
     protected void DrawBackground(Texture workingSurface, RenderingContext context)

+ 8 - 8
src/PixiEditor.ChangeableDocument/Changes/Drawing/ApplyLayerMask_Change.cs

@@ -21,24 +21,24 @@ internal class ApplyLayerMask_Change : Change
     public override bool InitializeAndValidate(Document target)
     {
         //TODO: Check if support for different Layer types is needed here.
-        if (!target.TryFindMember<ImageLayerNode>(layerGuid, out var layer) || layer.Mask.Value is null)
+        if (!target.TryFindMember<ImageLayerNode>(layerGuid, out var layer) || layer.EmbeddedMask is null)
             return false;
 
         var layerImage = layer.GetLayerImageAtFrame(frame);
         savedLayer = new CommittedChunkStorage(layerImage, layerImage.FindCommittedChunks());
-        savedMask = new CommittedChunkStorage(layer.Mask.Value, layer.Mask.Value.FindCommittedChunks());
+        savedMask = new CommittedChunkStorage(layer.EmbeddedMask, layer.EmbeddedMask.FindCommittedChunks());
         return true;
     }
 
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Apply(Document target, bool firstApply, out bool ignoreInUndo)
     {
         var layer = target.FindMemberOrThrow<ImageLayerNode>(layerGuid);
-        if (layer.Mask is null)
+        if (layer.EmbeddedMask is null)
             throw new InvalidOperationException("Cannot apply layer mask, no mask");
 
         var layerImage = layer.GetLayerImageAtFrame(frame);
         ChunkyImage newLayerImage = new ChunkyImage(target.Size);
-        newLayerImage.AddRasterClip(layer.Mask.Value);
+        newLayerImage.AddRasterClip(layer.EmbeddedMask);
         newLayerImage.EnqueueDrawCommitedChunkyImage(VecI.Zero, layerImage);
         newLayerImage.CommitChanges();
 
@@ -48,8 +48,8 @@ internal class ApplyLayerMask_Change : Change
         layer.SetLayerImageAtFrame(frame, newLayerImage);
         toDispose.Dispose();
 
-        var toDisposeMask = layer.Mask.NonOverridenValue;
-        layer.Mask.NonOverridenValue = null;
+        var toDisposeMask = layer.EmbeddedMask;
+        layer.EmbeddedMask = null;
         toDisposeMask.Dispose();
 
         ignoreInUndo = false;
@@ -63,7 +63,7 @@ internal class ApplyLayerMask_Change : Change
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Revert(Document target)
     {
         var layer = target.FindMemberOrThrow<ImageLayerNode>(layerGuid);
-        if (layer.Mask.Value is not null)
+        if (layer.EmbeddedMask is not null)
             throw new InvalidOperationException("Cannot restore layer mask, it already has one");
         if (savedLayer is null || savedMask is null)
             throw new InvalidOperationException("Cannot restore layer mask, no saved data");
@@ -72,7 +72,7 @@ internal class ApplyLayerMask_Change : Change
         savedMask.ApplyChunksToImage(newMask);
         var affectedChunksMask = newMask.FindAffectedArea();
         newMask.CommitChanges();
-        layer.Mask.NonOverridenValue = newMask;
+        layer.EmbeddedMask = newMask;
 
         var layerImage = layer.GetLayerImageAtFrame(frame);
         

+ 5 - 5
src/PixiEditor.ChangeableDocument/Changes/Drawing/DrawingChangeHelper.cs

@@ -40,9 +40,9 @@ internal static class DrawingChangeHelper
 
         if (drawOnMask)
         {
-            if (member.Mask is null)
+            if (member.EmbeddedMask is null)
                 throw new InvalidOperationException("Trying to draw on a mask that doesn't exist");
-            return member.Mask.Value;
+            return member.EmbeddedMask;
         }
 
         if (member is FolderNode)
@@ -65,9 +65,9 @@ internal static class DrawingChangeHelper
 
         if (drawOnMask)
         {
-            if (member.Mask.NonOverridenValue is null)
+            if (member.EmbeddedMask is null)
                 throw new InvalidOperationException("Trying to draw on a mask that doesn't exist");
-            return member.Mask.NonOverridenValue;
+            return member.EmbeddedMask;
         }
 
         if (member is FolderNode)
@@ -109,7 +109,7 @@ internal static class DrawingChangeHelper
         return drawOnMask switch
         {
             // If it should draw on the mask, the mask can't be null
-            true when member.Mask.NonOverridenValue is null => false,
+            true when member.EmbeddedMask is null => false,
             // If it should not draw on the mask, the member can't be a folder
             false when member is FolderNode => false,
             _ => true

+ 6 - 6
src/PixiEditor.ChangeableDocument/Changes/Properties/LayerStructure/CreateStructureMemberMask_Change.cs

@@ -14,15 +14,15 @@ internal class CreateStructureMemberMask_Change : Change
 
     public override bool InitializeAndValidate(Document target)
     {
-        return target.TryFindMember(targetMember, out var member) && member.Mask.NonOverridenValue is null;
+        return target.TryFindMember(targetMember, out var member) && member.EmbeddedMask is null;
     }
 
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Apply(Document target, bool firstApply, out bool ignoreInUndo)
     {
         var member = target.FindMemberOrThrow(targetMember);
-        if (member.Mask.NonOverridenValue is not null)
+        if (member.EmbeddedMask is not null)
             throw new InvalidOperationException("Cannot create a mask; the target member already has one");
-        member.Mask.NonOverridenValue = new ChunkyImage(target.Size);
+        member.EmbeddedMask = new ChunkyImage(target.Size);
 
         ignoreInUndo = false;
         return new StructureMemberMask_ChangeInfo(targetMember, true);
@@ -31,10 +31,10 @@ internal class CreateStructureMemberMask_Change : Change
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Revert(Document target)
     {
         var member = target.FindMemberOrThrow(targetMember);
-        if (member.Mask.NonOverridenValue is null)
+        if (member.EmbeddedMask is null)
             throw new InvalidOperationException("Cannot delete the mask; the target member has no mask");
-        member.Mask.NonOverridenValue.Dispose();
-        member.Mask.NonOverridenValue = null;
+        member.EmbeddedMask.Dispose();
+        member.EmbeddedMask = null;
         return new StructureMemberMask_ChangeInfo(targetMember, false);
     }
 }

+ 7 - 7
src/PixiEditor.ChangeableDocument/Changes/Properties/LayerStructure/DeleteStructureMemberMask_Change.cs

@@ -15,20 +15,20 @@ internal class DeleteStructureMemberMask_Change : Change
 
     public override bool InitializeAndValidate(Document target)
     {
-        if (!target.TryFindMember(memberGuid, out var member) || member.Mask.NonOverridenValue is null)
+        if (!target.TryFindMember(memberGuid, out var member) || member.EmbeddedMask is null)
             return false;
         
-        storedMask = member.Mask.NonOverridenValue.CloneFromCommitted();
+        storedMask = member.EmbeddedMask.CloneFromCommitted();
         return true;
     }
 
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Apply(Document target, bool firstApply, out bool ignoreInUndo)
     {
         var member = target.FindMemberOrThrow(memberGuid);
-        if (member.Mask.NonOverridenValue is null)
+        if (member.EmbeddedMask is null)
             throw new InvalidOperationException("Cannot delete the mask; Target member has no mask");
-        member.Mask.NonOverridenValue.Dispose();
-        member.Mask.NonOverridenValue = null;
+        member.EmbeddedMask.Dispose();
+        member.EmbeddedMask = null;
 
         ignoreInUndo = false;
         return new StructureMemberMask_ChangeInfo(memberGuid, false);
@@ -37,9 +37,9 @@ internal class DeleteStructureMemberMask_Change : Change
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Revert(Document target)
     {
         var member = target.FindMemberOrThrow(memberGuid);
-        if (member.Mask.NonOverridenValue is not null)
+        if (member.EmbeddedMask is not null)
             throw new InvalidOperationException("Cannot revert mask deletion; The target member already has a mask");
-        member.Mask.NonOverridenValue = storedMask!.CloneFromCommitted();
+        member.EmbeddedMask = storedMask!.CloneFromCommitted();
 
         return new StructureMemberMask_ChangeInfo(memberGuid, true);
     }

+ 4 - 4
src/PixiEditor.ChangeableDocument/Changes/Properties/LayerStructure/StructureMemberClipToMemberBelow_Change.cs

@@ -16,16 +16,16 @@ internal class StructureMemberClipToMemberBelow_Change : Change
 
     public override bool InitializeAndValidate(Document target)
     {
-        if (!target.TryFindMember(memberGuid, out var member) || member.ClipToPreviousMember.NonOverridenValue == newValue)
+        if (!target.TryFindMember(memberGuid, out var member) || member.ClipToPreviousMember == newValue)
             return false;
-        originalValue = member.ClipToPreviousMember.NonOverridenValue;
+        originalValue = member.ClipToPreviousMember;
         return true;
     }
 
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Apply(Document target, bool firstApply, out bool ignoreInUndo)
     {
         var member = target.FindMemberOrThrow(memberGuid);
-        member.ClipToPreviousMember.NonOverridenValue = newValue;
+        member.ClipToPreviousMember = newValue;
         ignoreInUndo = false;
         return new StructureMemberClipToMemberBelow_ChangeInfo(memberGuid, newValue);
     }
@@ -33,7 +33,7 @@ internal class StructureMemberClipToMemberBelow_Change : Change
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Revert(Document target)
     {
         var member = target.FindMemberOrThrow(memberGuid);
-        member.ClipToPreviousMember.NonOverridenValue = originalValue;
+        member.ClipToPreviousMember = originalValue;
         return new StructureMemberClipToMemberBelow_ChangeInfo(memberGuid, originalValue);
     }
 

+ 2 - 2
src/PixiEditor.ChangeableDocument/Changes/Root/ClipCanvas_Change.cs

@@ -52,10 +52,10 @@ internal class ClipCanvas_Change : ResizeBasedChangeBase
                 });
             }
             
-            if (member.Mask.NonOverridenValue is null)
+            if (member.EmbeddedMask is null)
                 return;
             
-            Resize(member.Mask.NonOverridenValue, member.Id, newBounds.Size, -newBounds.Pos, deletedMaskChunks);
+            Resize(member.EmbeddedMask, member.Id, newBounds.Size, -newBounds.Pos, deletedMaskChunks);
         });
 
         ignoreInUndo = false;

+ 2 - 2
src/PixiEditor.ChangeableDocument/Changes/Root/Crop_Change.cs

@@ -42,10 +42,10 @@ internal class Crop_Change : ResizeBasedChangeBase
                     Resize(frame, layer.Id, rect.Size, rect.Pos * -1, deletedChunks);
                 });
             }
-            if (member.Mask.NonOverridenValue is null)
+            if (member.EmbeddedMask is null)
                 return;
 
-            Resize(member.Mask.NonOverridenValue, member.Id, rect.Size, rect.Pos * -1, deletedMaskChunks);
+            Resize(member.EmbeddedMask, member.Id, rect.Size, rect.Pos * -1, deletedMaskChunks);
         });
         
         ignoreInUndo = false;

+ 4 - 4
src/PixiEditor.ChangeableDocument/Changes/Root/FlipImage_Change.cs

@@ -113,12 +113,12 @@ internal sealed class FlipImage_Change : Change
                 }
                 // TODO: Add support for non-raster layers
 
-                if (member.Mask.NonOverridenValue is not null)
+                if (member.EmbeddedMask is not null)
                 {
-                    FlipImage(member.Mask.NonOverridenValue);
+                    FlipImage(member.EmbeddedMask);
                     changes.Add(
-                        new MaskArea_ChangeInfo(member.Id, member.Mask.NonOverridenValue.FindAffectedArea()));
-                    member.Mask.NonOverridenValue.CommitChanges();
+                        new MaskArea_ChangeInfo(member.Id, member.EmbeddedMask.FindAffectedArea()));
+                    member.EmbeddedMask.CommitChanges();
                 }
             }
         });

+ 4 - 4
src/PixiEditor.ChangeableDocument/Changes/Root/ResizeBasedChangeBase.cs

@@ -60,11 +60,11 @@ internal abstract class ResizeBasedChangeBase : Change
 
             // TODO: Add support for different Layer types?
 
-            if (member.Mask.NonOverridenValue is null)
+            if (member.EmbeddedMask is null)
                 return;
-            member.Mask.NonOverridenValue.EnqueueResize(_originalSize);
-            deletedMaskChunks[member.Id][0].ApplyChunksToImage(member.Mask.NonOverridenValue);
-            member.Mask.NonOverridenValue.CommitChanges();
+            member.EmbeddedMask.EnqueueResize(_originalSize);
+            deletedMaskChunks[member.Id][0].ApplyChunksToImage(member.EmbeddedMask);
+            member.EmbeddedMask.CommitChanges();
         });
 
         target.HorizontalSymmetryAxisY = _originalHorAxisY;

+ 2 - 2
src/PixiEditor.ChangeableDocument/Changes/Root/ResizeCanvas_Change.cs

@@ -57,10 +57,10 @@ internal class ResizeCanvas_Change : ResizeBasedChangeBase
 
             // TODO: Check if adding support for different Layer types is necessary
 
-            if (member.Mask.Value is null)
+            if (member.EmbeddedMask is null)
                 return;
 
-            Resize(member.Mask.Value, member.Id, newSize, offset, deletedMaskChunks);
+            Resize(member.EmbeddedMask, member.Id, newSize, offset, deletedMaskChunks);
         });
 
         ignoreInUndo = false;

+ 10 - 10
src/PixiEditor.ChangeableDocument/Changes/Root/ResizeImage_Change.cs

@@ -101,12 +101,12 @@ internal class ResizeImage_Change : Change
 
             // Add support for different Layer types
 
-            if (member.Mask.Value is not null)
+            if (member.EmbeddedMask is not null)
             {
-                ScaleChunkyImage(member.Mask.Value);
-                var affected = member.Mask.Value.FindAffectedArea();
-                savedMaskChunks[member.Id] = new CommittedChunkStorage(member.Mask.Value, affected.Chunks);
-                member.Mask.Value.CommitChanges();
+                ScaleChunkyImage(member.EmbeddedMask);
+                var affected = member.EmbeddedMask.FindAffectedArea();
+                savedMaskChunks[member.Id] = new CommittedChunkStorage(member.EmbeddedMask, affected.Chunks);
+                member.EmbeddedMask.CommitChanges();
             }
         });
 
@@ -130,12 +130,12 @@ internal class ResizeImage_Change : Change
                 });
             }
 
-            if (member.Mask.Value is not null)
+            if (member.EmbeddedMask is not null)
             {
-                member.Mask.Value.EnqueueResize(originalSize);
-                member.Mask.Value.EnqueueClear();
-                savedMaskChunks[member.Id].ApplyChunksToImage(member.Mask.Value);
-                member.Mask.Value.CommitChanges();
+                member.EmbeddedMask.EnqueueResize(originalSize);
+                member.EmbeddedMask.EnqueueClear();
+                savedMaskChunks[member.Id].ApplyChunksToImage(member.EmbeddedMask);
+                member.EmbeddedMask.CommitChanges();
             }
         });
 

+ 9 - 9
src/PixiEditor.ChangeableDocument/Changes/Root/RotateImage_Change.cs

@@ -158,10 +158,10 @@ internal sealed class RotateImage_Change : Change
 
                 // TODO: Add support for different Layer types
 
-                if (member.Mask.NonOverridenValue is null)
+                if (member.EmbeddedMask is null)
                     return;
 
-                Resize(member.Mask.NonOverridenValue, member.Id, deletedMaskChunks, null);
+                Resize(member.EmbeddedMask, member.Id, deletedMaskChunks, null);
             }
         });
 
@@ -199,10 +199,10 @@ internal sealed class RotateImage_Change : Change
                 }
             }
 
-            if (member.Mask.NonOverridenValue is null)
+            if (member.EmbeddedMask is null)
                 return;
 
-            Resize(member.Mask.NonOverridenValue, member.Id, deletedMaskChunks, null);
+            Resize(member.EmbeddedMask, member.Id, deletedMaskChunks, null);
         });
 
         return new Size_ChangeInfo(newSize, target.VerticalSymmetryAxisX, target.HorizontalSymmetryAxisY);
@@ -257,12 +257,12 @@ internal sealed class RotateImage_Change : Change
                 }
             }
 
-            if (member.Mask.NonOverridenValue is null)
+            if (member.EmbeddedMask is null)
                 return;
-            member.Mask.NonOverridenValue.EnqueueResize(originalSize);
-            deletedMaskChunks[member.Id].ApplyChunksToImage(member.Mask.Value);
-            revertChanges.Add(new LayerImageArea_ChangeInfo(member.Id, member.Mask.Value.FindAffectedArea()));
-            member.Mask.NonOverridenValue.CommitChanges();
+            member.EmbeddedMask.EnqueueResize(originalSize);
+            deletedMaskChunks[member.Id].ApplyChunksToImage(member.EmbeddedMask);
+            revertChanges.Add(new LayerImageArea_ChangeInfo(member.Id, member.EmbeddedMask.FindAffectedArea()));
+            member.EmbeddedMask.CommitChanges();
         });
 
         DisposeDeletedChunks();

+ 2 - 2
src/PixiEditor.ChangeableDocument/Changes/Structure/ApplyMask_Change.cs

@@ -21,7 +21,7 @@ internal sealed class ApplyMask_Change : Change
     public override bool InitializeAndValidate(Document target)
     {
         var member = target.FindMember(structureMemberGuid);
-        bool isValid = member is not (null or FolderNode) && member.Mask.Value is not null;
+        bool isValid = member is not (null or FolderNode) && member.EmbeddedMask is not null;
 
         return isValid;
     }
@@ -31,7 +31,7 @@ internal sealed class ApplyMask_Change : Change
     {
         var layer = target.FindMemberOrThrow<ImageLayerNode>(structureMemberGuid)!;
         var layerImage = layer.GetLayerImageAtFrame(frame);
-        layerImage.EnqueueApplyMask(layer.Mask.Value!);
+        layerImage.EnqueueApplyMask(layer.EmbeddedMask);
         ignoreInUndo = false;
         var layerInfo = new LayerImageArea_ChangeInfo(structureMemberGuid, layerImage.FindAffectedArea());
         savedChunks = new CommittedChunkStorage(layerImage, layerInfo.Area.Chunks);

+ 5 - 5
src/PixiEditor/Models/Rendering/AffectedAreasGatherer.cs

@@ -196,8 +196,8 @@ internal class AffectedAreasGatherer
             }
 
             var chunks = result.FindAllChunks();
-            if (layer.Mask.Value is not null && layer.MaskIsVisible.Value && useMask)
-                chunks.IntersectWith(layer.Mask.Value.FindAllChunks());
+            if (layer.EmbeddedMask is not null && layer.MaskIsVisible.Value && useMask)
+                chunks.IntersectWith(layer.EmbeddedMask.FindAllChunks());
             AddToMainImage(new AffectedArea(chunks));
         }
         else
@@ -210,9 +210,9 @@ internal class AffectedAreasGatherer
     {
         if (!tracker.Document.TryFindMember(memberGuid, out var member))
             return;
-        if (member.Mask.Value is not null)
+        if (member.EmbeddedMask is not null)
         {
-            var chunks = member.Mask.Value.FindAllChunks();
+            var chunks = member.EmbeddedMask.FindAllChunks();
             AddToMaskPreview(memberGuid, new AffectedArea(chunks));
         }
 
@@ -305,7 +305,7 @@ internal class AffectedAreasGatherer
     {
         tracker.Document.ForEveryReadonlyMember((member) =>
         {
-            if (member.Mask.Value is not null)
+            if (member.EmbeddedMask is not null)
                 AddWholeCanvasToMaskPreview(member.Id);
         });
     }

+ 8 - 8
src/PixiEditor/Models/Rendering/MemberPreviewUpdater.cs

@@ -193,7 +193,7 @@ internal class MemberPreviewUpdater
             if (member is null)
                 continue;
 
-            if (forMasks && member.Mask.NonOverridenValue is null)
+            if (forMasks && member.EmbeddedMask is null)
             {
                 newPreviewBitmapSizes.Add(guid, null);
                 continue;
@@ -274,7 +274,7 @@ internal class MemberPreviewUpdater
     private RectI? GetOrFindMemberTightBounds(IReadOnlyStructureNode member, int atFrame,
         AffectedArea currentlyAffectedArea, bool forMask)
     {
-        if (forMask && member.Mask.NonOverridenValue is null)
+        if (forMask && member.EmbeddedMask is null)
             throw new InvalidOperationException();
 
         RectI? prevTightBounds = null;
@@ -304,11 +304,11 @@ internal class MemberPreviewUpdater
     /// </summary>
     private RectI? FindLayerTightBounds(IReadOnlyLayerNode layer, int frame, bool forMask)
     {
-        if (layer.Mask.NonOverridenValue is null && forMask)
+        if (layer.EmbeddedMask is null && forMask)
             throw new InvalidOperationException();
 
-        if (layer.Mask.NonOverridenValue is not null && forMask)
-            return FindImageTightBoundsFast(layer.Mask.Value);
+        if (layer.EmbeddedMask is not null && forMask)
+            return FindImageTightBoundsFast(layer.EmbeddedMask);
 
         if (layer is IReadOnlyImageNode raster)
         {
@@ -325,9 +325,9 @@ internal class MemberPreviewUpdater
     {
         if (forMask)
         {
-            if (folder.Mask.Value is null)
+            if (folder.EmbeddedMask is null)
                 throw new InvalidOperationException();
-            return FindImageTightBoundsFast(folder.Mask.Value);
+            return FindImageTightBoundsFast(folder.EmbeddedMask);
         }
 
         /*RectI? combinedBounds = null;
@@ -717,7 +717,7 @@ internal class MemberPreviewUpdater
                 foreach (var chunk in affArea.Value.Chunks)
                 {
                     var pos = chunk * ChunkResolution.Full.PixelSize();
-                    member.Mask!.Value.DrawMostUpToDateChunkOn
+                    member.EmbeddedMask!.DrawMostUpToDateChunkOn
                     (chunk, ChunkResolution.Full, memberVM.MaskPreviewSurface.DrawingSurface, pos,
                         scaling < smoothingThreshold ? SmoothReplacingPaint : ReplacingPaint);
                 }