summaryrefslogtreecommitdiff
path: root/indra/newview/llpanelnavmeshrebake.cpp
diff options
context:
space:
mode:
authorTodd Stinson <stinson@lindenlab.com>2012-06-19 18:13:47 -0700
committerTodd Stinson <stinson@lindenlab.com>2012-06-19 18:13:47 -0700
commitf5a5e687b77b70958e2ebb5a21ae4c4de2bc1bd8 (patch)
tree4395a12bace62c8165166118f1903e93ffe846c1 /indra/newview/llpanelnavmeshrebake.cpp
parente4aa2038812c2cf2cfed1b17a437ba620929f84f (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.cpp82
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);
}