|
@@ -78,7 +78,7 @@ void DetourCrowdManager::RegisterObject(Context* context)
|
|
|
|
|
|
|
|
void DetourCrowdManager::SetNavigationMesh(NavigationMesh* navMesh)
|
|
void DetourCrowdManager::SetNavigationMesh(NavigationMesh* navMesh)
|
|
|
{
|
|
{
|
|
|
- navigationMesh_ = WeakPtr<NavigationMesh>(navMesh);
|
|
|
|
|
|
|
+ navigationMesh_ = navMesh;
|
|
|
if (navigationMesh_ && !navigationMesh_->navMeshQuery_)
|
|
if (navigationMesh_ && !navigationMesh_->navMeshQuery_)
|
|
|
navigationMesh_->InitializeQuery();
|
|
navigationMesh_->InitializeQuery();
|
|
|
CreateCrowd();
|
|
CreateCrowd();
|
|
@@ -514,23 +514,31 @@ void DetourCrowdManager::HandleNavMeshFullRebuild(StringHash eventType, VariantM
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void DetourCrowdManager::OnNodeSet(Node* node)
|
|
|
|
|
|
|
+void DetourCrowdManager::OnSceneSet(Scene* scene)
|
|
|
{
|
|
{
|
|
|
// Subscribe to the scene subsystem update, which will trigger the crowd update step, and grab a reference
|
|
// Subscribe to the scene subsystem update, which will trigger the crowd update step, and grab a reference
|
|
|
// to the scene's NavigationMesh
|
|
// to the scene's NavigationMesh
|
|
|
- if (node)
|
|
|
|
|
|
|
+ if (scene)
|
|
|
{
|
|
{
|
|
|
- SubscribeToEvent(node, E_SCENESUBSYSTEMUPDATE, HANDLER(DetourCrowdManager, HandleSceneSubsystemUpdate));
|
|
|
|
|
- SubscribeToEvent(node, E_NAVIGATION_MESH_REBUILT, HANDLER(DetourCrowdManager, HandleNavMeshFullRebuild));
|
|
|
|
|
-
|
|
|
|
|
|
|
+ SubscribeToEvent(scene, E_SCENESUBSYSTEMUPDATE, HANDLER(DetourCrowdManager, HandleSceneSubsystemUpdate));
|
|
|
NavigationMesh* mesh = GetScene()->GetComponent<NavigationMesh>();
|
|
NavigationMesh* mesh = GetScene()->GetComponent<NavigationMesh>();
|
|
|
if (!mesh)
|
|
if (!mesh)
|
|
|
mesh = GetScene()->GetComponent<DynamicNavigationMesh>();
|
|
mesh = GetScene()->GetComponent<DynamicNavigationMesh>();
|
|
|
if (mesh)
|
|
if (mesh)
|
|
|
|
|
+ {
|
|
|
|
|
+ SubscribeToEvent(mesh, E_NAVIGATION_MESH_REBUILT, HANDLER(DetourCrowdManager, HandleNavMeshFullRebuild));
|
|
|
SetNavigationMesh(mesh);
|
|
SetNavigationMesh(mesh);
|
|
|
|
|
+ }
|
|
|
else
|
|
else
|
|
|
LOGERROR("DetourCrowdManager requires an existing navigation mesh");
|
|
LOGERROR("DetourCrowdManager requires an existing navigation mesh");
|
|
|
}
|
|
}
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ UnsubscribeFromEvent(E_SCENESUBSYSTEMUPDATE);
|
|
|
|
|
+ UnsubscribeFromEvent(E_NAVIGATION_MESH_REBUILT);
|
|
|
|
|
+ navigationMesh_.Reset();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
}
|
|
}
|