diff options
| author | Todd Stinson <stinson@lindenlab.com> | 2012-03-02 19:17:16 -0800 | 
|---|---|---|
| committer | Todd Stinson <stinson@lindenlab.com> | 2012-03-02 19:17:16 -0800 | 
| commit | a33e24413ea74aaad91d9eeaa685d1c523c5d210 (patch) | |
| tree | 0335aaef81e1b4b30d9a036b012751ec42ea71d9 /indra | |
| parent | e1e13bcab96565ddc7627139673519a09a60962f (diff) | |
PATH-304,PATH-205: Initial reworking of the navmesh download functionality.
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/newview/CMakeLists.txt | 4 | ||||
| -rw-r--r-- | indra/newview/llfloaterpathfindingbasic.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llfloaterpathfindingconsole.cpp | 281 | ||||
| -rw-r--r-- | indra/newview/llfloaterpathfindingconsole.h | 37 | ||||
| -rw-r--r-- | indra/newview/llfloaterpathfindinglinksets.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llnavmeshstation.cpp | 134 | ||||
| -rw-r--r-- | indra/newview/llnavmeshstation.h | 101 | ||||
| -rw-r--r-- | indra/newview/llpathfindingmanager.cpp | 118 | ||||
| -rw-r--r-- | indra/newview/llpathfindingmanager.h | 25 | ||||
| -rw-r--r-- | indra/newview/llpathfindingnavmesh.cpp | 133 | ||||
| -rw-r--r-- | indra/newview/llpathfindingnavmesh.h | 86 | ||||
| -rw-r--r-- | indra/newview/skins/default/xui/en/floater_pathfinding_console.xml | 14 | 
12 files changed, 615 insertions, 322 deletions
| diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 5223eead35..c5eac457fd 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -333,7 +333,6 @@ set(viewer_SOURCE_FILES      llnameeditor.cpp      llnamelistctrl.cpp      llnavigationbar.cpp -    llnavmeshstation.cpp      llnearbychat.cpp      llnearbychatbar.cpp      llnearbychathandler.cpp @@ -421,6 +420,7 @@ set(viewer_SOURCE_FILES      llpathfindinglinkset.cpp      llpathfindinglinksetlist.cpp      llpathfindingmanager.cpp +    llpathfindingnavmesh.cpp      llphysicsmotion.cpp      llphysicsshapebuilderutil.cpp      llplacesinventorybridge.cpp @@ -898,7 +898,6 @@ set(viewer_HEADER_FILES      llnameeditor.h      llnamelistctrl.h      llnavigationbar.h -    llnavmeshstation.h      llnearbychat.h      llnearbychatbar.h      llnearbychathandler.h @@ -975,6 +974,7 @@ set(viewer_HEADER_FILES      llpathfindinglinkset.h      llpathfindinglinksetlist.h      llpathfindingmanager.h +    llpathfindingnavmesh.h      llphysicsmotion.h      llphysicsshapebuilderutil.h      llplacesinventorybridge.h diff --git a/indra/newview/llfloaterpathfindingbasic.cpp b/indra/newview/llfloaterpathfindingbasic.cpp index 04d830632d..d1103088ab 100644 --- a/indra/newview/llfloaterpathfindingbasic.cpp +++ b/indra/newview/llfloaterpathfindingbasic.cpp @@ -66,7 +66,7 @@ void LLFloaterPathfindingBasic::onOpen(const LLSD& pKey)  	if (!mAgentStateSlot.connected())
  	{
 -		mAgentStateSlot = LLPathfindingManager::getInstance()->registerAgentStateSignal(boost::bind(&LLFloaterPathfindingBasic::onAgentStateCB, this, _1));
 +		mAgentStateSlot = LLPathfindingManager::getInstance()->registerAgentStateListener(boost::bind(&LLFloaterPathfindingBasic::onAgentStateCB, this, _1));
  	}
  	setAgentState(LLPathfindingManager::getInstance()->getAgentState());
  }
 diff --git a/indra/newview/llfloaterpathfindingconsole.cpp b/indra/newview/llfloaterpathfindingconsole.cpp index 2bf46175ee..02f2bf8d72 100644 --- a/indra/newview/llfloaterpathfindingconsole.cpp +++ b/indra/newview/llfloaterpathfindingconsole.cpp @@ -33,6 +33,7 @@  #include "llsd.h"
  #include "llhandle.h"
  #include "llagent.h"
 +#include "llpanel.h"
  #include "llbutton.h"
  #include "llradiogroup.h"
  #include "llsliderctrl.h"
 @@ -40,12 +41,12 @@  #include "lltextbase.h"
  #include "lltabcontainer.h"
  #include "llcombobox.h"
 -#include "llnavmeshstation.h"
  #include "llfloaterreg.h"
  #include "llviewerregion.h"
  #include "llviewerwindow.h"
  #include "llviewercamera.h"
  #include "llviewercontrol.h"
 +#include "llpathfindingnavmesh.h"
  #include "llpathfindingmanager.h"
  #include "LLPathingLib.h"
 @@ -104,6 +105,12 @@ BOOL LLFloaterPathfindingConsole::postBuild()  	mEditTestTabContainer = findChild<LLTabContainer>("edit_test_tab_container");
  	llassert(mEditTestTabContainer != NULL);
 +	mEditTab = findChild<LLPanel>("edit_panel");
 +	llassert(mEditTab != NULL);
 +
 +	mTestTab = findChild<LLPanel>("test_panel");
 +	llassert(mTestTab != NULL);
 +
  	mUnfreezeLabel = findChild<LLTextBase>("unfreeze_label");
  	llassert(mUnfreezeLabel != NULL);
 @@ -157,14 +164,18 @@ void LLFloaterPathfindingConsole::onOpen(const LLSD& pKey)  	}	
  	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);
 +		setConsoleState(kConsoleStateLibraryNotImplemented);
  		llwarns <<"Errror: cannout find pathing library implementation."<<llendl;
  	}
  	else
 -	{	
 +	{
 +		LLPathfindingManager *pathfindingManagerInstance = LLPathfindingManager::getInstance();
 +		if (!mNavMeshSlot.connected())
 +		{
 +			pathfindingManagerInstance->registerNavMeshListenerForCurrentRegion(boost::bind(&LLFloaterPathfindingConsole::onNavMeshDownloadCB, this, _1, _2, _3, _4));
 +		}
 +		pathfindingManagerInstance->requestGetNavMeshForCurrentRegion();
 +#if 0
  		LLPathingLib::getInstance()->cleanupResidual();
  		mCurrentMDO = 0;
 @@ -232,12 +243,14 @@ void LLFloaterPathfindingConsole::onOpen(const LLSD& pKey)  				llinfos<<"Region has does not required caps of type ["<<capability<<"]"<<llendl;
  			}
  		}
 +#endif
  	}		
  	if (!mAgentStateSlot.connected())
  	{
 -		LLPathfindingManager::getInstance()->registerAgentStateSignal(boost::bind(&LLFloaterPathfindingConsole::onAgentStateCB, this, _1));
 +		LLPathfindingManager::getInstance()->registerAgentStateListener(boost::bind(&LLFloaterPathfindingConsole::onAgentStateCB, this, _1));
  	}
 +
  	setAgentState(LLPathfindingManager::getInstance()->getAgentState());
  	updatePathTestStatus();
  }
 @@ -248,9 +261,16 @@ void LLFloaterPathfindingConsole::onClose(bool pIsAppQuitting)  	{
  		mAgentStateSlot.disconnect();
  	}
 -	LLPathingLib::getInstance()->cleanupResidual();
 +
 +	if (mNavMeshSlot.connected())
 +	{
 +		mNavMeshSlot.disconnect();
 +	}
 +
 +	clearNavMesh();
  	LLFloater::onClose(pIsAppQuitting);
  	setHeartBeat( false );
 +	setConsoleState(kConsoleStateUnknown);
  }
  BOOL LLFloaterPathfindingConsole::handleAnyMouseClick(S32 x, S32 y, MASK mask, EClickType clicktype, BOOL down)
 @@ -496,6 +516,7 @@ void LLFloaterPathfindingConsole::setCharacterType(ECharacterType pCharacterType  	mCharacterTypeRadioGroup->setValue(radioGroupValue);
  }
 +#if 0
  void LLFloaterPathfindingConsole::setHasNavMeshReceived()
  {
  	std::string str = getString("navmesh_fetch_complete_available");
 @@ -513,6 +534,7 @@ void LLFloaterPathfindingConsole::setHasNoNavMesh()  	std::string str = getString("navmesh_fetch_complete_none");
  	mPathfindingStatus->setText((LLStringExplicit)str);
  }
 +#endif
  LLFloaterPathfindingConsole::LLFloaterPathfindingConsole(const LLSD& pSeed)
  	: LLFloater(pSeed),
 @@ -527,6 +549,8 @@ LLFloaterPathfindingConsole::LLFloaterPathfindingConsole(const LLSD& pSeed)  	mPathfindingStatus(NULL),
  	mViewCharactersButton(NULL),
  	mEditTestTabContainer(NULL),
 +	mEditTab(NULL),
 +	mTestTab(NULL),
  	mUnfreezeLabel(NULL),
  	mUnfreezeButton(NULL),
  	mLinksetsLabel(NULL),
 @@ -537,38 +561,33 @@ LLFloaterPathfindingConsole::LLFloaterPathfindingConsole(const LLSD& pSeed)  	mCharacterTypeRadioGroup(NULL),
  	mPathTestingStatus(NULL),
  	mClearPathButton(NULL),
 +	mNavMeshSlot(),
  	mAgentStateSlot(),
 +	mConsoleState(kConsoleStateUnknown),
 +	mHasNavMesh(false),
 +	mNavMeshRegionVersion(0U),
 +	mNavMeshRegionUUID(),
 +#if 0
  	mNavMeshCnt(0),
 +	mNeighboringRegion( CURRENT_REGION ),
 +#endif
  	mHasStartPoint(false),
  	mHasEndPoint(false),
 -	mNeighboringRegion( CURRENT_REGION ),
  	mHeartBeat( false )
  {
  	mSelfHandle.bind(this);
 -
 +#if 0
  	for (int i=0;i<MAX_OBSERVERS;++i)
  	{
  		mNavMeshDownloadObserver[i].setPathfindingConsole(this);
  	}
 +#endif
  }
  LLFloaterPathfindingConsole::~LLFloaterPathfindingConsole()
  {
  }
 -std::string LLFloaterPathfindingConsole::getCurrentRegionCapabilityURL() const
 -{
 -	std::string capURL("");
 -
 -	LLViewerRegion *region = gAgent.getRegion();
 -	if (region != NULL)
 -	{
 -		capURL = region->getCapability("RetrieveNavMeshSrc");
 -	}
 -
 -	return capURL;
 -}
 -
  void LLFloaterPathfindingConsole::onShowWalkabilitySet()
  {
  	switch (getRenderHeatmapType())
 @@ -686,17 +705,76 @@ void LLFloaterPathfindingConsole::onClearPathClicked()  	updatePathTestStatus();
  }
 +void LLFloaterPathfindingConsole::onNavMeshDownloadCB(LLPathfindingNavMesh::ENavMeshRequestStatus pNavMeshRequestStatus, const LLUUID &pRegionUUID, U32 pNavMeshVersion, const LLSD::Binary &pNavMeshData)
 +{
 +
 +	switch (pNavMeshRequestStatus)
 +	{
 +	case LLPathfindingNavMesh::kNavMeshRequestStarted :
 +		setConsoleState(kConsoleStateDownloading);
 +		break;
 +	case LLPathfindingNavMesh::kNavMeshRequestCompleted :
 +		updateNavMesh(pRegionUUID, pNavMeshVersion, pNavMeshData);
 +		setConsoleState(kConsoleStateHasNavMesh);
 +		break;
 +	case LLPathfindingNavMesh::kNavMeshRequestNotEnabled :
 +		clearNavMesh();
 +		setConsoleState(kConsoleStateRegionNotEnabled);
 +		break;
 +	case LLPathfindingNavMesh::kNavMeshRequestMessageError :
 +		clearNavMesh();
 +		setConsoleState(kConsoleStateDownloadError);
 +		break;
 +	case LLPathfindingNavMesh::kNavMeshRequestFormatError :
 +		clearNavMesh();
 +		setConsoleState(kConsoleStateNavMeshError);
 +		break;
 +	case LLPathfindingNavMesh::kNavMeshRequestUnknown :
 +	default:
 +		clearNavMesh();
 +		setConsoleState(kConsoleStateUnknown);
 +		llassert(0);
 +		break;
 +	}
 +}
 +
 +void LLFloaterPathfindingConsole::updateNavMesh(const LLUUID &pRegionUUID, U32 pNavMeshVersion, const LLSD::Binary &pNavMeshData)
 +{
 +	if (!mHasNavMesh || (mNavMeshRegionUUID != pRegionUUID) || (mNavMeshRegionVersion != pNavMeshVersion))
 +	{
 +		llassert(!pNavMeshData.empty());
 +		mHasNavMesh = true;
 +		mNavMeshRegionUUID = pRegionUUID;
 +		mNavMeshRegionVersion = pNavMeshVersion;
 +		LLPathingLib::getInstance()->extractNavMeshSrcFromLLSD(pNavMeshData, CURRENT_REGION);
 +	}
 +}
 +
 +void LLFloaterPathfindingConsole::clearNavMesh()
 +{
 +	mHasNavMesh = false;
 +	LLPathingLib::getInstance()->cleanupResidual();
 +}
 +
  void LLFloaterPathfindingConsole::onAgentStateCB(LLPathfindingManager::EAgentState pAgentState)
  {
  	setAgentState(pAgentState);
  }
 -void LLFloaterPathfindingConsole::setAgentState(LLPathfindingManager::EAgentState pAgentState)
 +void LLFloaterPathfindingConsole::setConsoleState(EConsoleState pConsoleState)
 +{
 +	mConsoleState = pConsoleState;
 +	updateControlsOnConsoleState();
 +	updateStatusOnConsoleState();
 +}
 +
 +void LLFloaterPathfindingConsole::updateControlsOnConsoleState()
  {
 -	switch (pAgentState)
 +	switch (mConsoleState)
  	{
 -	case LLPathfindingManager::kAgentStateUnknown :
 -	case LLPathfindingManager::kAgentStateNotEnabled :
 +	case kConsoleStateUnknown :
 +	case kConsoleStateLibraryNotImplemented :
 +	case kConsoleStateRegionNotEnabled :
  		mShowNavMeshCheckBox->setEnabled(FALSE);
  		mShowNavMeshWalkabilityComboBox->setEnabled(FALSE);
  		mShowWalkablesCheckBox->setEnabled(FALSE);
 @@ -705,16 +783,35 @@ void LLFloaterPathfindingConsole::setAgentState(LLPathfindingManager::EAgentStat  		mShowExclusionVolumesCheckBox->setEnabled(FALSE);
  		mShowWorldCheckBox->setEnabled(FALSE);
  		mViewCharactersButton->setEnabled(FALSE);
 -		mEditTestTabContainer->setEnabled(FALSE);
 +		mEditTestTabContainer->selectTab(0);
 +		mTestTab->setEnabled(FALSE);
  		mCharacterWidthSlider->setEnabled(FALSE);
  		mCharacterTypeRadioGroup->setEnabled(FALSE);
  		mClearPathButton->setEnabled(FALSE);
 -
 +		mHasStartPoint = false;
 +		mHasEndPoint = false;
 +		break;
 +	case kConsoleStateDownloading :
 +	case kConsoleStateDownloadError :
 +	case kConsoleStateNavMeshError :
 +		mShowNavMeshCheckBox->setEnabled(FALSE);
 +		mShowNavMeshWalkabilityComboBox->setEnabled(FALSE);
 +		mShowWalkablesCheckBox->setEnabled(FALSE);
 +		mShowStaticObstaclesCheckBox->setEnabled(FALSE);
 +		mShowMaterialVolumesCheckBox->setEnabled(FALSE);
 +		mShowExclusionVolumesCheckBox->setEnabled(FALSE);
 +		mShowWorldCheckBox->setEnabled(FALSE);
 +		mViewCharactersButton->setEnabled(TRUE);
  		mEditTestTabContainer->selectTab(0);
 +		mTestTab->setEnabled(FALSE);
 +		mCharacterWidthSlider->setEnabled(FALSE);
 +		mCharacterTypeRadioGroup->setEnabled(FALSE);
 +		mClearPathButton->setEnabled(FALSE);
  		mHasStartPoint = false;
  		mHasEndPoint = false;
  		break;
 -	default :
 +	case kConsoleStateHasNavMesh :
 +	case kConsoleStateHasNavMeshDownloading :
  		mShowNavMeshCheckBox->setEnabled(TRUE);
  		mShowNavMeshWalkabilityComboBox->setEnabled(TRUE);
  		mShowWalkablesCheckBox->setEnabled(TRUE);
 @@ -723,17 +820,71 @@ void LLFloaterPathfindingConsole::setAgentState(LLPathfindingManager::EAgentStat  		mShowExclusionVolumesCheckBox->setEnabled(TRUE);
  		mShowWorldCheckBox->setEnabled(TRUE);
  		mViewCharactersButton->setEnabled(TRUE);
 -		mEditTestTabContainer->setEnabled(TRUE);
 +		mTestTab->setEnabled(TRUE);
  		mCharacterWidthSlider->setEnabled(TRUE);
  		mCharacterTypeRadioGroup->setEnabled(TRUE);
  		mClearPathButton->setEnabled(TRUE);
 +		mTestTab->setEnabled(TRUE);
 +		break;
 +	default :
 +		llassert(0);
  		break;
  	}
 +}
 +void LLFloaterPathfindingConsole::updateStatusOnConsoleState()
 +{
 +	static const LLColor4 warningColor = LLUIColorTable::instance().getColor("DrYellow");
 +
 +	std::string statusText("");
 +	LLStyle::Params styleParams;
 +
 +	switch (mConsoleState)
 +	{
 +	case kConsoleStateUnknown :
 +		statusText = getString("navmesh_status_unknown");
 +		break;
 +	case kConsoleStateLibraryNotImplemented :
 +		statusText = getString("navmesh_status_library_not_implemented");
 +		styleParams.color = warningColor;
 +		break;
 +	case kConsoleStateRegionNotEnabled :
 +		statusText = getString("navmesh_status_region_not_enabled");
 +		styleParams.color = warningColor;
 +		break;
 +	case kConsoleStateDownloading :
 +		statusText = getString("navmesh_status_downloading");
 +		break;
 +	case kConsoleStateHasNavMesh :
 +		statusText = getString("navmesh_status_has_navmesh");
 +		break;
 +	case kConsoleStateHasNavMeshDownloading :
 +		statusText = getString("navmesh_status_has_navmesh_downloading");
 +		break;
 +	case kConsoleStateDownloadError :
 +		statusText = getString("navmesh_status_download_error");
 +		styleParams.color = warningColor;
 +		break;
 +	case kConsoleStateNavMeshError :
 +		statusText = getString("navmesh_status_navmesh_error");
 +		styleParams.color = warningColor;
 +		break;
 +	default :
 +		statusText = getString("navmesh_status_unknown");
 +		llassert(0);
 +		break;
 +	}
 +
 +	mPathfindingStatus->setText((LLStringExplicit)statusText, styleParams);
 +}
 +
 +void LLFloaterPathfindingConsole::setAgentState(LLPathfindingManager::EAgentState pAgentState)
 +{
  	switch (LLPathfindingManager::getInstance()->getLastKnownNonErrorAgentState())
  	{
  	case LLPathfindingManager::kAgentStateUnknown :
  	case LLPathfindingManager::kAgentStateNotEnabled :
 +		mEditTab->setEnabled(FALSE);
  		mUnfreezeLabel->setEnabled(FALSE);
  		mUnfreezeButton->setEnabled(FALSE);
  		mLinksetsLabel->setEnabled(FALSE);
 @@ -742,6 +893,7 @@ void LLFloaterPathfindingConsole::setAgentState(LLPathfindingManager::EAgentStat  		mFreezeButton->setEnabled(FALSE);
  		break;
  	case LLPathfindingManager::kAgentStateFrozen :
 +		mEditTab->setEnabled(TRUE);
  		mUnfreezeLabel->setEnabled(TRUE);
  		mUnfreezeButton->setEnabled(TRUE);
  		mLinksetsLabel->setEnabled(FALSE);
 @@ -750,6 +902,7 @@ void LLFloaterPathfindingConsole::setAgentState(LLPathfindingManager::EAgentStat  		mFreezeButton->setEnabled(FALSE);
  		break;
  	case LLPathfindingManager::kAgentStateUnfrozen :
 +		mEditTab->setEnabled(TRUE);
  		mUnfreezeLabel->setEnabled(FALSE);
  		mUnfreezeButton->setEnabled(FALSE);
  		mLinksetsLabel->setEnabled(TRUE);
 @@ -803,36 +956,36 @@ void LLFloaterPathfindingConsole::updatePathTestStatus()  }
 -BOOL LLFloaterPathfindingConsole::isRenderAnyShapes() const -{ -	if ( isRenderWalkables() || isRenderStaticObstacles() || -		 isRenderMaterialVolumes() ||  isRenderExclusionVolumes() ) -	{ -		return true; -	} -	 -	return false; -} - -U32 LLFloaterPathfindingConsole::getRenderShapeFlags() -{ -	resetShapeRenderFlags(); - -	if ( isRenderWalkables() )			 -	{  -		setShapeRenderFlag( LLPathingLib::LLST_WalkableObjects );  -	} -	if ( isRenderStaticObstacles() )	 -	{  -		setShapeRenderFlag( LLPathingLib::LLST_ObstacleObjects );  -	} -	if ( isRenderMaterialVolumes() )	 -	{  -		setShapeRenderFlag( LLPathingLib::LLST_MaterialPhantoms );  -	} -	if ( isRenderExclusionVolumes() )	 -	{  -		setShapeRenderFlag( LLPathingLib::LLST_ExclusionPhantoms );  -	} -	return mShapeRenderFlags; -} +BOOL LLFloaterPathfindingConsole::isRenderAnyShapes() const
 +{
 +	if ( isRenderWalkables() || isRenderStaticObstacles() ||
 +		 isRenderMaterialVolumes() ||  isRenderExclusionVolumes() )
 +	{
 +		return true;
 +	}
 +	
 +	return false;
 +}
 +
 +U32 LLFloaterPathfindingConsole::getRenderShapeFlags()
 +{
 +	resetShapeRenderFlags();
 +
 +	if ( isRenderWalkables() )			
 +	{ 
 +		setShapeRenderFlag( LLPathingLib::LLST_WalkableObjects ); 
 +	}
 +	if ( isRenderStaticObstacles() )	
 +	{ 
 +		setShapeRenderFlag( LLPathingLib::LLST_ObstacleObjects ); 
 +	}
 +	if ( isRenderMaterialVolumes() )	
 +	{ 
 +		setShapeRenderFlag( LLPathingLib::LLST_MaterialPhantoms ); 
 +	}
 +	if ( isRenderExclusionVolumes() )	
 +	{ 
 +		setShapeRenderFlag( LLPathingLib::LLST_ExclusionPhantoms ); 
 +	}
 +	return mShapeRenderFlags;
 +}
 diff --git a/indra/newview/llfloaterpathfindingconsole.h b/indra/newview/llfloaterpathfindingconsole.h index 34a68ebed1..237d4216bb 100644 --- a/indra/newview/llfloaterpathfindingconsole.h +++ b/indra/newview/llfloaterpathfindingconsole.h @@ -30,11 +30,12 @@  #include "llfloater.h"  #include "llhandle.h" -#include "llnavmeshstation.h"  #include "LLPathingLib.h"  #include "llpathfindingmanager.h" +#include "llpathfindingnavmesh.h"  class LLSD; +class LLPanel;  class LLRadioGroup;  class LLSliderCtrl;  class LLLineEditor; @@ -108,22 +109,29 @@ public:      ECharacterType getCharacterType() const;      void           setCharacterType(ECharacterType pCharacterType); -	void setHasNavMeshReceived(); -	void setHasNoNavMesh(); -  	bool getHeartBeat() const { return mHeartBeat;}  	void setHeartBeat( bool state ) { mHeartBeat=state; }  protected:  private: +	typedef enum +	{ +		kConsoleStateUnknown, +		kConsoleStateLibraryNotImplemented, +		kConsoleStateRegionNotEnabled, +		kConsoleStateDownloading, +		kConsoleStateHasNavMesh, +		kConsoleStateHasNavMeshDownloading, +		kConsoleStateDownloadError, +		kConsoleStateNavMeshError +	} EConsoleState; +  	// Does its own instance management, so clients not allowed  	// to allocate or destroy.  	LLFloaterPathfindingConsole(const LLSD& pSeed);  	virtual ~LLFloaterPathfindingConsole(); -	std::string getCurrentRegionCapabilityURL() const; -  	void onShowWalkabilitySet();  	void onShowWorldToggle();  	void onCharacterWidthSet(); @@ -133,8 +141,16 @@ private:  	void onFreezeClicked();  	void onViewEditLinksetClicked();  	void onClearPathClicked(); +	void onNavMeshDownloadCB(LLPathfindingNavMesh::ENavMeshRequestStatus pNavMeshRequestStatus, const LLUUID &pRegionUUID, U32 pNavMeshVersion, const LLSD::Binary &pNavMeshData);  	void onAgentStateCB(LLPathfindingManager::EAgentState pAgentState); +	void setConsoleState(EConsoleState pConsoleState); +	void updateNavMesh(const LLUUID &pRegionUUID, U32 pNavMeshVersion, const LLSD::Binary &pNavMeshData); +	void clearNavMesh(); + +	void updateControlsOnConsoleState(); +	void updateStatusOnConsoleState(); +  	void setAgentState(LLPathfindingManager::EAgentState pAgentState);  	void generatePath(); @@ -153,6 +169,8 @@ private:  	LLTextBase                                *mPathfindingStatus;  	LLButton                                  *mViewCharactersButton;  	LLTabContainer                            *mEditTestTabContainer; +	LLPanel                                   *mEditTab; +	LLPanel                                   *mTestTab;  	LLTextBase                                *mUnfreezeLabel;  	LLButton                                  *mUnfreezeButton;  	LLTextBase                                *mLinksetsLabel; @@ -163,12 +181,19 @@ private:  	LLRadioGroup                              *mCharacterTypeRadioGroup;  	LLTextBase                                *mPathTestingStatus;  	LLButton                                  *mClearPathButton; +	LLPathfindingNavMesh::navmesh_slot_t      mNavMeshSlot;  	LLPathfindingManager::agent_state_slot_t  mAgentStateSlot; +	EConsoleState                             mConsoleState; +	bool                                      mHasNavMesh; +	U32                                       mNavMeshRegionVersion; +	LLUUID                                    mNavMeshRegionUUID; +#if 0  	LLNavMeshDownloadObserver	mNavMeshDownloadObserver[10];  	int							mCurrentMDO;  	int							mNavMeshCnt;  	U32							mNeighboringRegion; +#endif  	//Container that is populated and subsequently submitted to the LLPathingSystem for processing  	LLPathingLib::PathingPacket		mPathData;  	bool							mHasStartPoint; diff --git a/indra/newview/llfloaterpathfindinglinksets.cpp b/indra/newview/llfloaterpathfindinglinksets.cpp index 27047b4fd9..8c4bbea128 100644 --- a/indra/newview/llfloaterpathfindinglinksets.cpp +++ b/indra/newview/llfloaterpathfindinglinksets.cpp @@ -211,7 +211,7 @@ void LLFloaterPathfindingLinksets::onOpen(const LLSD& pKey)  	if (!mAgentStateSlot.connected())
  	{
 -		LLPathfindingManager::getInstance()->registerAgentStateSignal(boost::bind(&LLFloaterPathfindingLinksets::onAgentStateCB, this, _1));
 +		LLPathfindingManager::getInstance()->registerAgentStateListener(boost::bind(&LLFloaterPathfindingLinksets::onAgentStateCB, this, _1));
  	}
  	if (!mSelectionUpdateSlot.connected())
 diff --git a/indra/newview/llnavmeshstation.cpp b/indra/newview/llnavmeshstation.cpp deleted file mode 100644 index 54a945e562..0000000000 --- a/indra/newview/llnavmeshstation.cpp +++ /dev/null @@ -1,134 +0,0 @@ -/**  - * @file llnavmeshstation.cpp - * @brief  - * - * $LicenseInfo:firstyear=2005&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -#include "llviewerprecompiledheaders.h" -#include "llnavmeshstation.h" -#include "llcurl.h" -#include "LLPathingLib.h" -#include "llagent.h" -#include "llviewerregion.h" -#include "llsdutil.h" -#include "llfloaterpathfindingconsole.h" -#include "llsdserialize.h" -//=============================================================================== -LLNavMeshStation::LLNavMeshStation() -{ -} -//=============================================================================== -class LLNavMeshDownloadResponder : public LLCurl::Responder -{ -public: -	LLNavMeshDownloadResponder( const LLHandle<LLNavMeshDownloadObserver>& observer_handle, int dir ) -	:  mObserverHandle( observer_handle ) -	,  mDir( dir ) -	{ -	} - -	void error( U32 statusNum, const std::string& reason ) -	{	 -		llwarns	<< "Transport error "<<reason<<llendl;			 -	} -	 -	void result( const LLSD& content ) -	{		 -		llinfos<<"Content received"<<llendl; -		if ( content.has("error") ) -		{ -			llwarns	<< "Error on fetched data"<< llendl; -			//llinfos<<"LLsd buffer on error"<<ll_pretty_print_sd(content)<<llendl; -		} -		else  -		{ -			LLNavMeshDownloadObserver* pObserver = mObserverHandle.get(); -			if ( pObserver ) -			{				 -				if ( content.has("navmesh_data") ) -				{ -					const std::vector<U8>& value = content["navmesh_data"].asBinary();
 -					unsigned int binSize = value.size();
 -					U8* pBinBuffer = new U8[binSize];
 -					memcpy( &pBinBuffer[0], &value[0], binSize );
 -					std::string newStr((char*) pBinBuffer, binSize );
 -                    std::istringstream streamdecomp( newStr );                 
 -					unsigned int decompBinSize = 0;
 -					bool valid = false;
 -					if ( pBinBuffer ) 
 -					{
 -						delete [] pBinBuffer ;
 -					}
 -					U8* pUncompressedNavMeshContainer = unzip_llsdNavMesh( valid, decompBinSize, streamdecomp, binSize ) ;
 -					if ( !valid )
 -                    {
 -						if ( pUncompressedNavMeshContainer )
 -						{
 -							free( pUncompressedNavMeshContainer );
 -						}
 -                        llwarns << "Unable to decompress the navmesh llsd." << llendl;
 -						pObserver->getPathfindingConsole()->setHasNoNavMesh();
 -                        return;
 -                    }
 -                    else
 -                    {                    
 -						if ( pUncompressedNavMeshContainer )
 -						{
 -							std::vector<U8> lsd;
 -							lsd.resize( decompBinSize );
 -							memcpy( &lsd[0], &pUncompressedNavMeshContainer[0], decompBinSize );
 -							LLPathingLib::getInstance()->extractNavMeshSrcFromLLSD( lsd, mDir );
 -							pObserver->getPathfindingConsole()->setHasNavMeshReceived();
 -							free( pUncompressedNavMeshContainer );
 -						}
 -                    }					 -				} -				else -				{ -					llwarns<<"No mesh data received"<<llendl; -					pObserver->getPathfindingConsole()->setHasNoNavMesh(); -				} -			} -		}	 -}		 -private: -	//Observer handle -	LLHandle<LLNavMeshDownloadObserver> mObserverHandle; -	int mDir; -}; -//=============================================================================== -void LLNavMeshStation::downloadNavMeshSrc( const LLHandle<LLNavMeshDownloadObserver>& observerHandle, int dir )  -{	 -	if ( mNavMeshDownloadURL.empty() ) -	{ -		llinfos << "Unable to upload navmesh because of missing URL" << llendl; -	} -	else -	{		 -		LLSD data; -		data["agent_id"]  = gAgent.getID(); -		data["region_id"] = gAgent.getRegion()->getRegionID(); -		LLHTTPClient::post(mNavMeshDownloadURL, data, new LLNavMeshDownloadResponder( observerHandle, dir ) ); -	} -} -//=============================================================================== diff --git a/indra/newview/llnavmeshstation.h b/indra/newview/llnavmeshstation.h deleted file mode 100644 index 72bf725688..0000000000 --- a/indra/newview/llnavmeshstation.h +++ /dev/null @@ -1,101 +0,0 @@ -/**  - * @file llnavmeshstation.h - * @brief Client-side navmesh support - * - * $LicenseInfo:firstyear=2001&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -#ifndef LL_NAV_MESH_STATION_H -#define LL_NAV_MESH_STATION_H - -//=============================================================================== -#include "llhandle.h" -//=============================================================================== -class LLCurlRequest; -class LLFloaterPathfindingConsole; -//=============================================================================== -class LLNavMeshObserver -{ -public: -	//Ctor -	LLNavMeshObserver() -		: mPathfindingConsole(NULL) -	{ mObserverHandle.bind(this); } -	//Dtor -	virtual ~LLNavMeshObserver() {} -	//Accessor for the observers handle -	const LLHandle<LLNavMeshObserver>& getObserverHandle() const { return mObserverHandle; } -	LLFloaterPathfindingConsole *getPathfindingConsole() {return mPathfindingConsole;} -	void                        setPathfindingConsole(LLFloaterPathfindingConsole *pPathfindingConsole) {mPathfindingConsole = pPathfindingConsole;} - -protected: -	LLRootHandle<LLNavMeshObserver> mObserverHandle;	 -	LLFloaterPathfindingConsole     *mPathfindingConsole; -}; -//=============================================================================== -class LLNavMeshDownloadObserver -{ -public: -	//Ctor -	LLNavMeshDownloadObserver() { mObserverHandle.bind(this); } -	//Dtor -	virtual ~LLNavMeshDownloadObserver() {} -	//Accessor for the observers handle -	const LLHandle<LLNavMeshDownloadObserver>& getObserverHandle() const { return mObserverHandle; } -	LLFloaterPathfindingConsole *getPathfindingConsole() {return mPathfindingConsole;} -	void                        setPathfindingConsole(LLFloaterPathfindingConsole *pPathfindingConsole) {mPathfindingConsole = pPathfindingConsole;} - -protected: -	LLRootHandle<LLNavMeshDownloadObserver> mObserverHandle;	 -	LLFloaterPathfindingConsole *mPathfindingConsole; -}; -//=============================================================================== -class LLNavMeshStation : public LLSingleton<LLNavMeshStation> -{ -public: -	//Ctor -	LLNavMeshStation(); -	//Facilitates the posting of a prepopulated llsd block to an existing url -	bool postNavMeshToServer( LLSD& data, const LLHandle<LLNavMeshObserver>& observerHandle ); -	//Setter for the navmesh upload url -	void setNavMeshUploadURL( std::string& url ) { mNavMeshUploadURL = url; } -	//Setter for the navmesh download url -	void setNavMeshDownloadURL( std::string& url ) { mNavMeshDownloadURL = url; } -	//Callback to handle the requested src data for this regions navmesh src -	static void processNavMeshSrc( LLMessageSystem* msg, void** ); -	//Initiate download of the navmesh source from the server -	void downloadNavMeshSrc( const LLHandle<LLNavMeshDownloadObserver>& observerHandle, int dir ); - -protected:	 -	//Curl object to facilitate posts to server -	LLCurlRequest*	mCurlRequest; -	//Maximum time in seconds to execute an uploading request. -	S32				mMeshUploadTimeOut ;  -	//URL used for uploading viewer generated navmesh -	std::string		mNavMeshUploadURL; -	//URL used for download the src data for a navmesh -	std::string		mNavMeshDownloadURL; - -}; -//=============================================================================== -#endif  //LL_NAV_MESH_STATION_H - diff --git a/indra/newview/llpathfindingmanager.cpp b/indra/newview/llpathfindingmanager.cpp index 5c9293a28a..9a36923bd5 100644 --- a/indra/newview/llpathfindingmanager.cpp +++ b/indra/newview/llpathfindingmanager.cpp @@ -33,6 +33,7 @@  #include "llhttpclient.h"
  #include "llagent.h"
  #include "llviewerregion.h"
 +#include "llpathfindingnavmesh.h"
  #include "llpathfindinglinkset.h"
  #include "llpathfindinglinksetlist.h"
 @@ -48,6 +49,27 @@  #define CAP_SERVICE_TERRAIN_LINKSETS  "TerrainNavMeshProperties"
  //---------------------------------------------------------------------------
 +// NavMeshResponder
 +//---------------------------------------------------------------------------
 +
 +class NavMeshResponder : public LLHTTPClient::Responder
 +{
 +public:
 +	NavMeshResponder(const std::string &pCapabilityURL, U32 pNavMeshVersion, LLPathfindingNavMeshPtr pNavMeshPtr);
 +	virtual ~NavMeshResponder();
 +
 +	virtual void result(const LLSD &pContent);
 +	virtual void error(U32 pStatus, const std::string& pReason);
 +
 +protected:
 +
 +private:
 +	std::string             mCapabilityURL;
 +	U32                     mNavMeshVersion;
 +	LLPathfindingNavMeshPtr mNavMeshPtr;
 +};
 +
 +//---------------------------------------------------------------------------
  // AgentStateResponder
  //---------------------------------------------------------------------------
 @@ -152,6 +174,8 @@ private:  LLPathfindingManager::LLPathfindingManager()
  	: LLSingleton<LLPathfindingManager>(),
 +	mNavMeshMap(),
 +	mNavMeshVersionXXX(0),
  	mAgentStateSignal(),
  	mAgentState(kAgentStateUnknown),
  	mLastKnownNonErrorAgentState(kAgentStateUnknown)
 @@ -179,7 +203,49 @@ bool LLPathfindingManager::isAllowViewTerrainProperties() const  	return (gAgent.isGodlike() || ((region != NULL) && region->canManageEstate()));
  }
 -LLPathfindingManager::agent_state_slot_t LLPathfindingManager::registerAgentStateSignal(agent_state_callback_t pAgentStateCallback)
 +LLPathfindingNavMesh::navmesh_slot_t LLPathfindingManager::registerNavMeshListenerForCurrentRegion(LLPathfindingNavMesh::navmesh_callback_t pNavMeshCallback)
 +{
 +	LLPathfindingNavMeshPtr navMeshPtr = getNavMeshForCurrentRegion();
 +	return navMeshPtr->registerNavMeshListener(pNavMeshCallback);
 +}
 +
 +void LLPathfindingManager::requestGetNavMeshForCurrentRegion()
 +{
 +	LLPathfindingNavMeshPtr navMeshPtr = getNavMeshForCurrentRegion();
 +
 +	if (navMeshPtr->hasNavMeshVersion(mNavMeshVersionXXX))
 +	{
 +		navMeshPtr->handleRefresh();
 +	}
 +	else
 +	{
 +		LLViewerRegion *region = getCurrentRegion();
 +		if (region == NULL)
 +		{
 +			navMeshPtr->handleNavMeshNotEnabled();
 +		}
 +		else
 +		{
 +			std::string navMeshURL = getRetrieveNavMeshURLForCurrentRegion();
 +			if (navMeshURL.empty())
 +			{
 +				navMeshPtr->handleNavMeshNotEnabled();
 +			}
 +			else
 +			{
 +				navMeshPtr->handleNavMeshStart(mNavMeshVersionXXX);
 +				LLHTTPClient::ResponderPtr responder = new NavMeshResponder(navMeshURL, mNavMeshVersionXXX, navMeshPtr);
 +
 +				LLSD postData;
 +				postData["agent_id"] = gAgent.getID();
 +				postData["region_id"] = region->getRegionID();
 +				LLHTTPClient::post(navMeshURL, postData, responder);
 +			}
 +		}
 +	}
 +}
 +
 +LLPathfindingManager::agent_state_slot_t LLPathfindingManager::registerAgentStateListener(agent_state_callback_t pAgentStateCallback)
  {
  	return mAgentStateSignal.connect(pAgentStateCallback);
  }
 @@ -301,6 +367,31 @@ LLPathfindingManager::ELinksetsRequestStatus LLPathfindingManager::requestSetLin  	return status;
  }
 +LLPathfindingNavMeshPtr LLPathfindingManager::getNavMeshForCurrentRegion()
 +{
 +
 +	LLUUID regionUUID;
 +	LLViewerRegion *region = getCurrentRegion();
 +	if (region != NULL)
 +	{
 +		regionUUID = region->getRegionID();
 +	}
 +
 +	LLPathfindingNavMeshPtr navMeshPtr;
 +	NavMeshMap::iterator navMeshIter = mNavMeshMap.find(regionUUID);
 +	if (navMeshIter == mNavMeshMap.end())
 +	{
 +		navMeshPtr = LLPathfindingNavMeshPtr(new LLPathfindingNavMesh(regionUUID));
 +		mNavMeshMap.insert(std::pair<LLUUID, LLPathfindingNavMeshPtr>(regionUUID, navMeshPtr));
 +	}
 +	else
 +	{
 +		navMeshPtr = navMeshIter->second;
 +	}
 +
 +	return navMeshPtr;
 +}
 +
  bool LLPathfindingManager::isValidAgentState(EAgentState pAgentState)
  {
  	return ((pAgentState == kAgentStateFrozen) || (pAgentState == kAgentStateUnfrozen));
 @@ -399,6 +490,31 @@ LLViewerRegion *LLPathfindingManager::getCurrentRegion() const  }
  //---------------------------------------------------------------------------
 +// NavMeshResponder
 +//---------------------------------------------------------------------------
 +
 +NavMeshResponder::NavMeshResponder(const std::string &pCapabilityURL, U32 pNavMeshVersion, LLPathfindingNavMeshPtr pNavMeshPtr)
 +	: mCapabilityURL(pCapabilityURL),
 +	mNavMeshVersion(pNavMeshVersion),
 +	mNavMeshPtr(pNavMeshPtr)
 +{
 +}
 +
 +NavMeshResponder::~NavMeshResponder()
 +{
 +}
 +
 +void NavMeshResponder::result(const LLSD &pContent)
 +{
 +	mNavMeshPtr->handleNavMeshResult(pContent, mNavMeshVersion);
 +}
 +
 +void NavMeshResponder::error(U32 pStatus, const std::string& pReason)
 +{
 +	mNavMeshPtr->handleNavMeshError(pStatus, pReason, mCapabilityURL, mNavMeshVersion);
 +}
 +
 +//---------------------------------------------------------------------------
  // AgentStateResponder
  //---------------------------------------------------------------------------
 diff --git a/indra/newview/llpathfindingmanager.h b/indra/newview/llpathfindingmanager.h index 9a6bbb81b9..f034ddb9ea 100644 --- a/indra/newview/llpathfindingmanager.h +++ b/indra/newview/llpathfindingmanager.h @@ -28,15 +28,18 @@  #ifndef LL_LLPATHFINDINGMANAGER_H
  #define LL_LLPATHFINDINGMANAGER_H
 +#include "llsingleton.h"
 +#include "lluuid.h"
 +#include "llpathfindingnavmesh.h"
 +#include "llpathfindinglinkset.h"
 +#include "llpathfindinglinksetlist.h"
 +
  #include <string>
 +#include <map>
  #include <boost/function.hpp>
  #include <boost/signals2.hpp>
 -#include "llsingleton.h"
 -#include "llpathfindinglinkset.h"
 -#include "llpathfindinglinksetlist.h"
 -
  class LLFloater;
  class LLViewerRegion;
 @@ -44,6 +47,8 @@ class LLPathfindingManager : public LLSingleton<LLPathfindingManager>  {
  	friend class AgentStateResponder;
  public:
 +	typedef std::map<LLUUID, LLPathfindingNavMeshPtr> NavMeshMap;
 +
  	typedef enum {
  		kAgentStateUnknown,
  		kAgentStateFrozen,
 @@ -73,7 +78,10 @@ public:  	bool isAllowAlterPermanent();
  	bool isAllowViewTerrainProperties() const;
 -	agent_state_slot_t registerAgentStateSignal(agent_state_callback_t pAgentStateCallback);
 +	LLPathfindingNavMesh::navmesh_slot_t registerNavMeshListenerForCurrentRegion(LLPathfindingNavMesh::navmesh_callback_t pNavMeshCallback);
 +	void requestGetNavMeshForCurrentRegion();
 +
 +	agent_state_slot_t registerAgentStateListener(agent_state_callback_t pAgentStateCallback);
  	EAgentState        getAgentState();
  	EAgentState        getLastKnownNonErrorAgentState() const;
  	void               requestSetAgentState(EAgentState pAgentState);
 @@ -84,6 +92,8 @@ public:  protected:
  private:
 +	LLPathfindingNavMeshPtr getNavMeshForCurrentRegion();
 +
  	static bool isValidAgentState(EAgentState pAgentState);
  	void requestGetAgentState();
 @@ -96,9 +106,12 @@ private:  	std::string getObjectLinksetsURLForCurrentRegion() const;
  	std::string getTerrainLinksetsURLForCurrentRegion() const;
 -	std::string getCapabilityURLForCurrentRegion(const std::string &pCapabilityName) const;
 +	std::string    getCapabilityURLForCurrentRegion(const std::string &pCapabilityName) const;
  	LLViewerRegion *getCurrentRegion() const;
 +	NavMeshMap           mNavMeshMap;
 +	U32                  mNavMeshVersionXXX; // XXX stinson 03/02/2012 : a hacky way of doing versions for now
 +
  	agent_state_signal_t mAgentStateSignal;
  	EAgentState          mAgentState;
  	EAgentState          mLastKnownNonErrorAgentState;
 diff --git a/indra/newview/llpathfindingnavmesh.cpp b/indra/newview/llpathfindingnavmesh.cpp new file mode 100644 index 0000000000..fd1a498e3b --- /dev/null +++ b/indra/newview/llpathfindingnavmesh.cpp @@ -0,0 +1,133 @@ +/** 
 + * @file llpathfindingnavmesh.cpp
 + * @author William Todd Stinson
 + * @brief A class for representing the navmesh of a pathfinding region.
 + *
 + * $LicenseInfo:firstyear=2002&license=viewerlgpl$
 + * Second Life Viewer Source Code
 + * Copyright (C) 2010, Linden Research, Inc.
 + * 
 + * This library is free software; you can redistribute it and/or
 + * modify it under the terms of the GNU Lesser General Public
 + * License as published by the Free Software Foundation;
 + * version 2.1 of the License only.
 + * 
 + * This library is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 + * Lesser General Public License for more details.
 + * 
 + * You should have received a copy of the GNU Lesser General Public
 + * License along with this library; if not, write to the Free Software
 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 + * 
 + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
 + * $/LicenseInfo$
 + */
 +
 +#include "llviewerprecompiledheaders.h"
 +#include "lluuid.h"
 +#include "llpathfindingnavmesh.h"
 +#include "llsdserialize.h"
 +
 +#include <string>
 +
 +//---------------------------------------------------------------------------
 +// LLPathfindingNavMesh
 +//---------------------------------------------------------------------------
 +
 +LLPathfindingNavMesh::LLPathfindingNavMesh(const LLUUID &pRegionUUID)
 +	: mRegionUUID(pRegionUUID),
 +	mNavMeshRequestStatus(kNavMeshRequestUnknown),
 +	mNavMeshSignal(),
 +	mNavMeshData(),
 +	mNavMeshVersion(0U)
 +{
 +}
 +
 +LLPathfindingNavMesh::~LLPathfindingNavMesh()
 +{
 +}
 +
 +LLPathfindingNavMesh::navmesh_slot_t LLPathfindingNavMesh::registerNavMeshListener(navmesh_callback_t pNavMeshCallback)
 +{
 +	return mNavMeshSignal.connect(pNavMeshCallback);
 +}
 +
 +bool LLPathfindingNavMesh::hasNavMeshVersion(U32 pNavMeshVersion) const
 +{
 +	return (((mNavMeshRequestStatus == kNavMeshRequestStarted) || (mNavMeshRequestStatus == kNavMeshRequestCompleted)) && (mNavMeshVersion == pNavMeshVersion));
 +}
 +
 +void LLPathfindingNavMesh::handleRefresh()
 +{
 +	mNavMeshSignal(mNavMeshRequestStatus, mRegionUUID, mNavMeshVersion, mNavMeshData);
 +}
 +
 +void LLPathfindingNavMesh::handleNavMeshStart(U32 pNavMeshVersion)
 +{
 +	mNavMeshVersion = pNavMeshVersion;
 +	setRequestStatus(kNavMeshRequestStarted);
 +}
 +
 +void LLPathfindingNavMesh::handleNavMeshResult(const LLSD &pContent, U32 pNavMeshVersion)
 +{
 +	llassert(mNavMeshVersion == pNavMeshVersion);
 +	if (mNavMeshVersion == pNavMeshVersion)
 +	{
 +		if ( pContent.has("navmesh_data") )
 +		{
 +			const LLSD::Binary &value = pContent["navmesh_data"].asBinary();
 +			unsigned int binSize = value.size();
 +			std::string newStr(reinterpret_cast<const char *>(&value[0]), binSize);
 +			std::istringstream streamdecomp( newStr );                 
 +			unsigned int decompBinSize = 0;
 +			bool valid = false;
 +			U8* pUncompressedNavMeshContainer = unzip_llsdNavMesh( valid, decompBinSize, streamdecomp, binSize ) ;
 +			if ( !valid )
 +			{
 +				llwarns << "Unable to decompress the navmesh llsd." << llendl;
 +				setRequestStatus(kNavMeshRequestFormatError);
 +			}
 +			else
 +			{
 +				llassert(pUncompressedNavMeshContainer);
 +				mNavMeshData.resize( decompBinSize );
 +				memcpy( &mNavMeshData[0], &pUncompressedNavMeshContainer[0], decompBinSize );
 +				setRequestStatus(kNavMeshRequestCompleted);
 +			}					
 +			if ( pUncompressedNavMeshContainer )
 +			{
 +				free( pUncompressedNavMeshContainer );
 +			}
 +		}
 +		else
 +		{
 +			llwarns << "No mesh data received" << llendl;
 +			setRequestStatus(kNavMeshRequestMessageError);
 +		}
 +	}
 +}
 +
 +void LLPathfindingNavMesh::handleNavMeshNotEnabled()
 +{
 +	mNavMeshData.clear();
 +	setRequestStatus(kNavMeshRequestNotEnabled);
 +}
 +
 +void LLPathfindingNavMesh::handleNavMeshError(U32 pStatus, const std::string &pReason, const std::string &pURL, U32 pNavMeshVersion)
 +{
 +	llwarns << "error with request to URL '" << pURL << "' because " << pReason << " (statusCode:" << pStatus << ")" << llendl;
 +	llassert(mNavMeshVersion == pNavMeshVersion);
 +	mNavMeshData.clear();
 +	if (mNavMeshVersion == pNavMeshVersion)
 +	{
 +		setRequestStatus(kNavMeshRequestMessageError);
 +	}
 +}
 +
 +void LLPathfindingNavMesh::setRequestStatus(ENavMeshRequestStatus pNavMeshRequestStatus)
 +{
 +	mNavMeshRequestStatus = pNavMeshRequestStatus;
 +	mNavMeshSignal(mNavMeshRequestStatus, mRegionUUID, mNavMeshVersion, mNavMeshData);
 +}
 diff --git a/indra/newview/llpathfindingnavmesh.h b/indra/newview/llpathfindingnavmesh.h new file mode 100644 index 0000000000..1f033e15c7 --- /dev/null +++ b/indra/newview/llpathfindingnavmesh.h @@ -0,0 +1,86 @@ +/** 
 + * @file llpathfindingnavmesh.h
 + * @author William Todd Stinson
 + * @brief A class for representing the navmesh of a pathfinding region.
 + *
 + * $LicenseInfo:firstyear=2002&license=viewerlgpl$
 + * Second Life Viewer Source Code
 + * Copyright (C) 2010, Linden Research, Inc. 
 + * 
 + * This library is free software; you can redistribute it and/or
 + * modify it under the terms of the GNU Lesser General Public
 + * License as published by the Free Software Foundation;
 + * version 2.1 of the License only.
 + * 
 + * This library is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 + * Lesser General Public License for more details.
 + * 
 + * You should have received a copy of the GNU Lesser General Public
 + * License along with this library; if not, write to the Free Software
 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 + * 
 + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
 + * $/LicenseInfo$
 + */
 +
 +#ifndef LL_LLPATHFINDINGNAVMESH_H
 +#define LL_LLPATHFINDINGNAVMESH_H
 +
 +#include "llsd.h"
 +#include "lluuid.h"
 +
 +#include <string>
 +
 +#include <boost/shared_ptr.hpp>
 +#include <boost/function.hpp>
 +#include <boost/signals2.hpp>
 +
 +class LLSD;
 +class LLPathfindingNavMesh;
 +
 +typedef boost::shared_ptr<LLPathfindingNavMesh> LLPathfindingNavMeshPtr;
 +
 +class LLPathfindingNavMesh
 +{
 +public:
 +	typedef enum {
 +		kNavMeshRequestUnknown,
 +		kNavMeshRequestStarted,
 +		kNavMeshRequestCompleted,
 +		kNavMeshRequestNotEnabled,
 +		kNavMeshRequestMessageError,
 +		kNavMeshRequestFormatError
 +	} ENavMeshRequestStatus;
 +
 +	typedef boost::function<void (ENavMeshRequestStatus, const LLUUID &, U32, const LLSD::Binary &)>         navmesh_callback_t;
 +	typedef boost::signals2::signal<void (ENavMeshRequestStatus, const LLUUID &, U32, const LLSD::Binary &)> navmesh_signal_t;
 +	typedef boost::signals2::connection                                                                      navmesh_slot_t;
 +
 +	LLPathfindingNavMesh(const LLUUID &pRegionUUID);
 +	virtual ~LLPathfindingNavMesh();
 +
 +	navmesh_slot_t registerNavMeshListener(navmesh_callback_t pNavMeshCallback);
 +
 +	bool hasNavMeshVersion(U32 pNavMeshVersion) const;
 +
 +	void handleRefresh();
 +	void handleNavMeshStart(U32 pNavMeshVersion);
 +	void handleNavMeshResult(const LLSD &pContent, U32 pNavMeshVersion);
 +	void handleNavMeshNotEnabled();
 +	void handleNavMeshError(U32 pStatus, const std::string &pReason, const std::string &pURL, U32 pNavMeshVersion);
 +
 +protected:
 +
 +private:
 +	void setRequestStatus(ENavMeshRequestStatus pNavMeshRequestStatus);
 +
 +	LLUUID                mRegionUUID;
 +	ENavMeshRequestStatus mNavMeshRequestStatus;
 +	navmesh_signal_t      mNavMeshSignal;
 +	LLSD::Binary          mNavMeshData;
 +	U32                   mNavMeshVersion;
 +};
 +
 +#endif // LL_LLPATHFINDINGNAVMESH_H
 diff --git a/indra/newview/skins/default/xui/en/floater_pathfinding_console.xml b/indra/newview/skins/default/xui/en/floater_pathfinding_console.xml index b608e513d5..5577083303 100644 --- a/indra/newview/skins/default/xui/en/floater_pathfinding_console.xml +++ b/indra/newview/skins/default/xui/en/floater_pathfinding_console.xml @@ -11,12 +11,14 @@      single_instance="true"      title="Pathfinding edit / test"      width="456"> -  <floater.string name="navmesh_fetch_initial"></floater.string> -  <floater.string name="navmesh_fetch_inprogress">Downloading the navmesh ...</floater.string> -  <floater.string name="navmesh_fetch_complete_available">Navmesh received.</floater.string> -  <floater.string name="navmesh_fetch_complete_none">No navmesh for region.</floater.string> -  <floater.string name="navmesh_region_not_enabled">This region is not enabled for pathfinding.</floater.string> -  <floater.string name="navmesh_library_not_implemented">Cannot find pathing library implementation.</floater.string> +  <floater.string name="navmesh_status_unknown"></floater.string> +  <floater.string name="navmesh_status_library_not_implemented">Cannot find pathing library implementation.</floater.string> +  <floater.string name="navmesh_status_region_not_enabled">This region is not enabled for pathfinding.</floater.string> +  <floater.string name="navmesh_status_downloading">Downloading the navmesh ...</floater.string> +  <floater.string name="navmesh_status_has_navmesh">Navmesh received.</floater.string> +  <floater.string name="navmesh_status_has_navmesh_downloading">Downloading the latest navmesh ...</floater.string> +  <floater.string name="navmesh_status_download_error">Unable to download navmesh successfully.</floater.string> +  <floater.string name="navmesh_status_navmesh_error">Unable to understand data format of the navmesh.</floater.string>    <floater.string name="pathing_choose_start_and_end_points">Please choose start and end points.</floater.string>    <floater.string name="pathing_choose_start_point">Please choose start point.</floater.string>    <floater.string name="pathing_choose_end_point">Please choose end point.</floater.string> | 
