Fix rubber band to ignore inactive actors

This commit is contained in:
Wojtek Figat
2025-03-17 11:40:23 +01:00
parent 17e30ff904
commit 62354e81e2
5 changed files with 38 additions and 36 deletions

View File

@@ -162,8 +162,8 @@ public sealed class ViewportRubberBandSelector
projection.Init(_owner.Viewport);
foreach (var node in nodes)
{
// Check for custom can select code
if (!node.CanSelectActorNodeWithSelector())
// Skip actors that cannot be selected
if (!node.CanSelectInViewport)
continue;
var a = node.Actor;

View File

@@ -192,7 +192,7 @@ namespace FlaxEditor.SceneGraph
GetAllChildActorNodes(nodes);
return nodes.ToArray();
}
/// <summary>
/// Get all nested actor nodes under this actor node.
/// </summary>
@@ -213,12 +213,18 @@ namespace FlaxEditor.SceneGraph
}
/// <summary>
/// Whether an actor node can be selected with a selector.
/// Whether an actor node can be selected with a selector inside editor viewport.
/// </summary>
/// <returns>True if the actor node can be selected</returns>
public virtual bool CanSelectActorNodeWithSelector()
public virtual bool CanSelectInViewport
{
return Actor && Actor.HideFlags is not (HideFlags.DontSelect or HideFlags.FullyHidden) && Actor is not EmptyActor && IsActive;
get
{
var actor = Actor;
return actor &&
actor.IsActiveInHierarchy &&
(actor.HideFlags & HideFlags.DontSelect) == HideFlags.None &&
actor.GetType() != typeof(EmptyActor);
}
}
/// <summary>

View File

@@ -33,12 +33,6 @@ namespace FlaxEditor.SceneGraph.Actors
}
}
/// <inheritdoc />
public override bool CanSelectActorNodeWithSelector()
{
return false;
}
/// <summary>
/// Gets the scene.
/// </summary>
@@ -53,6 +47,9 @@ namespace FlaxEditor.SceneGraph.Actors
{
}
/// <inheritdoc />
public override bool CanSelectInViewport => false;
/// <inheritdoc />
public override bool CanCreatePrefab => false;

View File

@@ -80,9 +80,6 @@ namespace FlaxEditor.SceneGraph.Actors
}
/// <inheritdoc />
public override bool CanSelectActorNodeWithSelector()
{
return Actor is UICanvas uiCanvas && uiCanvas.Is3D && base.CanSelectActorNodeWithSelector();
}
public override bool CanSelectInViewport => base.CanSelectInViewport && Actor is UICanvas uiCanvas && uiCanvas.Is3D;
}
}

View File

@@ -42,29 +42,31 @@ namespace FlaxEditor.SceneGraph.Actors
}
/// <inheritdoc />
public override bool CanSelectActorNodeWithSelector()
public override bool CanSelectInViewport
{
// Check if control and skip if canvas is 2D
if (Actor is not UIControl uiControl)
return false;
UICanvas canvas = null;
var controlParent = uiControl.Parent;
while (controlParent != null && controlParent is not Scene)
get
{
if (controlParent is UICanvas uiCanvas)
{
canvas = uiCanvas;
break;
}
controlParent = controlParent.Parent;
}
if (canvas != null)
{
if (canvas.Is2D)
// Check if control and skip if canvas is 2D
if (Actor is not UIControl uiControl)
return false;
UICanvas canvas = null;
var controlParent = uiControl.Parent;
while (controlParent != null && controlParent is not Scene)
{
if (controlParent is UICanvas uiCanvas)
{
canvas = uiCanvas;
break;
}
controlParent = controlParent.Parent;
}
if (canvas != null)
{
if (canvas.Is2D)
return false;
}
return base.CanSelectInViewport;
}
return base.CanSelectActorNodeWithSelector();
}
}
}