summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTodd Stinson <stinson@lindenlab.com>2012-03-06 18:40:37 -0800
committerTodd Stinson <stinson@lindenlab.com>2012-03-06 18:40:37 -0800
commita0c626fe411336871505c2c414143ae4b2f73259 (patch)
tree37048430da906cf5cd4a2e0ef6f2866f7b011599
parent6c9561c882cf0d5bb0cb547852e95daec19f559c (diff)
PATH-205,PATH-304: More work to handle downloading of out-of-date navmeshes.
-rw-r--r--indra/newview/llfloaterpathfindingconsole.cpp73
-rw-r--r--indra/newview/llpathfindingmanager.cpp39
-rw-r--r--indra/newview/llpathfindingmanager.h8
-rw-r--r--indra/newview/llpathfindingnavmeshzone.cpp194
-rw-r--r--indra/newview/llpathfindingnavmeshzone.h40
5 files changed, 190 insertions, 164 deletions
diff --git a/indra/newview/llfloaterpathfindingconsole.cpp b/indra/newview/llfloaterpathfindingconsole.cpp
index f2404dcb6b..fe5c6b8d44 100644
--- a/indra/newview/llfloaterpathfindingconsole.cpp
+++ b/indra/newview/llfloaterpathfindingconsole.cpp
@@ -171,77 +171,10 @@ void LLFloaterPathfindingConsole::onOpen(const LLSD& pKey)
mNavMeshZoneSlot = mNavMeshZone.registerNavMeshZoneListener(boost::bind(&LLFloaterPathfindingConsole::onNavMeshZoneCB, this, _1));
}
- mNavMeshZone.setCurrentRegionAsCenter();
- mNavMeshZone.refresh();
-#if 0
- LLPathingLib::getInstance()->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<LLViewerRegion*> regions;
- regions.push_back( pCurrentRegion );
- std::vector<int> shiftDirections;
- shiftDirections.push_back( CURRENT_REGION );
-
- mNeighboringRegion = gSavedSettings.getU32("RetrieveNeighboringRegion");
- if ( mNeighboringRegion != CURRENT_REGION )
- {
- //User wants to pull in a neighboring region
- std::vector<S32> availableRegions;
- pCurrentRegion->getNeighboringRegionsStatus( availableRegions );
- //Is the desired region in the available list
- std::vector<S32>::iterator foundElem = std::find(availableRegions.begin(),availableRegions.end(),mNeighboringRegion);
- if ( foundElem != availableRegions.end() )
- {
- LLViewerRegion* pCurrentRegion = gAgent.getRegion();
- std::vector<LLViewerRegion*> 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 );
- }
+ mNavMeshZone.initialize();
- int regionCnt = regions.size();
- mNavMeshCnt = regionCnt;
-
- for ( int i=0; i<regionCnt; ++i )
- {
- std::string url = regions[i]->getCapability( 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 ["<<capability<<"]"<<llendl;
- }
- }
-#endif
+ mNavMeshZone.enable();
+ mNavMeshZone.refresh();
}
if (!mAgentStateSlot.connected())
diff --git a/indra/newview/llpathfindingmanager.cpp b/indra/newview/llpathfindingmanager.cpp
index 7fbf9ba62c..8597498a76 100644
--- a/indra/newview/llpathfindingmanager.cpp
+++ b/indra/newview/llpathfindingmanager.cpp
@@ -204,15 +204,15 @@ bool LLPathfindingManager::isAllowViewTerrainProperties() const
return (gAgent.isGodlike() || ((region != NULL) && region->canManageEstate()));
}
-LLPathfindingNavMesh::navmesh_slot_t LLPathfindingManager::registerNavMeshListenerForCurrentRegion(LLPathfindingNavMesh::navmesh_callback_t pNavMeshCallback)
+LLPathfindingNavMesh::navmesh_slot_t LLPathfindingManager::registerNavMeshListenerForRegion(LLViewerRegion *pRegion, LLPathfindingNavMesh::navmesh_callback_t pNavMeshCallback)
{
- LLPathfindingNavMeshPtr navMeshPtr = getNavMeshForCurrentRegion();
+ LLPathfindingNavMeshPtr navMeshPtr = getNavMeshForRegion(pRegion);
return navMeshPtr->registerNavMeshListener(pNavMeshCallback);
}
-void LLPathfindingManager::requestGetNavMeshForCurrentRegion()
+void LLPathfindingManager::requestGetNavMeshForRegion(LLViewerRegion *pRegion)
{
- LLPathfindingNavMeshPtr navMeshPtr = getNavMeshForCurrentRegion();
+ LLPathfindingNavMeshPtr navMeshPtr = getNavMeshForRegion(pRegion);
if (navMeshPtr->hasNavMeshVersion(mNavMeshVersionXXX))
{
@@ -220,14 +220,13 @@ void LLPathfindingManager::requestGetNavMeshForCurrentRegion()
}
else
{
- LLViewerRegion *region = getCurrentRegion();
- if (region == NULL)
+ if (pRegion == NULL)
{
navMeshPtr->handleNavMeshNotEnabled();
}
else
{
- std::string navMeshURL = getRetrieveNavMeshURLForCurrentRegion();
+ std::string navMeshURL = getRetrieveNavMeshURLForRegion(pRegion);
if (navMeshURL.empty())
{
navMeshPtr->handleNavMeshNotEnabled();
@@ -239,7 +238,7 @@ void LLPathfindingManager::requestGetNavMeshForCurrentRegion()
LLSD postData;
postData["agent_id"] = gAgent.getID();
- postData["region_id"] = region->getRegionID();
+ postData["region_id"] = pRegion->getRegionID();
LLHTTPClient::post(navMeshURL, postData, responder);
}
}
@@ -371,14 +370,13 @@ LLPathfindingManager::ELinksetsRequestStatus LLPathfindingManager::requestSetLin
return status;
}
-LLPathfindingNavMeshPtr LLPathfindingManager::getNavMeshForCurrentRegion()
+LLPathfindingNavMeshPtr LLPathfindingManager::getNavMeshForRegion(LLViewerRegion *pRegion)
{
LLUUID regionUUID;
- LLViewerRegion *region = getCurrentRegion();
- if (region != NULL)
+ if (pRegion != NULL)
{
- regionUUID = region->getRegionID();
+ regionUUID = pRegion->getRegionID();
}
LLPathfindingNavMeshPtr navMeshPtr;
@@ -469,6 +467,11 @@ std::string LLPathfindingManager::getRetrieveNavMeshURLForCurrentRegion() const
return getCapabilityURLForCurrentRegion(CAP_SERVICE_RETRIEVE_NAVMESH);
}
+std::string LLPathfindingManager::getRetrieveNavMeshURLForRegion(LLViewerRegion *pRegion) const
+{
+ return getCapabilityURLForRegion(pRegion, CAP_SERVICE_RETRIEVE_NAVMESH);
+}
+
std::string LLPathfindingManager::getAgentStateURLForCurrentRegion() const
{
return getCapabilityURLForCurrentRegion(CAP_SERVICE_AGENT_STATE);
@@ -486,18 +489,22 @@ std::string LLPathfindingManager::getTerrainLinksetsURLForCurrentRegion() const
std::string LLPathfindingManager::getCapabilityURLForCurrentRegion(const std::string &pCapabilityName) const
{
+ return getCapabilityURLForRegion(getCurrentRegion(), pCapabilityName);
+}
+
+std::string LLPathfindingManager::getCapabilityURLForRegion(LLViewerRegion *pRegion, const std::string &pCapabilityName) const
+{
std::string capabilityURL("");
- LLViewerRegion* region = getCurrentRegion();
- if (region != NULL)
+ if (pRegion != NULL)
{
- capabilityURL = region->getCapability(pCapabilityName);
+ capabilityURL = pRegion->getCapability(pCapabilityName);
}
if (capabilityURL.empty())
{
llwarns << "cannot find capability '" << pCapabilityName << "' for current region '"
- << ((region != NULL) ? region->getName() : "<null>") << "'" << llendl;
+ << ((pRegion != NULL) ? pRegion->getName() : "<null>") << "'" << llendl;
}
return capabilityURL;
diff --git a/indra/newview/llpathfindingmanager.h b/indra/newview/llpathfindingmanager.h
index f034ddb9ea..eb8704e308 100644
--- a/indra/newview/llpathfindingmanager.h
+++ b/indra/newview/llpathfindingmanager.h
@@ -78,8 +78,8 @@ public:
bool isAllowAlterPermanent();
bool isAllowViewTerrainProperties() const;
- LLPathfindingNavMesh::navmesh_slot_t registerNavMeshListenerForCurrentRegion(LLPathfindingNavMesh::navmesh_callback_t pNavMeshCallback);
- void requestGetNavMeshForCurrentRegion();
+ LLPathfindingNavMesh::navmesh_slot_t registerNavMeshListenerForRegion(LLViewerRegion *pRegion, LLPathfindingNavMesh::navmesh_callback_t pNavMeshCallback);
+ void requestGetNavMeshForRegion(LLViewerRegion *pRegion);
agent_state_slot_t registerAgentStateListener(agent_state_callback_t pAgentStateCallback);
EAgentState getAgentState();
@@ -92,7 +92,7 @@ public:
protected:
private:
- LLPathfindingNavMeshPtr getNavMeshForCurrentRegion();
+ LLPathfindingNavMeshPtr getNavMeshForRegion(LLViewerRegion *pRegion);
static bool isValidAgentState(EAgentState pAgentState);
@@ -102,11 +102,13 @@ private:
void handleAgentStateError(U32 pStatus, const std::string &pReason, const std::string &pURL);
std::string getRetrieveNavMeshURLForCurrentRegion() const;
+ std::string getRetrieveNavMeshURLForRegion(LLViewerRegion *pRegion) const;
std::string getAgentStateURLForCurrentRegion() const;
std::string getObjectLinksetsURLForCurrentRegion() const;
std::string getTerrainLinksetsURLForCurrentRegion() const;
std::string getCapabilityURLForCurrentRegion(const std::string &pCapabilityName) const;
+ std::string getCapabilityURLForRegion(LLViewerRegion *pRegion, const std::string &pCapabilityName) const;
LLViewerRegion *getCurrentRegion() const;
NavMeshMap mNavMeshMap;
diff --git a/indra/newview/llpathfindingnavmeshzone.cpp b/indra/newview/llpathfindingnavmeshzone.cpp
index c6b9c6c338..7b9ac913c9 100644
--- a/indra/newview/llpathfindingnavmeshzone.cpp
+++ b/indra/newview/llpathfindingnavmeshzone.cpp
@@ -38,7 +38,9 @@
#include "LLPathingLib.h"
#include <string>
-#include <map>
+#include <vector>
+
+#include <boost/bind.hpp>
#define CENTER_REGION 99
@@ -47,9 +49,8 @@
//---------------------------------------------------------------------------
LLPathfindingNavMeshZone::LLPathfindingNavMeshZone()
- : mNavMeshLocations(),
- mNavMeshZoneSignal(),
- mNavMeshSlot()
+ : mNavMeshLocationPtrs(),
+ mNavMeshZoneSignal()
{
}
@@ -62,56 +63,68 @@ LLPathfindingNavMeshZone::navmesh_zone_slot_t LLPathfindingNavMeshZone::register
return mNavMeshZoneSignal.connect(pNavMeshZoneCallback);
}
-void LLPathfindingNavMeshZone::setCurrentRegionAsCenter()
+void LLPathfindingNavMeshZone::initialize()
{
llassert(LLPathingLib::getInstance() != NULL);
if (LLPathingLib::getInstance() != NULL)
{
LLPathingLib::getInstance()->cleanupResidual();
}
- mNavMeshLocations.clear();
- LLViewerRegion *currentRegion = gAgent.getRegion();
- const LLUUID &currentRegionUUID = currentRegion->getRegionID();
- NavMeshLocation centerNavMesh(currentRegionUUID, CENTER_REGION);
- mNavMeshLocations.insert(std::pair<LLUUID, NavMeshLocation>(currentRegionUUID, centerNavMesh));
+ mNavMeshLocationPtrs.clear();
+
+ NavMeshLocationPtr centerNavMeshPtr(new NavMeshLocation(CENTER_REGION, boost::bind(&LLPathfindingNavMeshZone::handleNavMeshLocation, this)));
+ mNavMeshLocationPtrs.push_back(centerNavMeshPtr);
+
+ U32 neighborRegionDir = gSavedSettings.getU32("RetrieveNeighboringRegion");
+ if (neighborRegionDir != CENTER_REGION)
+ {
+ NavMeshLocationPtr neighborNavMeshPtr(new NavMeshLocation(neighborRegionDir, boost::bind(&LLPathfindingNavMeshZone::handleNavMeshLocation, this)));
+ mNavMeshLocationPtrs.push_back(neighborNavMeshPtr);
+ }
}
-void LLPathfindingNavMeshZone::refresh()
+void LLPathfindingNavMeshZone::enable()
{
- LLPathfindingManager *pathfindingManagerInstance = LLPathfindingManager::getInstance();
- if (!mNavMeshSlot.connected())
+ for (NavMeshLocationPtrs::iterator navMeshLocationPtrIter = mNavMeshLocationPtrs.begin();
+ navMeshLocationPtrIter != mNavMeshLocationPtrs.end(); ++navMeshLocationPtrIter)
{
- mNavMeshSlot = pathfindingManagerInstance->registerNavMeshListenerForCurrentRegion(boost::bind(&LLPathfindingNavMeshZone::handleNavMesh, this, _1, _2, _3, _4));
+ NavMeshLocationPtr navMeshLocationPtr = *navMeshLocationPtrIter;
+ navMeshLocationPtr->enable();
}
-
- pathfindingManagerInstance->requestGetNavMeshForCurrentRegion();
}
void LLPathfindingNavMeshZone::disable()
{
- if (mNavMeshSlot.connected())
+ for (NavMeshLocationPtrs::iterator navMeshLocationPtrIter = mNavMeshLocationPtrs.begin();
+ navMeshLocationPtrIter != mNavMeshLocationPtrs.end(); ++navMeshLocationPtrIter)
{
- mNavMeshSlot.disconnect();
+ NavMeshLocationPtr navMeshLocationPtr = *navMeshLocationPtrIter;
+ navMeshLocationPtr->disable();
}
-
+#if 0
+ llassert(LLPathingLib::getInstance() != NULL);
if (LLPathingLib::getInstance() != NULL)
{
LLPathingLib::getInstance()->cleanupResidual();
}
-
- mNavMeshLocations.clear();
+#endif
}
-void LLPathfindingNavMeshZone::handleNavMesh(LLPathfindingNavMesh::ENavMeshRequestStatus pNavMeshRequestStatus, const LLUUID &pRegionUUID, U32 pNavMeshVersion, const LLSD::Binary &pNavMeshData)
+void LLPathfindingNavMeshZone::refresh()
{
- NavMeshLocations::iterator navMeshIter = mNavMeshLocations.find(pRegionUUID);
- if (navMeshIter != mNavMeshLocations.end())
+ for (NavMeshLocationPtrs::iterator navMeshLocationPtrIter = mNavMeshLocationPtrs.begin();
+ navMeshLocationPtrIter != mNavMeshLocationPtrs.end(); ++navMeshLocationPtrIter)
{
- navMeshIter->second.handleNavMesh(pNavMeshRequestStatus, pRegionUUID, pNavMeshVersion, pNavMeshData);
- updateStatus();
+ NavMeshLocationPtr navMeshLocationPtr = *navMeshLocationPtrIter;
+ navMeshLocationPtr->refresh();
}
}
+void LLPathfindingNavMeshZone::handleNavMeshLocation()
+{
+ updateStatus();
+}
+
void LLPathfindingNavMeshZone::updateStatus()
{
bool hasRequestUnknown = false;
@@ -120,10 +133,11 @@ void LLPathfindingNavMeshZone::updateStatus()
bool hasRequestNotEnabled = false;
bool hasRequestError = false;
- for (NavMeshLocations::iterator navMeshIter = mNavMeshLocations.begin();
- navMeshIter != mNavMeshLocations.end(); ++navMeshIter)
+ for (NavMeshLocationPtrs::iterator navMeshLocationPtrIter = mNavMeshLocationPtrs.begin();
+ navMeshLocationPtrIter != mNavMeshLocationPtrs.end(); ++navMeshLocationPtrIter)
{
- switch (navMeshIter->second.getRequestStatus())
+ NavMeshLocationPtr navMeshLocationPtr = *navMeshLocationPtrIter;
+ switch (navMeshLocationPtr->getRequestStatus())
{
case LLPathfindingNavMesh::kNavMeshRequestUnknown :
hasRequestUnknown = true;
@@ -148,23 +162,14 @@ void LLPathfindingNavMeshZone::updateStatus()
}
ENavMeshZoneRequestStatus zoneRequestStatus = kNavMeshZoneRequestUnknown;
- if (hasRequestNotEnabled)
+ if (hasRequestStarted)
{
- zoneRequestStatus = kNavMeshZoneRequestNotEnabled;
+ zoneRequestStatus = kNavMeshZoneRequestStarted;
}
else if (hasRequestError)
{
zoneRequestStatus = kNavMeshZoneRequestError;
}
- else if (hasRequestStarted)
- {
- zoneRequestStatus = kNavMeshZoneRequestStarted;
- }
- else if (hasRequestUnknown)
- {
- zoneRequestStatus = kNavMeshZoneRequestUnknown;
- llassert(0);
- }
else if (hasRequestCompleted)
{
zoneRequestStatus = kNavMeshZoneRequestCompleted;
@@ -174,6 +179,14 @@ void LLPathfindingNavMeshZone::updateStatus()
LLPathingLib::getInstance()->stitchNavMeshes( gSavedSettings.getBOOL("EnableVBOForNavMeshVisualization") );
}
}
+ else if (hasRequestNotEnabled)
+ {
+ zoneRequestStatus = kNavMeshZoneRequestNotEnabled;
+ }
+ else if (hasRequestUnknown)
+ {
+ zoneRequestStatus = kNavMeshZoneRequestUnknown;
+ }
else
{
zoneRequestStatus = kNavMeshZoneRequestError;
@@ -187,26 +200,62 @@ void LLPathfindingNavMeshZone::updateStatus()
// LLPathfindingNavMeshZone::NavMeshLocation
//---------------------------------------------------------------------------
-LLPathfindingNavMeshZone::NavMeshLocation::NavMeshLocation(const LLUUID &pRegionUUID, S32 pDirection)
- : mRegionUUID(pRegionUUID),
- mDirection(pDirection),
+LLPathfindingNavMeshZone::NavMeshLocation::NavMeshLocation(S32 pDirection, navmesh_location_callback_t pLocationCallback)
+ : mDirection(pDirection),
+ mRegionUUID(),
mHasNavMesh(false),
mNavMeshVersion(0U),
- mRequestStatus(LLPathfindingNavMesh::kNavMeshRequestUnknown)
+ mLocationCallback(pLocationCallback),
+ mRequestStatus(LLPathfindingNavMesh::kNavMeshRequestUnknown),
+ mNavMeshSlot()
{
}
-LLPathfindingNavMeshZone::NavMeshLocation::NavMeshLocation(const NavMeshLocation &other)
- : mRegionUUID(other.mRegionUUID),
- mDirection(other.mDirection),
- mHasNavMesh(other.mHasNavMesh),
- mNavMeshVersion(other.mNavMeshVersion),
- mRequestStatus(other.mRequestStatus)
+LLPathfindingNavMeshZone::NavMeshLocation::~NavMeshLocation()
{
}
-LLPathfindingNavMeshZone::NavMeshLocation::~NavMeshLocation()
+void LLPathfindingNavMeshZone::NavMeshLocation::enable()
{
+ clear();
+
+ LLViewerRegion *region = getRegion();
+ if (region == NULL)
+ {
+ mRegionUUID.setNull();
+ }
+ else
+ {
+ mRegionUUID = region->getRegionID();
+ mNavMeshSlot = LLPathfindingManager::getInstance()->registerNavMeshListenerForRegion(region, boost::bind(&LLPathfindingNavMeshZone::NavMeshLocation::handleNavMesh, this, _1, _2, _3, _4));
+ }
+}
+
+void LLPathfindingNavMeshZone::NavMeshLocation::refresh()
+{
+ LLViewerRegion *region = getRegion();
+
+ if (region == NULL)
+ {
+ llassert(mRegionUUID.isNull());
+ LLSD::Binary nullData;
+ handleNavMesh(LLPathfindingNavMesh::kNavMeshRequestUnknown, mRegionUUID, 0U, nullData);
+ }
+ else
+ {
+ llassert(mRegionUUID == region->getRegionID());
+ LLPathfindingManager::getInstance()->requestGetNavMeshForRegion(region);
+ }
+}
+
+void LLPathfindingNavMeshZone::NavMeshLocation::disable()
+{
+ clear();
+}
+
+LLPathfindingNavMesh::ENavMeshRequestStatus LLPathfindingNavMeshZone::NavMeshLocation::getRequestStatus() const
+{
+ return mRequestStatus;
}
void LLPathfindingNavMeshZone::NavMeshLocation::handleNavMesh(LLPathfindingNavMesh::ENavMeshRequestStatus pNavMeshRequestStatus, const LLUUID &pRegionUUID, U32 pNavMeshVersion, const LLSD::Binary &pNavMeshData)
@@ -224,20 +273,45 @@ void LLPathfindingNavMeshZone::NavMeshLocation::handleNavMesh(LLPathfindingNavMe
LLPathingLib::getInstance()->extractNavMeshSrcFromLLSD(pNavMeshData, mDirection);
}
}
+ mLocationCallback();
}
-LLPathfindingNavMesh::ENavMeshRequestStatus LLPathfindingNavMeshZone::NavMeshLocation::getRequestStatus() const
+void LLPathfindingNavMeshZone::NavMeshLocation::clear()
{
- return mRequestStatus;
+ mHasNavMesh = false;
+ mRequestStatus = LLPathfindingNavMesh::kNavMeshRequestUnknown;
+ if (mNavMeshSlot.connected())
+ {
+ mNavMeshSlot.disconnect();
+ }
}
-LLPathfindingNavMeshZone::NavMeshLocation &LLPathfindingNavMeshZone::NavMeshLocation::operator =(const NavMeshLocation &other)
+LLViewerRegion *LLPathfindingNavMeshZone::NavMeshLocation::getRegion() const
{
- mRegionUUID = other.mRegionUUID;
- mDirection = other.mDirection;
- mHasNavMesh = other.mHasNavMesh;
- mNavMeshVersion = other.mNavMeshVersion;
- mRequestStatus = other.mRequestStatus;
+ LLViewerRegion *region = NULL;
+
+ LLViewerRegion *currentRegion = gAgent.getRegion();
+ if (currentRegion != NULL)
+ {
+ if (mDirection == CENTER_REGION)
+ {
+ region = currentRegion;
+ }
+ else
+ {
+ //User wants to pull in a neighboring region
+ std::vector<S32> availableRegions;
+ currentRegion->getNeighboringRegionsStatus( availableRegions );
+ //Is the desired region in the available list
+ std::vector<S32>::iterator foundElem = std::find(availableRegions.begin(),availableRegions.end(),mDirection);
+ if ( foundElem != availableRegions.end() )
+ {
+ std::vector<LLViewerRegion*> neighborRegionsPtrs;
+ currentRegion->getNeighboringRegions( neighborRegionsPtrs );
+ region = neighborRegionsPtrs[foundElem - availableRegions.begin()];
+ }
+ }
+ }
- return (*this);
+ return region;
}
diff --git a/indra/newview/llpathfindingnavmeshzone.h b/indra/newview/llpathfindingnavmeshzone.h
index 9d1139de32..8489b5899b 100644
--- a/indra/newview/llpathfindingnavmeshzone.h
+++ b/indra/newview/llpathfindingnavmeshzone.h
@@ -32,8 +32,9 @@
#include "lluuid.h"
#include "llpathfindingnavmesh.h"
-#include <map>
+#include <vector>
+#include <boost/shared_ptr.hpp>
#include <boost/function.hpp>
#include <boost/signals2.hpp>
@@ -56,44 +57,53 @@ public:
virtual ~LLPathfindingNavMeshZone();
navmesh_zone_slot_t registerNavMeshZoneListener(navmesh_zone_callback_t pNavMeshZoneCallback);
- void setCurrentRegionAsCenter();
- void refresh();
- void disable();
+ void initialize();
- void handleNavMesh(LLPathfindingNavMesh::ENavMeshRequestStatus pNavMeshRequestStatus, const LLUUID &pRegionUUID, U32 pNavMeshVersion, const LLSD::Binary &pNavMeshData);
+ void enable();
+ void disable();
+ void refresh();
protected:
private:
+ typedef boost::function<void (void)> navmesh_location_callback_t;
class NavMeshLocation
{
public:
- NavMeshLocation(const LLUUID &pRegionUUID, S32 pDirection);
- NavMeshLocation(const NavMeshLocation &other);
+ NavMeshLocation(S32 pDirection, navmesh_location_callback_t pLocationCallback);
virtual ~NavMeshLocation();
- void handleNavMesh(LLPathfindingNavMesh::ENavMeshRequestStatus pNavMeshRequestStatus, const LLUUID &pRegionUUID, U32 pNavMeshVersion, const LLSD::Binary &pNavMeshData);
- LLPathfindingNavMesh::ENavMeshRequestStatus getRequestStatus() const;
+ void enable();
+ void refresh();
+ void disable();
- NavMeshLocation &operator =(const NavMeshLocation &other);
+ LLPathfindingNavMesh::ENavMeshRequestStatus getRequestStatus() const;
protected:
private:
- LLUUID mRegionUUID;
+ void handleNavMesh(LLPathfindingNavMesh::ENavMeshRequestStatus pNavMeshRequestStatus, const LLUUID &pRegionUUID, U32 pNavMeshVersion, const LLSD::Binary &pNavMeshData);
+
+ void clear();
+ LLViewerRegion *getRegion() const;
+
S32 mDirection;
+ LLUUID mRegionUUID;
bool mHasNavMesh;
U32 mNavMeshVersion;
+ navmesh_location_callback_t mLocationCallback;
LLPathfindingNavMesh::ENavMeshRequestStatus mRequestStatus;
+ LLPathfindingNavMesh::navmesh_slot_t mNavMeshSlot;
};
- typedef std::map<LLUUID, NavMeshLocation> NavMeshLocations;
+ typedef boost::shared_ptr<NavMeshLocation> NavMeshLocationPtr;
+ typedef std::vector<NavMeshLocationPtr> NavMeshLocationPtrs;
+ void handleNavMeshLocation();
void updateStatus();
- NavMeshLocations mNavMeshLocations;
- navmesh_zone_signal_t mNavMeshZoneSignal;
- LLPathfindingNavMesh::navmesh_slot_t mNavMeshSlot;
+ NavMeshLocationPtrs mNavMeshLocationPtrs;
+ navmesh_zone_signal_t mNavMeshZoneSignal;
};
#endif // LL_LLPATHFINDINGNAVMESHZONE_H