Browse Source

Fixed document preview

flabbet 10 months ago
parent
commit
5b6010d5c3

+ 9 - 1
src/PixiEditor.ChangeableDocument/Rendering/DocumentRenderer.cs

@@ -11,7 +11,7 @@ using PixiEditor.Numerics;
 
 
 namespace PixiEditor.ChangeableDocument.Rendering;
 namespace PixiEditor.ChangeableDocument.Rendering;
 
 
-public class DocumentRenderer
+public class DocumentRenderer : IPreviewRenderable
 {
 {
     
     
     private Paint ClearPaint { get; } = new Paint()
     private Paint ClearPaint { get; } = new Paint()
@@ -299,4 +299,12 @@ public class DocumentRenderer
 
 
         return chunk;
         return chunk;
     }
     }
+
+    public bool RenderPreview(DrawingSurface renderOn, ChunkResolution resolution, int frame, string elementToRenderName)
+    {
+        using RenderContext context = new(renderOn, frame, resolution, Document.Size);
+        Document.NodeGraph.Execute(context);
+        
+        return true;
+    }
 }
 }

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

@@ -356,10 +356,6 @@ internal class DocumentUpdater
         doc.SetSize(info.Size);
         doc.SetSize(info.Size);
         doc.SetVerticalSymmetryAxisX(info.VerticalSymmetryAxisX);
         doc.SetVerticalSymmetryAxisX(info.VerticalSymmetryAxisX);
         doc.SetHorizontalSymmetryAxisY(info.HorizontalSymmetryAxisY);
         doc.SetHorizontalSymmetryAxisY(info.HorizontalSymmetryAxisY);
-
-        VecI documentPreviewSize = StructureHelpers.CalculatePreviewSize(info.Size);
-        doc.PreviewSurface.Dispose();
-        doc.PreviewSurface = new Texture(documentPreviewSize);
     }
     }
 
 
     private void ProcessCreateStructureMember(CreateStructureMember_ChangeInfo info)
     private void ProcessCreateStructureMember(CreateStructureMember_ChangeInfo info)

+ 2 - 1
src/PixiEditor/Models/Handlers/IDocument.cs

@@ -11,6 +11,7 @@ using PixiEditor.Extensions.CommonApi.Palettes;
 using PixiEditor.Helpers;
 using PixiEditor.Helpers;
 using PixiEditor.Models.Controllers;
 using PixiEditor.Models.Controllers;
 using PixiEditor.Models.DocumentModels.Public;
 using PixiEditor.Models.DocumentModels.Public;
+using PixiEditor.Models.Rendering;
 using PixiEditor.Models.Structures;
 using PixiEditor.Models.Structures;
 using PixiEditor.Models.Tools;
 using PixiEditor.Models.Tools;
 using PixiEditor.Numerics;
 using PixiEditor.Numerics;
@@ -27,7 +28,7 @@ internal interface IDocument : IHandler
     public VectorPath SelectionPathBindable { get; }
     public VectorPath SelectionPathBindable { get; }
     public INodeGraphHandler NodeGraphHandler { get; }
     public INodeGraphHandler NodeGraphHandler { get; }
     public DocumentStructureModule StructureHelper { get; }
     public DocumentStructureModule StructureHelper { get; }
-    public Texture PreviewSurface { get; set; }
+    public PreviewPainter PreviewPainter { get; set; }
     public bool AllChangesSaved { get; }
     public bool AllChangesSaved { get; }
     public string CoordinatesString { get; set; }
     public string CoordinatesString { get; set; }
     public IReadOnlyCollection<IStructureMemberHandler> SoftSelectedStructureMembers { get; }
     public IReadOnlyCollection<IStructureMemberHandler> SoftSelectedStructureMembers { get; }

+ 11 - 0
src/PixiEditor/Models/Rendering/MemberPreviewUpdater.cs

@@ -56,6 +56,17 @@ internal class MemberPreviewUpdater
     {
     {
         var previewSize = StructureHelpers.CalculatePreviewSize(internals.Tracker.Document.Size);
         var previewSize = StructureHelpers.CalculatePreviewSize(internals.Tracker.Document.Size);
         float scaling = (float)previewSize.X / doc.SizeBindable.X;
         float scaling = (float)previewSize.X / doc.SizeBindable.X;
+
+        if (doc.PreviewPainter == null)
+        {
+            doc.PreviewPainter = new PreviewPainter(doc.Renderer, new RectD(VecD.Zero, doc.SizeBindable));
+            doc.PreviewPainter.Repaint();
+        }
+        else
+        {
+            doc.PreviewPainter.Bounds = new RectD(VecD.Zero, doc.SizeBindable);
+            doc.PreviewPainter.Repaint();
+        }
     }
     }
 
 
     private void RenderMainPreviews(Guid[] memberGuids)
     private void RenderMainPreviews(Guid[] memberGuids)

+ 6 - 9
src/PixiEditor/ViewModels/Document/DocumentViewModel.cs

@@ -43,6 +43,7 @@ using PixiEditor.Models.DocumentModels.Public;
 using PixiEditor.Models.DocumentModels.UpdateableChangeExecutors.Features;
 using PixiEditor.Models.DocumentModels.UpdateableChangeExecutors.Features;
 using PixiEditor.Models.Handlers;
 using PixiEditor.Models.Handlers;
 using PixiEditor.Models.Layers;
 using PixiEditor.Models.Layers;
+using PixiEditor.Models.Rendering;
 using PixiEditor.Models.Serialization;
 using PixiEditor.Models.Serialization;
 using PixiEditor.Models.Serialization.Factories;
 using PixiEditor.Models.Serialization.Factories;
 using PixiEditor.Models.Structures;
 using PixiEditor.Models.Structures;
@@ -180,18 +181,18 @@ internal partial class DocumentViewModel : PixiObservableObject, IDocument
     public IStructureMemberHandler? SelectedStructureMember { get; private set; } = null;
     public IStructureMemberHandler? SelectedStructureMember { get; private set; } = null;
 
 
 
 
-    private Texture previewSurface;
+    private PreviewPainter previewSurface;
 
 
-    public Texture PreviewSurface
+    public PreviewPainter PreviewPainter
     {
     {
         get => previewSurface;
         get => previewSurface;
         set
         set
         {
         {
-            VecI? oldSize = previewSurface?.Size;
+            VecI? oldSize = (VecI?)previewSurface?.Bounds?.Size;
             SetProperty(ref previewSurface, value);
             SetProperty(ref previewSurface, value);
-            if (oldSize != null && value != null && oldSize != value.Size)
+            if (oldSize != null && value is { Bounds: not null } && oldSize != value.Bounds.Value.Size)
             {
             {
-                RaiseSizeChanged(new DocumentSizeChangedEventArgs(this, oldSize.Value, value.Size));
+                RaiseSizeChanged(new DocumentSizeChangedEventArgs(this, oldSize.Value, (VecI)value.Bounds.Value.Size));
             }
             }
         }
         }
     }
     }
@@ -260,9 +261,6 @@ internal partial class DocumentViewModel : PixiObservableObject, IDocument
             }
             }
         };
         };
 
 
-        VecI previewSize = StructureMemberViewModel.CalculatePreviewSize(SizeBindable);
-        PreviewSurface = new Texture(new VecI(previewSize.X, previewSize.Y));
-
         ReferenceLayerViewModel = new(this, Internals);
         ReferenceLayerViewModel = new(this, Internals);
 
 
         Renderer = new DocumentRenderer(Internals.Tracker.Document);
         Renderer = new DocumentRenderer(Internals.Tracker.Document);
@@ -999,7 +997,6 @@ internal partial class DocumentViewModel : PixiObservableObject, IDocument
 
 
     public void Dispose()
     public void Dispose()
     {
     {
-        PreviewSurface.Dispose();
         Internals.Tracker.Dispose();
         Internals.Tracker.Dispose();
         Internals.Tracker.Document.Dispose();
         Internals.Tracker.Document.Dispose();
     }
     }

+ 4 - 4
src/PixiEditor/ViewModels/SubViewModels/ViewportWindowViewModel.cs

@@ -81,7 +81,7 @@ internal class ViewportWindowViewModel : SubViewModel<WindowViewModel>, IDockabl
         Document = document;
         Document = document;
         Document.SizeChanged += DocumentOnSizeChanged;
         Document.SizeChanged += DocumentOnSizeChanged;
         Document.PropertyChanged += DocumentOnPropertyChanged;
         Document.PropertyChanged += DocumentOnPropertyChanged;
-        TabCustomizationSettings.Icon = new TextureImage(Document.PreviewSurface);
+        TabCustomizationSettings.Icon = new PreviewPainterImage(Document.PreviewPainter, Document.AnimationDataViewModel.ActiveFrameTime.Frame);
     }
     }
 
 
     private void DocumentOnPropertyChanged(object? sender, PropertyChangedEventArgs e)
     private void DocumentOnPropertyChanged(object? sender, PropertyChangedEventArgs e)
@@ -90,9 +90,9 @@ internal class ViewportWindowViewModel : SubViewModel<WindowViewModel>, IDockabl
         {
         {
             OnPropertyChanged(nameof(Title));
             OnPropertyChanged(nameof(Title));
         }
         }
-        else if (e.PropertyName == nameof(DocumentViewModel.PreviewSurface))
+        else if (e.PropertyName == nameof(DocumentViewModel.PreviewPainter))
         {
         {
-            TabCustomizationSettings.Icon = new TextureImage(Document.PreviewSurface);
+            TabCustomizationSettings.Icon = new PreviewPainterImage(Document.PreviewPainter, Document.AnimationDataViewModel.ActiveFrameTime.Frame); 
         }
         }
         else if (e.PropertyName == nameof(DocumentViewModel.AllChangesSaved))
         else if (e.PropertyName == nameof(DocumentViewModel.AllChangesSaved))
         {
         {
@@ -108,7 +108,7 @@ internal class ViewportWindowViewModel : SubViewModel<WindowViewModel>, IDockabl
 
 
     private void DocumentOnSizeChanged(object? sender, DocumentSizeChangedEventArgs e)
     private void DocumentOnSizeChanged(object? sender, DocumentSizeChangedEventArgs e)
     {
     {
-        TabCustomizationSettings.Icon = new TextureImage(Document.PreviewSurface);
+        TabCustomizationSettings.Icon = new PreviewPainterImage(Document.PreviewPainter, e.Document.AnimationHandler.ActiveFrameTime.Frame);
         OnPropertyChanged(nameof(TabCustomizationSettings));
         OnPropertyChanged(nameof(TabCustomizationSettings));
     }
     }
 
 

+ 27 - 0
src/PixiEditor/Views/Visuals/PreviewPainterImage.cs

@@ -0,0 +1,27 @@
+using Avalonia;
+using Avalonia.Media;
+using PixiEditor.Models.Rendering;
+
+namespace PixiEditor.Views.Visuals;
+
+public class PreviewPainterImage : IImage
+{
+    public PreviewPainter PreviewPainter { get; set; }
+    
+    public int FrameToRender { get; set; }
+    public Size Size => new Size(PreviewPainter.Bounds?.Size.X ?? 0, PreviewPainter.Bounds?.Size.Y ?? 0); 
+    
+    public PreviewPainterImage(PreviewPainter previewPainter, int frameToRender)
+    {
+        PreviewPainter = previewPainter;
+        FrameToRender = frameToRender;
+    }
+    
+    public void Draw(DrawingContext context, Rect sourceRect, Rect destRect)
+    {
+        if (PreviewPainter.Bounds == null) return;
+        
+        using DrawPreviewOperation drawPreviewOperation = new DrawPreviewOperation(destRect, PreviewPainter, FrameToRender); 
+        context.Custom(drawPreviewOperation);
+    }
+}