|
@@ -1,4 +1,5 @@
|
|
using System.Collections.Generic;
|
|
using System.Collections.Generic;
|
|
|
|
+using System.Diagnostics;
|
|
using ChunkyImageLib;
|
|
using ChunkyImageLib;
|
|
using ChunkyImageLib.DataHolders;
|
|
using ChunkyImageLib.DataHolders;
|
|
using ChunkyImageLib.Operations;
|
|
using ChunkyImageLib.Operations;
|
|
@@ -28,13 +29,15 @@ internal class AffectedAreasGatherer
|
|
private readonly DocumentChangeTracker tracker;
|
|
private readonly DocumentChangeTracker tracker;
|
|
|
|
|
|
public AffectedArea MainImageArea { get; private set; } = new();
|
|
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();
|
|
|
|
-
|
|
|
|
|
|
+ public HashSet<Guid> ChangedMembers { get; private set; } = new();
|
|
|
|
+ public HashSet<Guid> ChangedMasks { get; private set; } = new();
|
|
|
|
+ public HashSet<Guid> ChangedKeyFrames { get; private set; } = new();
|
|
|
|
+
|
|
|
|
|
|
private KeyFrameTime ActiveFrame { get; set; }
|
|
private KeyFrameTime ActiveFrame { get; set; }
|
|
- public List<Guid> ChangedNodes { get; set; } = new();
|
|
|
|
|
|
+ public HashSet<Guid> ChangedNodes { get; set; } = new();
|
|
|
|
+
|
|
|
|
+ private bool alreadyAddedWholeCanvasToEveryImagePreview = false;
|
|
|
|
|
|
public AffectedAreasGatherer(KeyFrameTime activeFrame, DocumentChangeTracker tracker,
|
|
public AffectedAreasGatherer(KeyFrameTime activeFrame, DocumentChangeTracker tracker,
|
|
IReadOnlyList<IChangeInfo> changes)
|
|
IReadOnlyList<IChangeInfo> changes)
|
|
@@ -42,11 +45,11 @@ internal class AffectedAreasGatherer
|
|
this.tracker = tracker;
|
|
this.tracker = tracker;
|
|
ActiveFrame = activeFrame;
|
|
ActiveFrame = activeFrame;
|
|
ProcessChanges(changes);
|
|
ProcessChanges(changes);
|
|
-
|
|
|
|
|
|
+
|
|
var outputNode = tracker.Document.NodeGraph.OutputNode;
|
|
var outputNode = tracker.Document.NodeGraph.OutputNode;
|
|
if (outputNode is null)
|
|
if (outputNode is null)
|
|
return;
|
|
return;
|
|
-
|
|
|
|
|
|
+
|
|
if (tracker.Document.NodeGraph.CalculateExecutionQueue(tracker.Document.NodeGraph.OutputNode)
|
|
if (tracker.Document.NodeGraph.CalculateExecutionQueue(tracker.Document.NodeGraph.OutputNode)
|
|
.Any(x => x is ICustomShaderNode))
|
|
.Any(x => x is ICustomShaderNode))
|
|
{
|
|
{
|
|
@@ -64,20 +67,20 @@ internal class AffectedAreasGatherer
|
|
if (info.Area.Chunks is null)
|
|
if (info.Area.Chunks is null)
|
|
throw new InvalidOperationException("Chunks must not be null");
|
|
throw new InvalidOperationException("Chunks must not be null");
|
|
AddToMainImage(info.Area);
|
|
AddToMainImage(info.Area);
|
|
- AddToImagePreviews(info.Id, info.Area, true);
|
|
|
|
- AddToMaskPreview(info.Id, info.Area);
|
|
|
|
|
|
+ AddToImagePreviews(info.Id, true);
|
|
|
|
+ AddToMaskPreview(info.Id);
|
|
AddToNodePreviews(info.Id);
|
|
AddToNodePreviews(info.Id);
|
|
break;
|
|
break;
|
|
case LayerImageArea_ChangeInfo info:
|
|
case LayerImageArea_ChangeInfo info:
|
|
if (info.Area.Chunks is null)
|
|
if (info.Area.Chunks is null)
|
|
throw new InvalidOperationException("Chunks must not be null");
|
|
throw new InvalidOperationException("Chunks must not be null");
|
|
AddToMainImage(info.Area);
|
|
AddToMainImage(info.Area);
|
|
- AddToImagePreviews(info.Id, info.Area);
|
|
|
|
|
|
+ AddToImagePreviews(info.Id);
|
|
AddToNodePreviews(info.Id);
|
|
AddToNodePreviews(info.Id);
|
|
break;
|
|
break;
|
|
case TransformObject_ChangeInfo info:
|
|
case TransformObject_ChangeInfo info:
|
|
AddToMainImage(info.Area);
|
|
AddToMainImage(info.Area);
|
|
- AddToImagePreviews(info.NodeGuid, info.Area);
|
|
|
|
|
|
+ AddToImagePreviews(info.NodeGuid);
|
|
AddToNodePreviews(info.NodeGuid);
|
|
AddToNodePreviews(info.NodeGuid);
|
|
break;
|
|
break;
|
|
case CreateStructureMember_ChangeInfo info:
|
|
case CreateStructureMember_ChangeInfo info:
|
|
@@ -104,7 +107,6 @@ internal class AffectedAreasGatherer
|
|
break;
|
|
break;
|
|
case StructureMemberMask_ChangeInfo info:
|
|
case StructureMemberMask_ChangeInfo info:
|
|
AddWholeCanvasToMainImage();
|
|
AddWholeCanvasToMainImage();
|
|
- AddWholeCanvasToMaskPreview(info.Id);
|
|
|
|
AddWholeCanvasToImagePreviews(info.Id, true);
|
|
AddWholeCanvasToImagePreviews(info.Id, true);
|
|
AddToNodePreviews(info.Id);
|
|
AddToNodePreviews(info.Id);
|
|
break;
|
|
break;
|
|
@@ -172,7 +174,7 @@ internal class AffectedAreasGatherer
|
|
{
|
|
{
|
|
AddToNodePreviews(info.OutputNodeId.Value);
|
|
AddToNodePreviews(info.OutputNodeId.Value);
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
break;
|
|
break;
|
|
case PropertyValueUpdated_ChangeInfo info:
|
|
case PropertyValueUpdated_ChangeInfo info:
|
|
AddWholeCanvasToMainImage();
|
|
AddWholeCanvasToMainImage();
|
|
@@ -187,12 +189,13 @@ internal class AffectedAreasGatherer
|
|
break;
|
|
break;
|
|
case VectorShape_ChangeInfo info:
|
|
case VectorShape_ChangeInfo info:
|
|
AddToMainImage(info.Affected);
|
|
AddToMainImage(info.Affected);
|
|
- AddToImagePreviews(info.LayerId, info.Affected);
|
|
|
|
|
|
+ AddToImagePreviews(info.LayerId);
|
|
AddToNodePreviews(info.LayerId);
|
|
AddToNodePreviews(info.LayerId);
|
|
break;
|
|
break;
|
|
case ProcessingColorSpace_ChangeInfo:
|
|
case ProcessingColorSpace_ChangeInfo:
|
|
AddWholeCanvasToMainImage();
|
|
AddWholeCanvasToMainImage();
|
|
AddWholeCanvasToEveryImagePreview();
|
|
AddWholeCanvasToEveryImagePreview();
|
|
|
|
+ AddWholeCanvasToEveryMaskPreview();
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -200,20 +203,20 @@ internal class AffectedAreasGatherer
|
|
|
|
|
|
private void AddKeyFrame(Guid infoKeyFrameId)
|
|
private void AddKeyFrame(Guid infoKeyFrameId)
|
|
{
|
|
{
|
|
- ChangedKeyFrames ??= new List<Guid>();
|
|
|
|
|
|
+ ChangedKeyFrames ??= new HashSet<Guid>();
|
|
if (!ChangedKeyFrames.Contains(infoKeyFrameId))
|
|
if (!ChangedKeyFrames.Contains(infoKeyFrameId))
|
|
ChangedKeyFrames.Add(infoKeyFrameId);
|
|
ChangedKeyFrames.Add(infoKeyFrameId);
|
|
}
|
|
}
|
|
|
|
|
|
private void AddToNodePreviews(Guid nodeId)
|
|
private void AddToNodePreviews(Guid nodeId)
|
|
{
|
|
{
|
|
- ChangedNodes ??= new List<Guid>();
|
|
|
|
|
|
+ ChangedNodes ??= new HashSet<Guid>();
|
|
if (!ChangedNodes.Contains(nodeId))
|
|
if (!ChangedNodes.Contains(nodeId))
|
|
{
|
|
{
|
|
ChangedNodes.Add(nodeId);
|
|
ChangedNodes.Add(nodeId);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
private void AddAllNodesToImagePreviews()
|
|
private void AddAllNodesToImagePreviews()
|
|
{
|
|
{
|
|
foreach (var node in tracker.Document.NodeGraph.AllNodes)
|
|
foreach (var node in tracker.Document.NodeGraph.AllNodes)
|
|
@@ -234,8 +237,7 @@ internal class AffectedAreasGatherer
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
- var chunks = result.FindAllChunks();
|
|
|
|
- AddToImagePreviews(memberGuid, new AffectedArea(chunks), ignoreSelf);
|
|
|
|
|
|
+ AddToImagePreviews(member, ignoreSelf);
|
|
}
|
|
}
|
|
else if (member is IReadOnlyFolderNode folder)
|
|
else if (member is IReadOnlyFolderNode folder)
|
|
{
|
|
{
|
|
@@ -248,9 +250,7 @@ internal class AffectedAreasGatherer
|
|
var tightBounds = genericLayerNode.GetTightBounds(frame);
|
|
var tightBounds = genericLayerNode.GetTightBounds(frame);
|
|
if (tightBounds is not null)
|
|
if (tightBounds is not null)
|
|
{
|
|
{
|
|
- var affectedArea = new AffectedArea(
|
|
|
|
- OperationHelper.FindChunksTouchingRectangle((RectI)tightBounds.Value, ChunkyImage.FullChunkSize));
|
|
|
|
- AddToImagePreviews(memberGuid, affectedArea, ignoreSelf);
|
|
|
|
|
|
+ AddToImagePreviews(member, ignoreSelf);
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
@@ -283,9 +283,9 @@ internal class AffectedAreasGatherer
|
|
{
|
|
{
|
|
var affectedArea = new AffectedArea(
|
|
var affectedArea = new AffectedArea(
|
|
OperationHelper.FindChunksTouchingRectangle((RectI)tightBounds.Value, ChunkyImage.FullChunkSize));
|
|
OperationHelper.FindChunksTouchingRectangle((RectI)tightBounds.Value, ChunkyImage.FullChunkSize));
|
|
-
|
|
|
|
|
|
+
|
|
var lastArea = new AffectedArea(affectedArea);
|
|
var lastArea = new AffectedArea(affectedArea);
|
|
-
|
|
|
|
|
|
+
|
|
AddToMainImage(affectedArea);
|
|
AddToMainImage(affectedArea);
|
|
}
|
|
}
|
|
else
|
|
else
|
|
@@ -312,7 +312,7 @@ internal class AffectedAreasGatherer
|
|
if (member.EmbeddedMask is not null)
|
|
if (member.EmbeddedMask is not null)
|
|
{
|
|
{
|
|
var chunks = member.EmbeddedMask.FindAllChunks();
|
|
var chunks = member.EmbeddedMask.FindAllChunks();
|
|
- AddToMaskPreview(memberGuid, new AffectedArea(chunks));
|
|
|
|
|
|
+ AddToMaskPreview(memberGuid);
|
|
}
|
|
}
|
|
|
|
|
|
if (member is IReadOnlyFolderNode folder)
|
|
if (member is IReadOnlyFolderNode folder)
|
|
@@ -330,41 +330,36 @@ internal class AffectedAreasGatherer
|
|
MainImageArea = temp;
|
|
MainImageArea = temp;
|
|
}
|
|
}
|
|
|
|
|
|
- private void AddToImagePreviews(Guid memberGuid, AffectedArea area, bool ignoreSelf = false)
|
|
|
|
|
|
+ private void AddToImagePreviews(Guid memberGuid, bool ignoreSelf = false)
|
|
{
|
|
{
|
|
- var path = tracker.Document.GetParents(memberGuid);
|
|
|
|
- path.Insert(0, tracker.Document.FindMember(memberGuid));
|
|
|
|
- for (int i = ignoreSelf ? 1 : 0; i < path.Count; i++)
|
|
|
|
|
|
+ var sourceMember = tracker.Document.FindMember(memberGuid);
|
|
|
|
+ if (sourceMember is null)
|
|
{
|
|
{
|
|
- var member = path[i];
|
|
|
|
- if(member == null) continue;
|
|
|
|
- if (!ImagePreviewAreas.ContainsKey(member.Id))
|
|
|
|
- {
|
|
|
|
- ImagePreviewAreas[member.Id] = new AffectedArea(area);
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- var temp = ImagePreviewAreas[member.Id];
|
|
|
|
- temp.UnionWith(area);
|
|
|
|
- ImagePreviewAreas[member.Id] = temp;
|
|
|
|
- }
|
|
|
|
|
|
+ // If the member is not found, we cannot add it to previews
|
|
|
|
+ return;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ AddToImagePreviews(sourceMember, ignoreSelf);
|
|
}
|
|
}
|
|
|
|
|
|
- private void AddToMaskPreview(Guid memberGuid, AffectedArea area)
|
|
|
|
|
|
+ private void AddToImagePreviews(IReadOnlyStructureNode sourceMember, bool ignoreSelf)
|
|
{
|
|
{
|
|
- if (!MaskPreviewAreas.ContainsKey(memberGuid))
|
|
|
|
- {
|
|
|
|
- MaskPreviewAreas[memberGuid] = new AffectedArea(area);
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
|
|
+ var path = tracker.Document.GetParents(sourceMember.Id);
|
|
|
|
+ path.Insert(0, sourceMember);
|
|
|
|
+ for (int i = ignoreSelf ? 1 : 0; i < path.Count; i++)
|
|
{
|
|
{
|
|
- var temp = MaskPreviewAreas[memberGuid];
|
|
|
|
- temp.UnionWith(area);
|
|
|
|
- MaskPreviewAreas[memberGuid] = temp;
|
|
|
|
|
|
+ var member = path[i];
|
|
|
|
+ if (member == null) continue;
|
|
|
|
+
|
|
|
|
+ ChangedMembers.Add(member.Id);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ private void AddToMaskPreview(Guid memberGuid)
|
|
|
|
+ {
|
|
|
|
+ ChangedMasks.Add(memberGuid);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
|
|
private void AddWholeCanvasToMainImage()
|
|
private void AddWholeCanvasToMainImage()
|
|
{
|
|
{
|
|
@@ -380,23 +375,19 @@ internal class AffectedAreasGatherer
|
|
for (int i = ignoreSelf ? 1 : 0; i < path.Count; i++)
|
|
for (int i = ignoreSelf ? 1 : 0; i < path.Count; i++)
|
|
{
|
|
{
|
|
var member = path[i];
|
|
var member = path[i];
|
|
- if (!ImagePreviewAreas.ContainsKey(member.Id))
|
|
|
|
- ImagePreviewAreas[member.Id] = new AffectedArea();
|
|
|
|
- ImagePreviewAreas[member.Id] = AddWholeArea(ImagePreviewAreas[member.Id]);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ if (member is null) continue;
|
|
|
|
|
|
- private void AddWholeCanvasToMaskPreview(Guid memberGuid)
|
|
|
|
- {
|
|
|
|
- if (!MaskPreviewAreas.ContainsKey(memberGuid))
|
|
|
|
- MaskPreviewAreas[memberGuid] = new AffectedArea();
|
|
|
|
- MaskPreviewAreas[memberGuid] = AddWholeArea(MaskPreviewAreas[memberGuid]);
|
|
|
|
|
|
+ ChangedMembers.Add(member.Id);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
private void AddWholeCanvasToEveryImagePreview()
|
|
private void AddWholeCanvasToEveryImagePreview()
|
|
{
|
|
{
|
|
|
|
+ if (alreadyAddedWholeCanvasToEveryImagePreview)
|
|
|
|
+ return;
|
|
|
|
+
|
|
tracker.Document.ForEveryReadonlyMember((member) => AddWholeCanvasToImagePreviews(member.Id));
|
|
tracker.Document.ForEveryReadonlyMember((member) => AddWholeCanvasToImagePreviews(member.Id));
|
|
|
|
+ alreadyAddedWholeCanvasToEveryImagePreview = true;
|
|
}
|
|
}
|
|
|
|
|
|
private void AddWholeCanvasToEveryMaskPreview()
|
|
private void AddWholeCanvasToEveryMaskPreview()
|
|
@@ -404,7 +395,9 @@ internal class AffectedAreasGatherer
|
|
tracker.Document.ForEveryReadonlyMember((member) =>
|
|
tracker.Document.ForEveryReadonlyMember((member) =>
|
|
{
|
|
{
|
|
if (member.EmbeddedMask is not null)
|
|
if (member.EmbeddedMask is not null)
|
|
- AddWholeCanvasToMaskPreview(member.Id);
|
|
|
|
|
|
+ {
|
|
|
|
+ ChangedMasks.Add(member.Id);
|
|
|
|
+ }
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
|