diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index c5eac457fd4dd94ac29b5aa9f0687a68a2731eef..44cb23b648cc106524fc5a0c4365c2daf9afd834 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -421,6 +421,7 @@ set(viewer_SOURCE_FILES llpathfindinglinksetlist.cpp llpathfindingmanager.cpp llpathfindingnavmesh.cpp + llpathfindingnavmeshzone.cpp llphysicsmotion.cpp llphysicsshapebuilderutil.cpp llplacesinventorybridge.cpp @@ -975,6 +976,7 @@ set(viewer_HEADER_FILES llpathfindinglinksetlist.h llpathfindingmanager.h llpathfindingnavmesh.h + llpathfindingnavmeshzone.h llphysicsmotion.h llphysicsshapebuilderutil.h llplacesinventorybridge.h diff --git a/indra/newview/llfloaterpathfindingconsole.cpp b/indra/newview/llfloaterpathfindingconsole.cpp index 02f2bf8d72dd964961d4680a6ff21c38c9dbf821..094f7749c16235041ffc8980f0189ced5241df73 100644 --- a/indra/newview/llfloaterpathfindingconsole.cpp +++ b/indra/newview/llfloaterpathfindingconsole.cpp @@ -46,7 +46,7 @@ #include "llviewerwindow.h" #include "llviewercamera.h" #include "llviewercontrol.h" -#include "llpathfindingnavmesh.h" +#include "llpathfindingnavmeshzone.h" #include "llpathfindingmanager.h" #include "LLPathingLib.h" @@ -64,9 +64,6 @@ #define XUI_TEST_TAB_INDEX 1 -const int CURRENT_REGION = 99; -const int MAX_OBSERVERS = 10; - LLHandle<LLFloaterPathfindingConsole> LLFloaterPathfindingConsole::sInstanceHandle; //--------------------------------------------------------------------------- @@ -165,16 +162,17 @@ void LLFloaterPathfindingConsole::onOpen(const LLSD& pKey) if ( LLPathingLib::getInstance() == NULL ) { setConsoleState(kConsoleStateLibraryNotImplemented); - llwarns <<"Errror: cannout find pathing library implementation."<<llendl; + llwarns <<"Errror: cannot find pathing library implementation."<<llendl; } else { - LLPathfindingManager *pathfindingManagerInstance = LLPathfindingManager::getInstance(); - if (!mNavMeshSlot.connected()) + if (!mNavMeshZoneSlot.connected()) { - pathfindingManagerInstance->registerNavMeshListenerForCurrentRegion(boost::bind(&LLFloaterPathfindingConsole::onNavMeshDownloadCB, this, _1, _2, _3, _4)); + mNavMeshZone.registerNavMeshZoneListener(boost::bind(&LLFloaterPathfindingConsole::onNavMeshZoneCB, this, _1)); } - pathfindingManagerInstance->requestGetNavMeshForCurrentRegion(); + + mNavMeshZone.setCurrentRegionAsCenter(); + mNavMeshZone.refresh(); #if 0 LLPathingLib::getInstance()->cleanupResidual(); @@ -262,12 +260,13 @@ void LLFloaterPathfindingConsole::onClose(bool pIsAppQuitting) mAgentStateSlot.disconnect(); } - if (mNavMeshSlot.connected()) + if (mNavMeshZoneSlot.connected()) { - mNavMeshSlot.disconnect(); + mNavMeshZoneSlot.disconnect(); } - clearNavMesh(); + //mNavMeshZone.disable(); + LLFloater::onClose(pIsAppQuitting); setHeartBeat( false ); setConsoleState(kConsoleStateUnknown); @@ -516,26 +515,6 @@ void LLFloaterPathfindingConsole::setCharacterType(ECharacterType pCharacterType mCharacterTypeRadioGroup->setValue(radioGroupValue); } -#if 0 -void LLFloaterPathfindingConsole::setHasNavMeshReceived() -{ - std::string str = getString("navmesh_fetch_complete_available"); - mPathfindingStatus->setText((LLStringExplicit)str); - //check to see if all regions are done loading and they are then stitch the navmeshes together - --mNavMeshCnt; - if ( mNavMeshCnt == 0 ) - { - LLPathingLib::getInstance()->stitchNavMeshes( gSavedSettings.getBOOL("EnableVBOForNavMeshVisualization") ); - } -} - -void LLFloaterPathfindingConsole::setHasNoNavMesh() -{ - std::string str = getString("navmesh_fetch_complete_none"); - mPathfindingStatus->setText((LLStringExplicit)str); -} -#endif - LLFloaterPathfindingConsole::LLFloaterPathfindingConsole(const LLSD& pSeed) : LLFloater(pSeed), mSelfHandle(), @@ -561,27 +540,16 @@ LLFloaterPathfindingConsole::LLFloaterPathfindingConsole(const LLSD& pSeed) mCharacterTypeRadioGroup(NULL), mPathTestingStatus(NULL), mClearPathButton(NULL), - mNavMeshSlot(), + mNavMeshZoneSlot(), + mNavMeshZone(), mAgentStateSlot(), mConsoleState(kConsoleStateUnknown), - mHasNavMesh(false), - mNavMeshRegionVersion(0U), - mNavMeshRegionUUID(), -#if 0 - mNavMeshCnt(0), - mNeighboringRegion( CURRENT_REGION ), -#endif + mPathData(), mHasStartPoint(false), mHasEndPoint(false), mHeartBeat( false ) { mSelfHandle.bind(this); -#if 0 - for (int i=0;i<MAX_OBSERVERS;++i) - { - mNavMeshDownloadObserver[i].setPathfindingConsole(this); - } -#endif } LLFloaterPathfindingConsole::~LLFloaterPathfindingConsole() @@ -705,57 +673,30 @@ void LLFloaterPathfindingConsole::onClearPathClicked() updatePathTestStatus(); } -void LLFloaterPathfindingConsole::onNavMeshDownloadCB(LLPathfindingNavMesh::ENavMeshRequestStatus pNavMeshRequestStatus, const LLUUID &pRegionUUID, U32 pNavMeshVersion, const LLSD::Binary &pNavMeshData) +void LLFloaterPathfindingConsole::onNavMeshZoneCB(LLPathfindingNavMeshZone::ENavMeshZoneRequestStatus pNavMeshZoneRequestStatus) { - - switch (pNavMeshRequestStatus) + switch (pNavMeshZoneRequestStatus) { - case LLPathfindingNavMesh::kNavMeshRequestStarted : + case LLPathfindingNavMeshZone::kNavMeshZoneRequestStarted : setConsoleState(kConsoleStateDownloading); break; - case LLPathfindingNavMesh::kNavMeshRequestCompleted : - updateNavMesh(pRegionUUID, pNavMeshVersion, pNavMeshData); + case LLPathfindingNavMeshZone::kNavMeshZoneRequestCompleted : setConsoleState(kConsoleStateHasNavMesh); break; - case LLPathfindingNavMesh::kNavMeshRequestNotEnabled : - clearNavMesh(); + case LLPathfindingNavMeshZone::kNavMeshZoneRequestNotEnabled : setConsoleState(kConsoleStateRegionNotEnabled); break; - case LLPathfindingNavMesh::kNavMeshRequestMessageError : - clearNavMesh(); - setConsoleState(kConsoleStateDownloadError); + case LLPathfindingNavMeshZone::kNavMeshZoneRequestError : + setConsoleState(kConsoleStateError); break; - case LLPathfindingNavMesh::kNavMeshRequestFormatError : - clearNavMesh(); - setConsoleState(kConsoleStateNavMeshError); - break; - case LLPathfindingNavMesh::kNavMeshRequestUnknown : + case LLPathfindingNavMeshZone::kNavMeshZoneRequestUnknown : 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); @@ -792,8 +733,7 @@ void LLFloaterPathfindingConsole::updateControlsOnConsoleState() mHasEndPoint = false; break; case kConsoleStateDownloading : - case kConsoleStateDownloadError : - case kConsoleStateNavMeshError : + case kConsoleStateError : mShowNavMeshCheckBox->setEnabled(FALSE); mShowNavMeshWalkabilityComboBox->setEnabled(FALSE); mShowWalkablesCheckBox->setEnabled(FALSE); @@ -861,12 +801,8 @@ void LLFloaterPathfindingConsole::updateStatusOnConsoleState() 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"); + case kConsoleStateError : + statusText = getString("navmesh_status_error"); styleParams.color = warningColor; break; default : diff --git a/indra/newview/llfloaterpathfindingconsole.h b/indra/newview/llfloaterpathfindingconsole.h index 237d4216bbf139b5787291bc47611cf4509ceb64..b1886fb71634bf64f023445dc04471977aa8c3b7 100644 --- a/indra/newview/llfloaterpathfindingconsole.h +++ b/indra/newview/llfloaterpathfindingconsole.h @@ -32,7 +32,7 @@ #include "llhandle.h" #include "LLPathingLib.h" #include "llpathfindingmanager.h" -#include "llpathfindingnavmesh.h" +#include "llpathfindingnavmeshzone.h" class LLSD; class LLPanel; @@ -123,8 +123,7 @@ class LLFloaterPathfindingConsole kConsoleStateDownloading, kConsoleStateHasNavMesh, kConsoleStateHasNavMeshDownloading, - kConsoleStateDownloadError, - kConsoleStateNavMeshError + kConsoleStateError } EConsoleState; // Does its own instance management, so clients not allowed @@ -141,12 +140,10 @@ class LLFloaterPathfindingConsole void onFreezeClicked(); void onViewEditLinksetClicked(); void onClearPathClicked(); - void onNavMeshDownloadCB(LLPathfindingNavMesh::ENavMeshRequestStatus pNavMeshRequestStatus, const LLUUID &pRegionUUID, U32 pNavMeshVersion, const LLSD::Binary &pNavMeshData); + void onNavMeshZoneCB(LLPathfindingNavMeshZone::ENavMeshZoneRequestStatus pNavMeshZoneRequestStatus); 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(); @@ -158,48 +155,44 @@ class LLFloaterPathfindingConsole void resetShapeRenderFlags() { mShapeRenderFlags = 0; } void setShapeRenderFlag( LLPathingLib::LLShapeType type ) { mShapeRenderFlags |= (1<<type); } - LLRootHandle<LLFloaterPathfindingConsole> mSelfHandle; - LLCheckBoxCtrl *mShowNavMeshCheckBox; - LLComboBox *mShowNavMeshWalkabilityComboBox; - LLCheckBoxCtrl *mShowWalkablesCheckBox; - LLCheckBoxCtrl *mShowStaticObstaclesCheckBox; - LLCheckBoxCtrl *mShowMaterialVolumesCheckBox; - LLCheckBoxCtrl *mShowExclusionVolumesCheckBox; - LLCheckBoxCtrl *mShowWorldCheckBox; - LLTextBase *mPathfindingStatus; - LLButton *mViewCharactersButton; - LLTabContainer *mEditTestTabContainer; - LLPanel *mEditTab; - LLPanel *mTestTab; - LLTextBase *mUnfreezeLabel; - LLButton *mUnfreezeButton; - LLTextBase *mLinksetsLabel; - LLButton *mLinksetsButton; - LLTextBase *mFreezeLabel; - LLButton *mFreezeButton; - LLSliderCtrl *mCharacterWidthSlider; - 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 + LLRootHandle<LLFloaterPathfindingConsole> mSelfHandle; + LLCheckBoxCtrl *mShowNavMeshCheckBox; + LLComboBox *mShowNavMeshWalkabilityComboBox; + LLCheckBoxCtrl *mShowWalkablesCheckBox; + LLCheckBoxCtrl *mShowStaticObstaclesCheckBox; + LLCheckBoxCtrl *mShowMaterialVolumesCheckBox; + LLCheckBoxCtrl *mShowExclusionVolumesCheckBox; + LLCheckBoxCtrl *mShowWorldCheckBox; + LLTextBase *mPathfindingStatus; + LLButton *mViewCharactersButton; + LLTabContainer *mEditTestTabContainer; + LLPanel *mEditTab; + LLPanel *mTestTab; + LLTextBase *mUnfreezeLabel; + LLButton *mUnfreezeButton; + LLTextBase *mLinksetsLabel; + LLButton *mLinksetsButton; + LLTextBase *mFreezeLabel; + LLButton *mFreezeButton; + LLSliderCtrl *mCharacterWidthSlider; + LLRadioGroup *mCharacterTypeRadioGroup; + LLTextBase *mPathTestingStatus; + LLButton *mClearPathButton; + + + LLPathfindingNavMeshZone::navmesh_zone_slot_t mNavMeshZoneSlot; + LLPathfindingNavMeshZone mNavMeshZone; + LLPathfindingManager::agent_state_slot_t mAgentStateSlot; + + EConsoleState mConsoleState; + //Container that is populated and subsequently submitted to the LLPathingSystem for processing LLPathingLib::PathingPacket mPathData; bool mHasStartPoint; bool mHasEndPoint; U32 mShapeRenderFlags; bool mHeartBeat; + static LLHandle<LLFloaterPathfindingConsole> sInstanceHandle; }; diff --git a/indra/newview/llpathfindingnavmesh.cpp b/indra/newview/llpathfindingnavmesh.cpp index fd1a498e3bb51f53b920e85448ee42372818b0fd..469972efa9f52c800777f7b8000666d0bb77f8af 100644 --- a/indra/newview/llpathfindingnavmesh.cpp +++ b/indra/newview/llpathfindingnavmesh.cpp @@ -87,7 +87,7 @@ void LLPathfindingNavMesh::handleNavMeshResult(const LLSD &pContent, U32 pNavMes if ( !valid ) { llwarns << "Unable to decompress the navmesh llsd." << llendl; - setRequestStatus(kNavMeshRequestFormatError); + setRequestStatus(kNavMeshRequestError); } else { @@ -104,7 +104,7 @@ void LLPathfindingNavMesh::handleNavMeshResult(const LLSD &pContent, U32 pNavMes else { llwarns << "No mesh data received" << llendl; - setRequestStatus(kNavMeshRequestMessageError); + setRequestStatus(kNavMeshRequestError); } } } @@ -122,7 +122,7 @@ void LLPathfindingNavMesh::handleNavMeshError(U32 pStatus, const std::string &pR mNavMeshData.clear(); if (mNavMeshVersion == pNavMeshVersion) { - setRequestStatus(kNavMeshRequestMessageError); + setRequestStatus(kNavMeshRequestError); } } diff --git a/indra/newview/llpathfindingnavmesh.h b/indra/newview/llpathfindingnavmesh.h index 1f033e15c7690ac24d19718fd4d93b46c84d798f..26ef21f90eba5f8c3aba79826288143361ef1f92 100644 --- a/indra/newview/llpathfindingnavmesh.h +++ b/indra/newview/llpathfindingnavmesh.h @@ -50,8 +50,7 @@ class LLPathfindingNavMesh kNavMeshRequestStarted, kNavMeshRequestCompleted, kNavMeshRequestNotEnabled, - kNavMeshRequestMessageError, - kNavMeshRequestFormatError + kNavMeshRequestError } ENavMeshRequestStatus; typedef boost::function<void (ENavMeshRequestStatus, const LLUUID &, U32, const LLSD::Binary &)> navmesh_callback_t; diff --git a/indra/newview/llpathfindingnavmeshzone.cpp b/indra/newview/llpathfindingnavmeshzone.cpp new file mode 100644 index 0000000000000000000000000000000000000000..986acfa3e8eb7df39141eea27ab85fefbeb6418f --- /dev/null +++ b/indra/newview/llpathfindingnavmeshzone.cpp @@ -0,0 +1,230 @@ +/** + * @file llpathfindingnavmeshzone.cpp + * @author William Todd Stinson + * @brief A class for representing the zone of navmeshes containing and possible surrounding the current 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 "llsd.h" +#include "lluuid.h" +#include "llagent.h" +#include "llviewerregion.h" +#include "llpathfindingnavmesh.h" +#include "llpathfindingnavmeshzone.h" +#include "llpathfindingmanager.h" +#include "llviewercontrol.h" + +#include "LLPathingLib.h" + +#include <string> +#include <map> + +#define CENTER_REGION 99 + +//--------------------------------------------------------------------------- +// LLPathfindingNavMeshZone +//--------------------------------------------------------------------------- + +LLPathfindingNavMeshZone::LLPathfindingNavMeshZone() + : mNavMeshLocations(), + mNavMeshZoneSignal(), + mNavMeshSlot() +{ +} + +LLPathfindingNavMeshZone::~LLPathfindingNavMeshZone() +{ +} + +LLPathfindingNavMeshZone::navmesh_zone_slot_t LLPathfindingNavMeshZone::registerNavMeshZoneListener(navmesh_zone_callback_t pNavMeshZoneCallback) +{ + return mNavMeshZoneSignal.connect(pNavMeshZoneCallback); +} + +void LLPathfindingNavMeshZone::setCurrentRegionAsCenter() +{ + llassert(LLPathingLib::getInstance() != NULL); + LLPathingLib::getInstance()->cleanupResidual(); + mNavMeshLocations.clear(); + LLViewerRegion *currentRegion = gAgent.getRegion(); + const LLUUID ¤tRegionUUID = currentRegion->getRegionID(); + NavMeshLocation centerNavMesh(currentRegionUUID, CENTER_REGION); + mNavMeshLocations.insert(std::pair<LLUUID, NavMeshLocation>(currentRegionUUID, centerNavMesh)); +} + +void LLPathfindingNavMeshZone::refresh() +{ + LLPathfindingManager *pathfindingManagerInstance = LLPathfindingManager::getInstance(); + if (!mNavMeshSlot.connected()) + { + pathfindingManagerInstance->registerNavMeshListenerForCurrentRegion(boost::bind(&LLPathfindingNavMeshZone::handleNavMesh, this, _1, _2, _3, _4)); + } + + pathfindingManagerInstance->requestGetNavMeshForCurrentRegion(); +} + +void LLPathfindingNavMeshZone::disable() +{ + if (mNavMeshSlot.connected()) + { + mNavMeshSlot.disconnect(); + } + + llassert(LLPathingLib::getInstance() != NULL); + LLPathingLib::getInstance()->cleanupResidual(); + + mNavMeshLocations.clear(); +} + +void LLPathfindingNavMeshZone::handleNavMesh(LLPathfindingNavMesh::ENavMeshRequestStatus pNavMeshRequestStatus, const LLUUID &pRegionUUID, U32 pNavMeshVersion, const LLSD::Binary &pNavMeshData) +{ + NavMeshLocations::iterator navMeshIter = mNavMeshLocations.find(pRegionUUID); + if (navMeshIter != mNavMeshLocations.end()) + { + navMeshIter->second.handleNavMesh(pNavMeshRequestStatus, pRegionUUID, pNavMeshVersion, pNavMeshData); + updateStatus(); + } +} + +void LLPathfindingNavMeshZone::updateStatus() +{ + bool hasRequestUnknown = false; + bool hasRequestStarted = false; + bool hasRequestCompleted = false; + bool hasRequestNotEnabled = false; + bool hasRequestError = false; + + for (NavMeshLocations::iterator navMeshIter = mNavMeshLocations.begin(); + navMeshIter != mNavMeshLocations.end(); ++navMeshIter) + { + switch (navMeshIter->second.getRequestStatus()) + { + case LLPathfindingNavMesh::kNavMeshRequestUnknown : + hasRequestUnknown = true; + break; + case LLPathfindingNavMesh::kNavMeshRequestStarted : + hasRequestStarted = true; + break; + case LLPathfindingNavMesh::kNavMeshRequestCompleted : + hasRequestCompleted = true; + break; + case LLPathfindingNavMesh::kNavMeshRequestNotEnabled : + hasRequestNotEnabled = true; + break; + case LLPathfindingNavMesh::kNavMeshRequestError : + hasRequestError = true; + break; + default : + hasRequestError = true; + llassert(0); + break; + } + } + + ENavMeshZoneRequestStatus zoneRequestStatus = kNavMeshZoneRequestUnknown; + if (hasRequestNotEnabled) + { + zoneRequestStatus = kNavMeshZoneRequestNotEnabled; + } + else if (hasRequestError) + { + zoneRequestStatus = kNavMeshZoneRequestError; + } + else if (hasRequestStarted) + { + zoneRequestStatus = kNavMeshZoneRequestStarted; + } + else if (hasRequestUnknown) + { + zoneRequestStatus = kNavMeshZoneRequestUnknown; + llassert(0); + } + else if (hasRequestCompleted) + { + zoneRequestStatus = kNavMeshZoneRequestCompleted; + LLPathingLib::getInstance()->stitchNavMeshes( gSavedSettings.getBOOL("EnableVBOForNavMeshVisualization") ); + } + else + { + zoneRequestStatus = kNavMeshZoneRequestError; + llassert(0); + } + + mNavMeshZoneSignal(zoneRequestStatus); +} + +//--------------------------------------------------------------------------- +// LLPathfindingNavMeshZone::NavMeshLocation +//--------------------------------------------------------------------------- + +LLPathfindingNavMeshZone::NavMeshLocation::NavMeshLocation(const LLUUID &pRegionUUID, S32 pDirection) + : mRegionUUID(pRegionUUID), + mDirection(pDirection), + mHasNavMesh(false), + mNavMeshVersion(0U), + mRequestStatus(LLPathfindingNavMesh::kNavMeshRequestUnknown) +{ +} + +LLPathfindingNavMeshZone::NavMeshLocation::NavMeshLocation(const NavMeshLocation &other) + : mRegionUUID(other.mRegionUUID), + mDirection(other.mDirection), + mHasNavMesh(other.mHasNavMesh), + mNavMeshVersion(other.mNavMeshVersion), + mRequestStatus(other.mRequestStatus) +{ +} + +LLPathfindingNavMeshZone::NavMeshLocation::~NavMeshLocation() +{ +} + +void LLPathfindingNavMeshZone::NavMeshLocation::handleNavMesh(LLPathfindingNavMesh::ENavMeshRequestStatus pNavMeshRequestStatus, const LLUUID &pRegionUUID, U32 pNavMeshVersion, const LLSD::Binary &pNavMeshData) +{ + llassert(mRegionUUID == pRegionUUID); + mRequestStatus = pNavMeshRequestStatus; + if ((pNavMeshRequestStatus == LLPathfindingNavMesh::kNavMeshRequestCompleted) && (!mHasNavMesh || (mNavMeshVersion != pNavMeshVersion))) + { + llassert(!pNavMeshData.empty()); + mHasNavMesh = true; + mNavMeshVersion = pNavMeshVersion; + LLPathingLib::getInstance()->extractNavMeshSrcFromLLSD(pNavMeshData, mDirection); + } +} + +LLPathfindingNavMesh::ENavMeshRequestStatus LLPathfindingNavMeshZone::NavMeshLocation::getRequestStatus() const +{ + return mRequestStatus; +} + +LLPathfindingNavMeshZone::NavMeshLocation &LLPathfindingNavMeshZone::NavMeshLocation::operator =(const NavMeshLocation &other) +{ + mRegionUUID = other.mRegionUUID; + mDirection = other.mDirection; + mHasNavMesh = other.mHasNavMesh; + mNavMeshVersion = other.mNavMeshVersion; + mRequestStatus = other.mRequestStatus; + + return (*this); +} diff --git a/indra/newview/llpathfindingnavmeshzone.h b/indra/newview/llpathfindingnavmeshzone.h new file mode 100644 index 0000000000000000000000000000000000000000..9d1139de324667ce5359e08376b6b198030cba1e --- /dev/null +++ b/indra/newview/llpathfindingnavmeshzone.h @@ -0,0 +1,99 @@ +/** + * @file llpathfindingnavmeshzone.h + * @author William Todd Stinson + * @brief A class for representing the zone of navmeshes containing and possible surrounding the current 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_LLPATHFINDINGNAVMESHZONE_H +#define LL_LLPATHFINDINGNAVMESHZONE_H + +#include "llsd.h" +#include "lluuid.h" +#include "llpathfindingnavmesh.h" + +#include <map> + +#include <boost/function.hpp> +#include <boost/signals2.hpp> + +class LLPathfindingNavMeshZone +{ +public: + typedef enum { + kNavMeshZoneRequestUnknown, + kNavMeshZoneRequestStarted, + kNavMeshZoneRequestCompleted, + kNavMeshZoneRequestNotEnabled, + kNavMeshZoneRequestError + } ENavMeshZoneRequestStatus; + + 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; + + LLPathfindingNavMeshZone(); + virtual ~LLPathfindingNavMeshZone(); + + navmesh_zone_slot_t registerNavMeshZoneListener(navmesh_zone_callback_t pNavMeshZoneCallback); + void setCurrentRegionAsCenter(); + void refresh(); + void disable(); + + void handleNavMesh(LLPathfindingNavMesh::ENavMeshRequestStatus pNavMeshRequestStatus, const LLUUID &pRegionUUID, U32 pNavMeshVersion, const LLSD::Binary &pNavMeshData); + +protected: + +private: + class NavMeshLocation + { + public: + NavMeshLocation(const LLUUID &pRegionUUID, S32 pDirection); + NavMeshLocation(const NavMeshLocation &other); + virtual ~NavMeshLocation(); + + void handleNavMesh(LLPathfindingNavMesh::ENavMeshRequestStatus pNavMeshRequestStatus, const LLUUID &pRegionUUID, U32 pNavMeshVersion, const LLSD::Binary &pNavMeshData); + LLPathfindingNavMesh::ENavMeshRequestStatus getRequestStatus() const; + + NavMeshLocation &operator =(const NavMeshLocation &other); + + protected: + + private: + LLUUID mRegionUUID; + S32 mDirection; + bool mHasNavMesh; + U32 mNavMeshVersion; + LLPathfindingNavMesh::ENavMeshRequestStatus mRequestStatus; + }; + + typedef std::map<LLUUID, NavMeshLocation> NavMeshLocations; + + void updateStatus(); + + NavMeshLocations mNavMeshLocations; + navmesh_zone_signal_t mNavMeshZoneSignal; + LLPathfindingNavMesh::navmesh_slot_t mNavMeshSlot; +}; + +#endif // LL_LLPATHFINDINGNAVMESHZONE_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 557708330353d82aa548ec91ea7e371b28d25f42..6c97af28783ba5983105d236b4894ec5b93a161c 100644 --- a/indra/newview/skins/default/xui/en/floater_pathfinding_console.xml +++ b/indra/newview/skins/default/xui/en/floater_pathfinding_console.xml @@ -17,8 +17,7 @@ <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="navmesh_status_error">Unable to download navmesh successfully.</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>