From d19c31555b457f8e9beaee82981c51f66989390a Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Mon, 18 Jan 2021 15:08:00 +0100 Subject: [PATCH] Add support for dynamic updating navmesh when moving NavModifierVolume --- .../Engine/Navigation/NavModifierVolume.cpp | 26 +++++++++++++++---- Source/Engine/Navigation/NavModifierVolume.h | 2 +- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/Source/Engine/Navigation/NavModifierVolume.cpp b/Source/Engine/Navigation/NavModifierVolume.cpp index 533fae199..e72393a03 100644 --- a/Source/Engine/Navigation/NavModifierVolume.cpp +++ b/Source/Engine/Navigation/NavModifierVolume.cpp @@ -2,12 +2,12 @@ #include "NavModifierVolume.h" #include "NavigationSettings.h" +#include "NavMeshBuilder.h" #include "Engine/Level/Scene/Scene.h" #include "Engine/Serialization/Serialization.h" #if USE_EDITOR #include "Editor/Editor.h" #include "Editor/Managed/ManagedEditor.h" -#include "NavMeshBuilder.h" #endif NavModifierVolume::NavModifierVolume(const SpawnParams& params) @@ -47,19 +47,35 @@ void NavModifierVolume::Deserialize(DeserializeStream& stream, ISerializeModifie DESERIALIZE(AreaName); } -#if USE_EDITOR - void NavModifierVolume::OnBoundsChanged(const BoundingBox& prevBounds) { +#if COMPILE_WITH_NAV_MESH_BUILDER // Auto-rebuild modified navmesh area - if (IsDuringPlay() && IsActiveInHierarchy() && !Editor::IsPlayMode && Editor::Managed->CanAutoBuildNavMesh()) + if ( + IsDuringPlay() && IsActiveInHierarchy() && HasStaticFlag(StaticFlags::Navigation) && + ( + // Build at runtime for dynamic modifiers + !HasStaticFlag(StaticFlags::Transform) +#if USE_EDITOR + // Build in editor when using auto-rebuild option + || (!Editor::IsPlayMode && Editor::Managed->CanAutoBuildNavMesh()) +#endif + )) { BoundingBox dirtyBounds; BoundingBox::Merge(prevBounds, _box, dirtyBounds); - NavMeshBuilder::Build(GetScene(), dirtyBounds, ManagedEditor::ManagedEditorOptions.AutoRebuildNavMeshTimeoutMs); +#if USE_EDITOR + const float timeoutMs = ManagedEditor::ManagedEditorOptions.AutoRebuildNavMeshTimeoutMs; +#else + const float timeoutMs = 0.0f; +#endif + NavMeshBuilder::Build(GetScene(), dirtyBounds, timeoutMs); } +#endif } +#if USE_EDITOR + Color NavModifierVolume::GetWiresColor() { return Color::Red; diff --git a/Source/Engine/Navigation/NavModifierVolume.h b/Source/Engine/Navigation/NavModifierVolume.h index 7ee70c116..9b6a3e764 100644 --- a/Source/Engine/Navigation/NavModifierVolume.h +++ b/Source/Engine/Navigation/NavModifierVolume.h @@ -41,8 +41,8 @@ public: protected: // [BoxVolume] -#if USE_EDITOR void OnBoundsChanged(const BoundingBox& prevBounds) override; +#if USE_EDITOR Color GetWiresColor() override; #endif };