summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorOz Linden <oz@lindenlab.com>2012-11-27 10:53:50 -0500
committerOz Linden <oz@lindenlab.com>2012-11-27 10:53:50 -0500
commitf5a47417fde70f78b99744386c6da0bcf78e60d5 (patch)
treee4db7f9474ff092585b0cca03f4c8cf0cd44503e /indra
parentc57a40da173bb0622d56771ec9ab9998c3f74e28 (diff)
parentf8a182ec3733e305397f73d194331040e9a8f95d (diff)
merge changes for DRTVWR-230
Diffstat (limited to 'indra')
-rwxr-xr-xindra/newview/CMakeLists.txt4
-rwxr-xr-xindra/newview/llagent.cpp3
-rw-r--r--indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp238
-rw-r--r--indra/newview/llmenuoptionpathfindingrebakenavmesh.h (renamed from indra/newview/llpanelpathfindingrebakenavmesh.h)53
-rw-r--r--indra/newview/llpanelpathfindingrebakenavmesh.cpp269
-rw-r--r--indra/newview/llviewermenu.cpp34
-rwxr-xr-xindra/newview/llviewerwindow.cpp9
-rw-r--r--indra/newview/skins/default/xui/de/panel_navmesh_rebake.xml6
-rw-r--r--indra/newview/skins/default/xui/en/menu_object.xml40
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml10
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml20
-rw-r--r--indra/newview/skins/default/xui/en/panel_navmesh_rebake.xml45
-rw-r--r--indra/newview/skins/default/xui/es/panel_navmesh_rebake.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/panel_navmesh_rebake.xml6
-rw-r--r--indra/newview/skins/default/xui/it/panel_navmesh_rebake.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_navmesh_rebake.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/panel_navmesh_rebake.xml6
-rw-r--r--indra/newview/skins/default/xui/ru/panel_navmesh_rebake.xml6
-rw-r--r--indra/newview/skins/default/xui/tr/panel_navmesh_rebake.xml6
19 files changed, 329 insertions, 444 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index f6213598cf..dff2c04fbc 100755
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -337,6 +337,7 @@ set(viewer_SOURCE_FILES
llmediactrl.cpp
llmediadataclient.cpp
llmemoryview.cpp
+ llmenuoptionpathfindingrebakenavmesh.cpp
llmeshrepository.cpp
llmimetypes.cpp
llmorphview.cpp
@@ -401,7 +402,6 @@ set(viewer_SOURCE_FILES
llpanelonlinestatus.cpp
llpaneloutfitedit.cpp
llpaneloutfitsinventory.cpp
- llpanelpathfindingrebakenavmesh.cpp
llpanelpeople.cpp
llpanelpeoplemenus.cpp
llpanelpermissions.cpp
@@ -914,6 +914,7 @@ set(viewer_HEADER_FILES
llmediactrl.h
llmediadataclient.h
llmemoryview.h
+ llmenuoptionpathfindingrebakenavmesh.h
llmeshrepository.h
llmimetypes.h
llmorphview.h
@@ -972,7 +973,6 @@ set(viewer_HEADER_FILES
llpanelonlinestatus.h
llpaneloutfitedit.h
llpaneloutfitsinventory.h
- llpanelpathfindingrebakenavmesh.h
llpanelpeople.h
llpanelpeoplemenus.h
llpanelpermissions.h
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 11fa50b51a..b6fd7bc9c2 100755
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -56,7 +56,6 @@
#include "llnavigationbar.h" // to show/hide navigation bar when changing mouse look state
#include "llnearbychatbar.h"
#include "llnotificationsutil.h"
-#include "llpanelpathfindingrebakenavmesh.h"
#include "llpaneltopinfobar.h"
#include "llparcel.h"
#include "llrendersphere.h"
@@ -2002,7 +2001,6 @@ void LLAgent::endAnimationUpdateUI()
LLChicletBar::getInstance()->setVisible(TRUE);
LLPanelStandStopFlying::getInstance()->setVisible(TRUE);
- LLPanelPathfindingRebakeNavmesh::getInstance()->setVisible(TRUE);
LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
@@ -2112,7 +2110,6 @@ void LLAgent::endAnimationUpdateUI()
LLChicletBar::getInstance()->setVisible(FALSE);
LLPanelStandStopFlying::getInstance()->setVisible(FALSE);
- LLPanelPathfindingRebakeNavmesh::getInstance()->setVisible(FALSE);
// clear out camera lag effect
gAgentCamera.clearCameraLag();
diff --git a/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp b/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp
new file mode 100644
index 0000000000..dd5f1ea689
--- /dev/null
+++ b/indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp
@@ -0,0 +1,238 @@
+/**
+* @file llmenuoptionpathfindingrebakenavmesh.cpp
+* @brief Implementation of llmenuoptionpathfindingrebakenavmesh
+* @author Prep@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, 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 "llmenuoptionpathfindingrebakenavmesh.h"
+
+#include <boost/bind.hpp>
+#include <boost/signals2.hpp>
+
+#include "llagent.h"
+#include "llenvmanager.h"
+#include "llnotificationsutil.h"
+#include "llpathfindingmanager.h"
+#include "llpathfindingnavmesh.h"
+#include "llpathfindingnavmeshstatus.h"
+#include "llviewerregion.h"
+
+LLMenuOptionPathfindingRebakeNavmesh::LLMenuOptionPathfindingRebakeNavmesh()
+ : LLSingleton<LLMenuOptionPathfindingRebakeNavmesh>(),
+ mIsInitialized(false),
+ mCanRebakeRegion(false),
+ mRebakeNavMeshMode(kRebakeNavMesh_Default),
+ mNavMeshSlot(),
+ mRegionCrossingSlot(),
+ mAgentStateSlot()
+{
+}
+
+LLMenuOptionPathfindingRebakeNavmesh::~LLMenuOptionPathfindingRebakeNavmesh()
+{
+ if (mRebakeNavMeshMode == kRebakeNavMesh_RequestSent)
+ {
+ LL_WARNS("navmeshRebaking") << "During destruction of the LLMenuOptionPathfindingRebakeNavmesh "
+ << "singleton, the mode indicates that a request has been sent for which a response has yet "
+ << "to be received. This could contribute to a crash on exit." << LL_ENDL;
+ }
+
+ llassert(!mIsInitialized);
+ if (mIsInitialized)
+ {
+ quit();
+ }
+}
+
+void LLMenuOptionPathfindingRebakeNavmesh::initialize()
+{
+ llassert(!mIsInitialized);
+ if (!mIsInitialized)
+ {
+ mIsInitialized = true;
+
+ setMode(kRebakeNavMesh_Default);
+
+ createNavMeshStatusListenerForCurrentRegion();
+
+ if ( !mRegionCrossingSlot.connected() )
+ {
+ mRegionCrossingSlot = LLEnvManagerNew::getInstance()->setRegionChangeCallback(boost::bind(&LLMenuOptionPathfindingRebakeNavmesh::handleRegionBoundaryCrossed, this));
+ }
+
+ if (!mAgentStateSlot.connected())
+ {
+ mAgentStateSlot = LLPathfindingManager::getInstance()->registerAgentStateListener(boost::bind(&LLMenuOptionPathfindingRebakeNavmesh::handleAgentState, this, _1));
+ }
+ LLPathfindingManager::getInstance()->requestGetAgentState();
+ }
+}
+
+void LLMenuOptionPathfindingRebakeNavmesh::quit()
+{
+ llassert(mIsInitialized);
+ if (mIsInitialized)
+ {
+ if (mNavMeshSlot.connected())
+ {
+ mNavMeshSlot.disconnect();
+ }
+
+ if (mRegionCrossingSlot.connected())
+ {
+ mRegionCrossingSlot.disconnect();
+ }
+
+ if (mAgentStateSlot.connected())
+ {
+ mAgentStateSlot.disconnect();
+ }
+
+ mIsInitialized = false;
+ }
+}
+
+bool LLMenuOptionPathfindingRebakeNavmesh::canRebakeRegion() const
+{
+ if (!mIsInitialized)
+ {
+ LL_ERRS("navmeshRebaking") << "LLMenuOptionPathfindingRebakeNavmesh class has not been initialized "
+ << "when the ability to rebake navmesh is being requested." << LL_ENDL;
+ }
+ return mCanRebakeRegion;
+}
+
+LLMenuOptionPathfindingRebakeNavmesh::ERebakeNavMeshMode LLMenuOptionPathfindingRebakeNavmesh::getMode() const
+{
+ if (!mIsInitialized)
+ {
+ LL_ERRS("navmeshRebaking") << "LLMenuOptionPathfindingRebakeNavmesh class has not been initialized "
+ << "when the mode is being requested." << LL_ENDL;
+ }
+ return mRebakeNavMeshMode;
+}
+
+void LLMenuOptionPathfindingRebakeNavmesh::sendRequestRebakeNavmesh()
+{
+ if (!mIsInitialized)
+ {
+ LL_ERRS("navmeshRebaking") << "LLMenuOptionPathfindingRebakeNavmesh class has not been initialized "
+ << "when the request is being made to rebake the navmesh." << LL_ENDL;
+ }
+ else
+ {
+ if (!canRebakeRegion())
+ {
+ LL_WARNS("navmeshRebaking") << "attempting to rebake navmesh when user does not have permissions "
+ << "on this region" << LL_ENDL;
+ }
+ if (getMode() != kRebakeNavMesh_Available)
+ {
+ LL_WARNS("navmeshRebaking") << "attempting to rebake navmesh when mode is not available"
+ << LL_ENDL;
+ }
+
+ setMode(kRebakeNavMesh_RequestSent);
+ LLPathfindingManager::getInstance()->requestRebakeNavMesh(boost::bind(&LLMenuOptionPathfindingRebakeNavmesh::handleRebakeNavMeshResponse, this, _1));
+ }
+}
+
+void LLMenuOptionPathfindingRebakeNavmesh::setMode(ERebakeNavMeshMode pRebakeNavMeshMode)
+{
+ mRebakeNavMeshMode = pRebakeNavMeshMode;
+}
+
+void LLMenuOptionPathfindingRebakeNavmesh::handleAgentState(BOOL pCanRebakeRegion)
+{
+ llassert(mIsInitialized);
+ mCanRebakeRegion = pCanRebakeRegion;
+}
+
+void LLMenuOptionPathfindingRebakeNavmesh::handleRebakeNavMeshResponse(bool pResponseStatus)
+{
+ llassert(mIsInitialized);
+ if (getMode() == kRebakeNavMesh_RequestSent)
+ {
+ setMode(pResponseStatus ? kRebakeNavMesh_InProgress : kRebakeNavMesh_Default);
+ }
+
+ if (!pResponseStatus)
+ {
+ LLNotificationsUtil::add("PathfindingCannotRebakeNavmesh");
+ }
+}
+
+void LLMenuOptionPathfindingRebakeNavmesh::handleNavMeshStatus(const LLPathfindingNavMeshStatus &pNavMeshStatus)
+{
+ llassert(mIsInitialized);
+ ERebakeNavMeshMode rebakeNavMeshMode = kRebakeNavMesh_Default;
+ if (pNavMeshStatus.isValid())
+ {
+ switch (pNavMeshStatus.getStatus())
+ {
+ case LLPathfindingNavMeshStatus::kPending :
+ case LLPathfindingNavMeshStatus::kRepending :
+ rebakeNavMeshMode = kRebakeNavMesh_Available;
+ break;
+ case LLPathfindingNavMeshStatus::kBuilding :
+ rebakeNavMeshMode = kRebakeNavMesh_InProgress;
+ break;
+ case LLPathfindingNavMeshStatus::kComplete :
+ rebakeNavMeshMode = kRebakeNavMesh_NotAvailable;
+ break;
+ default :
+ rebakeNavMeshMode = kRebakeNavMesh_Default;
+ llassert(0);
+ break;
+ }
+ }
+
+ setMode(rebakeNavMeshMode);
+}
+
+void LLMenuOptionPathfindingRebakeNavmesh::handleRegionBoundaryCrossed()
+{
+ llassert(mIsInitialized);
+ createNavMeshStatusListenerForCurrentRegion();
+ mCanRebakeRegion = FALSE;
+ LLPathfindingManager::getInstance()->requestGetAgentState();
+}
+
+void LLMenuOptionPathfindingRebakeNavmesh::createNavMeshStatusListenerForCurrentRegion()
+{
+ if (mNavMeshSlot.connected())
+ {
+ mNavMeshSlot.disconnect();
+ }
+
+ LLViewerRegion *currentRegion = gAgent.getRegion();
+ if (currentRegion != NULL)
+ {
+ mNavMeshSlot = LLPathfindingManager::getInstance()->registerNavMeshListenerForRegion(currentRegion, boost::bind(&LLMenuOptionPathfindingRebakeNavmesh::handleNavMeshStatus, this, _2));
+ LLPathfindingManager::getInstance()->requestGetNavMeshForRegion(currentRegion, true);
+ }
+}
diff --git a/indra/newview/llpanelpathfindingrebakenavmesh.h b/indra/newview/llmenuoptionpathfindingrebakenavmesh.h
index 48764f2aa7..7b1d2873ba 100644
--- a/indra/newview/llpanelpathfindingrebakenavmesh.h
+++ b/indra/newview/llmenuoptionpathfindingrebakenavmesh.h
@@ -1,6 +1,6 @@
/**
-* @file llpanelpathfindingrebakenavmesh.h
-* @brief Header file for llpanelpathfindingrebakenavmesh
+* @file llmenuoptionpathfindingrebakenavmesh.h
+* @brief Header file for llmenuoptionpathfindingrebakenavmesh
* @author Prep@lindenlab.com
*
* $LicenseInfo:firstyear=2012&license=viewerlgpl$
@@ -24,34 +24,22 @@
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
-#ifndef LL_LLPANELPATHFINDINGREBAKENAVMESH_H
-#define LL_LLPANELPATHFINDINGREBAKENAVMESH_H
+#ifndef LL_LLMENUOPTIONPATHFINDINGREBAKENAVMESH_H
+#define LL_LLMENUOPTIONPATHFINDINGREBAKENAVMESH_H
#include <boost/signals2.hpp>
-#include "llpanel.h"
#include "llpathfindingmanager.h"
#include "llpathfindingnavmesh.h"
+#include "llsingleton.h"
-class LLButton;
class LLPathfindingNavMeshStatus;
-class LLPanelPathfindingRebakeNavmesh : public LLPanel
+class LLMenuOptionPathfindingRebakeNavmesh : public LLSingleton<LLMenuOptionPathfindingRebakeNavmesh>
{
-
- LOG_CLASS(LLPanelPathfindingRebakeNavmesh);
+ LOG_CLASS(LLMenuOptionPathfindingRebakeNavmesh);
public:
- static LLPanelPathfindingRebakeNavmesh* getInstance();
-
- virtual BOOL postBuild();
-
- virtual void draw();
- virtual BOOL handleToolTip( S32 x, S32 y, MASK mask );
-
-protected:
-
-private:
typedef enum
{
kRebakeNavMesh_Available,
@@ -61,15 +49,21 @@ private:
kRebakeNavMesh_Default = kRebakeNavMesh_NotAvailable
} ERebakeNavMeshMode;
- LLPanelPathfindingRebakeNavmesh();
- virtual ~LLPanelPathfindingRebakeNavmesh();
+ LLMenuOptionPathfindingRebakeNavmesh();
+ virtual ~LLMenuOptionPathfindingRebakeNavmesh();
- static LLPanelPathfindingRebakeNavmesh* getPanel();
+ void initialize();
+ void quit();
- void setMode(ERebakeNavMeshMode pRebakeNavMeshMode);
+ bool canRebakeRegion() const;
ERebakeNavMeshMode getMode() const;
- void onNavMeshRebakeClick();
+ void sendRequestRebakeNavmesh();
+
+protected:
+
+private:
+ void setMode(ERebakeNavMeshMode pRebakeNavMeshMode);
void handleAgentState(BOOL pCanRebakeRegion);
void handleRebakeNavMeshResponse(bool pResponseStatus);
@@ -78,19 +72,14 @@ private:
void createNavMeshStatusListenerForCurrentRegion();
- bool doDraw() const;
- void updatePosition();
+ bool mIsInitialized;
- BOOL mCanRebakeRegion;
+ bool mCanRebakeRegion;
ERebakeNavMeshMode mRebakeNavMeshMode;
- LLButton* mNavMeshRebakeButton;
- LLButton* mNavMeshSendingButton;
- LLButton* mNavMeshBakingButton;
-
LLPathfindingNavMesh::navmesh_slot_t mNavMeshSlot;
boost::signals2::connection mRegionCrossingSlot;
LLPathfindingManager::agent_state_slot_t mAgentStateSlot;
};
-#endif // LL_LLPANELPATHFINDINGREBAKENAVMESH_H
+#endif // LL_LLMENUOPTIONPATHFINDINGREBAKENAVMESH_H
diff --git a/indra/newview/llpanelpathfindingrebakenavmesh.cpp b/indra/newview/llpanelpathfindingrebakenavmesh.cpp
deleted file mode 100644
index 7efb1a9227..0000000000
--- a/indra/newview/llpanelpathfindingrebakenavmesh.cpp
+++ /dev/null
@@ -1,269 +0,0 @@
-/**
-* @file llpanelpathfindingrebakenavmesh.cpp
-* @brief Implementation of llpanelpathfindingrebakenavmesh
-* @author Prep@lindenlab.com
-*
-* $LicenseInfo:firstyear=2012&license=viewerlgpl$
-* Second Life Viewer Source Code
-* Copyright (C) 2012, 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 "llpanelpathfindingrebakenavmesh.h"
-
-#include <boost/bind.hpp>
-#include <boost/signals2.hpp>
-
-#include "llagent.h"
-#include "llbutton.h"
-#include "llenvmanager.h"
-#include "llhints.h"
-#include "llnotificationsutil.h"
-#include "llpanel.h"
-#include "llpathfindingmanager.h"
-#include "llpathfindingnavmesh.h"
-#include "llpathfindingnavmeshstatus.h"
-#include "lltoolbar.h"
-#include "lltoolbarview.h"
-#include "lltooltip.h"
-#include "llviewerregion.h"
-
-LLPanelPathfindingRebakeNavmesh* LLPanelPathfindingRebakeNavmesh::getInstance()
-{
- static LLPanelPathfindingRebakeNavmesh* panel = getPanel();
- return panel;
-}
-
-BOOL LLPanelPathfindingRebakeNavmesh::postBuild()
-{
- //Rebake button
- mNavMeshRebakeButton = findChild<LLButton>("navmesh_btn");
- llassert(mNavMeshRebakeButton != NULL);
- mNavMeshRebakeButton->setCommitCallback(boost::bind(&LLPanelPathfindingRebakeNavmesh::onNavMeshRebakeClick, this));
- LLHints::registerHintTarget("navmesh_btn", mNavMeshRebakeButton->getHandle());
-
- //Sending rebake request
- mNavMeshSendingButton = findChild<LLButton>("navmesh_btn_sending");
- llassert(mNavMeshSendingButton != NULL);
- LLHints::registerHintTarget("navmesh_btn_sending", mNavMeshSendingButton->getHandle());
-
- //rebaking...
- mNavMeshBakingButton = findChild<LLButton>("navmesh_btn_baking");
- llassert(mNavMeshBakingButton != NULL);
- LLHints::registerHintTarget("navmesh_btn_baking", mNavMeshBakingButton->getHandle());
-
- setMode(kRebakeNavMesh_Default);
-
- createNavMeshStatusListenerForCurrentRegion();
-
- if ( !mRegionCrossingSlot.connected() )
- {
- mRegionCrossingSlot = LLEnvManagerNew::getInstance()->setRegionChangeCallback(boost::bind(&LLPanelPathfindingRebakeNavmesh::handleRegionBoundaryCrossed, this));
- }
-
- if (!mAgentStateSlot.connected())
- {
- mAgentStateSlot = LLPathfindingManager::getInstance()->registerAgentStateListener(boost::bind(&LLPanelPathfindingRebakeNavmesh::handleAgentState, this, _1));
- }
- LLPathfindingManager::getInstance()->requestGetAgentState();
-
- return LLPanel::postBuild();
-}
-
-void LLPanelPathfindingRebakeNavmesh::draw()
-{
- if (doDraw())
- {
- updatePosition();
- LLPanel::draw();
- }
-}
-
-BOOL LLPanelPathfindingRebakeNavmesh::handleToolTip( S32 x, S32 y, MASK mask )
-{
- LLToolTipMgr::instance().unblockToolTips();
-
- if (mNavMeshRebakeButton->getVisible())
- {
- LLToolTipMgr::instance().show(mNavMeshRebakeButton->getToolTip());
- }
- else if (mNavMeshSendingButton->getVisible())
- {
- LLToolTipMgr::instance().show(mNavMeshSendingButton->getToolTip());
- }
- else if (mNavMeshBakingButton->getVisible())
- {
- LLToolTipMgr::instance().show(mNavMeshBakingButton->getToolTip());
- }
-
- return LLPanel::handleToolTip(x, y, mask);
-}
-
-LLPanelPathfindingRebakeNavmesh::LLPanelPathfindingRebakeNavmesh()
- : LLPanel(),
- mCanRebakeRegion(FALSE),
- mRebakeNavMeshMode(kRebakeNavMesh_Default),
- mNavMeshRebakeButton(NULL),
- mNavMeshSendingButton(NULL),
- mNavMeshBakingButton(NULL),
- mNavMeshSlot(),
- mRegionCrossingSlot(),
- mAgentStateSlot()
-{
- // make sure we have the only instance of this class
- static bool b = true;
- llassert_always(b);
- b=false;
-}
-
-LLPanelPathfindingRebakeNavmesh::~LLPanelPathfindingRebakeNavmesh()
-{
-}
-
-LLPanelPathfindingRebakeNavmesh* LLPanelPathfindingRebakeNavmesh::getPanel()
-{
- LLPanelPathfindingRebakeNavmesh* panel = new LLPanelPathfindingRebakeNavmesh();
- panel->buildFromFile("panel_navmesh_rebake.xml");
- return panel;
-}
-
-void LLPanelPathfindingRebakeNavmesh::setMode(ERebakeNavMeshMode pRebakeNavMeshMode)
-{
- if (pRebakeNavMeshMode == kRebakeNavMesh_Available)
- {
- LLNotificationsUtil::add("PathfindingRebakeNavmesh");
- }
- mNavMeshRebakeButton->setVisible(pRebakeNavMeshMode == kRebakeNavMesh_Available);
- mNavMeshSendingButton->setVisible(pRebakeNavMeshMode == kRebakeNavMesh_RequestSent);
- mNavMeshBakingButton->setVisible(pRebakeNavMeshMode == kRebakeNavMesh_InProgress);
- mRebakeNavMeshMode = pRebakeNavMeshMode;
-}
-
-LLPanelPathfindingRebakeNavmesh::ERebakeNavMeshMode LLPanelPathfindingRebakeNavmesh::getMode() const
-{
- return mRebakeNavMeshMode;
-}
-
-void LLPanelPathfindingRebakeNavmesh::onNavMeshRebakeClick()
-{
- setMode(kRebakeNavMesh_RequestSent);
- LLPathfindingManager::getInstance()->requestRebakeNavMesh(boost::bind(&LLPanelPathfindingRebakeNavmesh::handleRebakeNavMeshResponse, this, _1));
-}
-
-void LLPanelPathfindingRebakeNavmesh::handleAgentState(BOOL pCanRebakeRegion)
-{
- mCanRebakeRegion = pCanRebakeRegion;
-}
-
-void LLPanelPathfindingRebakeNavmesh::handleRebakeNavMeshResponse(bool pResponseStatus)
-{
- if (getMode() == kRebakeNavMesh_RequestSent)
- {
- setMode(pResponseStatus ? kRebakeNavMesh_InProgress : kRebakeNavMesh_Default);
- }
-
- if (!pResponseStatus)
- {
- LLNotificationsUtil::add("PathfindingCannotRebakeNavmesh");
- }
-}
-
-void LLPanelPathfindingRebakeNavmesh::handleNavMeshStatus(const LLPathfindingNavMeshStatus &pNavMeshStatus)
-{
- ERebakeNavMeshMode rebakeNavMeshMode = kRebakeNavMesh_Default;
- if (pNavMeshStatus.isValid())
- {
- switch (pNavMeshStatus.getStatus())
- {
- case LLPathfindingNavMeshStatus::kPending :
- case LLPathfindingNavMeshStatus::kRepending :
- rebakeNavMeshMode = kRebakeNavMesh_Available;
- break;
- case LLPathfindingNavMeshStatus::kBuilding :
- rebakeNavMeshMode = kRebakeNavMesh_InProgress;
- break;
- case LLPathfindingNavMeshStatus::kComplete :
- rebakeNavMeshMode = kRebakeNavMesh_NotAvailable;
- break;
- default :
- rebakeNavMeshMode = kRebakeNavMesh_Default;
- llassert(0);
- break;
- }
- }
-
- setMode(rebakeNavMeshMode);
-}
-
-void LLPanelPathfindingRebakeNavmesh::handleRegionBoundaryCrossed()
-{
- createNavMeshStatusListenerForCurrentRegion();
- mCanRebakeRegion = FALSE;
- LLPathfindingManager::getInstance()->requestGetAgentState();
-}
-
-void LLPanelPathfindingRebakeNavmesh::createNavMeshStatusListenerForCurrentRegion()
-{
- if (mNavMeshSlot.connected())
- {
- mNavMeshSlot.disconnect();
- }
-
- LLViewerRegion *currentRegion = gAgent.getRegion();
- if (currentRegion != NULL)
- {
- mNavMeshSlot = LLPathfindingManager::getInstance()->registerNavMeshListenerForRegion(currentRegion, boost::bind(&LLPanelPathfindingRebakeNavmesh::handleNavMeshStatus, this, _2));
- LLPathfindingManager::getInstance()->requestGetNavMeshForRegion(currentRegion, true);
- }
-}
-
-bool LLPanelPathfindingRebakeNavmesh::doDraw() const
-{
- return (mCanRebakeRegion && (mRebakeNavMeshMode != kRebakeNavMesh_NotAvailable));
-}
-
-void LLPanelPathfindingRebakeNavmesh::updatePosition()
-{
- S32 y_pos = 0;
- S32 bottom_tb_center = 0;
-
- if (LLToolBar* toolbar_bottom = gToolBarView->getChild<LLToolBar>("toolbar_bottom"))
- {
- y_pos = toolbar_bottom->getRect().getHeight();
- bottom_tb_center = toolbar_bottom->getRect().getCenterX();
- }
-
- S32 left_tb_width = 0;
- if (LLToolBar* toolbar_left = gToolBarView->getChild<LLToolBar>("toolbar_left"))
- {
- left_tb_width = toolbar_left->getRect().getWidth();
- }
-
- if(LLPanel* panel_ssf_container = getRootView()->getChild<LLPanel>("state_management_buttons_container"))
- {
- panel_ssf_container->setOrigin(0, y_pos);
- }
-
- S32 x_pos = bottom_tb_center-getRect().getWidth()/2 - left_tb_width + 113 /* width of stand/fly button */ + 10 /* margin */;
-
- setOrigin( x_pos, 0);
-}
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index d11e7e32c7..5a8ef00b1f 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -83,6 +83,7 @@
#include "llinventoryfunctions.h"
#include "llpanellogin.h"
#include "llpanelblockedlist.h"
+#include "llmenuoptionpathfindingrebakenavmesh.h"
#include "llmoveview.h"
#include "llparcel.h"
#include "llrootview.h"
@@ -4876,6 +4877,37 @@ class LLToolsEnablePathfindingView : public view_listener_t
}
};
+class LLToolsDoPathfindingRebakeRegion : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ bool hasPathfinding = (LLPathfindingManager::getInstance() != NULL);
+
+ if (hasPathfinding)
+ {
+ LLMenuOptionPathfindingRebakeNavmesh::getInstance()->sendRequestRebakeNavmesh();
+ }
+
+ return hasPathfinding;
+ }
+};
+
+class LLToolsEnablePathfindingRebakeRegion : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ bool returnValue = false;
+
+ if (LLPathfindingManager::getInstance() != NULL)
+ {
+ LLMenuOptionPathfindingRebakeNavmesh *rebakeInstance = LLMenuOptionPathfindingRebakeNavmesh::getInstance();
+ returnValue = (rebakeInstance->canRebakeRegion() &&
+ (rebakeInstance->getMode() == LLMenuOptionPathfindingRebakeNavmesh::kRebakeNavMesh_Available));
+ }
+ return returnValue;
+ }
+};
+
// Round the position of all root objects to the grid
class LLToolsSnapObjectXY : public view_listener_t
{
@@ -8359,6 +8391,8 @@ void initialize_menus()
view_listener_t::addMenu(new LLToolsEnablePathfinding(), "Tools.EnablePathfinding");
view_listener_t::addMenu(new LLToolsEnablePathfindingView(), "Tools.EnablePathfindingView");
+ view_listener_t::addMenu(new LLToolsDoPathfindingRebakeRegion(), "Tools.DoPathfindingRebakeRegion");
+ view_listener_t::addMenu(new LLToolsEnablePathfindingRebakeRegion(), "Tools.EnablePathfindingRebakeRegion");
// Help menu
// most items use the ShowFloater method
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 44e6d70546..29ca7dac27 100755
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -122,11 +122,11 @@
#include "llkeyboard.h"
#include "lllineeditor.h"
#include "llmenugl.h"
+#include "llmenuoptionpathfindingrebakenavmesh.h"
#include "llmodaldialog.h"
#include "llmorphview.h"
#include "llmoveview.h"
#include "llnavigationbar.h"
-#include "llpanelpathfindingrebakenavmesh.h"
#include "llpaneltopinfobar.h"
#include "llpopupview.h"
#include "llpreviewtexture.h"
@@ -1933,11 +1933,10 @@ void LLViewerWindow::initWorldUI()
LLPanelStandStopFlying* panel_stand_stop_flying = LLPanelStandStopFlying::getInstance();
panel_ssf_container->addChild(panel_stand_stop_flying);
- LLPanelPathfindingRebakeNavmesh *panel_rebake_navmesh = LLPanelPathfindingRebakeNavmesh::getInstance();
- panel_ssf_container->addChild(panel_rebake_navmesh);
-
panel_ssf_container->setVisible(TRUE);
+ LLMenuOptionPathfindingRebakeNavmesh::getInstance()->initialize();
+
// Load and make the toolbars visible
// Note: we need to load the toolbars only *after* the user is logged in and IW
if (gToolBarView)
@@ -2007,6 +2006,8 @@ void LLViewerWindow::shutdownViews()
mRootView = NULL;
llinfos << "RootView deleted." << llendl ;
+ LLMenuOptionPathfindingRebakeNavmesh::getInstance()->quit();
+
// Automatically deleted as children of mRootView. Fix the globals.
gStatusBar = NULL;
gIMMgr = NULL;
diff --git a/indra/newview/skins/default/xui/de/panel_navmesh_rebake.xml b/indra/newview/skins/default/xui/de/panel_navmesh_rebake.xml
deleted file mode 100644
index 44be6d67b1..0000000000
--- a/indra/newview/skins/default/xui/de/panel_navmesh_rebake.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_navmesh_rebake">
- <button label="Region neu formen" name="navmesh_btn" tool_tip="Klicken, um das Navmesh der Region neu zu formen."/>
- <button label="Neuformen wird angefordert" name="navmesh_btn_sending" tool_tip="Anforderung zum Neuformen wird an den Server gesendet."/>
- <button label="Region wird neu geformt" name="navmesh_btn_baking" tool_tip="Region wird neu geformt. Nach Abschluss des Vorgangs verschwindet diese Schaltfläche."/>
-</panel>
diff --git a/indra/newview/skins/default/xui/en/menu_object.xml b/indra/newview/skins/default/xui/en/menu_object.xml
index 52b9524b11..f6004621a6 100644
--- a/indra/newview/skins/default/xui/en/menu_object.xml
+++ b/indra/newview/skins/default/xui/en/menu_object.xml
@@ -30,26 +30,6 @@
function="EnableEdit"/>
</menu_item_call>
<menu_item_call
- label="Show in linksets"
- name="show_in_linksets">
- <menu_item_call.on_click
- function="Pathfinding.Linksets.Select" />
- <menu_item_call.on_enable
- function="EnableSelectInPathfindingLinksets"/>
- <menu_item_call.on_visible
- function="EnableSelectInPathfindingLinksets"/>
- </menu_item_call>
- <menu_item_call
- label="Show in characters"
- name="show_in_characters">
- <menu_item_call.on_click
- function="Pathfinding.Characters.Select" />
- <menu_item_call.on_enable
- function="EnableSelectInPathfindingCharacters"/>
- <menu_item_call.on_visible
- function="EnableSelectInPathfindingCharacters"/>
- </menu_item_call>
- <menu_item_call
enabled="false"
label="Open"
name="Open">
@@ -90,6 +70,26 @@
<menu_item_call.on_click
function="Object.ZoomIn" />
</menu_item_call>
+ <menu_item_call
+ label="Show in linksets"
+ name="show_in_linksets">
+ <menu_item_call.on_click
+ function="Pathfinding.Linksets.Select" />
+ <menu_item_call.on_enable
+ function="EnableSelectInPathfindingLinksets"/>
+ <menu_item_call.on_visible
+ function="EnableSelectInPathfindingLinksets"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Show in characters"
+ name="show_in_characters">
+ <menu_item_call.on_click
+ function="Pathfinding.Characters.Select" />
+ <menu_item_call.on_enable
+ function="EnableSelectInPathfindingCharacters"/>
+ <menu_item_call.on_visible
+ function="EnableSelectInPathfindingCharacters"/>
+ </menu_item_call>
<menu_item_separator layout="topleft" />
<context_menu
label="Put On"
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 1aa55acf2d..18932a32d0 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -956,7 +956,7 @@
create_jump_keys="true"
label="Pathfinding"
name="Pathfinding"
- tear_off="false">
+ tear_off="true">
<menu_item_call
label="Linksets..."
name="pathfinding_linksets_menu_item">
@@ -984,6 +984,14 @@
<menu_item_call.on_enable
function="Tools.EnablePathfindingView" />
</menu_item_call>
+ <menu_item_call
+ label="Rebake region"
+ name="pathfinding_rebake_navmesh_item">
+ <menu_item_call.on_click
+ function="Tools.DoPathfindingRebakeRegion"/>
+ <menu_item_call.on_enable
+ function="Tools.EnablePathfindingRebakeRegion" />
+ </menu_item_call>
</menu>
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 8e6de6ed4f..9dae77a304 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -6076,26 +6076,6 @@ This area has building disabled. You can&apos;t build or rez objects here.
<notification
icon="alertmodal.tga"
- name="PathfindingRebakeNavmesh"
- type="alertmodal">
- <unique/>
- Changing certain objects in this region could cause other moving objects to behave incorrectly. To make moving objects behave correctly, click the “Rebake region” button. Choose “Help” for more information.
- <url
- option="1"
- name="url"
- target = "_external">
- http://wiki.secondlife.com/wiki/Pathfinding_Tools_in_the_Second_Life_Viewer
- </url>
- <usetemplate
- name="okhelpignore"
- ignoretext="Changing certain objects in this region could cause other moving objects to behave incorrectly."
- yestext="OK"
- helptext="Help"
- />
- </notification>
-
- <notification
- icon="alertmodal.tga"
name="PathfindingCannotRebakeNavmesh"
type="alertmodal">
<unique/>
diff --git a/indra/newview/skins/default/xui/en/panel_navmesh_rebake.xml b/indra/newview/skins/default/xui/en/panel_navmesh_rebake.xml
deleted file mode 100644
index 90308a2ca9..0000000000
--- a/indra/newview/skins/default/xui/en/panel_navmesh_rebake.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel
- height="25"
- layout="topleft"
- name="panel_navmesh_rebake"
- mouse_opaque="false"
- visible="true"
- width="133">
- <button
- follows="left|bottom"
- height="19"
- label="Rebake region"
- layout="topleft"
- left="10"
- name="navmesh_btn"
- tool_tip="Click to rebake the region&apos;s navmesh."
- top="2"
- visible="false"
- enabled="true"
- width="120" />
- <button
- follows="left|bottom"
- height="19"
- label="Requesting rebake"
- layout="topleft"
- left="10"
- name="navmesh_btn_sending"
- tool_tip="Sending rebake request to the server."
- top="2"
- visible="false"
- enabled="false"
- width="120" />
- <button
- follows="left|bottom"
- height="19"
- label="Region is rebaking"
- layout="topleft"
- left="10"
- name="navmesh_btn_baking"
- tool_tip="Region is being rebaked. When completed, this button will disappear."
- top="2"
- visible="false"
- enabled="false"
- width="120" />
-</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_navmesh_rebake.xml b/indra/newview/skins/default/xui/es/panel_navmesh_rebake.xml
deleted file mode 100644
index 96df844512..0000000000
--- a/indra/newview/skins/default/xui/es/panel_navmesh_rebake.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_navmesh_rebake">
- <button label="Recargar la región" name="navmesh_btn" tool_tip="Pulsa para recargar el navmesh de la región."/>
- <button label="Solicitando recarga" name="navmesh_btn_sending" tool_tip="Enviando la solicitud de recarga al servidor."/>
- <button label="La región se está recargando" name="navmesh_btn_baking" tool_tip="La región se está recargando. Este botón desaparecerá cuando finalice la recarga."/>
-</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_navmesh_rebake.xml b/indra/newview/skins/default/xui/fr/panel_navmesh_rebake.xml
deleted file mode 100644
index 7acf092257..0000000000
--- a/indra/newview/skins/default/xui/fr/panel_navmesh_rebake.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_navmesh_rebake">
- <button label="Refiger la région" name="navmesh_btn" tool_tip="Cliquer pour refiger le maillage de navigation de la région."/>
- <button label="Demande consistant à refiger la région en cours..." name="navmesh_btn_sending" tool_tip="Envoi de la demande consistant à refiger la région au serveur..."/>
- <button label="La région se refige..." name="navmesh_btn_baking" tool_tip="La région se refige. Ce bouton disparaîtra lorsque le processus sera terminé."/>
-</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_navmesh_rebake.xml b/indra/newview/skins/default/xui/it/panel_navmesh_rebake.xml
deleted file mode 100644
index 432754076a..0000000000
--- a/indra/newview/skins/default/xui/it/panel_navmesh_rebake.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_navmesh_rebake">
- <button label="Rebake regione" name="navmesh_btn" tool_tip="Fai clic per eseguire rebake sul navmesh della regione"/>
- <button label="Richiesta rebake" name="navmesh_btn_sending" tool_tip="Invio richiesta rebake al server."/>
- <button label="Rebake regione in corso" name="navmesh_btn_baking" tool_tip="Rebake della regione in corso. Al termine, questo pulsante non sarà più visibile."/>
-</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_navmesh_rebake.xml b/indra/newview/skins/default/xui/ja/panel_navmesh_rebake.xml
deleted file mode 100644
index ea3ec32424..0000000000
--- a/indra/newview/skins/default/xui/ja/panel_navmesh_rebake.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_navmesh_rebake">
- <button label="地域の再構築" name="navmesh_btn" tool_tip="クリックしてこの地域のナビメッシュを再構築します。"/>
- <button label="再構築をリクエスト中" name="navmesh_btn_sending" tool_tip="再構築リクエストをサーバーに送信しています。"/>
- <button label="地域(リージョン)を再構築中" name="navmesh_btn_baking" tool_tip="地域を再構築しています。完了すると、このボタンは消えます。"/>
-</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_navmesh_rebake.xml b/indra/newview/skins/default/xui/pt/panel_navmesh_rebake.xml
deleted file mode 100644
index aa885ae031..0000000000
--- a/indra/newview/skins/default/xui/pt/panel_navmesh_rebake.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_navmesh_rebake">
- <button label="Recarregar região" name="navmesh_btn" tool_tip="Clique para recarregar o navmesh da região."/>
- <button label="Solicitando recarregamento" name="navmesh_btn_sending" tool_tip="Enviando solicitação de recarregamento para o servidor."/>
- <button label="A região está recarregando" name="navmesh_btn_baking" tool_tip="A região está sendo recarregada. Este botão desaparecerá após a conclusão."/>
-</panel>
diff --git a/indra/newview/skins/default/xui/ru/panel_navmesh_rebake.xml b/indra/newview/skins/default/xui/ru/panel_navmesh_rebake.xml
deleted file mode 100644
index fdc374a024..0000000000
--- a/indra/newview/skins/default/xui/ru/panel_navmesh_rebake.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_navmesh_rebake">
- <button label="Восстановить регион" name="navmesh_btn" tool_tip="Восстановить навигационную сетку региона."/>
- <button label="Запрос на восстановление" name="navmesh_btn_sending" tool_tip="Отправка запроса на восстановление на сервер."/>
- <button label="Идет восстановление региона" name="navmesh_btn_baking" tool_tip="Идет восстановление региона. Когда оно завершится, эта кнопка исчезнет."/>
-</panel>
diff --git a/indra/newview/skins/default/xui/tr/panel_navmesh_rebake.xml b/indra/newview/skins/default/xui/tr/panel_navmesh_rebake.xml
deleted file mode 100644
index 78cb8bcc02..0000000000
--- a/indra/newview/skins/default/xui/tr/panel_navmesh_rebake.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_navmesh_rebake">
- <button label="Bölgeyi yeniden kaydet" name="navmesh_btn" tool_tip="Bölgenin navigasyon örgüsünü tekrar kaydetmek için tıkla."/>
- <button label="Yeniden kaydetme talep ediliyor" name="navmesh_btn_sending" tool_tip="Yeniden kaydetme talebi sunucuya gönderiliyor."/>
- <button label="Bölge yeniden kaydediliyor" name="navmesh_btn_baking" tool_tip="Bölge yeniden kaydediliyor. Tamamlandığında bu düğme kaybolacak."/>
-</panel>