diff options
21 files changed, 330 insertions, 455 deletions
| @@ -367,3 +367,4 @@ f1d3b3fcab28ed9ea532bf50db0ba96f5c8cc8e9 DRTVWR-232  f4481df42f9a4a92bf475a80f0c51d1a4bbdfd59 DRTVWR-246  39c5204b6e800983a41ccac8ad6dc993120197c6 DRTVWR-247  7c7d57d393e8ae7b61623279de06eb4a62ccae6a DRTVWR-249 +f72b50ef168c159d6e79e97aa2bcafaf8577ab99 DRTVWR-230 diff --git a/BuildParams b/BuildParams index e63336cb19..6a0e30e526 100644 --- a/BuildParams +++ b/BuildParams @@ -122,17 +122,6 @@ viewer-mesh.viewer_grid = aditi  viewer-mesh.email = shining@lists.lindenlab.com  # ======================================== -# viewer-adult-check -# ======================================== - -viewer-adult-check.viewer_channel = "Project Viewer - AdultCheck" -viewer-adult-check.login_channel = "Project Viewer - AdultCheck" -viewer-adult-check.viewer_grid = agni -viewer-adult-check.build_debug_release_separately = true -viewer-adult-check.build_CYGWIN_Debug = false -viewer-adult-check.build_viewer_update_version_manager = false - -# ========================================  # viewer-pathfinding  # ======================================== 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'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'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> | 
