Browse Source

Check for obstacle node moving and update navigation mesh appropriately. Needs a hack to skip this during scene deletion to avoid crash. Closes #1558.

Lasse Öörni 9 years ago
parent
commit
000b1af6d7
2 changed files with 30 additions and 0 deletions
  1. 26 0
      Source/Urho3D/Navigation/Obstacle.cpp
  2. 4 0
      Source/Urho3D/Navigation/Obstacle.h

+ 26 - 0
Source/Urho3D/Navigation/Obstacle.cpp

@@ -86,6 +86,12 @@ void Obstacle::SetRadius(float newRadius)
     MarkNetworkUpdate();
 }
 
+void Obstacle::OnNodeSet(Node* node)
+{
+    if (node)
+        node->AddListener(this);
+}
+
 void Obstacle::OnSceneSet(Scene* scene)
 {
     if (scene)
@@ -109,6 +115,26 @@ void Obstacle::OnSceneSet(Scene* scene)
     }
 }
 
+void Obstacle::OnMarkedDirty(Node* node)
+{
+    if (IsEnabledEffective() && ownerMesh_)
+    {
+        Scene* scene = GetScene();
+        /// \hack If scene already unassigned, or if it's being destroyed, do nothing
+        if (!scene || scene->Refs() == 0)
+            return;
+
+        // If within threaded update, update later
+        if (scene->IsThreadedUpdate())
+        {
+            scene->DelayedMarkedDirty(this);
+            return;
+        }
+
+        ownerMesh_->ObstacleChanged(this);
+    }
+}
+
 void Obstacle::DrawDebugGeometry(DebugRenderer* debug, bool depthTest)
 {
     if (debug && IsEnabledEffective())

+ 4 - 0
Source/Urho3D/Navigation/Obstacle.h

@@ -70,8 +70,12 @@ public:
     void DrawDebugGeometry(bool depthTest);
 
 protected:
+    /// Handle node being assigned.
+    virtual void OnNodeSet(Node* node);
     /// Handle scene being assigned, identify our DynamicNavigationMesh.
     virtual void OnSceneSet(Scene* scene);
+    /// Handle node transform being dirtied.
+    virtual void OnMarkedDirty(Node* node);
 
 private:
     /// Radius of this obstacle.