PATH-702: Tying the status of the rebake button to the status of the navmesh for the current region.

master
Todd Stinson 2012-06-19 18:13:47 -07:00
parent e4aa203881
commit f5a5e687b7
4 changed files with 112 additions and 24 deletions

View File

@ -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);
}

View File

@ -28,10 +28,15 @@
#ifndef LL_NAVMESHREBAKE_H
#define LL_NAVMESHREBAKE_H
#include <boost/bind.hpp>
#include <boost/signals2.hpp>
#include "llhandle.h"
#include "llpanel.h"
#include "llpathfindingnavmesh.h"
class LLButton;
class LLPathfindingNavMeshStatus;
class LLView;
class LLPanelNavMeshRebake : public LLPanel
@ -40,19 +45,8 @@ class LLPanelNavMeshRebake : public LLPanel
LOG_CLASS(LLPanelNavMeshRebake);
public:
typedef enum
{
kRebakeNavMesh_Available,
kRebakeNavMesh_RequestSent,
kRebakeNavMesh_NotAvailable,
kRebakeNavMesh_Default = kRebakeNavMesh_NotAvailable
} ERebakeNavMeshMode;
static LLPanelNavMeshRebake* getInstance();
void setMode(ERebakeNavMeshMode pRebakeNavMeshMode);
virtual BOOL postBuild();
virtual void draw();
@ -61,16 +55,34 @@ public:
protected:
private:
typedef enum
{
kRebakeNavMesh_Available,
kRebakeNavMesh_RequestSent,
kRebakeNavMesh_NotAvailable,
kRebakeNavMesh_Default = kRebakeNavMesh_NotAvailable
} ERebakeNavMeshMode;
LLPanelNavMeshRebake();
virtual ~LLPanelNavMeshRebake();
static LLPanelNavMeshRebake* getPanel();
void setMode(ERebakeNavMeshMode pRebakeNavMeshMode);
void onNavMeshRebakeClick();
void handleNavMeshStatus(const LLPathfindingNavMeshStatus &pNavMeshStatus);
void handleRegionBoundaryCrossed();
void createNavMeshStatusListenerForCurrentRegion();
void updatePosition();
LLButton* mNavMeshRebakeButton;
LLButton* mNavMeshBakingButton;
LLButton* mNavMeshRebakeButton;
LLButton* mNavMeshBakingButton;
LLPathfindingNavMesh::navmesh_slot_t mNavMeshSlot;
boost::signals2::connection mRegionCrossingSlot;
};
#endif //LL_NAVMESHREBAKE_H

View File

@ -54,7 +54,9 @@
#include "llweb.h"
#include "llpanelnavmeshrebake.h"
#include "llenvmanager.h"
#if 0
#include "llstartup.h"
#endif
#define CAP_SERVICE_RETRIEVE_NAVMESH "RetrieveNavMeshSrc"
@ -670,7 +672,9 @@ void LLPathfindingManager::requestGetAgentState()
void LLPathfindingManager::handleAgentStateResult(const LLSD &pContent)
{
#if 0
displayNavMeshRebakePanel();
#endif
}
void LLPathfindingManager::handleAgentStateError(U32 pStatus, const std::string &pReason, const std::string &pURL)
@ -755,7 +759,6 @@ void LLPathfindingManager::handleNavMeshStatus(LLPathfindingNavMesh::ENavMeshReq
break;
case LLPathfindingNavMeshStatus::kComplete :
llinfos << "STINSON DEBUG: navmesh status is kComplete" << llendl;
displayNavMeshRebakePanel();
break;
case LLPathfindingNavMeshStatus::kRepending :
llinfos << "STINSON DEBUG: navmesh status is kRepending" << llendl;
@ -768,6 +771,7 @@ void LLPathfindingManager::handleNavMeshStatus(LLPathfindingNavMesh::ENavMeshReq
}
}
#if 0
void LLPathfindingManager::displayNavMeshRebakePanel()
{
LLPanelNavMeshRebake::getInstance()->setMode(LLPanelNavMeshRebake::kRebakeNavMesh_Available);
@ -777,6 +781,7 @@ void LLPathfindingManager::hideNavMeshRebakePanel()
{
LLPanelNavMeshRebake::getInstance()->setMode(LLPanelNavMeshRebake::kRebakeNavMesh_NotAvailable);
}
#endif
void LLPathfindingManager::handleNavMeshRebakeError(U32 pStatus, const std::string &pReason, const std::string &pURL)
{
@ -785,7 +790,10 @@ void LLPathfindingManager::handleNavMeshRebakeError(U32 pStatus, const std::stri
void LLPathfindingManager::handleNavMeshRebakeResult( const LLSD &pContent )
{
#if 0
hideNavMeshRebakePanel();
#endif
}
void LLPathfindingManager::triggerNavMeshRebuild()
@ -830,7 +838,9 @@ void LLAgentStateChangeNode::post(ResponsePtr pResponse, const LLSD &pContext, c
void LLPathfindingManager::handleAgentStateUpdate()
{
//Don't trigger if we are still loading in
#if 0
if ( LLStartUp::getStartupState() == STATE_STARTED) { displayNavMeshRebakePanel(); }
#endif
}
//---------------------------------------------------------------------------

View File

@ -97,7 +97,6 @@ public:
void triggerNavMeshRebuild();
void onRegionBoundaryCrossed();
void requestGetAgentState();
void hideNavMeshRebakePanel();
protected:
@ -128,7 +127,10 @@ private:
void handleNavMeshStatus(LLPathfindingNavMesh::ENavMeshRequestStatus pRequestStatus, const LLPathfindingNavMeshStatus &pNavMeshStatus);
#if 0
void displayNavMeshRebakePanel();
void hideNavMeshRebakePanel();
#endif
void handleAgentStateResult(const LLSD &pContent );
void handleAgentStateError(U32 pStatus, const std::string &pReason, const std::string &pURL);