PATH-302: Adding in status reporting for the simulator navmesh status. Separating the viewer status messaging from the simulator status.

master
Todd Stinson 2012-03-14 14:09:36 -07:00
parent e1aac37181
commit d4fb7c99fe
11 changed files with 405 additions and 129 deletions

View File

@ -129,8 +129,11 @@ BOOL LLFloaterPathfindingConsole::postBuild()
llassert(mFreezeButton != NULL);
mFreezeButton->setCommitCallback(boost::bind(&LLFloaterPathfindingConsole::onFreezeClicked, this));
mPathfindingStatus = findChild<LLTextBase>("pathfinding_status");
llassert(mPathfindingStatus != NULL);
mPathfindingViewerStatus = findChild<LLTextBase>("pathfinding_viewer_status");
llassert(mPathfindingViewerStatus != NULL);
mPathfindingSimulatorStatus = findChild<LLTextBase>("pathfinding_simulator_status");
llassert(mPathfindingSimulatorStatus != NULL);
mCharacterWidthSlider = findChild<LLSliderCtrl>("character_width");
llassert(mCharacterWidthSlider != NULL);
@ -469,7 +472,8 @@ LLFloaterPathfindingConsole::LLFloaterPathfindingConsole(const LLSD& pSeed)
mShowMaterialVolumesCheckBox(NULL),
mShowExclusionVolumesCheckBox(NULL),
mShowWorldCheckBox(NULL),
mPathfindingStatus(NULL),
mPathfindingViewerStatus(NULL),
mPathfindingSimulatorStatus(NULL),
mViewCharactersButton(NULL),
mEditTestTabContainer(NULL),
mEditTab(NULL),
@ -731,50 +735,126 @@ void LLFloaterPathfindingConsole::updateStatusOnConsoleState()
{
static const LLColor4 warningColor = LLUIColorTable::instance().getColor("DrYellow");
std::string statusText("");
LLStyle::Params styleParams;
std::string simulatorStatusText("");
std::string viewerStatusText("");
LLStyle::Params viewerStyleParams;
switch (mConsoleState)
{
case kConsoleStateUnknown :
statusText = getString("navmesh_status_unknown");
simulatorStatusText = getString("navmesh_simulator_status_unknown");
viewerStatusText = getString("navmesh_viewer_status_unknown");
break;
case kConsoleStateLibraryNotImplemented :
statusText = getString("navmesh_status_library_not_implemented");
styleParams.color = warningColor;
simulatorStatusText = getString("navmesh_simulator_status_unknown");
viewerStatusText = getString("navmesh_viewer_status_library_not_implemented");
viewerStyleParams.color = warningColor;
break;
case kConsoleStateRegionNotEnabled :
statusText = getString("navmesh_status_region_not_enabled");
styleParams.color = warningColor;
simulatorStatusText = getString("navmesh_simulator_status_unknown");
viewerStatusText = getString("navmesh_viewer_status_region_not_enabled");
viewerStyleParams.color = warningColor;
break;
case kConsoleStateCheckingVersion :
statusText = getString("navmesh_status_checking_version");
simulatorStatusText = getString("navmesh_simulator_status_unknown");
viewerStatusText = getString("navmesh_viewer_status_checking_version");
break;
case kConsoleStateDownloading :
simulatorStatusText = getSimulatorStatusText();
if (mIsNavMeshUpdating)
{
statusText = getString("navmesh_status_updating");
viewerStatusText = getString("navmesh_viewer_status_updating");
}
else
{
statusText = getString("navmesh_status_downloading");
viewerStatusText = getString("navmesh_viewer_status_downloading");
}
break;
case kConsoleStateHasNavMesh :
statusText = getString("navmesh_status_has_navmesh");
simulatorStatusText = getSimulatorStatusText();
viewerStatusText = getString("navmesh_viewer_status_has_navmesh");
break;
case kConsoleStateError :
statusText = getString("navmesh_status_error");
styleParams.color = warningColor;
simulatorStatusText = getString("navmesh_simulator_status_unknown");
viewerStatusText = getString("navmesh_viewer_status_error");
viewerStyleParams.color = warningColor;
break;
default :
statusText = getString("navmesh_status_unknown");
simulatorStatusText = getString("navmesh_simulator_status_unknown");
viewerStatusText = getString("navmesh_viewer_status_unknown");
llassert(0);
break;
}
mPathfindingStatus->setText((LLStringExplicit)statusText, styleParams);
mPathfindingViewerStatus->setText((LLStringExplicit)viewerStatusText, viewerStyleParams);
mPathfindingSimulatorStatus->setText((LLStringExplicit)simulatorStatusText);
}
std::string LLFloaterPathfindingConsole::getSimulatorStatusText() const
{
std::string simulatorStatusText("");
#ifdef DEPRECATED_UNVERSIONED_NAVMESH
if (LLPathfindingManager::getInstance()->isPathfindingNavMeshVersioningEnabledForCurrentRegionXXX())
{
switch (mNavMeshZone.getNavMeshZoneStatus())
{
case LLPathfindingNavMeshZone::kNavMeshZonePending :
simulatorStatusText = getString("navmesh_simulator_status_pending");
break;
case LLPathfindingNavMeshZone::kNavMeshZoneBuilding :
simulatorStatusText = getString("navmesh_simulator_status_building");
break;
case LLPathfindingNavMeshZone::kNavMeshZoneSomePending :
simulatorStatusText = getString("navmesh_simulator_status_some_pending");
break;
case LLPathfindingNavMeshZone::kNavMeshZoneSomeBuilding :
simulatorStatusText = getString("navmesh_simulator_status_some_building");
break;
case LLPathfindingNavMeshZone::kNavMeshZonePendingAndBuilding :
simulatorStatusText = getString("navmesh_simulator_status_pending_and_building");
break;
case LLPathfindingNavMeshZone::kNavMeshZoneComplete :
simulatorStatusText = getString("navmesh_simulator_status_complete");
break;
default :
simulatorStatusText = getString("navmesh_simulator_status_unknown");
break;
}
}
else
{
simulatorStatusText = getString("navmesh_simulator_status_region_not_enabled");
}
#else // DEPRECATED_UNVERSIONED_NAVMESH
switch (mNavMeshZone.getNavMeshZoneStatus())
{
case LLPathfindingNavMeshZone::kNavMeshZonePending :
simulatorStatusText = getString("navmesh_simulator_status_pending");
break;
case LLPathfindingNavMeshZone::kNavMeshZoneBuilding :
simulatorStatusText = getString("navmesh_simulator_status_building");
break;
case LLPathfindingNavMeshZone::kNavMeshZoneSomePending :
simulatorStatusText = getString("navmesh_simulator_status_some_pending");
break;
case LLPathfindingNavMeshZone::kNavMeshZoneSomeBuilding :
simulatorStatusText = getString("navmesh_simulator_status_some_building");
break;
case LLPathfindingNavMeshZone::kNavMeshZonePendingAndBuilding :
simulatorStatusText = getString("navmesh_simulator_status_pending_and_building");
break;
case LLPathfindingNavMeshZone::kNavMeshZoneComplete :
simulatorStatusText = getString("navmesh_simulator_status_complete");
break;
default :
simulatorStatusText = getString("navmesh_simulator_status_unknown");
break;
}
#endif // DEPRECATED_UNVERSIONED_NAVMESH
return simulatorStatusText;
}
void LLFloaterPathfindingConsole::setAgentState(LLPathfindingManager::EAgentState pAgentState)
{
@ -894,5 +974,5 @@ void LLFloaterPathfindingConsole::regionCrossingOccured()
LLStyle::Params styleParams;
styleParams.color = LLUIColorTable::instance().getColor("DrYellow");
statusText = getString("navmesh_update_needed");
mPathfindingStatus->setText((LLStringExplicit)statusText, styleParams);
mPathfindingViewerStatus->setText((LLStringExplicit)statusText, styleParams);
}

View File

@ -147,8 +147,9 @@ private:
void setConsoleState(EConsoleState pConsoleState);
void updateControlsOnConsoleState();
void updateStatusOnConsoleState();
void updateControlsOnConsoleState();
void updateStatusOnConsoleState();
std::string getSimulatorStatusText() const;
void setAgentState(LLPathfindingManager::EAgentState pAgentState);
@ -165,7 +166,8 @@ private:
LLCheckBoxCtrl *mShowMaterialVolumesCheckBox;
LLCheckBoxCtrl *mShowExclusionVolumesCheckBox;
LLCheckBoxCtrl *mShowWorldCheckBox;
LLTextBase *mPathfindingStatus;
LLTextBase *mPathfindingViewerStatus;
LLTextBase *mPathfindingSimulatorStatus;
LLButton *mViewCharactersButton;
LLTabContainer *mEditTestTabContainer;
LLPanel *mEditTab;

View File

@ -41,7 +41,6 @@
#include "llpathfindinglinkset.h"
#include "llpathfindinglinksetlist.h"
#include "llhttpnode.h"
//#include "llpathfindingnavmeshzone.h" // XXX
#include <boost/function.hpp>
#include <boost/signals2.hpp>
@ -254,6 +253,14 @@ bool LLPathfindingManager::isPathfindingEnabledForRegion(LLViewerRegion *pRegion
return !retrieveNavMeshURL.empty();
}
#ifdef DEPRECATED_UNVERSIONED_NAVMESH
bool LLPathfindingManager::isPathfindingNavMeshVersioningEnabledForCurrentRegionXXX() const
{
std::string navMeshStatusURL = getNavMeshStatusURLForRegion(getCurrentRegion());
return !navMeshStatusURL.empty();
}
#endif // DEPRECATED_UNVERSIONED_NAVMESH
bool LLPathfindingManager::isAllowAlterPermanent()
{
return (!isPathfindingEnabledForCurrentRegion() || (getAgentState() == kAgentStateUnfrozen));
@ -285,7 +292,9 @@ void LLPathfindingManager::requestGetNavMeshForRegion(LLViewerRegion *pRegion)
#ifdef DEPRECATED_UNVERSIONED_NAVMESH
if (navMeshStatusURL.empty())
{
sendRequestGetNavMeshForRegion(navMeshPtr, pRegion, navMeshPtr->getNavMeshVersion() + 1U);
LLPathfindingNavMeshStatus navMeshStatus = navMeshPtr->getNavMeshStatusXXX();
navMeshStatus.incrementNavMeshVersionXXX();
sendRequestGetNavMeshForRegion(navMeshPtr, pRegion, navMeshStatus);
}
else
{
@ -312,13 +321,13 @@ void LLPathfindingManager::handleNavMeshStatusRequest(const LLPathfindingNavMesh
}
else
{
if (navMeshPtr->hasNavMeshVersion(pNavMeshStatus.getVersion()))
if (navMeshPtr->hasNavMeshVersion(pNavMeshStatus))
{
navMeshPtr->handleRefresh(pNavMeshStatus.getVersion());
navMeshPtr->handleRefresh(pNavMeshStatus);
}
else
{
sendRequestGetNavMeshForRegion(navMeshPtr, pRegion, pNavMeshStatus.getVersion());
sendRequestGetNavMeshForRegion(navMeshPtr, pRegion, pNavMeshStatus);
}
}
}
@ -333,7 +342,7 @@ void LLPathfindingManager::handleNavMeshStatusUpdate(const LLPathfindingNavMeshS
}
else
{
navMeshPtr->handleNavMeshNewVersion(pNavMeshStatus.getVersion());
navMeshPtr->handleNavMeshNewVersion(pNavMeshStatus);
}
}
@ -462,7 +471,7 @@ LLPathfindingManager::ELinksetsRequestStatus LLPathfindingManager::requestSetLin
return status;
}
void LLPathfindingManager::sendRequestGetNavMeshForRegion(LLPathfindingNavMeshPtr navMeshPtr, LLViewerRegion *pRegion, U32 pNavMeshVersion)
void LLPathfindingManager::sendRequestGetNavMeshForRegion(LLPathfindingNavMeshPtr navMeshPtr, LLViewerRegion *pRegion, const LLPathfindingNavMeshStatus &pNavMeshStatus)
{
if ((pRegion == NULL) || !pRegion->isAlive())
{
@ -478,8 +487,8 @@ void LLPathfindingManager::sendRequestGetNavMeshForRegion(LLPathfindingNavMeshPt
}
else
{
navMeshPtr->handleNavMeshStart(pNavMeshVersion);
LLHTTPClient::ResponderPtr responder = new NavMeshResponder(navMeshURL, pNavMeshVersion, navMeshPtr);
navMeshPtr->handleNavMeshStart(pNavMeshStatus);
LLHTTPClient::ResponderPtr responder = new NavMeshResponder(navMeshURL, pNavMeshStatus.getVersion(), navMeshPtr);
LLSD postData;
LLHTTPClient::post(navMeshURL, postData, responder);

View File

@ -77,6 +77,9 @@ public:
bool isPathfindingEnabledForCurrentRegion() const;
bool isPathfindingEnabledForRegion(LLViewerRegion *pRegion) const;
#ifdef DEPRECATED_UNVERSIONED_NAVMESH
bool isPathfindingNavMeshVersioningEnabledForCurrentRegionXXX() const;
#endif // DEPRECATED_UNVERSIONED_NAVMESH
bool isAllowAlterPermanent();
bool isAllowViewTerrainProperties() const;
@ -98,7 +101,7 @@ public:
protected:
private:
void sendRequestGetNavMeshForRegion(LLPathfindingNavMeshPtr navMeshPtr, LLViewerRegion *pRegion, U32 pNavMeshVersion);
void sendRequestGetNavMeshForRegion(LLPathfindingNavMeshPtr navMeshPtr, LLViewerRegion *pRegion, const LLPathfindingNavMeshStatus &pNavMeshStatus);
LLPathfindingNavMeshPtr getNavMeshForRegion(const LLUUID &pRegionUUID);
LLPathfindingNavMeshPtr getNavMeshForRegion(LLViewerRegion *pRegion);

View File

@ -28,6 +28,7 @@
#include "llviewerprecompiledheaders.h"
#include "lluuid.h"
#include "llpathfindingnavmesh.h"
#include "llpathfindingnavmeshstatus.h"
#include "llsdserialize.h"
#include <string>
@ -40,11 +41,11 @@
//---------------------------------------------------------------------------
LLPathfindingNavMesh::LLPathfindingNavMesh(const LLUUID &pRegionUUID)
: mRegionUUID(pRegionUUID),
: mNavMeshStatus(pRegionUUID),
mNavMeshRequestStatus(kNavMeshRequestUnknown),
mNavMeshSignal(),
mNavMeshData(),
mNavMeshVersion(0U)
mNavMeshData()
{
}
@ -57,45 +58,54 @@ LLPathfindingNavMesh::navmesh_slot_t LLPathfindingNavMesh::registerNavMeshListen
return mNavMeshSignal.connect(pNavMeshCallback);
}
bool LLPathfindingNavMesh::hasNavMeshVersion(U32 pNavMeshVersion) const
bool LLPathfindingNavMesh::hasNavMeshVersion(const LLPathfindingNavMeshStatus &pNavMeshStatus) const
{
return ((mNavMeshVersion == pNavMeshVersion) &&
return ((mNavMeshStatus.getVersion() == pNavMeshStatus.getVersion()) &&
((mNavMeshRequestStatus == kNavMeshRequestStarted) || (mNavMeshRequestStatus == kNavMeshRequestCompleted) ||
((mNavMeshRequestStatus == kNavMeshRequestChecking) && !mNavMeshData.empty())));
}
void LLPathfindingNavMesh::handleRefresh(U32 pNavMeshVersion)
{
llassert(pNavMeshVersion == mNavMeshVersion);
if (mNavMeshRequestStatus == kNavMeshRequestChecking)
{
llassert(!mNavMeshData.empty());
setRequestStatus(kNavMeshRequestCompleted);
}
else
{
mNavMeshSignal(mNavMeshRequestStatus, mRegionUUID, mNavMeshVersion, mNavMeshData);
}
}
void LLPathfindingNavMesh::handleNavMeshCheckVersion()
{
setRequestStatus(kNavMeshRequestChecking);
}
void LLPathfindingNavMesh::handleNavMeshNewVersion(U32 pNavMeshVersion)
void LLPathfindingNavMesh::handleRefresh(const LLPathfindingNavMeshStatus &pNavMeshStatus)
{
if (mNavMeshVersion != pNavMeshVersion)
llassert(mNavMeshStatus.getRegionUUID() == pNavMeshStatus.getRegionUUID());
llassert(mNavMeshStatus.getVersion() == pNavMeshStatus.getVersion());
mNavMeshStatus = pNavMeshStatus;
if (mNavMeshRequestStatus == kNavMeshRequestChecking)
{
llassert(!mNavMeshData.empty());
setRequestStatus(kNavMeshRequestCompleted);
}
else
{
sendStatus();
}
}
void LLPathfindingNavMesh::handleNavMeshNewVersion(const LLPathfindingNavMeshStatus &pNavMeshStatus)
{
llassert(mNavMeshStatus.getRegionUUID() == pNavMeshStatus.getRegionUUID());
if (mNavMeshStatus.getVersion() == pNavMeshStatus.getVersion())
{
mNavMeshStatus = pNavMeshStatus;
sendStatus();
}
else
{
mNavMeshData.clear();
mNavMeshVersion = pNavMeshVersion;
mNavMeshStatus = pNavMeshStatus;
setRequestStatus(kNavMeshRequestNeedsUpdate);
}
}
void LLPathfindingNavMesh::handleNavMeshStart(U32 pNavMeshVersion)
void LLPathfindingNavMesh::handleNavMeshStart(const LLPathfindingNavMeshStatus &pNavMeshStatus)
{
mNavMeshVersion = pNavMeshVersion;
llassert(mNavMeshStatus.getRegionUUID() == pNavMeshStatus.getRegionUUID());
mNavMeshStatus = pNavMeshStatus;
setRequestStatus(kNavMeshRequestStarted);
}
@ -114,8 +124,9 @@ void LLPathfindingNavMesh::handleNavMeshResult(const LLSD &pContent, U32 pNavMes
}
}
if (mNavMeshVersion == pNavMeshVersion)
if (mNavMeshStatus.getVersion() == pNavMeshVersion)
{
ENavMeshRequestStatus status;
if ( pContent.has(NAVMESH_DATA_FIELD) )
{
const LLSD::Binary &value = pContent.get(NAVMESH_DATA_FIELD).asBinary();
@ -128,14 +139,14 @@ void LLPathfindingNavMesh::handleNavMeshResult(const LLSD &pContent, U32 pNavMes
if ( !valid )
{
llwarns << "Unable to decompress the navmesh llsd." << llendl;
setRequestStatus(kNavMeshRequestError);
status = kNavMeshRequestError;
}
else
{
llassert(pUncompressedNavMeshContainer);
mNavMeshData.resize( decompBinSize );
memcpy( &mNavMeshData[0], &pUncompressedNavMeshContainer[0], decompBinSize );
setRequestStatus(kNavMeshRequestCompleted);
status = kNavMeshRequestCompleted;
}
if ( pUncompressedNavMeshContainer )
{
@ -145,8 +156,9 @@ void LLPathfindingNavMesh::handleNavMeshResult(const LLSD &pContent, U32 pNavMes
else
{
llwarns << "No mesh data received" << llendl;
setRequestStatus(kNavMeshRequestError);
status = kNavMeshRequestError;
}
setRequestStatus(status);
}
}
@ -165,7 +177,7 @@ void LLPathfindingNavMesh::handleNavMeshError()
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;
if (mNavMeshVersion == pNavMeshVersion)
if (mNavMeshStatus.getVersion() == pNavMeshVersion)
{
handleNavMeshError();
}
@ -174,5 +186,10 @@ void LLPathfindingNavMesh::handleNavMeshError(U32 pStatus, const std::string &pR
void LLPathfindingNavMesh::setRequestStatus(ENavMeshRequestStatus pNavMeshRequestStatus)
{
mNavMeshRequestStatus = pNavMeshRequestStatus;
mNavMeshSignal(mNavMeshRequestStatus, mRegionUUID, mNavMeshVersion, mNavMeshData);
sendStatus();
}
void LLPathfindingNavMesh::sendStatus()
{
mNavMeshSignal(mNavMeshRequestStatus, mNavMeshStatus, mNavMeshData);
}

View File

@ -29,7 +29,6 @@
#define LL_LLPATHFINDINGNAVMESH_H
#include "llsd.h"
#include "lluuid.h"
#include <string>
@ -37,14 +36,13 @@
#include <boost/function.hpp>
#include <boost/signals2.hpp>
class LLSD;
#include "llpathfindingnavmeshstatus.h"
class LLUUID;
class LLPathfindingNavMesh;
typedef boost::shared_ptr<LLPathfindingNavMesh> LLPathfindingNavMeshPtr;
// XXX stinson 03/12/2012 : This definition is in place to support an older version of the pathfinding simulator that does not have versioned information
#define DEPRECATED_UNVERSIONED_NAVMESH
class LLPathfindingNavMesh
{
public:
@ -58,9 +56,9 @@ public:
kNavMeshRequestError
} 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;
typedef boost::function<void (ENavMeshRequestStatus, const LLPathfindingNavMeshStatus &, const LLSD::Binary &)> navmesh_callback_t;
typedef boost::signals2::signal<void (ENavMeshRequestStatus, const LLPathfindingNavMeshStatus &, const LLSD::Binary &)> navmesh_signal_t;
typedef boost::signals2::connection navmesh_slot_t;
LLPathfindingNavMesh(const LLUUID &pRegionUUID);
virtual ~LLPathfindingNavMesh();
@ -68,15 +66,15 @@ public:
navmesh_slot_t registerNavMeshListener(navmesh_callback_t pNavMeshCallback);
#ifdef DEPRECATED_UNVERSIONED_NAVMESH
U32 getNavMeshVersion() const {return mNavMeshVersion;};
const LLPathfindingNavMeshStatus &getNavMeshStatusXXX() const {return mNavMeshStatus;};
#endif // DEPRECATED_UNVERSIONED_NAVMESH
bool hasNavMeshVersion(U32 pNavMeshVersion) const;
bool hasNavMeshVersion(const LLPathfindingNavMeshStatus &pNavMeshStatus) const;
void handleNavMeshCheckVersion();
void handleRefresh(U32 pNavMeshVersion);
void handleNavMeshNewVersion(U32 pNavMeshVersion);
void handleNavMeshStart(U32 pNavMeshVersion);
void handleRefresh(const LLPathfindingNavMeshStatus &pNavMeshStatus);
void handleNavMeshNewVersion(const LLPathfindingNavMeshStatus &pNavMeshStatus);
void handleNavMeshStart(const LLPathfindingNavMeshStatus &pNavMeshStatus);
void handleNavMeshResult(const LLSD &pContent, U32 pNavMeshVersion);
void handleNavMeshNotEnabled();
void handleNavMeshError();
@ -86,12 +84,12 @@ protected:
private:
void setRequestStatus(ENavMeshRequestStatus pNavMeshRequestStatus);
void sendStatus();
LLUUID mRegionUUID;
ENavMeshRequestStatus mNavMeshRequestStatus;
navmesh_signal_t mNavMeshSignal;
LLSD::Binary mNavMeshData;
U32 mNavMeshVersion;
LLPathfindingNavMeshStatus mNavMeshStatus;
ENavMeshRequestStatus mNavMeshRequestStatus;
navmesh_signal_t mNavMeshSignal;
LLSD::Binary mNavMeshData;
};
#endif // LL_LLPATHFINDINGNAVMESH_H

View File

@ -48,6 +48,14 @@ const std::string LLPathfindingNavMeshStatus::sStatusRepending("repending");
// LLPathfindingNavMeshStatus
//---------------------------------------------------------------------------
LLPathfindingNavMeshStatus::LLPathfindingNavMeshStatus()
: mIsValid(false),
mRegionUUID(),
mVersion(0U),
mStatus(kComplete)
{
}
LLPathfindingNavMeshStatus::LLPathfindingNavMeshStatus(const LLUUID &pRegionUUID)
: mIsValid(false),
mRegionUUID(pRegionUUID),
@ -127,19 +135,19 @@ void LLPathfindingNavMeshStatus::parseStatus(const LLSD &pContent)
std::string status = pContent.get(STATUS_FIELD).asString();
#endif // DEPRECATED_STATE_FIELD
if (LLStringUtil::compareStrings(status, sStatusPending))
if (LLStringUtil::compareStrings(status, sStatusPending) == 0)
{
mStatus = kPending;
}
else if (LLStringUtil::compareStrings(status, sStatusBuilding))
else if (LLStringUtil::compareStrings(status, sStatusBuilding) == 0)
{
mStatus = kBuilding;
}
else if (LLStringUtil::compareStrings(status, sStatusComplete))
else if (LLStringUtil::compareStrings(status, sStatusComplete) == 0)
{
mStatus = kComplete;
}
else if (LLStringUtil::compareStrings(status, sStatusRepending))
else if (LLStringUtil::compareStrings(status, sStatusRepending) == 0)
{
mStatus = kRepending;
}

View File

@ -32,6 +32,9 @@
#include <string>
// XXX stinson 03/12/2012 : This definition is in place to support an older version of the pathfinding simulator that does not have versioned information
#define DEPRECATED_UNVERSIONED_NAVMESH
class LLSD;
class LLPathfindingNavMeshStatus
@ -45,6 +48,7 @@ public:
kRepending
} ENavMeshStatus;
LLPathfindingNavMeshStatus();
LLPathfindingNavMeshStatus(const LLUUID &pRegionUUID);
LLPathfindingNavMeshStatus(const LLUUID &pRegionUUID, const LLSD &pContent);
LLPathfindingNavMeshStatus(const LLSD &pContent);
@ -53,6 +57,10 @@ public:
LLPathfindingNavMeshStatus &operator =(const LLPathfindingNavMeshStatus &pOther);
#ifdef DEPRECATED_UNVERSIONED_NAVMESH
void incrementNavMeshVersionXXX() {++mVersion;};
#endif // DEPRECATED_UNVERSIONED_NAVMESH
bool isValid() const {return mIsValid;};
const LLUUID &getRegionUUID() const {return mRegionUUID;};
U32 getVersion() const {return mVersion;};

View File

@ -50,6 +50,7 @@
LLPathfindingNavMeshZone::LLPathfindingNavMeshZone()
: mNavMeshLocationPtrs(),
mNavMeshZoneRequestStatus(kNavMeshZoneRequestUnknown),
mNavMeshZoneSignal()
{
}
@ -132,6 +133,71 @@ void LLPathfindingNavMeshZone::refresh()
}
}
LLPathfindingNavMeshZone::ENavMeshZoneStatus LLPathfindingNavMeshZone::getNavMeshZoneStatus() const
{
bool hasPending = false;
bool hasBuilding = false;
bool hasComplete = false;
bool hasRepending = false;
for (NavMeshLocationPtrs::const_iterator navMeshLocationPtrIter = mNavMeshLocationPtrs.begin();
navMeshLocationPtrIter != mNavMeshLocationPtrs.end(); ++navMeshLocationPtrIter)
{
const NavMeshLocationPtr navMeshLocationPtr = *navMeshLocationPtrIter;
switch (navMeshLocationPtr->getNavMeshStatus())
{
case LLPathfindingNavMeshStatus::kPending :
hasPending = true;
break;
case LLPathfindingNavMeshStatus::kBuilding :
hasBuilding = true;
break;
case LLPathfindingNavMeshStatus::kComplete :
hasComplete = true;
break;
case LLPathfindingNavMeshStatus::kRepending :
hasRepending = true;
break;
default :
hasPending = true;
llassert(0);
break;
}
}
ENavMeshZoneStatus zoneStatus = kNavMeshZoneComplete;
if (hasRepending || (hasPending && hasBuilding))
{
zoneStatus = kNavMeshZonePendingAndBuilding;
}
else if (hasComplete)
{
if (hasPending)
{
zoneStatus = kNavMeshZoneSomePending;
}
else if (hasBuilding)
{
zoneStatus = kNavMeshZoneSomeBuilding;
}
else
{
zoneStatus = kNavMeshZoneComplete;
}
}
else if (hasPending)
{
zoneStatus = kNavMeshZonePending;
}
else if (hasBuilding)
{
zoneStatus = kNavMeshZoneBuilding;
}
return zoneStatus;
}
void LLPathfindingNavMeshZone::handleNavMeshLocation()
{
updateStatus();
@ -150,10 +216,10 @@ void LLPathfindingNavMeshZone::updateStatus()
#ifdef XXX_STINSON_DEBUG_NAVMESH_ZONE
llinfos << "STINSON DEBUG: Navmesh zone update BEGIN" << llendl;
#endif // XXX_STINSON_DEBUG_NAVMESH_ZONE
for (NavMeshLocationPtrs::iterator navMeshLocationPtrIter = mNavMeshLocationPtrs.begin();
for (NavMeshLocationPtrs::const_iterator navMeshLocationPtrIter = mNavMeshLocationPtrs.begin();
navMeshLocationPtrIter != mNavMeshLocationPtrs.end(); ++navMeshLocationPtrIter)
{
NavMeshLocationPtr navMeshLocationPtr = *navMeshLocationPtrIter;
const NavMeshLocationPtr navMeshLocationPtr = *navMeshLocationPtrIter;
#ifdef XXX_STINSON_DEBUG_NAVMESH_ZONE
llinfos << "STINSON DEBUG: region #" << navMeshLocationPtr->getDirection() << ": region(" << navMeshLocationPtr->getRegionUUID().asString() << ") status:" << navMeshLocationPtr->getRequestStatus() << llendl;
#endif // XXX_STINSON_DEBUG_NAVMESH_ZONE
@ -226,14 +292,6 @@ void LLPathfindingNavMeshZone::updateStatus()
else if (hasRequestCompleted)
{
zoneRequestStatus = kNavMeshZoneRequestCompleted;
#ifdef XXX_STINSON_DEBUG_NAVMESH_ZONE
llinfos << "STINSON DEBUG: Navmesh zone update is stitching" << llendl;
#endif // XXX_STINSON_DEBUG_NAVMESH_ZONE
llassert(LLPathingLib::getInstance() != NULL);
if (LLPathingLib::getInstance() != NULL)
{
LLPathingLib::getInstance()->stitchNavMeshes( gSavedSettings.getBOOL("EnableVBOForNavMeshVisualization") );
}
#ifdef XXX_STINSON_DEBUG_NAVMESH_ZONE
llinfos << "STINSON DEBUG: Navmesh zone update is COMPLETED" << llendl;
#endif // XXX_STINSON_DEBUG_NAVMESH_ZONE
@ -254,7 +312,24 @@ void LLPathfindingNavMeshZone::updateStatus()
llassert(0);
}
mNavMeshZoneSignal(zoneRequestStatus);
if ((mNavMeshZoneRequestStatus != kNavMeshZoneRequestCompleted) &&
(zoneRequestStatus == kNavMeshZoneRequestCompleted))
{
#ifdef XXX_STINSON_DEBUG_NAVMESH_ZONE
llinfos << "STINSON DEBUG: Navmesh zone update is stitching" << llendl;
#endif // XXX_STINSON_DEBUG_NAVMESH_ZONE
llassert(LLPathingLib::getInstance() != NULL);
if (LLPathingLib::getInstance() != NULL)
{
LLPathingLib::getInstance()->stitchNavMeshes( gSavedSettings.getBOOL("EnableVBOForNavMeshVisualization") );
}
#ifdef XXX_STINSON_DEBUG_NAVMESH_ZONE
llinfos << "STINSON DEBUG: Navmesh zone update stitching is done" << llendl;
#endif // XXX_STINSON_DEBUG_NAVMESH_ZONE
}
mNavMeshZoneRequestStatus = zoneRequestStatus;
mNavMeshZoneSignal(mNavMeshZoneRequestStatus);
}
//---------------------------------------------------------------------------
@ -266,6 +341,7 @@ LLPathfindingNavMeshZone::NavMeshLocation::NavMeshLocation(S32 pDirection, navme
mRegionUUID(),
mHasNavMesh(false),
mNavMeshVersion(0U),
mNavMeshStatus(LLPathfindingNavMeshStatus::kComplete),
mLocationCallback(pLocationCallback),
mRequestStatus(LLPathfindingNavMesh::kNavMeshRequestUnknown),
mNavMeshSlot()
@ -288,7 +364,7 @@ void LLPathfindingNavMeshZone::NavMeshLocation::enable()
else
{
mRegionUUID = region->getRegionID();
mNavMeshSlot = LLPathfindingManager::getInstance()->registerNavMeshListenerForRegion(region, boost::bind(&LLPathfindingNavMeshZone::NavMeshLocation::handleNavMesh, this, _1, _2, _3, _4));
mNavMeshSlot = LLPathfindingManager::getInstance()->registerNavMeshListenerForRegion(region, boost::bind(&LLPathfindingNavMeshZone::NavMeshLocation::handleNavMesh, this, _1, _2, _3));
}
}
@ -299,8 +375,9 @@ void LLPathfindingNavMeshZone::NavMeshLocation::refresh()
if (region == NULL)
{
llassert(mRegionUUID.isNull());
LLPathfindingNavMeshStatus newNavMeshStatus(mRegionUUID);
LLSD::Binary nullData;
handleNavMesh(LLPathfindingNavMesh::kNavMeshRequestNotEnabled, mRegionUUID, 0U, nullData);
handleNavMesh(LLPathfindingNavMesh::kNavMeshRequestNotEnabled, newNavMeshStatus, nullData);
}
else
{
@ -319,33 +396,38 @@ LLPathfindingNavMesh::ENavMeshRequestStatus LLPathfindingNavMeshZone::NavMeshLoc
return mRequestStatus;
}
void LLPathfindingNavMeshZone::NavMeshLocation::handleNavMesh(LLPathfindingNavMesh::ENavMeshRequestStatus pNavMeshRequestStatus, const LLUUID &pRegionUUID, U32 pNavMeshVersion, const LLSD::Binary &pNavMeshData)
LLPathfindingNavMeshStatus::ENavMeshStatus LLPathfindingNavMeshZone::NavMeshLocation::getNavMeshStatus() const
{
llassert(mRegionUUID == pRegionUUID);
if (pNavMeshRequestStatus != LLPathfindingNavMesh::kNavMeshRequestCompleted)
{
mRequestStatus = pNavMeshRequestStatus;
mLocationCallback();
}
else if (!mHasNavMesh || (mNavMeshVersion != pNavMeshVersion))
return mNavMeshStatus;
}
void LLPathfindingNavMeshZone::NavMeshLocation::handleNavMesh(LLPathfindingNavMesh::ENavMeshRequestStatus pNavMeshRequestStatus, const LLPathfindingNavMeshStatus &pNavMeshStatus, const LLSD::Binary &pNavMeshData)
{
llassert(mRegionUUID == pNavMeshStatus.getRegionUUID());
if ((pNavMeshRequestStatus == LLPathfindingNavMesh::kNavMeshRequestCompleted) &&
(!mHasNavMesh || (mNavMeshVersion != pNavMeshStatus.getVersion())))
{
llassert(!pNavMeshData.empty());
mRequestStatus = pNavMeshRequestStatus;
mHasNavMesh = true;
mNavMeshVersion = pNavMeshVersion;
mNavMeshVersion = pNavMeshStatus.getVersion();
llassert(LLPathingLib::getInstance() != NULL);
if (LLPathingLib::getInstance() != NULL)
{
LLPathingLib::getInstance()->extractNavMeshSrcFromLLSD(pNavMeshData, mDirection);
}
mLocationCallback();
}
mRequestStatus = pNavMeshRequestStatus;
mNavMeshStatus = pNavMeshStatus.getStatus();
mLocationCallback();
}
void LLPathfindingNavMeshZone::NavMeshLocation::clear()
{
mHasNavMesh = false;
mRequestStatus = LLPathfindingNavMesh::kNavMeshRequestUnknown;
mNavMeshStatus = LLPathfindingNavMeshStatus::kComplete;
if (mNavMeshSlot.connected())
{
mNavMeshSlot.disconnect();

View File

@ -31,6 +31,7 @@
#include "llsd.h"
#include "lluuid.h"
#include "llpathfindingnavmesh.h"
#include "llpathfindingnavmeshstatus.h"
#include <vector>
@ -38,6 +39,8 @@
#include <boost/function.hpp>
#include <boost/signals2.hpp>
class LLPathfindingNavMeshStatus;
//#define XXX_STINSON_DEBUG_NAVMESH_ZONE
class LLPathfindingNavMeshZone
@ -53,9 +56,18 @@ public:
kNavMeshZoneRequestError
} ENavMeshZoneRequestStatus;
typedef enum {
kNavMeshZonePending,
kNavMeshZoneBuilding,
kNavMeshZoneSomePending,
kNavMeshZoneSomeBuilding,
kNavMeshZonePendingAndBuilding,
kNavMeshZoneComplete
} ENavMeshZoneStatus;
typedef boost::function<void (ENavMeshZoneRequestStatus)> navmesh_zone_callback_t;
typedef boost::signals2::signal<void (ENavMeshZoneRequestStatus)> navmesh_zone_signal_t;
typedef boost::signals2::connection navmesh_zone_slot_t;
typedef boost::signals2::connection navmesh_zone_slot_t;
LLPathfindingNavMeshZone();
virtual ~LLPathfindingNavMeshZone();
@ -67,6 +79,8 @@ public:
void disable();
void refresh();
ENavMeshZoneStatus getNavMeshZoneStatus() const;
protected:
private:
@ -82,6 +96,7 @@ private:
void disable();
LLPathfindingNavMesh::ENavMeshRequestStatus getRequestStatus() const;
LLPathfindingNavMeshStatus::ENavMeshStatus getNavMeshStatus() const;
#ifdef XXX_STINSON_DEBUG_NAVMESH_ZONE
const LLUUID &getRegionUUID() const {return mRegionUUID;};
S32 getDirection() const {return mDirection;};
@ -90,7 +105,7 @@ private:
protected:
private:
void handleNavMesh(LLPathfindingNavMesh::ENavMeshRequestStatus pNavMeshRequestStatus, const LLUUID &pRegionUUID, U32 pNavMeshVersion, const LLSD::Binary &pNavMeshData);
void handleNavMesh(LLPathfindingNavMesh::ENavMeshRequestStatus pNavMeshRequestStatus, const LLPathfindingNavMeshStatus &pNavMeshStatus, const LLSD::Binary &pNavMeshData);
void clear();
LLViewerRegion *getRegion() const;
@ -99,6 +114,7 @@ private:
LLUUID mRegionUUID;
bool mHasNavMesh;
U32 mNavMeshVersion;
LLPathfindingNavMeshStatus::ENavMeshStatus mNavMeshStatus;
navmesh_location_callback_t mLocationCallback;
LLPathfindingNavMesh::ENavMeshRequestStatus mRequestStatus;
LLPathfindingNavMesh::navmesh_slot_t mNavMeshSlot;
@ -110,8 +126,9 @@ private:
void handleNavMeshLocation();
void updateStatus();
NavMeshLocationPtrs mNavMeshLocationPtrs;
navmesh_zone_signal_t mNavMeshZoneSignal;
NavMeshLocationPtrs mNavMeshLocationPtrs;
ENavMeshZoneRequestStatus mNavMeshZoneRequestStatus;
navmesh_zone_signal_t mNavMeshZoneSignal;
};
#endif // LL_LLPATHFINDINGNAVMESHZONE_H

View File

@ -2,7 +2,7 @@
<floater
open_positioning="cascading"
can_tear_off="false"
height="352"
height="420"
layout="topleft"
name="floater_pathfinding_console"
help_topic="floater_pathfinding_console"
@ -11,19 +11,27 @@
single_instance="true"
title="Pathfinding edit / test"
width="456">
<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_checking_version">Checking the status of the navmesh ...</floater.string>
<floater.string name="navmesh_status_downloading">Downloading the navmesh ...</floater.string>
<floater.string name="navmesh_status_updating">The navmesh has changed on the server. Downloading the latest navmesh ...</floater.string>
<floater.string name="navmesh_status_has_navmesh">Navmesh received.</floater.string>
<floater.string name="navmesh_status_error">Unable to download navmesh successfully.</floater.string>
<floater.string name="navmesh_viewer_status_unknown"></floater.string>
<floater.string name="navmesh_viewer_status_library_not_implemented">Cannot find pathing library implementation.</floater.string>
<floater.string name="navmesh_viewer_status_region_not_enabled">This region is not enabled for pathfinding.</floater.string>
<floater.string name="navmesh_viewer_status_checking_version">Checking the status of the navmesh.</floater.string>
<floater.string name="navmesh_viewer_status_downloading">Downloading the navmesh.</floater.string>
<floater.string name="navmesh_viewer_status_updating">The navmesh has changed on the server. Downloading the latest navmesh.</floater.string>
<floater.string name="navmesh_viewer_status_has_navmesh">Latest navmesh has been downloaded.</floater.string>
<floater.string name="navmesh_viewer_status_error">Unable to download navmesh successfully.</floater.string>
<floater.string name="navmesh_simulator_status_unknown"></floater.string>
<floater.string name="navmesh_simulator_status_region_not_enabled">This region does not expose the navmesh status.</floater.string>
<floater.string name="navmesh_simulator_status_pending">Navmesh has pending changes.</floater.string>
<floater.string name="navmesh_simulator_status_building">Navmesh is building.</floater.string>
<floater.string name="navmesh_simulator_status_some_pending">Some navmesh regions have pending changes.</floater.string>
<floater.string name="navmesh_simulator_status_some_building">Some navmesh regions are building.</floater.string>
<floater.string name="navmesh_simulator_status_pending_and_building">Some navmesh regions have pending changes and others are building.</floater.string>
<floater.string name="navmesh_simulator_status_complete">Navmesh is up-to-date.</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>
<floater.string name="pathing_path_valid">Path is shown in blue.</floater.string>
<floater.string name="navmesh_update_needed">Region boundary hit, navmesh may not be accurate. Update.</floater.string>
<floater.string name="navmesh_update_needed">Region boundary hit, navmesh may not be accurate.</floater.string>
<text
height="13"
word_wrap="true"
@ -56,7 +64,7 @@
follows="left|top"
layout="topleft"
left="35"
width="208">
width="188">
Show walkability map:
</text>
<combo_box
@ -157,7 +165,7 @@
left="0"
top_pad="5"
width="200">
Status
Viewer status
</text>
<text
height="40"
@ -169,7 +177,51 @@
follows="left|top"
layout="topleft"
left="0"
name="pathfinding_status"
name="pathfinding_viewer_status"
top_pad="8"
width="200">
</text>
</panel>
<view_border
bevel_style="none"
follows="top|left"
layout="topleft"
left="14"
height="0"
width="200"
top_pad="0"
visible="true" />
<panel
border="false"
bevel_style="none"
follows="left|top"
layout="topleft"
height="73"
width="200">
<text
height="13"
word_wrap="true"
use_ellipses="false"
type="string"
text_color="LabelTextColor"
length="1"
layout="topleft"
left="0"
top_pad="5"
width="200">
Simulator status
</text>
<text
height="40"
word_wrap="true"
use_ellipses="false"
type="string"
text_color="LabelTextColor"
length="1"
follows="left|top"
layout="topleft"
left="0"
name="pathfinding_simulator_status"
top_pad="8"
width="200">
</text>
@ -210,7 +262,7 @@
layout="topleft"
left="230"
top="35"
height="305"
height="373"
width="214"
visible="true" />
<tab_container
@ -220,7 +272,7 @@
name="edit_test_tab_container"
left="227"
top="14"
height="327"
height="395"
width="218">
<panel
border="false"
@ -294,7 +346,7 @@
line_spacing.multiple="1.5"
name="freeze_label"
top_pad="23"
height="26"
height="32"
width="190">
Prevent object / terrain changes and update the navmesh:
</text>
@ -306,7 +358,7 @@
label="Freeze"
layout="topleft"
name="enter_frozen_mode"
top_pad="9"
top_pad="3"
width="116"/>
</panel>
<panel