From 06970dd907db7a7c5ebe950c0e74e10bab13483d Mon Sep 17 00:00:00 2001 From: Todd Stinson Date: Tue, 21 Feb 2012 19:29:28 -0800 Subject: PATH-296: Pulling the freeze/unfreeze functionality into the pathfinding console. --- indra/newview/llfloaterpathfindingconsole.cpp | 286 ++++++++++++++------------ indra/newview/llfloaterpathfindingconsole.h | 9 +- 2 files changed, 163 insertions(+), 132 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/llfloaterpathfindingconsole.cpp b/indra/newview/llfloaterpathfindingconsole.cpp index cdd96b8b8e..7795397803 100644 --- a/indra/newview/llfloaterpathfindingconsole.cpp +++ b/indra/newview/llfloaterpathfindingconsole.cpp @@ -45,7 +45,8 @@ #include "llviewerregion.h" #include "llviewerwindow.h" #include "llviewercamera.h" -#include "llviewercontrol.h" +#include "llviewercontrol.h" +#include "llpathfindingmanager.h" #include "LLPathingLib.h" @@ -142,10 +143,113 @@ BOOL LLFloaterPathfindingConsole::postBuild() llassert(mClearPathButton != NULL); mClearPathButton->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onClearPathClicked, this)); - updateOnPathfindingServerStatus(); + return LLFloater::postBuild(); +} + +void LLFloaterPathfindingConsole::onOpen(const LLSD& pKey) +{ + LLFloater::onOpen(pKey); + + //make sure we have a pathing system + if ( !LLPathingLib::getInstance() ) + { + LLPathingLib::initSystem(); + } + if ( LLPathingLib::getInstance() == NULL ) + { + std::string str = getString("navmesh_library_not_implemented"); + LLStyle::Params styleParams; + styleParams.color = LLUIColorTable::instance().getColor("DrYellow"); + mPathfindingStatus->setText((LLStringExplicit)str, styleParams); + llwarns <<"Errror: cannout find pathing library implementation."<cleanupResidual(); + + mCurrentMDO = 0; + mNavMeshCnt = 0; + + //make sure the region is essentially enabled for navmesh support + std::string capability = "RetrieveNavMeshSrc"; + + LLViewerRegion* pCurrentRegion = gAgent.getRegion(); + std::vector regions; + regions.push_back( pCurrentRegion ); + std::vector shiftDirections; + shiftDirections.push_back( CURRENT_REGION ); + + mNeighboringRegion = gSavedSettings.getU32("RetrieveNeighboringRegion"); + if ( mNeighboringRegion != CURRENT_REGION ) + { + //User wants to pull in a neighboring region + std::vector availableRegions; + pCurrentRegion->getNeighboringRegionsStatus( availableRegions ); + //Is the desired region in the available list + std::vector::iterator foundElem = std::find(availableRegions.begin(),availableRegions.end(),mNeighboringRegion); + if ( foundElem != availableRegions.end() ) + { + LLViewerRegion* pCurrentRegion = gAgent.getRegion(); + std::vector regionPtrs; + pCurrentRegion->getNeighboringRegions( regionPtrs ); + regions.push_back( regionPtrs[mNeighboringRegion] ); + shiftDirections.push_back( mNeighboringRegion ); + } + } + + + //If the navmesh shift ops and the total region counts do not match - use the current region, only. + if ( shiftDirections.size() != regions.size() ) + { + shiftDirections.clear();regions.clear(); + regions.push_back( pCurrentRegion ); + shiftDirections.push_back( CURRENT_REGION ); + } + + int regionCnt = regions.size(); + mNavMeshCnt = regionCnt; + + for ( int i=0; igetCapability( capability ); + + if ( !url.empty() ) + { + std::string str = getString("navmesh_fetch_inprogress"); + mPathfindingStatus->setText((LLStringExplicit)str); + LLNavMeshStation::getInstance()->setNavMeshDownloadURL( url ); + int dir = shiftDirections[i]; + LLNavMeshStation::getInstance()->downloadNavMeshSrc( mNavMeshDownloadObserver[mCurrentMDO].getObserverHandle(), dir ); + ++mCurrentMDO; + } + else + { + --mNavMeshCnt; + std::string str = getString("navmesh_region_not_enabled"); + LLStyle::Params styleParams; + styleParams.color = LLUIColorTable::instance().getColor("DrYellow"); + mPathfindingStatus->setText((LLStringExplicit)str, styleParams); + llinfos<<"Region has does not required caps of type ["<registerAgentStateSignal(boost::bind(&LLFloaterPathfindingConsole::onAgentStateCB, this, _1)); + } + setAgentState(LLPathfindingManager::getInstance()->getAgentState()); updatePathTestStatus(); +} - return LLFloater::postBuild(); +void LLFloaterPathfindingConsole::onClose(bool pIsAppQuitting) +{ + if (mAgentStateSlot.connected()) + { + mAgentStateSlot.disconnect(); + } + + LLFloater::onClose(pIsAppQuitting); } BOOL LLFloaterPathfindingConsole::handleAnyMouseClick(S32 x, S32 y, MASK mask, EClickType clicktype, BOOL down) @@ -432,10 +536,10 @@ LLFloaterPathfindingConsole::LLFloaterPathfindingConsole(const LLSD& pSeed) mCharacterTypeRadioGroup(NULL), mPathTestingStatus(NULL), mClearPathButton(NULL), + mAgentStateSlot(), mNavMeshCnt(0), mHasStartPoint(false), mHasEndPoint(false), - mIsRegionFrozen(false), mNeighboringRegion( CURRENT_REGION ) { mSelfHandle.bind(this); @@ -450,95 +554,6 @@ LLFloaterPathfindingConsole::~LLFloaterPathfindingConsole() { } -void LLFloaterPathfindingConsole::onOpen(const LLSD& pKey) -{ - //make sure we have a pathing system - if ( !LLPathingLib::getInstance() ) - { - LLPathingLib::initSystem(); - } - if ( LLPathingLib::getInstance() == NULL ) - { - std::string str = getString("navmesh_library_not_implemented"); - LLStyle::Params styleParams; - styleParams.color = LLUIColorTable::instance().getColor("DrYellow"); - mPathfindingStatus->setText((LLStringExplicit)str, styleParams); - llwarns <<"Errror: cannout find pathing library implementation."<cleanupResidual(); - - mCurrentMDO = 0; - mNavMeshCnt = 0; - - //make sure the region is essentially enabled for navmesh support - std::string capability = "RetrieveNavMeshSrc"; - - LLViewerRegion* pCurrentRegion = gAgent.getRegion(); - std::vector regions; - regions.push_back( pCurrentRegion ); - std::vector shiftDirections; - shiftDirections.push_back( CURRENT_REGION ); - - mNeighboringRegion = gSavedSettings.getU32("RetrieveNeighboringRegion"); - if ( mNeighboringRegion != CURRENT_REGION ) - { - //User wants to pull in a neighboring region - std::vector availableRegions; - pCurrentRegion->getNeighboringRegionsStatus( availableRegions ); - //Is the desired region in the available list - std::vector::iterator foundElem = std::find(availableRegions.begin(),availableRegions.end(),mNeighboringRegion); - if ( foundElem != availableRegions.end() ) - { - LLViewerRegion* pCurrentRegion = gAgent.getRegion(); - std::vector regionPtrs; - pCurrentRegion->getNeighboringRegions( regionPtrs ); - regions.push_back( regionPtrs[mNeighboringRegion] ); - shiftDirections.push_back( mNeighboringRegion ); - } - } - - - //If the navmesh shift ops and the total region counts do not match - use the current region, only. - if ( shiftDirections.size() != regions.size() ) - { - shiftDirections.clear();regions.clear(); - regions.push_back( pCurrentRegion ); - shiftDirections.push_back( CURRENT_REGION ); - } - - int regionCnt = regions.size(); - mNavMeshCnt = regionCnt; - - for ( int i=0; igetCapability( capability ); - - if ( !url.empty() ) - { - std::string str = getString("navmesh_fetch_inprogress"); - mPathfindingStatus->setText((LLStringExplicit)str); - LLNavMeshStation::getInstance()->setNavMeshDownloadURL( url ); - int dir = shiftDirections[i]; - LLNavMeshStation::getInstance()->downloadNavMeshSrc( mNavMeshDownloadObserver[mCurrentMDO].getObserverHandle(), dir ); - ++mCurrentMDO; - } - else - { - --mNavMeshCnt; - std::string str = getString("navmesh_region_not_enabled"); - LLStyle::Params styleParams; - styleParams.color = LLUIColorTable::instance().getColor("DrYellow"); - mPathfindingStatus->setText((LLStringExplicit)str, styleParams); - llinfos<<"Region has does not required caps of type ["<setEnabled(FALSE); + LLPathfindingManager::getInstance()->requestSetAgentState(LLPathfindingManager::kAgentStateUnfrozen); } void LLFloaterPathfindingConsole::onFreezeClicked() { - mIsRegionFrozen = true; - updateOnPathfindingServerStatus(); - llwarns << "functionality has not yet been implemented to set frozen state" << llendl; + mFreezeButton->setEnabled(FALSE); + LLPathfindingManager::getInstance()->requestSetAgentState(LLPathfindingManager::kAgentStateFrozen); } void LLFloaterPathfindingConsole::onViewEditLinksetClicked() @@ -671,12 +684,17 @@ void LLFloaterPathfindingConsole::onClearPathClicked() updatePathTestStatus(); } -void LLFloaterPathfindingConsole::updateOnPathfindingServerStatus() +void LLFloaterPathfindingConsole::onAgentStateCB(LLPathfindingManager::EAgentState pAgentState) { - std::string capURL = getCurrentRegionCapabilityURL(); + setAgentState(pAgentState); +} - if (capURL.empty()) +void LLFloaterPathfindingConsole::setAgentState(LLPathfindingManager::EAgentState pAgentState) +{ + switch (pAgentState) { + case LLPathfindingManager::kAgentStateUnknown : + case LLPathfindingManager::kAgentStateNotEnabled : mShowNavMeshCheckBox->setEnabled(FALSE); mShowNavMeshWalkabilityComboBox->setEnabled(FALSE); mShowWalkablesCheckBox->setEnabled(FALSE); @@ -686,20 +704,15 @@ void LLFloaterPathfindingConsole::updateOnPathfindingServerStatus() mShowWorldCheckBox->setEnabled(FALSE); mViewCharactersButton->setEnabled(FALSE); mEditTestTabContainer->setEnabled(FALSE); - mUnfreezeLabel->setEnabled(FALSE); - mUnfreezeButton->setEnabled(FALSE); - mLinksetsLabel->setEnabled(FALSE); - mLinksetsButton->setEnabled(FALSE); - mFreezeLabel->setEnabled(FALSE); - mFreezeButton->setEnabled(FALSE); mCharacterWidthSlider->setEnabled(FALSE); mCharacterTypeRadioGroup->setEnabled(FALSE); mClearPathButton->setEnabled(FALSE); mEditTestTabContainer->selectTab(0); - } - else - { + mHasStartPoint = false; + mHasEndPoint = false; + break; + default : mShowNavMeshCheckBox->setEnabled(TRUE); mShowNavMeshWalkabilityComboBox->setEnabled(TRUE); mShowWalkablesCheckBox->setEnabled(TRUE); @@ -712,24 +725,39 @@ void LLFloaterPathfindingConsole::updateOnPathfindingServerStatus() mCharacterWidthSlider->setEnabled(TRUE); mCharacterTypeRadioGroup->setEnabled(TRUE); mClearPathButton->setEnabled(TRUE); - if (mIsRegionFrozen) - { - mUnfreezeLabel->setEnabled(TRUE); - mUnfreezeButton->setEnabled(TRUE); - mLinksetsLabel->setEnabled(FALSE); - mLinksetsButton->setEnabled(FALSE); - mFreezeLabel->setEnabled(FALSE); - mFreezeButton->setEnabled(FALSE); - } - else - { - mUnfreezeLabel->setEnabled(FALSE); - mUnfreezeButton->setEnabled(FALSE); - mLinksetsLabel->setEnabled(TRUE); - mLinksetsButton->setEnabled(TRUE); - mFreezeLabel->setEnabled(TRUE); - mFreezeButton->setEnabled(TRUE); - } + break; + } + + switch (LLPathfindingManager::getInstance()->getLastKnownNonErrorAgentState()) + { + case LLPathfindingManager::kAgentStateUnknown : + case LLPathfindingManager::kAgentStateNotEnabled : + mUnfreezeLabel->setEnabled(FALSE); + mUnfreezeButton->setEnabled(FALSE); + mLinksetsLabel->setEnabled(FALSE); + mLinksetsButton->setEnabled(FALSE); + mFreezeLabel->setEnabled(FALSE); + mFreezeButton->setEnabled(FALSE); + break; + case LLPathfindingManager::kAgentStateFrozen : + mUnfreezeLabel->setEnabled(TRUE); + mUnfreezeButton->setEnabled(TRUE); + mLinksetsLabel->setEnabled(FALSE); + mLinksetsButton->setEnabled(FALSE); + mFreezeLabel->setEnabled(FALSE); + mFreezeButton->setEnabled(FALSE); + break; + case LLPathfindingManager::kAgentStateUnfrozen : + mUnfreezeLabel->setEnabled(FALSE); + mUnfreezeButton->setEnabled(FALSE); + mLinksetsLabel->setEnabled(TRUE); + mLinksetsButton->setEnabled(TRUE); + mFreezeLabel->setEnabled(TRUE); + mFreezeButton->setEnabled(TRUE); + break; + default : + llassert(0); + break; } } diff --git a/indra/newview/llfloaterpathfindingconsole.h b/indra/newview/llfloaterpathfindingconsole.h index 2068d2c53f..3735a94c18 100644 --- a/indra/newview/llfloaterpathfindingconsole.h +++ b/indra/newview/llfloaterpathfindingconsole.h @@ -32,6 +32,7 @@ #include "llhandle.h" #include "llnavmeshstation.h" #include "LLPathingLib.h" +#include "llpathfindingmanager.h" class LLSD; class LLRadioGroup; @@ -67,6 +68,8 @@ public: } ECharacterType; virtual BOOL postBuild(); + virtual void onOpen(const LLSD& pKey); + virtual void onClose(bool pIsAppQuitting); virtual BOOL handleAnyMouseClick(S32 x, S32 y, MASK mask, EClickType clicktype, BOOL down); BOOL isGeneratePathMode(MASK mask, EClickType clicktype, BOOL down) const; @@ -113,7 +116,6 @@ private: LLFloaterPathfindingConsole(const LLSD& pSeed); virtual ~LLFloaterPathfindingConsole(); - virtual void onOpen(const LLSD& pKey); std::string getCurrentRegionCapabilityURL() const; void onShowWalkabilitySet(); @@ -125,8 +127,9 @@ private: void onFreezeClicked(); void onViewEditLinksetClicked(); void onClearPathClicked(); + void onAgentStateCB(LLPathfindingManager::EAgentState pAgentState); - void updateOnPathfindingServerStatus(); + void setAgentState(LLPathfindingManager::EAgentState pAgentState); void generatePath(); void updatePathTestStatus(); @@ -152,7 +155,7 @@ private: LLRadioGroup *mCharacterTypeRadioGroup; LLTextBase *mPathTestingStatus; LLButton *mClearPathButton; - bool mIsRegionFrozen; + LLPathfindingManager::agent_state_slot_t mAgentStateSlot; LLNavMeshDownloadObserver mNavMeshDownloadObserver[10]; int mCurrentMDO; -- cgit v1.2.3