Pārlūkot izejas kodu

Added mechanism to recover missing animation data

flabbet 7 mēneši atpakaļ
vecāks
revīzija
f7b9ab2602

+ 31 - 3
src/PixiEditor/Helpers/DocumentViewModelBuilder.cs

@@ -87,7 +87,7 @@ internal class DocumentViewModelBuilder
         return this;
     }
 
-    public DocumentViewModelBuilder WithAnimationData(AnimationData? animationData)
+    public DocumentViewModelBuilder WithAnimationData(AnimationData? animationData, NodeGraph documentGraph)
     {
         AnimationData = new AnimationDataBuilder();
 
@@ -96,7 +96,7 @@ internal class DocumentViewModelBuilder
             AnimationData.WithFrameRate(animationData.FrameRate);
             AnimationData.WithOnionFrames(animationData.OnionFrames);
             AnimationData.WithOnionOpacity(animationData.OnionOpacity);
-            BuildKeyFrames(animationData.KeyFrameGroups.ToList(), AnimationData.KeyFrameGroups);
+            BuildKeyFrames(animationData.KeyFrameGroups.ToList(), AnimationData.KeyFrameGroups, documentGraph);
         }
 
         return this;
@@ -132,7 +132,7 @@ internal class DocumentViewModelBuilder
         return this;
     }
 
-    private static void BuildKeyFrames(List<KeyFrameGroup> root, List<KeyFrameBuilder> data)
+    private static void BuildKeyFrames(List<KeyFrameGroup> root, List<KeyFrameBuilder> data, NodeGraph documentGraph)
     {
         foreach (KeyFrameGroup group in root)
         {
@@ -148,6 +148,34 @@ internal class DocumentViewModelBuilder
 
             data?.Add(builder);
         }
+        
+        TryAddMissingKeyFrames(root, data, documentGraph);
+    }
+
+    private static void TryAddMissingKeyFrames(List<KeyFrameGroup> groups, List<KeyFrameBuilder>? data, NodeGraph documentGraph)
+    {
+        if (data == null)
+        {
+            return;
+        }
+
+        foreach (var node in documentGraph.AllNodes)
+        {
+            if (node.KeyFrames.Length > 1 && data.All(x => x.NodeId != node.Id))
+            {
+                GroupKeyFrameBuilder builder = new GroupKeyFrameBuilder()
+                .WithNodeId(node.Id);
+                
+                foreach (var keyFrame in node.KeyFrames)
+                {
+                    builder.WithChild<KeyFrameBuilder>(x => x
+                        .WithKeyFrameId(keyFrame.Id)
+                        .WithNodeId(node.Id));
+                }   
+                
+                data.Add(builder);
+            }
+        }
     }
 
     public class ReferenceLayerBuilder

+ 1 - 1
src/PixiEditor/Helpers/Extensions/PixiParserDocumentEx.cs

@@ -38,7 +38,7 @@ internal static class PixiParserDocumentEx
             .WithSwatches(document.Swatches, x => new(x.R, x.G, x.B))
             .WithReferenceLayer(document.ReferenceLayer, BuildReferenceLayer, encoder)
             .WithGraph(document.Graph, BuildGraph)
-            .WithAnimationData(document.AnimationData));
+            .WithAnimationData(document.AnimationData, document.Graph));
     }
 
     private static void BuildGraph(NodeGraph graph, NodeGraphBuilder graphBuilder)