2
0
Эх сурвалжийг харах

Preview vector shape duplicate

flabbet 7 сар өмнө
parent
commit
0db8547bbb

+ 1 - 1
src/Drawie

@@ -1 +1 @@
-Subproject commit 0f4cbd35e77d52f89c944d5fcc7d732ccd22bd82
+Subproject commit bbc26f8cbc06e8cbe0cdbe1c11cb1b5372a7e484

+ 2 - 0
src/PixiEditor.ChangeableDocument/Changeables/Graph/Interfaces/IReadOnlyShapeVectorData.cs

@@ -1,5 +1,6 @@
 using Drawie.Backend.Core.ColorsImpl;
 using Drawie.Backend.Core.ColorsImpl;
 using Drawie.Backend.Core.Numerics;
 using Drawie.Backend.Core.Numerics;
+using Drawie.Backend.Core.Vector;
 using Drawie.Numerics;
 using Drawie.Numerics;
 
 
 namespace PixiEditor.ChangeableDocument.Changeables.Graph.Interfaces;
 namespace PixiEditor.ChangeableDocument.Changeables.Graph.Interfaces;
@@ -14,4 +15,5 @@ public interface IReadOnlyShapeVectorData
     public RectD GeometryAABB { get; }
     public RectD GeometryAABB { get; }
     public RectD TransformedAABB { get; }
     public RectD TransformedAABB { get; }
     public ShapeCorners TransformationCorners { get; }
     public ShapeCorners TransformationCorners { get; }
+    public VectorPath ToPath();
 }
 }

+ 88 - 22
src/PixiEditor.ChangeableDocument/Changes/Drawing/PreviewTransformSelected_UpdateableChange.cs

@@ -9,6 +9,8 @@ using Drawie.Backend.Core.Surfaces;
 using Drawie.Backend.Core.Surfaces.PaintImpl;
 using Drawie.Backend.Core.Surfaces.PaintImpl;
 using Drawie.Backend.Core.Vector;
 using Drawie.Backend.Core.Vector;
 using Drawie.Numerics;
 using Drawie.Numerics;
+using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes.Shapes.Data;
+using PixiEditor.ChangeableDocument.ChangeInfos.Vectors;
 
 
 namespace PixiEditor.ChangeableDocument.Changes.Drawing;
 namespace PixiEditor.ChangeableDocument.Changes.Drawing;
 
 
@@ -109,23 +111,26 @@ internal class PreviewTransformSelected_UpdateableChange : InterruptableUpdateab
                 var targetBounds = tightBoundsWithSelection != default ? tightBoundsWithSelection : tightBounds;
                 var targetBounds = tightBoundsWithSelection != default ? tightBoundsWithSelection : tightBounds;
                 SetImageMember(target, member, targetBounds, layer);
                 SetImageMember(target, member, targetBounds, layer);
             }
             }
-            else if (layer is ITransformableObject transformable)
+            else if (layer is IReadOnlyVectorNode vectorNode)
             {
             {
-                SetTransformableMember(member, transformable, tightBounds);
+                SetVectorMember(member, vectorNode, tightBounds);
             }
             }
         }
         }
 
 
         return true;
         return true;
     }
     }
 
 
-    private void SetTransformableMember(MemberTransformationData member,
-        ITransformableObject transformable, RectD tightBounds)
+    private void SetVectorMember(MemberTransformationData member,
+        IReadOnlyVectorNode vectorNode, RectD tightBounds)
     {
     {
         member.OriginalBounds = tightBounds;
         member.OriginalBounds = tightBounds;
         VecD posRelativeToMaster = member.OriginalBounds.Value.TopLeft - masterCorners.TopLeft;
         VecD posRelativeToMaster = member.OriginalBounds.Value.TopLeft - masterCorners.TopLeft;
 
 
+        member.OriginalMatrix = vectorNode.ShapeData.TransformationMatrix;
         member.OriginalPos = (VecI)posRelativeToMaster;
         member.OriginalPos = (VecI)posRelativeToMaster;
-        member.AddTransformableObject(transformable, transformable.TransformationMatrix);
+        member.OriginalShapeData = vectorNode.ShapeData as ShapeVectorData;
+        member.OriginalPath = vectorNode.ShapeData?.ToPath();
+        member.OriginalPath.Transform(vectorNode.ShapeData.TransformationMatrix);
     }
     }
 
 
     private void SetImageMember(Document target, MemberTransformationData member, RectD originalTightBounds,
     private void SetImageMember(Document target, MemberTransformationData member, RectD originalTightBounds,
@@ -230,6 +235,8 @@ internal class PreviewTransformSelected_UpdateableChange : InterruptableUpdateab
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Apply(Document target, bool firstApply,
     public override OneOf<None, IChangeInfo, List<IChangeInfo>> Apply(Document target, bool firstApply,
         out bool ignoreInUndo)
         out bool ignoreInUndo)
     {
     {
+        List<IChangeInfo> infos = new();
+        
         foreach (var data in memberData)
         foreach (var data in memberData)
         {
         {
             if (data.IsImage)
             if (data.IsImage)
@@ -238,20 +245,29 @@ internal class PreviewTransformSelected_UpdateableChange : InterruptableUpdateab
                     DrawingChangeHelper.GetTargetImageOrThrow(target, data.MemberId, drawOnMask, frame);
                     DrawingChangeHelper.GetTargetImageOrThrow(target, data.MemberId, drawOnMask, frame);
                 targetImage.CancelChanges();
                 targetImage.CancelChanges();
             }
             }
+            else if (data.OriginalPath != null)
+            {
+                var memberNode = target.FindMemberOrThrow(data.MemberId);
+                if (memberNode is VectorLayerNode vectorNode)
+                {
+                    (vectorNode.ShapeData as PathVectorData)?.Path.Dispose();
+                    vectorNode.ShapeData = data.OriginalShapeData;
+                    infos.Add(new VectorShape_ChangeInfo(data.MemberId, GetTranslationAffectedArea()));
+                }
+            }
         }
         }
-        
-        List<IChangeInfo> infos = new();
-        
+
+
         if (isTransformingSelection)
         if (isTransformingSelection)
         {
         {
-            VectorPath? newPath = originalPath == null ? null : new VectorPath(originalPath); 
+            VectorPath? newPath = originalPath == null ? null : new VectorPath(originalPath);
             target.Selection.SelectionPath = newPath;
             target.Selection.SelectionPath = newPath;
             infos.Add(new Selection_ChangeInfo(newPath));
             infos.Add(new Selection_ChangeInfo(newPath));
         }
         }
-        
+
         hasEnqueudImages = false;
         hasEnqueudImages = false;
         ignoreInUndo = true;
         ignoreInUndo = true;
-        
+
         return infos;
         return infos;
     }
     }
 
 
@@ -270,9 +286,43 @@ internal class PreviewTransformSelected_UpdateableChange : InterruptableUpdateab
                         DrawImage(member, targetImage), drawOnMask)
                         DrawImage(member, targetImage), drawOnMask)
                     .AsT1);
                     .AsT1);
             }
             }
-            /*else if (member.IsTransformable)
+            else if (member.OriginalPath != null)
             {
             {
-                member.TransformableObject.TransformationMatrix = member.LocalMatrix;
+                VectorPath newPath = new VectorPath(member.OriginalPath);
+
+                VecD translation = VecD.Zero;
+                    //member.OriginalBounds.Value.TopLeft;
+                
+                var finalMatrix = member.LocalMatrix
+                    .Concat(member.OriginalShapeData.TransformationMatrix.Invert())
+                    .PostConcat(Matrix3X3.CreateTranslation(-(float)translation.X, -(float)translation.Y));
+                    
+                newPath.AddPath(member.OriginalPath, finalMatrix, AddPathMode.Append);
+
+                var memberNode = target.FindMemberOrThrow(member.MemberId);
+                if (memberNode is VectorLayerNode vectorNode)
+                {
+                    StrokeCap cap = vectorNode.ShapeData is PathVectorData pathData
+                        ? pathData.StrokeLineCap
+                        : StrokeCap.Round;
+                    StrokeJoin join = vectorNode.ShapeData is PathVectorData pathData1
+                        ? pathData1.StrokeLineJoin
+                        : StrokeJoin.Round;
+                    vectorNode.ShapeData = new PathVectorData(newPath)
+                    {
+                        Fill = vectorNode.ShapeData.Fill,
+                        FillColor = vectorNode.ShapeData.FillColor,
+                        StrokeWidth = vectorNode.ShapeData.StrokeWidth,
+                        StrokeColor = vectorNode.ShapeData.StrokeColor,
+                        Path = newPath,
+                        StrokeLineCap = cap,
+                        StrokeLineJoin = join
+                    };
+                }
+                else
+                {
+                    continue;
+                }
 
 
                 AffectedArea translationAffectedArea = GetTranslationAffectedArea();
                 AffectedArea translationAffectedArea = GetTranslationAffectedArea();
                 var tmp = new AffectedArea(translationAffectedArea);
                 var tmp = new AffectedArea(translationAffectedArea);
@@ -282,16 +332,10 @@ internal class PreviewTransformSelected_UpdateableChange : InterruptableUpdateab
                 }
                 }
 
 
                 lastAffectedArea = tmp;
                 lastAffectedArea = tmp;
-                infos.Add(new TransformObject_ChangeInfo(member.MemberId, translationAffectedArea));
-            }*/
+                infos.Add(new VectorShape_ChangeInfo(member.MemberId, translationAffectedArea));
+            }
         }
         }
 
 
-        /*if (isTransformingSelection)
-        {
-            infos.Add(SelectionChangeHelper.DoSelectionTransform(target, originalPath!, originalSelectionBounds,
-                masterCorners, cornersToSelectionOffset, originalCornersSize));
-        }*/
-
         return infos;
         return infos;
     }
     }
 
 
@@ -311,7 +355,29 @@ internal class PreviewTransformSelected_UpdateableChange : InterruptableUpdateab
             member.Dispose();
             member.Dispose();
         }
         }
     }
     }
-    
+
+    private AffectedArea GetTranslationAffectedArea()
+    {
+        RectI oldBounds = (RectI)masterCorners.AABBBounds.RoundOutwards();
+
+        HashSet<VecI> chunks = new();
+        VecI topLeftChunk = new VecI((int)oldBounds.Left / ChunkyImage.FullChunkSize,
+            (int)oldBounds.Top / ChunkyImage.FullChunkSize);
+        VecI bottomRightChunk = new VecI((int)oldBounds.Right / ChunkyImage.FullChunkSize,
+            (int)oldBounds.Bottom / ChunkyImage.FullChunkSize);
+
+        for (int x = topLeftChunk.X; x <= bottomRightChunk.X; x++)
+        {
+            for (int y = topLeftChunk.Y; y <= bottomRightChunk.Y; y++)
+            {
+                chunks.Add(new VecI(x, y));
+            }
+        }
+
+        var final = new AffectedArea(chunks);
+        return final;
+    }
+
     private AffectedArea DrawImage(MemberTransformationData data, ChunkyImage memberImage)
     private AffectedArea DrawImage(MemberTransformationData data, ChunkyImage memberImage)
     {
     {
         var prevAffArea = memberImage.FindAffectedArea();
         var prevAffArea = memberImage.FindAffectedArea();

+ 4 - 1
src/PixiEditor.ChangeableDocument/Changes/Drawing/TransformSelected_UpdateableChange.cs

@@ -9,6 +9,7 @@ using Drawie.Backend.Core.Surfaces;
 using Drawie.Backend.Core.Surfaces.PaintImpl;
 using Drawie.Backend.Core.Surfaces.PaintImpl;
 using Drawie.Backend.Core.Vector;
 using Drawie.Backend.Core.Vector;
 using Drawie.Numerics;
 using Drawie.Numerics;
+using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes.Shapes.Data;
 
 
 namespace PixiEditor.ChangeableDocument.Changes.Drawing;
 namespace PixiEditor.ChangeableDocument.Changes.Drawing;
 
 
@@ -410,7 +411,7 @@ class MemberTransformationData : IDisposable
     public ShapeCorners MemberCorners { get; init; }
     public ShapeCorners MemberCorners { get; init; }
 
 
     public ITransformableObject? TransformableObject { get; private set; }
     public ITransformableObject? TransformableObject { get; private set; }
-    public Matrix3X3? OriginalMatrix { get; private set; }
+    public Matrix3X3? OriginalMatrix { get; set; }
 
 
     public CommittedChunkStorage? SavedChunks { get; set; }
     public CommittedChunkStorage? SavedChunks { get; set; }
     public VectorPath? OriginalPath { get; set; }
     public VectorPath? OriginalPath { get; set; }
@@ -421,6 +422,7 @@ class MemberTransformationData : IDisposable
     public bool IsTransformable => TransformableObject != null;
     public bool IsTransformable => TransformableObject != null;
     public RectI? RoundedOriginalBounds => (RectI)OriginalBounds?.RoundOutwards();
     public RectI? RoundedOriginalBounds => (RectI)OriginalBounds?.RoundOutwards();
     public Matrix3X3 LocalMatrix { get; set; }
     public Matrix3X3 LocalMatrix { get; set; }
+    public ShapeVectorData? OriginalShapeData { get; set; }
 
 
     public MemberTransformationData(Guid memberId)
     public MemberTransformationData(Guid memberId)
     {
     {
@@ -446,5 +448,6 @@ class MemberTransformationData : IDisposable
         OriginalPath?.Dispose();
         OriginalPath?.Dispose();
         OriginalPath = null;
         OriginalPath = null;
         SavedChunks?.Dispose();
         SavedChunks?.Dispose();
+        OriginalShapeData = null;
     }
     }
 }
 }