|
@@ -2,25 +2,24 @@
|
|
|
using PixiEditor.ChangeableDocument.Changeables.Graph.Nodes;
|
|
|
using Drawie.Backend.Core.Numerics;
|
|
|
using Drawie.Numerics;
|
|
|
+using PixiEditor.ChangeableDocument.Changeables.Graph.Interfaces;
|
|
|
|
|
|
namespace PixiEditor.ChangeableDocument.Changes.Drawing;
|
|
|
|
|
|
-internal class ShiftLayer_UpdateableChange : UpdateableChange
|
|
|
+internal class ShiftLayer_UpdateableChange : Change
|
|
|
{
|
|
|
private List<Guid> layerGuids;
|
|
|
- private bool keepOriginal;
|
|
|
- private VecI delta;
|
|
|
+ private VecD delta;
|
|
|
private Dictionary<Guid, CommittedChunkStorage?> originalLayerChunks = new();
|
|
|
+ private Dictionary<Guid, Matrix3X3> originalTransformations = new();
|
|
|
|
|
|
- private List<IChangeInfo> _tempChanges = new();
|
|
|
private int frame;
|
|
|
|
|
|
- [GenerateUpdateableChangeActions]
|
|
|
- public ShiftLayer_UpdateableChange(List<Guid> layerGuids, VecI delta, bool keepOriginal, int frame)
|
|
|
+ [GenerateMakeChangeAction]
|
|
|
+ public ShiftLayer_UpdateableChange(List<Guid> layerGuids, VecD delta, int frame)
|
|
|
{
|
|
|
this.delta = delta;
|
|
|
this.layerGuids = layerGuids;
|
|
|
- this.keepOriginal = keepOriginal;
|
|
|
this.frame = frame;
|
|
|
}
|
|
|
|
|
@@ -41,59 +40,36 @@ internal class ShiftLayer_UpdateableChange : UpdateableChange
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
- [UpdateChangeMethod]
|
|
|
- public void Update(VecI delta, bool keepOriginal)
|
|
|
- {
|
|
|
- this.delta = delta;
|
|
|
- this.keepOriginal = keepOriginal;
|
|
|
- }
|
|
|
-
|
|
|
public override OneOf<None, IChangeInfo, List<IChangeInfo>> Apply(Document target, bool firstApply,
|
|
|
out bool ignoreInUndo)
|
|
|
{
|
|
|
originalLayerChunks = new Dictionary<Guid, CommittedChunkStorage?>();
|
|
|
+ originalTransformations = new Dictionary<Guid, Matrix3X3>();
|
|
|
List<IChangeInfo> changes = new List<IChangeInfo>();
|
|
|
foreach (var layerGuid in layerGuids)
|
|
|
{
|
|
|
var layer = target.FindMemberOrThrow<LayerNode>(layerGuid);
|
|
|
|
|
|
- // TODO: This now does't crash, but ignores other layer types. Think how to handle this.
|
|
|
- if (layer is not ImageLayerNode)
|
|
|
+ if (layer is ImageLayerNode)
|
|
|
{
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- var area = ShiftLayerHelper.DrawShiftedLayer(target, layerGuid, keepOriginal, delta, frame);
|
|
|
- var image = target.FindMemberOrThrow<ImageLayerNode>(layerGuid).GetLayerImageAtFrame(frame);
|
|
|
+ var area = ShiftLayerHelper.DrawShiftedLayer(target, layerGuid, false, (VecI)delta, frame);
|
|
|
+ var image = target.FindMemberOrThrow<ImageLayerNode>(layerGuid).GetLayerImageAtFrame(frame);
|
|
|
|
|
|
- changes.Add(new LayerImageArea_ChangeInfo(layerGuid, area));
|
|
|
+ changes.Add(new LayerImageArea_ChangeInfo(layerGuid, area));
|
|
|
|
|
|
- originalLayerChunks[layerGuid] = new(image, image.FindAffectedArea().Chunks);
|
|
|
- image.CommitChanges();
|
|
|
- }
|
|
|
-
|
|
|
- ignoreInUndo = delta.TaxicabLength == 0;
|
|
|
- return changes;
|
|
|
- }
|
|
|
-
|
|
|
- public override OneOf<None, IChangeInfo, List<IChangeInfo>> ApplyTemporarily(Document target)
|
|
|
- {
|
|
|
- _tempChanges.Clear();
|
|
|
-
|
|
|
- foreach (var layerGuid in layerGuids)
|
|
|
- {
|
|
|
- var layer = target.FindMemberOrThrow<LayerNode>(layerGuid);
|
|
|
-
|
|
|
- if (layer is not ImageLayerNode)
|
|
|
+ originalLayerChunks[layerGuid] = new(image, image.FindAffectedArea().Chunks);
|
|
|
+ image.CommitChanges();
|
|
|
+ }
|
|
|
+ else if (layer is ITransformableObject transformableObject)
|
|
|
{
|
|
|
- continue;
|
|
|
+ originalTransformations[layerGuid] = transformableObject.TransformationMatrix;
|
|
|
+ transformableObject.TransformationMatrix = transformableObject.TransformationMatrix.PostConcat(
|
|
|
+ Matrix3X3.CreateTranslation((float)delta.X, (float)delta.Y));
|
|
|
}
|
|
|
-
|
|
|
- var chunks = ShiftLayerHelper.DrawShiftedLayer(target, layerGuid, keepOriginal, delta, frame);
|
|
|
- _tempChanges.Add(new LayerImageArea_ChangeInfo(layerGuid, chunks));
|
|
|
}
|
|
|
|
|
|
- return _tempChanges;
|
|
|
+ ignoreInUndo = delta.TaxicabLength == 0;
|
|
|
+ return changes;
|
|
|
}
|
|
|
|
|
|
public override OneOf<None, IChangeInfo, List<IChangeInfo>> Revert(Document target)
|
|
@@ -103,15 +79,17 @@ internal class ShiftLayer_UpdateableChange : UpdateableChange
|
|
|
{
|
|
|
var layer = target.FindMemberOrThrow<LayerNode>(layerGuid);
|
|
|
|
|
|
- if (layer is not ImageLayerNode)
|
|
|
+ if (layer is ImageLayerNode)
|
|
|
{
|
|
|
- continue;
|
|
|
+ var image = target.FindMemberOrThrow<ImageLayerNode>(layerGuid).GetLayerImageAtFrame(frame);
|
|
|
+ CommittedChunkStorage? originalChunks = originalLayerChunks[layerGuid];
|
|
|
+ var affected = DrawingChangeHelper.ApplyStoredChunksDisposeAndSetToNull(image, ref originalChunks);
|
|
|
+ changes.Add(new LayerImageArea_ChangeInfo(layerGuid, affected));
|
|
|
+ }
|
|
|
+ else if (layer is ITransformableObject transformableObject)
|
|
|
+ {
|
|
|
+ transformableObject.TransformationMatrix = originalTransformations[layerGuid];
|
|
|
}
|
|
|
-
|
|
|
- var image = target.FindMemberOrThrow<ImageLayerNode>(layerGuid).GetLayerImageAtFrame(frame);
|
|
|
- CommittedChunkStorage? originalChunks = originalLayerChunks[layerGuid];
|
|
|
- var affected = DrawingChangeHelper.ApplyStoredChunksDisposeAndSetToNull(image, ref originalChunks);
|
|
|
- changes.Add(new LayerImageArea_ChangeInfo(layerGuid, affected));
|
|
|
}
|
|
|
|
|
|
return changes;
|