1. simon_linden
  2. viewer-rabbit

Commits

Stinson Linden  committed 71accc4

MAINT-1737: Adding a menu option to the Pathfinding menu to allow rebuilding of the region's navmesh.

  • Participants
  • Parent commits fa8c3b1
  • Branches default

Comments (0)

Files changed (16)

File indra/newview/llagent.cpp

View file
 #include "llhomelocationresponder.h"
 #include "llhudmanager.h"
 #include "lljoystickbutton.h"
-#include "llmenuoptionpathfindingrebakenavmesh.h"
 #include "llmorphview.h"
 #include "llmoveview.h"
 #include "llnavigationbar.h" // to show/hide navigation bar when changing mouse look state
 		LLChicletBar::getInstance()->setVisible(TRUE);
 
 		LLPanelStandStopFlying::getInstance()->setVisible(TRUE);
-		LLPanelPathfindingRebakeNavmesh::getInstance()->setVisible(TRUE);
 
 		LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
 
 		LLChicletBar::getInstance()->setVisible(FALSE);
 
 		LLPanelStandStopFlying::getInstance()->setVisible(FALSE);
-		LLPanelPathfindingRebakeNavmesh::getInstance()->setVisible(FALSE);
 
 		// clear out camera lag effect
 		gAgentCamera.clearCameraLag();

File indra/newview/llmenuoptionpathfindingrebakenavmesh.cpp

View file
 #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),
+LLMenuOptionPathfindingRebakeNavmesh::LLMenuOptionPathfindingRebakeNavmesh() 
+	: LLSingleton<LLMenuOptionPathfindingRebakeNavmesh>(),
+	mIsInitialized(false),
+	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() 
+LLMenuOptionPathfindingRebakeNavmesh::~LLMenuOptionPathfindingRebakeNavmesh() 
 {
+	if (getMode() == 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();
+	}
 }
 
-LLPanelPathfindingRebakeNavmesh* LLPanelPathfindingRebakeNavmesh::getPanel()
+void LLMenuOptionPathfindingRebakeNavmesh::initialize()
 {
-	LLPanelPathfindingRebakeNavmesh* panel = new LLPanelPathfindingRebakeNavmesh();
-	panel->buildFromFile("panel_navmesh_rebake.xml");
-	return panel;
+	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 LLPanelPathfindingRebakeNavmesh::setMode(ERebakeNavMeshMode pRebakeNavMeshMode)
+void LLMenuOptionPathfindingRebakeNavmesh::quit()
 {
-	if (pRebakeNavMeshMode == kRebakeNavMesh_Available)
+	llassert(mIsInitialized);
+	if (mIsInitialized)
 	{
-		LLNotificationsUtil::add("PathfindingRebakeNavmesh");
+		if (mNavMeshSlot.connected())
+		{
+			mNavMeshSlot.disconnect();
+		}
+
+		if (mRegionCrossingSlot.connected())
+		{
+			mRegionCrossingSlot.disconnect();
+		}
+
+		if (mAgentStateSlot.connected())
+		{
+			mAgentStateSlot.disconnect();
+		}
+
+		mIsInitialized = false;
 	}
-	mNavMeshRebakeButton->setVisible(pRebakeNavMeshMode == kRebakeNavMesh_Available);
-	mNavMeshSendingButton->setVisible(pRebakeNavMeshMode == kRebakeNavMesh_RequestSent);
-	mNavMeshBakingButton->setVisible(pRebakeNavMeshMode == kRebakeNavMesh_InProgress);
+}
+
+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;
 }
 
-LLPanelPathfindingRebakeNavmesh::ERebakeNavMeshMode LLPanelPathfindingRebakeNavmesh::getMode() const
+void LLMenuOptionPathfindingRebakeNavmesh::handleAgentState(BOOL pCanRebakeRegion)
 {
-	return mRebakeNavMeshMode;
-}
-
-void LLPanelPathfindingRebakeNavmesh::onNavMeshRebakeClick()
-{
-	setMode(kRebakeNavMesh_RequestSent);
-	LLPathfindingManager::getInstance()->requestRebakeNavMesh(boost::bind(&LLPanelPathfindingRebakeNavmesh::handleRebakeNavMeshResponse, this, _1));
-}
-
-void LLPanelPathfindingRebakeNavmesh::handleAgentState(BOOL pCanRebakeRegion)
-{
+	llassert(mIsInitialized);
 	mCanRebakeRegion = pCanRebakeRegion;
 }
 
-void LLPanelPathfindingRebakeNavmesh::handleRebakeNavMeshResponse(bool pResponseStatus)
+void LLMenuOptionPathfindingRebakeNavmesh::handleRebakeNavMeshResponse(bool pResponseStatus)
 {
+	llassert(mIsInitialized);
 	if (getMode() == kRebakeNavMesh_RequestSent)
 	{
 		setMode(pResponseStatus ? kRebakeNavMesh_InProgress : kRebakeNavMesh_Default);
 	}
 }
 
-void LLPanelPathfindingRebakeNavmesh::handleNavMeshStatus(const LLPathfindingNavMeshStatus &pNavMeshStatus)
+void LLMenuOptionPathfindingRebakeNavmesh::handleNavMeshStatus(const LLPathfindingNavMeshStatus &pNavMeshStatus)
 {
+	llassert(mIsInitialized);
 	ERebakeNavMeshMode rebakeNavMeshMode = kRebakeNavMesh_Default;
 	if (pNavMeshStatus.isValid())
 	{
 	setMode(rebakeNavMeshMode);
 }
 
-void LLPanelPathfindingRebakeNavmesh::handleRegionBoundaryCrossed()
+void LLMenuOptionPathfindingRebakeNavmesh::handleRegionBoundaryCrossed()
 {
+	llassert(mIsInitialized);
 	createNavMeshStatusListenerForCurrentRegion();
 	mCanRebakeRegion = FALSE;
 	LLPathfindingManager::getInstance()->requestGetAgentState();
 }
 
-void LLPanelPathfindingRebakeNavmesh::createNavMeshStatusListenerForCurrentRegion()
+void LLMenuOptionPathfindingRebakeNavmesh::createNavMeshStatusListenerForCurrentRegion()
 {
 	if (mNavMeshSlot.connected())
 	{
 	LLViewerRegion *currentRegion = gAgent.getRegion();
 	if (currentRegion != NULL)
 	{
-		mNavMeshSlot = LLPathfindingManager::getInstance()->registerNavMeshListenerForRegion(currentRegion, boost::bind(&LLPanelPathfindingRebakeNavmesh::handleNavMeshStatus, this, _2));
+		mNavMeshSlot = LLPathfindingManager::getInstance()->registerNavMeshListenerForRegion(currentRegion, boost::bind(&LLMenuOptionPathfindingRebakeNavmesh::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);
-}

File indra/newview/llmenuoptionpathfindingrebakenavmesh.h

View file
 * 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,
 		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);
 
 	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

File indra/newview/llviewermenu.cpp

View file
 #include "llinventoryfunctions.h"
 #include "llpanellogin.h"
 #include "llpanelblockedlist.h"
+#include "llmenuoptionpathfindingrebakenavmesh.h"
 #include "llmoveview.h"
 #include "llparcel.h"
 #include "llrootview.h"
 	}
 };
 
+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;
+	}
+};
+
+class LLToolsVisiblePathfindingRebakeRegion : 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_NotAvailable));
+		}
+		return returnValue;
+	}
+};
+
 // Round the position of all root objects to the grid
 class LLToolsSnapObjectXY : public view_listener_t
 {
 
 	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");
+	view_listener_t::addMenu(new LLToolsVisiblePathfindingRebakeRegion(), "Tools.VisiblePathfindingRebakeRegion");
 
 	// Help menu
 	// most items use the ShowFloater method

File indra/newview/llviewerwindow.cpp

View file
 	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)
 	mRootView = NULL;
 	llinfos << "RootView deleted." << llendl ;
 
+	LLMenuOptionPathfindingRebakeNavmesh::getInstance()->quit();
+
 	// Automatically deleted as children of mRootView.  Fix the globals.
 	gStatusBar = NULL;
 	gIMMgr = NULL;

File indra/newview/skins/default/xui/de/panel_navmesh_rebake.xml

-<?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>

File indra/newview/skins/default/xui/en/menu_viewer.xml

View file
           <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.on_visible
+              function="Tools.VisiblePathfindingRebakeRegion" />
+        </menu_item_call>
       </menu>
 
 

File indra/newview/skins/default/xui/en/notifications.xml

View file
 
   <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/>

File indra/newview/skins/default/xui/en/panel_navmesh_rebake.xml

-<?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>

File indra/newview/skins/default/xui/es/panel_navmesh_rebake.xml

-<?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>

File indra/newview/skins/default/xui/fr/panel_navmesh_rebake.xml

-<?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>

File indra/newview/skins/default/xui/it/panel_navmesh_rebake.xml

-<?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>

File indra/newview/skins/default/xui/ja/panel_navmesh_rebake.xml

-<?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>

File indra/newview/skins/default/xui/pt/panel_navmesh_rebake.xml

-<?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>

File indra/newview/skins/default/xui/ru/panel_navmesh_rebake.xml

-<?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>

File indra/newview/skins/default/xui/tr/panel_navmesh_rebake.xml

-<?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>