Browse Source

Fixed folder preview

Krzysztof Krysiński 1 week ago
parent
commit
b9c9909061

+ 1 - 1
src/Drawie

@@ -1 +1 @@
-Subproject commit de00c15348702e8188bc3962bfc9a2a2612388a8
+Subproject commit eb8d324941ae1200492669768c4bde0f45a59501

+ 12 - 1
src/PixiEditor.ChangeableDocument/Changeables/Graph/Interfaces/SceneObjectRenderContext.cs

@@ -11,7 +11,6 @@ public class SceneObjectRenderContext : RenderContext
     public RectD LocalBounds { get; }
     public RectD LocalBounds { get; }
     public bool RenderSurfaceIsScene { get; }
     public bool RenderSurfaceIsScene { get; }
     public RenderOutputProperty TargetPropertyOutput { get; }
     public RenderOutputProperty TargetPropertyOutput { get; }
-    public AffectedArea AffectedArea { get; set; }
 
 
     public SceneObjectRenderContext(RenderOutputProperty targetPropertyOutput, DrawingSurface surface, RectD localBounds, KeyFrameTime frameTime,
     public SceneObjectRenderContext(RenderOutputProperty targetPropertyOutput, DrawingSurface surface, RectD localBounds, KeyFrameTime frameTime,
         ChunkResolution chunkResolution, VecI renderOutputSize, VecI documentSize, bool renderSurfaceIsScene, ColorSpace processingColorSpace, SamplingOptions desiredSampling, double opacity) : base(surface, frameTime, chunkResolution, renderOutputSize, documentSize, processingColorSpace, desiredSampling, opacity)
         ChunkResolution chunkResolution, VecI renderOutputSize, VecI documentSize, bool renderSurfaceIsScene, ColorSpace processingColorSpace, SamplingOptions desiredSampling, double opacity) : base(surface, frameTime, chunkResolution, renderOutputSize, documentSize, processingColorSpace, desiredSampling, opacity)
@@ -20,4 +19,16 @@ public class SceneObjectRenderContext : RenderContext
         LocalBounds = localBounds;
         LocalBounds = localBounds;
         RenderSurfaceIsScene = renderSurfaceIsScene;
         RenderSurfaceIsScene = renderSurfaceIsScene;
     }
     }
+
+    public override RenderContext Clone()
+    {
+        return new SceneObjectRenderContext(TargetPropertyOutput, RenderSurface, LocalBounds, FrameTime, ChunkResolution, RenderOutputSize, DocumentSize, RenderSurfaceIsScene, ProcessingColorSpace, DesiredSamplingOptions, Opacity)
+        {
+            VisibleDocumentRegion = VisibleDocumentRegion,
+            AffectedArea = AffectedArea,
+            FullRerender = FullRerender,
+            TargetOutput = TargetOutput,
+            PreviewTextures = PreviewTextures,
+        };
+    }
 }
 }

+ 18 - 13
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/FolderNode.cs

@@ -44,6 +44,7 @@ public class FolderNode : StructureNode, IReadOnlyFolderNode, IClipSource
 
 
     public override void Render(SceneObjectRenderContext sceneContext)
     public override void Render(SceneObjectRenderContext sceneContext)
     {
     {
+        RenderPreviews(sceneContext);
         if (!IsVisible.Value || Opacity.Value <= 0 || IsEmptyMask())
         if (!IsVisible.Value || Opacity.Value <= 0 || IsEmptyMask())
         {
         {
             Output.Value = Background.Value;
             Output.Value = Background.Value;
@@ -238,6 +239,21 @@ public class FolderNode : StructureNode, IReadOnlyFolderNode, IClipSource
         return guids;
         return guids;
     }
     }
 
 
+    protected override bool ShouldRenderPreview(string elementToRenderName)
+    {
+        if (elementToRenderName == nameof(EmbeddedMask))
+        {
+            return base.ShouldRenderPreview(elementToRenderName);
+        }
+
+        return Content.Connection != null;
+    }
+
+    public override RectD? GetPreviewBounds(RenderContext ctx, string elementToRenderName)
+    {
+        return GetApproxBounds(ctx.FrameTime);
+    }
+
     public override void RenderPreview(DrawingSurface renderOn, RenderContext context,
     public override void RenderPreview(DrawingSurface renderOn, RenderContext context,
         string elementToRenderName)
         string elementToRenderName)
     {
     {
@@ -249,20 +265,9 @@ public class FolderNode : StructureNode, IReadOnlyFolderNode, IClipSource
 
 
         if (Content.Connection != null)
         if (Content.Connection != null)
         {
         {
-            var executionQueue = GraphUtils.CalculateExecutionQueue(Content.Connection.Node, FilterInvisibleFolders);
-            while (executionQueue.Count > 0)
+            if (context is SceneObjectRenderContext ctx)
             {
             {
-                IReadOnlyNode node = executionQueue.Dequeue();
-
-                if (node is IReadOnlyStructureNode { IsVisible.Value: false })
-                {
-                    continue;
-                }
-
-                /*if (node is IPreviewRenderable previewRenderable)
-                {
-                    previewRenderable.RenderPreview(renderOn, context, elementToRenderName);
-                }*/
+                RenderFolderContent(ctx, true);
             }
             }
         }
         }
     }
     }

+ 12 - 4
src/PixiEditor.ChangeableDocument/Changeables/Graph/Nodes/RenderNode.cs

@@ -89,7 +89,7 @@ public abstract class RenderNode : Node, IHighDpiRenderNode
 
 
     protected abstract void OnPaint(RenderContext context, DrawingSurface surface);
     protected abstract void OnPaint(RenderContext context, DrawingSurface surface);
 
 
-    private void RenderPreviews(RenderContext ctx)
+    protected void RenderPreviews(RenderContext ctx)
     {
     {
         var previewToRender = ctx.GetPreviewTexturesForNode(Id);
         var previewToRender = ctx.GetPreviewTexturesForNode(Id);
         if (previewToRender == null || previewToRender.Count == 0)
         if (previewToRender == null || previewToRender.Count == 0)
@@ -106,14 +106,22 @@ public abstract class RenderNode : Node, IHighDpiRenderNode
             int saved = preview.Texture.DrawingSurface.Canvas.Save();
             int saved = preview.Texture.DrawingSurface.Canvas.Save();
             preview.Texture.DrawingSurface.Canvas.Clear();
             preview.Texture.DrawingSurface.Canvas.Clear();
 
 
-            VecD scaling = PreviewUtility.CalculateUniformScaling(ctx.RenderOutputSize, preview.Texture.Size);
-            VecD offset = PreviewUtility.CalculateCenteringOffset(ctx.RenderOutputSize, preview.Texture.Size, scaling);
+            var bounds = GetPreviewBounds(ctx, preview.ElementToRender);
+            if (bounds == null)
+            {
+                bounds = new RectD(0, 0, ctx.RenderOutputSize.X, ctx.RenderOutputSize.Y);
+            }
+
+            VecD scaling = PreviewUtility.CalculateUniformScaling(bounds.Value.Size, preview.Texture.Size);
+            VecD offset = PreviewUtility.CalculateCenteringOffset(bounds.Value.Size, preview.Texture.Size, scaling);
             RenderContext adjusted =
             RenderContext adjusted =
-                PreviewUtility.CreatePreviewContext(ctx, scaling, ctx.RenderOutputSize, preview.Texture.Size);
+                PreviewUtility.CreatePreviewContext(ctx, scaling, bounds.Value.Size, preview.Texture.Size);
 
 
             preview.Texture.DrawingSurface.Canvas.Translate((float)offset.X, (float)offset.Y);
             preview.Texture.DrawingSurface.Canvas.Translate((float)offset.X, (float)offset.Y);
             preview.Texture.DrawingSurface.Canvas.Scale((float)scaling.X, (float)scaling.Y);
             preview.Texture.DrawingSurface.Canvas.Scale((float)scaling.X, (float)scaling.Y);
+            preview.Texture.DrawingSurface.Canvas.Translate((float)-bounds.Value.X, (float)-bounds.Value.Y);
 
 
+            adjusted.RenderSurface = preview.Texture.DrawingSurface;
             RenderPreview(preview.Texture.DrawingSurface, adjusted, preview.ElementToRender);
             RenderPreview(preview.Texture.DrawingSurface, adjusted, preview.ElementToRender);
             preview.Texture.DrawingSurface.Canvas.RestoreToCount(saved);
             preview.Texture.DrawingSurface.Canvas.RestoreToCount(saved);
         }
         }

+ 1 - 1
src/PixiEditor.ChangeableDocument/Rendering/RenderContext.cs

@@ -76,7 +76,7 @@ public class RenderContext
         };
         };
     }
     }
 
 
-    public RenderContext Clone()
+    public virtual RenderContext Clone()
     {
     {
         return new RenderContext(RenderSurface, FrameTime, ChunkResolution, RenderOutputSize, DocumentSize, ProcessingColorSpace, DesiredSamplingOptions, Opacity)
         return new RenderContext(RenderSurface, FrameTime, ChunkResolution, RenderOutputSize, DocumentSize, ProcessingColorSpace, DesiredSamplingOptions, Opacity)
         {
         {

+ 4 - 4
src/PixiEditor/Views/Layers/FolderControl.axaml

@@ -71,8 +71,8 @@
                                     </ImageBrush.Transform>
                                     </ImageBrush.Transform>
                                 </ImageBrush>
                                 </ImageBrush>
                             </Border.Background>
                             </Border.Background>
-                            <visuals:TextureControl
-                                Texture="{Binding Folder.Preview, ElementName=folderControl}"
+                            <visuals:PreviewTextureControl
+                                TexturePreview="{Binding Folder.Preview, ElementName=folderControl}"
                                 ClipToBounds="True"
                                 ClipToBounds="True"
                                 Width="30" Height="30" RenderOptions.BitmapInterpolationMode="None" />
                                 Width="30" Height="30" RenderOptions.BitmapInterpolationMode="None" />
                         </Border>
                         </Border>
@@ -91,8 +91,8 @@
                                 </ImageBrush>
                                 </ImageBrush>
                             </Border.Background>
                             </Border.Background>
                             <Grid IsHitTestVisible="False">
                             <Grid IsHitTestVisible="False">
-                                <visuals:TextureControl
-                                    Texture="{Binding Folder.MaskPreview, ElementName=folderControl}"
+                                <visuals:PreviewTextureControl
+                                    TexturePreview="{Binding Folder.MaskPreview, ElementName=folderControl}"
                                     Width="30" Height="30"
                                     Width="30" Height="30"
                                     ClipToBounds="True"
                                     ClipToBounds="True"
                                     RenderOptions.BitmapInterpolationMode="None" IsHitTestVisible="False" />
                                     RenderOptions.BitmapInterpolationMode="None" IsHitTestVisible="False" />