diff --git a/Source/Editor/Gizmo/TransformGizmo.cs b/Source/Editor/Gizmo/TransformGizmo.cs index f7aed5597..afda8484e 100644 --- a/Source/Editor/Gizmo/TransformGizmo.cs +++ b/Source/Editor/Gizmo/TransformGizmo.cs @@ -165,7 +165,10 @@ namespace FlaxEditor.Gizmo if (_selectionParents[i] is ActorNode actorNode) { bounds = BoundingBox.Merge(bounds, actorNode.Actor.BoxWithChildren); - navigationDirty |= (actorNode.Actor.StaticFlags & StaticFlags.Navigation) == StaticFlags.Navigation; + if (actorNode.AffectsNavigationWithChildren) + { + navigationDirty |= actorNode.Actor.HasStaticFlag(StaticFlags.Navigation); + } } } } diff --git a/Source/Editor/Modules/SceneEditingModule.cs b/Source/Editor/Modules/SceneEditingModule.cs index 5a19693a1..021817945 100644 --- a/Source/Editor/Modules/SceneEditingModule.cs +++ b/Source/Editor/Modules/SceneEditingModule.cs @@ -195,10 +195,11 @@ namespace FlaxEditor.Modules OnSelectionChanged(); } - private void OnDirty(Actor actor) + private void OnDirty(ActorNode node) { var options = Editor.Options.Options; var isPlayMode = Editor.StateMachine.IsPlayMode; + var actor = node.Actor; // Auto CSG mesh rebuild if (!isPlayMode && options.General.AutoRebuildCSG) @@ -208,7 +209,7 @@ namespace FlaxEditor.Modules } // Auto NavMesh rebuild - if (!isPlayMode && options.General.AutoRebuildNavMesh && actor.Scene && (actor.StaticFlags & StaticFlags.Navigation) == StaticFlags.Navigation) + if (!isPlayMode && options.General.AutoRebuildNavMesh && actor.Scene && node.AffectsNavigationWithChildren) { var bounds = actor.BoxWithChildren; Navigation.BuildNavMesh(actor.Scene, bounds, options.General.AutoRebuildNavMeshTimeoutMs); @@ -235,7 +236,7 @@ namespace FlaxEditor.Modules { foreach (var obj in objects) { - if (obj is ActorNode node && node.Actor.Scene && (node.Actor.StaticFlags & StaticFlags.Navigation) == StaticFlags.Navigation) + if (obj is ActorNode node && node.Actor.Scene && node.AffectsNavigationWithChildren) { var bounds = node.Actor.BoxWithChildren; Navigation.BuildNavMesh(node.Actor.Scene, bounds, options.General.AutoRebuildNavMeshTimeoutMs); @@ -291,7 +292,7 @@ namespace FlaxEditor.Modules SpawnEnd?.Invoke(); - OnDirty(actor); + OnDirty(actorNode); } /// @@ -376,7 +377,7 @@ namespace FlaxEditor.Modules SpawnEnd?.Invoke(); - OnDirty(actor); + OnDirty(actorNode); } /// diff --git a/Source/Editor/SceneGraph/ActorNode.cs b/Source/Editor/SceneGraph/ActorNode.cs index 07ff6a3b5..318d8379b 100644 --- a/Source/Editor/SceneGraph/ActorNode.cs +++ b/Source/Editor/SceneGraph/ActorNode.cs @@ -76,6 +76,29 @@ namespace FlaxEditor.SceneGraph _treeNode.LinkNode(this); } + /// + /// Gets a value indicating whether this actor affects navigation. + /// + public virtual bool AffectsNavigation => false; + + /// + /// Gets a value indicating whether this actor affects navigation or any of its children (recursive). + /// + public bool AffectsNavigationWithChildren + { + get + { + if (_actor.HasStaticFlag(StaticFlags.Navigation) && AffectsNavigation) + return true; + for (var i = 0; i < ChildNodes.Count; i++) + { + if (ChildNodes[i] is ActorNode actorChild && actorChild.AffectsNavigationWithChildren) + return true; + } + return false; + } + } + /// /// Tries to find the tree node for the specified actor. /// diff --git a/Source/Editor/SceneGraph/Actors/ColliderNode.cs b/Source/Editor/SceneGraph/Actors/ColliderNode.cs index 3d9618939..6be43e01b 100644 --- a/Source/Editor/SceneGraph/Actors/ColliderNode.cs +++ b/Source/Editor/SceneGraph/Actors/ColliderNode.cs @@ -18,6 +18,9 @@ namespace FlaxEditor.SceneGraph { } + /// + public override bool AffectsNavigation => true; + /// public override bool RayCastSelf(ref RayCastData ray, out float distance, out Vector3 normal) { diff --git a/Source/Editor/SceneGraph/Actors/NavLinkNode.cs b/Source/Editor/SceneGraph/Actors/NavLinkNode.cs index 62bc0a2e7..3e52b8216 100644 --- a/Source/Editor/SceneGraph/Actors/NavLinkNode.cs +++ b/Source/Editor/SceneGraph/Actors/NavLinkNode.cs @@ -78,6 +78,9 @@ namespace FlaxEditor.SceneGraph.Actors AddChildNode(new LinkNode(this, new Guid(bytes), false)); } + /// + public override bool AffectsNavigation => true; + /// public override bool RayCastSelf(ref RayCastData ray, out float distance, out Vector3 normal) { diff --git a/Source/Editor/SceneGraph/Actors/NavModifierVolumeNode.cs b/Source/Editor/SceneGraph/Actors/NavModifierVolumeNode.cs index 38faba8ef..56451b1fb 100644 --- a/Source/Editor/SceneGraph/Actors/NavModifierVolumeNode.cs +++ b/Source/Editor/SceneGraph/Actors/NavModifierVolumeNode.cs @@ -16,5 +16,8 @@ namespace FlaxEditor.SceneGraph.Actors : base(actor) { } + + /// + public override bool AffectsNavigation => true; } } diff --git a/Source/Editor/SceneGraph/Actors/TerrainNode.cs b/Source/Editor/SceneGraph/Actors/TerrainNode.cs index 13fcb846b..120415d07 100644 --- a/Source/Editor/SceneGraph/Actors/TerrainNode.cs +++ b/Source/Editor/SceneGraph/Actors/TerrainNode.cs @@ -15,5 +15,8 @@ namespace FlaxEditor.SceneGraph.Actors : base(actor) { } + + /// + public override bool AffectsNavigation => true; } } diff --git a/Source/Editor/Tools/Terrain/EditTab.cs b/Source/Editor/Tools/Terrain/EditTab.cs index e7b281f13..45577589b 100644 --- a/Source/Editor/Tools/Terrain/EditTab.cs +++ b/Source/Editor/Tools/Terrain/EditTab.cs @@ -190,7 +190,7 @@ namespace FlaxEditor.Tools.Terrain // Auto NavMesh rebuild if (!isPlayMode && editorOptions.General.AutoRebuildNavMesh) { - if (terrain.Scene && (terrain.StaticFlags & StaticFlags.Navigation) == StaticFlags.Navigation) + if (terrain.Scene && terrain.HasStaticFlag(StaticFlags.Navigation)) { Navigation.BuildNavMesh(terrain.Scene, patchBounds, editorOptions.General.AutoRebuildNavMeshTimeoutMs); } diff --git a/Source/Editor/Tools/Terrain/EditTerrainGizmo.cs b/Source/Editor/Tools/Terrain/EditTerrainGizmo.cs index 314a6cfb8..851687bdf 100644 --- a/Source/Editor/Tools/Terrain/EditTerrainGizmo.cs +++ b/Source/Editor/Tools/Terrain/EditTerrainGizmo.cs @@ -207,7 +207,7 @@ namespace FlaxEditor.Tools.Terrain // Auto NavMesh rebuild if (!isPlayMode && editorOptions.General.AutoRebuildNavMesh) { - if (terrain.Scene && (terrain.StaticFlags & StaticFlags.Navigation) == StaticFlags.Navigation) + if (terrain.Scene && terrain.HasStaticFlag(StaticFlags.Navigation)) { Navigation.BuildNavMesh(terrain.Scene, patchBounds, editorOptions.General.AutoRebuildNavMeshTimeoutMs); } diff --git a/Source/Editor/Tools/Terrain/Sculpt/Mode.cs b/Source/Editor/Tools/Terrain/Sculpt/Mode.cs index eb32b3934..bc38eaaf1 100644 --- a/Source/Editor/Tools/Terrain/Sculpt/Mode.cs +++ b/Source/Editor/Tools/Terrain/Sculpt/Mode.cs @@ -154,7 +154,7 @@ namespace FlaxEditor.Tools.Terrain.Sculpt // Auto NavMesh rebuild if (!isPlayMode && editorOptions.General.AutoRebuildNavMesh) { - if (terrain.Scene && (terrain.StaticFlags & StaticFlags.Navigation) == StaticFlags.Navigation) + if (terrain.Scene && terrain.HasStaticFlag(StaticFlags.Navigation)) { Navigation.BuildNavMesh(terrain.Scene, brushBounds, editorOptions.General.AutoRebuildNavMeshTimeoutMs); } diff --git a/Source/Editor/Windows/EditGameWindow.cs b/Source/Editor/Windows/EditGameWindow.cs index a9f85490d..07fbf7a46 100644 --- a/Source/Editor/Windows/EditGameWindow.cs +++ b/Source/Editor/Windows/EditGameWindow.cs @@ -210,10 +210,11 @@ namespace FlaxEditor.Windows if (Editor.Undo.Enabled) { - bool navigationDirty = (_pilotActor.StaticFlags & StaticFlags.Navigation) == StaticFlags.Navigation; + ActorNode node = Editor.Scene.GetActorNode(_pilotActor); + bool navigationDirty = node.AffectsNavigationWithChildren; var action = new TransformObjectsAction ( - new List { Editor.Scene.GetActorNode(_pilotActor) }, + new List { node }, new List { _pilotStart }, ref _pilotBounds, navigationDirty