diff --git a/Source/Editor/Surface/SurfaceNode.cs b/Source/Editor/Surface/SurfaceNode.cs
index 633b41373..1ebc1c1c5 100644
--- a/Source/Editor/Surface/SurfaceNode.cs
+++ b/Source/Editor/Surface/SurfaceNode.cs
@@ -390,6 +390,11 @@ namespace FlaxEditor.Surface
UpdateBoxesTypes();
}
+ ///
+ /// Array of nodes that are sealed to this node - sealed nodes are duplicated/copied/pasted/removed in a batch. Null if unused.
+ ///
+ public virtual SurfaceNode[] SealedNodes => null;
+
///
/// Gets a value indicating whether this node uses dependent boxes.
///
diff --git a/Source/Editor/Surface/VisjectSurface.CopyPaste.cs b/Source/Editor/Surface/VisjectSurface.CopyPaste.cs
index aee617ad3..7df90f298 100644
--- a/Source/Editor/Surface/VisjectSurface.CopyPaste.cs
+++ b/Source/Editor/Surface/VisjectSurface.CopyPaste.cs
@@ -65,6 +65,25 @@ namespace FlaxEditor.Surface
return;
}
+ // Collect sealed nodes to be copied as well
+ foreach (var control in selection.ToArray())
+ {
+ if (control is SurfaceNode node)
+ {
+ var sealedNodes = node.SealedNodes;
+ if (sealedNodes != null)
+ {
+ foreach (var sealedNode in sealedNodes)
+ {
+ if (sealedNode != null && !selection.Contains(sealedNode))
+ {
+ selection.Add(sealedNode);
+ }
+ }
+ }
+ }
+ }
+
var dataModel = new DataModel();
var dataModelNodes = new List(selection.Count);
var dataModelComments = new List();
diff --git a/Source/Editor/Surface/VisjectSurface.cs b/Source/Editor/Surface/VisjectSurface.cs
index 5104adc27..012d98778 100644
--- a/Source/Editor/Surface/VisjectSurface.cs
+++ b/Source/Editor/Surface/VisjectSurface.cs
@@ -749,7 +749,25 @@ namespace FlaxEditor.Surface
{
if (nodes == null)
nodes = new List();
- nodes.Add(node);
+ var sealedNodes = node.SealedNodes;
+ if (sealedNodes != null)
+ {
+ foreach (var sealedNode in sealedNodes)
+ {
+ if (sealedNode != null)
+ {
+ if (sealedNode.IsSelected)
+ {
+ selectionChanged = true;
+ sealedNode.IsSelected = false;
+ }
+ if (!nodes.Contains(sealedNode))
+ nodes.Add(sealedNode);
+ }
+ }
+ }
+ if (!nodes.Contains(node))
+ nodes.Add(node);
}
}
else