Browse Source

Improved key frames previews

flabbet 9 months ago
parent
commit
30a513bab8

+ 1 - 1
src/PixiEditor/Models/DocumentModels/ActionAccumulator.cs

@@ -115,7 +115,7 @@ internal class ActionAccumulator
             }
 
             previewUpdater.UpdatePreviews(undoBoundaryPassed, affectedAreas.ImagePreviewAreas.Keys, affectedAreas.MaskPreviewAreas.Keys,
-                affectedAreas.ChangedNodes);
+                affectedAreas.ChangedNodes, affectedAreas.ChangedKeyFrames);
 
             // force refresh viewports for better responsiveness
             foreach (var (_, value) in internals.State.Viewports)

+ 4 - 2
src/PixiEditor/Models/DocumentModels/DocumentUpdater.cs

@@ -465,9 +465,11 @@ internal class DocumentUpdater
 
     private void ProcessCreateRasterKeyFrame(CreateRasterKeyFrame_ChangeInfo info)
     {
-        doc.AnimationHandler.AddKeyFrame(new RasterKeyFrameViewModel(info.TargetLayerGuid, info.Frame, 1,
+        var vm = new RasterKeyFrameViewModel(info.TargetLayerGuid, info.Frame, 1,
             info.KeyFrameId,
-            (DocumentViewModel)doc, helper));
+            (DocumentViewModel)doc, helper);
+        
+        doc.AnimationHandler.AddKeyFrame(vm);
     }
 
     private void ProcessDeleteKeyFrame(DeleteKeyFrame_ChangeInfo info)

+ 9 - 0
src/PixiEditor/Models/Rendering/AffectedAreasGatherer.cs

@@ -30,6 +30,7 @@ internal class AffectedAreasGatherer
     public AffectedArea MainImageArea { get; private set; } = new();
     public Dictionary<Guid, AffectedArea> ImagePreviewAreas { get; private set; } = new();
     public Dictionary<Guid, AffectedArea> MaskPreviewAreas { get; private set; } = new();
+    public List<Guid> ChangedKeyFrames { get; private set; } = new();
     
 
     private KeyFrameTime ActiveFrame { get; set; }
@@ -144,6 +145,7 @@ internal class AffectedAreasGatherer
                         AddWholeCanvasToImagePreviews(info.TargetLayerGuid);
                     }
 
+                    AddKeyFrame(info.KeyFrameId);
                     break;
                 case SetActiveFrame_PassthroughAction:
                     AddWholeCanvasToMainImage();
@@ -191,6 +193,13 @@ internal class AffectedAreasGatherer
         }
     }
 
+    private void AddKeyFrame(Guid infoKeyFrameId)
+    {
+        ChangedKeyFrames ??= new List<Guid>();
+        if (!ChangedKeyFrames.Contains(infoKeyFrameId))
+            ChangedKeyFrames.Add(infoKeyFrameId);
+    }
+
     private void AddToNodePreviews(Guid nodeId)
     {
         ChangedNodes ??= new List<Guid>();

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

@@ -33,12 +33,12 @@ internal class MemberPreviewUpdater
     }
 
     public void UpdatePreviews(bool rerenderPreviews, IEnumerable<Guid> membersToUpdate,
-        IEnumerable<Guid> masksToUpdate, IEnumerable<Guid> nodesToUpdate)
+        IEnumerable<Guid> masksToUpdate, IEnumerable<Guid> nodesToUpdate, IEnumerable<Guid> keyFramesToUpdate)
     {
         if (!rerenderPreviews)
             return;
 
-        UpdatePreviewPainters(membersToUpdate, masksToUpdate, nodesToUpdate);
+        UpdatePreviewPainters(membersToUpdate, masksToUpdate, nodesToUpdate, keyFramesToUpdate);
     }
 
     /// <summary>
@@ -47,16 +47,17 @@ internal class MemberPreviewUpdater
     /// <param name="members">Members that should be rendered</param>
     /// <param name="masksToUpdate">Masks that should be rendered</param>
     private void UpdatePreviewPainters(IEnumerable<Guid> members, IEnumerable<Guid> masksToUpdate,
-        IEnumerable<Guid> nodesToUpdate)
+        IEnumerable<Guid> nodesToUpdate, IEnumerable<Guid> keyFramesToUpdate)
     {
         Guid[] memberGuids = members as Guid[] ?? members.ToArray();
         Guid[] maskGuids = masksToUpdate as Guid[] ?? masksToUpdate.ToArray();
         Guid[] nodesGuids = nodesToUpdate as Guid[] ?? nodesToUpdate.ToArray();
+        Guid[] keyFramesGuids = keyFramesToUpdate as Guid[] ?? keyFramesToUpdate.ToArray();
 
         RenderWholeCanvasPreview();
         RenderLayersPreview(memberGuids);
         RenderMaskPreviews(maskGuids);
-        RenderAnimationPreviews(memberGuids);
+        RenderAnimationPreviews(memberGuids, keyFramesGuids);
         RenderNodePreviews(nodesGuids);
     }
 
@@ -106,7 +107,7 @@ internal class MemberPreviewUpdater
         }
     }
 
-    private void RenderAnimationPreviews(Guid[] memberGuids)
+    private void RenderAnimationPreviews(Guid[] memberGuids, Guid[] keyFramesGuids)
     {
         foreach (var keyFrame in doc.AnimationHandler.KeyFrames)
         {
@@ -114,8 +115,11 @@ internal class MemberPreviewUpdater
             {
                 foreach (var childFrame in groupHandler.Children)
                 {
-                    if (!memberGuids.Contains(childFrame.LayerGuid) || !IsInFrame(childFrame))
-                        continue;
+                    if (!keyFramesGuids.Contains(childFrame.Id))
+                    {
+                        if (!memberGuids.Contains(childFrame.LayerGuid) || !IsInFrame(childFrame))
+                            continue;
+                    }
 
                     RenderFramePreview(childFrame);
                 }
@@ -136,7 +140,7 @@ internal class MemberPreviewUpdater
 
     private void RenderFramePreview(IKeyFrameHandler keyFrame)
     {
-        if (internals.Tracker.Document.AnimationData.TryFindKeyFrame(keyFrame.Id, out KeyFrame foundKeyFrame))
+        if (internals.Tracker.Document.AnimationData.TryFindKeyFrame(keyFrame.Id, out KeyFrame _))
         {
             keyFrame.PreviewPainter ??= new PreviewPainter(AnimationKeyFramePreviewRenderer, keyFrame.Id.ToString());
             keyFrame.PreviewPainter.Repaint();