From b20f1a51430f1d611c129e170bf69bc52b9d0700 Mon Sep 17 00:00:00 2001 From: Todd Stinson <stinson@lindenlab.com> Date: Mon, 18 Jun 2012 19:07:37 -0700 Subject: [PATCH] PATH-750: Adding icon to display pathfinding dirty state. --- indra/newview/lllocationinputctrl.cpp | 52 +++++++++++++++++- indra/newview/lllocationinputctrl.h | 15 ++++- .../textures/icons/Pathfinding_Dirty.png | Bin 0 -> 553 bytes .../skins/default/textures/textures.xml | 1 + .../skins/default/xui/en/notifications.xml | 11 +++- .../newview/skins/default/xui/en/strings.xml | 3 +- .../default/xui/en/widgets/location_input.xml | 9 +++ 7 files changed, 86 insertions(+), 5 deletions(-) create mode 100644 indra/newview/skins/default/textures/icons/Pathfinding_Dirty.png diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp index 0f299683a5d..8d9d70b50ee 100644 --- a/indra/newview/lllocationinputctrl.cpp +++ b/indra/newview/lllocationinputctrl.cpp @@ -44,10 +44,14 @@ // newview includes #include "llagent.h" +#include "llenvmanager.h" #include "llfloatersidepanelcontainer.h" #include "llinventoryobserver.h" #include "lllandmarkactions.h" #include "lllandmarklist.h" +#include "llpathfindingmanager.h" +#include "llpathfindingnavmesh.h" +#include "llpathfindingnavmeshstatus.h" #include "llteleporthistory.h" #include "llslurl.h" #include "llstatusbar.h" // getHealth() @@ -192,6 +196,7 @@ LLLocationInputCtrl::Params::Params() damage_text("damage_text"), see_avatars_icon("see_avatars_icon"), maturity_help_topic("maturity_help_topic"), + pathfinding_dirty_icon("pathfinding_dirty_icon"), pathfinding_disabled_icon("pathfinding_disabled_icon") { } @@ -204,6 +209,9 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p) mAddLandmarkBtn(NULL), mForSaleBtn(NULL), mInfoBtn(NULL), + mRegionCrossingSlot(), + mNavMeshSlot(), + mIsNavMeshDirty(false), mLandmarkImageOn(NULL), mLandmarkImageOff(NULL), mIconMaturityGeneral(NULL), @@ -338,6 +346,13 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p) mParcelIcon[DAMAGE_ICON]->setMouseDownCallback(boost::bind(&LLLocationInputCtrl::onParcelIconClick, this, DAMAGE_ICON)); addChild(mParcelIcon[DAMAGE_ICON]); + LLIconCtrl::Params pathfinding_dirty_icon = p.pathfinding_dirty_icon; + pathfinding_dirty_icon.tool_tip = LLTrans::getString("LocationCtrlPathfindingDirtyTooltip"); + pathfinding_dirty_icon.mouse_opaque = true; + mParcelIcon[PATHFINDING_DIRTY_ICON] = LLUICtrlFactory::create<LLIconCtrl>(pathfinding_dirty_icon); + mParcelIcon[PATHFINDING_DIRTY_ICON]->setMouseDownCallback(boost::bind(&LLLocationInputCtrl::onParcelIconClick, this, PATHFINDING_DIRTY_ICON)); + addChild(mParcelIcon[PATHFINDING_DIRTY_ICON]); + LLIconCtrl::Params pathfinding_disabled_icon = p.pathfinding_disabled_icon; pathfinding_disabled_icon.tool_tip = LLTrans::getString("LocationCtrlPathfindingDisabledTooltip"); pathfinding_disabled_icon.mouse_opaque = true; @@ -399,6 +414,9 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p) mLocationHistoryConnection = LLLocationHistory::getInstance()->setChangedCallback( boost::bind(&LLLocationInputCtrl::onLocationHistoryChanged, this,_1)); + mRegionCrossingSlot = LLEnvManagerNew::getInstance()->setRegionChangeCallback(boost::bind(&LLLocationInputCtrl::onRegionBoundaryCrossed, this)); + createNavMeshStatusListenerForCurrentRegion(); + mRemoveLandmarkObserver = new LLRemoveLandmarkObserver(this); mAddLandmarkObserver = new LLAddLandmarkObserver(this); gInventory.addObserver(mRemoveLandmarkObserver); @@ -423,6 +441,8 @@ LLLocationInputCtrl::~LLLocationInputCtrl() LLViewerParcelMgr::getInstance()->removeObserver(mParcelChangeObserver); delete mParcelChangeObserver; + mRegionCrossingSlot.disconnect(); + mNavMeshSlot.disconnect(); mCoordinatesControlConnection.disconnect(); mParcelPropertiesControlConnection.disconnect(); mParcelMgrConnection.disconnect(); @@ -644,6 +664,17 @@ void LLLocationInputCtrl::onMaturityButtonClicked() LLUI::sHelpImpl->showTopic(mMaturityHelpTopic); } +void LLLocationInputCtrl::onRegionBoundaryCrossed() +{ + createNavMeshStatusListenerForCurrentRegion(); +} + +void LLLocationInputCtrl::onNavMeshStatusChange(const LLPathfindingNavMeshStatus &pNavMeshStatus) +{ + mIsNavMeshDirty = pNavMeshStatus.isValid() && (pNavMeshStatus.getStatus() != LLPathfindingNavMeshStatus::kComplete); + refreshParcelIcons(); +} + void LLLocationInputCtrl::onLandmarkLoaded(LLLandmark* lm) { (void) lm; @@ -836,7 +867,8 @@ void LLLocationInputCtrl::refreshParcelIcons() mParcelIcon[BUILD_ICON]->setVisible( !allow_build ); mParcelIcon[SCRIPTS_ICON]->setVisible( !allow_scripts ); mParcelIcon[DAMAGE_ICON]->setVisible( allow_damage ); - mParcelIcon[PATHFINDING_DISABLED_ICON]->setVisible( !pathfinding_dynamic_enabled ); + mParcelIcon[PATHFINDING_DIRTY_ICON]->setVisible(mIsNavMeshDirty); + mParcelIcon[PATHFINDING_DISABLED_ICON]->setVisible(!mIsNavMeshDirty && !pathfinding_dynamic_enabled); mDamageText->setVisible(allow_damage); mParcelIcon[SEE_AVATARS_ICON]->setVisible( !see_avs ); @@ -1176,6 +1208,9 @@ void LLLocationInputCtrl::onParcelIconClick(EParcelIcon icon) case BUILD_ICON: LLNotificationsUtil::add("NoBuild"); break; + case PATHFINDING_DIRTY_ICON: + LLNotificationsUtil::add("PathfindingDirty"); + break; case PATHFINDING_DISABLED_ICON: LLNotificationsUtil::add("DynamicPathfindingDisabled"); break; @@ -1207,3 +1242,18 @@ void LLLocationInputCtrl::onParcelIconClick(EParcelIcon icon) // no default to get compiler warning when a new icon gets added } } + +void LLLocationInputCtrl::createNavMeshStatusListenerForCurrentRegion() +{ + if (mNavMeshSlot.connected()) + { + mNavMeshSlot.disconnect(); + } + + LLViewerRegion *currentRegion = gAgent.getRegion(); + if (currentRegion != NULL) + { + mNavMeshSlot = LLPathfindingManager::getInstance()->registerNavMeshListenerForRegion(currentRegion, boost::bind(&LLLocationInputCtrl::onNavMeshStatusChange, this, _2)); + LLPathfindingManager::getInstance()->requestGetNavMeshForRegion(currentRegion, true); + } +} diff --git a/indra/newview/lllocationinputctrl.h b/indra/newview/lllocationinputctrl.h index 14650c57b57..cd6fd240778 100644 --- a/indra/newview/lllocationinputctrl.h +++ b/indra/newview/lllocationinputctrl.h @@ -31,6 +31,7 @@ #include "lliconctrl.h" // Params #include "lltextbox.h" // Params #include "lllocationhistory.h" +#include "llpathfindingnavmesh.h" class LLLandmark; @@ -40,6 +41,7 @@ class LLRemoveLandmarkObserver; class LLParcelChangeObserver; class LLMenuGL; class LLTeleportHistoryItem; +class LLPathfindingNavMeshStatus; /** * Location input control. @@ -79,6 +81,7 @@ class LLLocationInputCtrl scripts_icon, damage_icon, see_avatars_icon, + pathfinding_dirty_icon, pathfinding_disabled_icon; Optional<LLTextBox::Params> damage_text; Params(); @@ -117,8 +120,9 @@ class LLLocationInputCtrl SCRIPTS_ICON, // 4 DAMAGE_ICON, // 5 SEE_AVATARS_ICON, // 6 - PATHFINDING_DISABLED_ICON,// 7 - ICON_COUNT // 8 total + PATHFINDING_DIRTY_ICON, // 7 + PATHFINDING_DISABLED_ICON,// 8 + ICON_COUNT // 9 total }; friend class LLUICtrlFactory; @@ -157,11 +161,15 @@ class LLLocationInputCtrl void onAddLandmarkButtonClicked(); void onAgentParcelChange(); void onMaturityButtonClicked(); + void onRegionBoundaryCrossed(); + void onNavMeshStatusChange(const LLPathfindingNavMeshStatus &pNavMeshStatus); // callbacks bool onLocationContextMenuItemEnabled(const LLSD& userdata); void onLocationContextMenuItemClicked(const LLSD& userdata); void onParcelIconClick(EParcelIcon icon); + void createNavMeshStatusListenerForCurrentRegion(); + LLMenuGL* mLocationContextMenu; LLButton* mAddLandmarkBtn; LLButton* mForSaleBtn; @@ -181,6 +189,9 @@ class LLLocationInputCtrl boost::signals2::connection mParcelPropertiesControlConnection; boost::signals2::connection mParcelMgrConnection; boost::signals2::connection mLocationHistoryConnection; + boost::signals2::connection mRegionCrossingSlot; + LLPathfindingNavMesh::navmesh_slot_t mNavMeshSlot; + bool mIsNavMeshDirty; LLUIImage* mLandmarkImageOn; LLUIImage* mLandmarkImageOff; LLPointer<LLUIImage> mIconMaturityGeneral; diff --git a/indra/newview/skins/default/textures/icons/Pathfinding_Dirty.png b/indra/newview/skins/default/textures/icons/Pathfinding_Dirty.png new file mode 100644 index 0000000000000000000000000000000000000000..cfa12cb7cc247d75d4b103fb34d98de70ba89a32 GIT binary patch literal 553 zcmeAS@N?(olHy`uVBq!ia0vp^Vn8g!!3-obe&3S^Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>JicSXjgt!9fii(QKlP9yWu|-EmtE#GcdwVl7GD=HJ8yFZo z+^1@5YnzjkGr3kpfR9y3NNDEN*8dMRCbY%W*Vn7cbNs)ro}X&{|E9vug)+HGCYLuz z-rTMf<{`MePi{(`%F-U??&h?gm*qEa-nw$-%3Zs5Cq>)c-=p&Pit5Df${!ci|3B5* zv18ZW9RgG9RX0zSn%=7R?4a7DuB@pITJMj`@bK_V?k$-;qxb(U&Hwk5ru7$W+rH!f zbFJAeYJab4Om9`)K2v7bY_S=QGC*H+MQ<qqQqCnoe!>4K1`Li#EboEFE%$VB45_%4 zGa;1kumg`vx_M7(T3T9O?SJR3nXA;a-`3pppJtmpA*AD~Pv1e8Gfs++<j;uyIjXeA zVX{xL#-+OkJI-{nX-xb5x_Y9p?T*Y9j=Sf-OWL<HkBKo}JU&*jk883<<hS|ijO7y) zvUoO4J#N`{SGPneFYjvI>Yv`3HOyHiE1$Y;n>%Z}GtY6OxjYwF8QA?eecDjB&Y=GL ltLrnjYjj#H+s?quFzJ^Ui?I*Wf1r~YJYD@<);T3K0RXsI2@C)L literal 0 HcmV?d00001 diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 8bdec15f1f3..b76f04d17fb 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -432,6 +432,7 @@ with the same filename but different name <texture name="Parcel_Voice_Light" file_name="icons/Parcel_Voice_Light.png" preload="false" /> <texture name="Parcel_VoiceNo_Light" file_name="icons/Parcel_VoiceNo_Light.png" preload="false" /> + <texture name="Pathfinding_Dirty" file_name="icons/Pathfinding_Dirty.png" preload="false" /> <texture name="Pathfinding_Disabled" file_name="icons/Pathfinding_Disabled.png" preload="false" /> <texture name="Pause_Off" file_name="icons/Pause_Off.png" preload="false" /> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index c523add73ea..39c6939201a 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -5779,7 +5779,16 @@ This area has voice chat disabled. You won't be able to hear anyone talking <unique/> This area has building disabled. You can't build or rez objects here. </notification> - + + <notification + icon="notify.tga" + name="PathfindingDirty" + persist="true" + type="notify"> + <unique/> + The pathfinding navmesh is not up-to-date on the current region. If you have build rights, you may rebake the navmesh by clicking on the Rebake Region button. + </notification> + <notification icon="notify.tga" name="DynamicPathfindingDisabled" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 4f20b067f98..4fdbe557b9a 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -3325,7 +3325,8 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="LocationCtrlModerateIconTooltip">Moderate Region</string> <string name="LocationCtrlGeneralIconTooltip">General Region</string> <string name="LocationCtrlSeeAVsTooltip">Avatars visible and chat allowed outside of this parcel</string> - <string name="LocationCtrlPathfindingDisabledTooltip">Dynamic pathfinding is not disabled on this region</string> + <string name="LocationCtrlPathfindingDirtyTooltip">The pathfinding navmesh is not up-to-date.</string> + <string name="LocationCtrlPathfindingDisabledTooltip">Dynamic pathfinding is not disabled on this region.</string> <!-- Strings used by the (currently Linux) auto-updater app --> <string name="UpdaterWindowTitle"> [APP_NAME] Update diff --git a/indra/newview/skins/default/xui/en/widgets/location_input.xml b/indra/newview/skins/default/xui/en/widgets/location_input.xml index 01dc0f200b9..0eec895b042 100644 --- a/indra/newview/skins/default/xui/en/widgets/location_input.xml +++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml @@ -112,6 +112,15 @@ follows="right|top" image_name="Parcel_Health_Dark" /> + <pathfinding_dirty_icon + name="pathfinding_dirty_icon" + width="14" + height="13" + top="19" + left="2" + follows="right|top" + image_name="Pathfinding_Dirty" + /> <pathfinding_disabled_icon name="pathfinding_disabled_icon" width="14" -- GitLab