diff options
| author | Todd Stinson <stinson@lindenlab.com> | 2012-06-19 18:13:47 -0700 |
|---|---|---|
| committer | Todd Stinson <stinson@lindenlab.com> | 2012-06-19 18:13:47 -0700 |
| commit | f5a5e687b77b70958e2ebb5a21ae4c4de2bc1bd8 (patch) | |
| tree | 4395a12bace62c8165166118f1903e93ffe846c1 /indra/newview/llpanelnavmeshrebake.cpp | |
| parent | e4aa2038812c2cf2cfed1b17a437ba620929f84f (diff) | |
PATH-702: Tying the status of the rebake button to the status of the navmesh for the current region.
Diffstat (limited to 'indra/newview/llpanelnavmeshrebake.cpp')
| -rw-r--r-- | indra/newview/llpanelnavmeshrebake.cpp | 82 |
1 files changed, 73 insertions, 9 deletions
diff --git a/indra/newview/llpanelnavmeshrebake.cpp b/indra/newview/llpanelnavmeshrebake.cpp index e1c1548de1..608bfbf776 100644 --- a/indra/newview/llpanelnavmeshrebake.cpp +++ b/indra/newview/llpanelnavmeshrebake.cpp @@ -30,17 +30,23 @@ #include "llpanelnavmeshrebake.h" #include <boost/bind.hpp> +#include <boost/signals2.hpp> +#include "llagent.h" #include "llbutton.h" +#include "llenvmanager.h" #include "llhandle.h" #include "llhints.h" #include "llpanel.h" #include "llpathfindingmanager.h" +#include "llpathfindingnavmesh.h" +#include "llpathfindingnavmeshstatus.h" #include "lltoolbar.h" #include "lltoolbarview.h" #include "lltoolmgr.h" #include "lltooltip.h" #include "llview.h" +#include "llviewerregion.h" LLPanelNavMeshRebake* LLPanelNavMeshRebake::getInstance() { @@ -48,13 +54,6 @@ LLPanelNavMeshRebake* LLPanelNavMeshRebake::getInstance() return panel; } -void LLPanelNavMeshRebake::setMode(ERebakeNavMeshMode pRebakeNavMeshMode) -{ - mNavMeshRebakeButton->setVisible(pRebakeNavMeshMode == kRebakeNavMesh_Available); - mNavMeshBakingButton->setVisible(pRebakeNavMeshMode == kRebakeNavMesh_RequestSent); - setVisible(pRebakeNavMeshMode != kRebakeNavMesh_NotAvailable); -} - BOOL LLPanelNavMeshRebake::postBuild() { //Rebake initiated @@ -68,6 +67,13 @@ BOOL LLPanelNavMeshRebake::postBuild() setMode(kRebakeNavMesh_Default); + createNavMeshStatusListenerForCurrentRegion(); + + if ( !mRegionCrossingSlot.connected() ) + { + mRegionCrossingSlot = LLEnvManagerNew::getInstance()->setRegionChangeCallback(boost::bind(&LLPanelNavMeshRebake::handleRegionBoundaryCrossed, this)); + } + return LLPanel::postBuild(); } @@ -91,7 +97,9 @@ BOOL LLPanelNavMeshRebake::handleToolTip( S32 x, S32 y, MASK mask ) LLPanelNavMeshRebake::LLPanelNavMeshRebake() : mNavMeshRebakeButton( NULL ), - mNavMeshBakingButton( NULL ) + mNavMeshBakingButton( NULL ), + mNavMeshSlot(), + mRegionCrossingSlot() { // make sure we have the only instance of this class static bool b = true; @@ -111,6 +119,13 @@ LLPanelNavMeshRebake* LLPanelNavMeshRebake::getPanel() return panel; } +void LLPanelNavMeshRebake::setMode(ERebakeNavMeshMode pRebakeNavMeshMode) +{ + mNavMeshRebakeButton->setVisible(pRebakeNavMeshMode == kRebakeNavMesh_Available); + mNavMeshBakingButton->setVisible(pRebakeNavMeshMode == kRebakeNavMesh_RequestSent); + setVisible(pRebakeNavMeshMode != kRebakeNavMesh_NotAvailable); +} + void LLPanelNavMeshRebake::onNavMeshRebakeClick() { #if 0 @@ -121,6 +136,55 @@ void LLPanelNavMeshRebake::onNavMeshRebakeClick() LLPathfindingManager::getInstance()->triggerNavMeshRebuild(); } +void LLPanelNavMeshRebake::handleNavMeshStatus(const LLPathfindingNavMeshStatus &pNavMeshStatus) +{ + ERebakeNavMeshMode rebakeNavMeshMode = kRebakeNavMesh_Default; + if (pNavMeshStatus.isValid()) + { + switch (pNavMeshStatus.getStatus()) + { + case LLPathfindingNavMeshStatus::kPending : + rebakeNavMeshMode = kRebakeNavMesh_Available; + break; + case LLPathfindingNavMeshStatus::kBuilding : + rebakeNavMeshMode = kRebakeNavMesh_NotAvailable; + break; + case LLPathfindingNavMeshStatus::kComplete : + rebakeNavMeshMode = kRebakeNavMesh_NotAvailable; + break; + case LLPathfindingNavMeshStatus::kRepending : + rebakeNavMeshMode = kRebakeNavMesh_Available; + break; + default : + rebakeNavMeshMode = kRebakeNavMesh_Default; + llassert(0); + break; + } + } + + setMode(rebakeNavMeshMode); +} + +void LLPanelNavMeshRebake::handleRegionBoundaryCrossed() +{ + createNavMeshStatusListenerForCurrentRegion(); +} + +void LLPanelNavMeshRebake::createNavMeshStatusListenerForCurrentRegion() +{ + if (mNavMeshSlot.connected()) + { + mNavMeshSlot.disconnect(); + } + + LLViewerRegion *currentRegion = gAgent.getRegion(); + if (currentRegion != NULL) + { + mNavMeshSlot = LLPathfindingManager::getInstance()->registerNavMeshListenerForRegion(currentRegion, boost::bind(&LLPanelNavMeshRebake::handleNavMeshStatus, this, _2)); + LLPathfindingManager::getInstance()->requestGetNavMeshForRegion(currentRegion, true); + } +} + void LLPanelNavMeshRebake::updatePosition() { S32 y_pos = 0; @@ -143,7 +207,7 @@ void LLPanelNavMeshRebake::updatePosition() panel_ssf_container->setOrigin(0, y_pos); } - S32 x_pos = bottom_tb_center-getRect().getWidth()/2 - left_tb_width + 113 /*width of stand/fly button */ + 10; + S32 x_pos = bottom_tb_center-getRect().getWidth()/2 - left_tb_width + 113 /* width of stand/fly button */ + 10 /* margin */; setOrigin( x_pos, 0); } |
