瀏覽代碼

Added missing serialization factories

flabbet 1 年之前
父節點
當前提交
174a646499

+ 1 - 0
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/CreatingNode.md

@@ -8,6 +8,7 @@ with solving common problems that may occur during the process.
 1. Each node needs to inherit from `Node` class
 2. Each node class needs `NodeInfoAttribute` with Unique Name and Display name, display name should be localized, unique name should be unique across all nodes.
 3. Node inputs are serialized and therefore any input should have a proper SerializationFactory class, otherwise saving fails.
+4. Run Tests to make sure node doesn't have any obvious issues.
 
 # Important notes
 

+ 33 - 0
src/PixiEditor/Models/Serialization/Factories/TextureSerializationFactory.cs

@@ -0,0 +1,33 @@
+using PixiEditor.DrawingApi.Core;
+
+namespace PixiEditor.Models.Serialization.Factories;
+
+public class TextureSerializationFactory : SerializationFactory<byte[], Texture>
+{
+    private SurfaceSerializationFactory SurfaceFactory { get; } = new SurfaceSerializationFactory();
+    public override byte[] Serialize(Texture original)
+    {
+        Surface surface = new Surface(original.Size);
+        surface.DrawingSurface.Canvas.DrawSurface(original.DrawingSurface, 0, 0);
+        return SurfaceFactory.Serialize(surface);
+    }
+
+    public override bool TryDeserialize(object serialized, out Texture original)
+    {
+        if (serialized is byte[] imgBytes)
+        {
+            if (SurfaceFactory.TryDeserialize(imgBytes, out Surface surface))
+            {
+                original = new Texture(surface.Size);
+                original.DrawingSurface.Canvas.DrawSurface(surface.DrawingSurface, 0, 0);
+                return true;
+            }
+        }
+
+        original = null;
+        return false; 
+    }
+
+
+    public override string DeserializationId { get; } = "PixiEditor.Texture";
+}

+ 30 - 0
src/PixiEditor/Models/Serialization/Factories/VecD3SerializationFactory.cs

@@ -0,0 +1,30 @@
+using PixiEditor.Numerics;
+
+namespace PixiEditor.Models.Serialization.Factories;
+
+public class VecD3SerializationFactory : SerializationFactory<byte[], VecD3>
+{
+    public override string DeserializationId { get; } = "PixiEditor.VecD";
+
+    public override byte[] Serialize(VecD3 original)
+    {
+        byte[] result = new byte[sizeof(double) * 3];
+        BitConverter.GetBytes(original.X).CopyTo(result, 0);
+        BitConverter.GetBytes(original.Y).CopyTo(result, sizeof(double));
+        BitConverter.GetBytes(original.Z).CopyTo(result, sizeof(double) * 2);
+        return result;
+    }
+
+    public override bool TryDeserialize(object serialized, out VecD3 original)
+    {
+        if (serialized is byte[] { Length: sizeof(double) * 3 } bytes)
+        {
+            original = new VecD3(BitConverter.ToDouble(bytes, 0), BitConverter.ToDouble(bytes, sizeof(double)),
+                BitConverter.ToDouble(bytes, sizeof(double) * 2));
+            return true;
+        }
+
+        original = default;
+        return false; 
+    }
+}