diff options
| -rw-r--r-- | doc/contributions.txt | 1 | ||||
| -rw-r--r-- | indra/llcommon/llsmoothstep.h | 50 | ||||
| -rw-r--r-- | indra/llui/llfloater.h | 2 | ||||
| -rw-r--r-- | indra/newview/linux_tools/client-readme.txt | 5 | ||||
| -rw-r--r-- | indra/newview/llagent.cpp | 73 | ||||
| -rw-r--r-- | indra/newview/llagent.h | 41 | ||||
| -rw-r--r-- | indra/newview/llfloaterbuyland.cpp | 21 | ||||
| -rw-r--r-- | indra/newview/llmoveview.cpp | 16 | ||||
| -rw-r--r-- | indra/newview/llmoveview.h | 4 | ||||
| -rw-r--r-- | indra/newview/llpanelgroupinvite.cpp | 68 | ||||
| -rw-r--r-- | indra/newview/llprogressview.cpp | 98 | ||||
| -rw-r--r-- | indra/newview/llprogressview.h | 3 | ||||
| -rw-r--r-- | indra/newview/llstartup.cpp | 5 | ||||
| -rw-r--r-- | indra/newview/lltooldraganddrop.cpp | 14 | ||||
| -rw-r--r-- | indra/newview/llurldispatcher.cpp | 61 | ||||
| -rw-r--r-- | indra/newview/llviewerkeyboard.cpp | 89 | ||||
| -rw-r--r-- | indra/newview/llviewermenu.cpp | 13 | ||||
| -rw-r--r-- | indra/newview/llviewermessage.cpp | 9 | ||||
| -rw-r--r-- | indra/newview/llviewerwindow.cpp | 10 | ||||
| -rw-r--r-- | indra/newview/llworldmap.cpp | 49 | ||||
| -rw-r--r-- | indra/newview/llworldmap.h | 5 | 
21 files changed, 463 insertions, 174 deletions
| diff --git a/doc/contributions.txt b/doc/contributions.txt index cf2cb84931..d14e97644f 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -119,6 +119,7 @@ Gigs Taggart  	VWR-234  	VWR-315  	VWR-326 +	VWR-442  	VWR-493  	VWR-1203  	VWR-1217 diff --git a/indra/llcommon/llsmoothstep.h b/indra/llcommon/llsmoothstep.h new file mode 100644 index 0000000000..cac40c8f67 --- /dev/null +++ b/indra/llcommon/llsmoothstep.h @@ -0,0 +1,50 @@ +/**  + * @file llsmoothstep.h + * @brief Smoothstep - transition from 0 to 1 - function, first and second derivatives all continuous (smooth) + * + * $LicenseInfo:firstyear=2001&license=viewergpl$ + *  + * Copyright (c) 2001-2007, Linden Research, Inc. + *  + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlife.com/developers/opensource/gplv2 + *  + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at http://secondlife.com/developers/opensource/flossexception + *  + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + *  + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLSMOOTHSTEP_H +#define LL_LLSMOOTHSTEP_H + +template <class LLDATATYPE> +inline LLDATATYPE llsmoothstep(const LLDATATYPE& edge0, const LLDATATYPE& edge1, const LLDATATYPE& value) +{ +    if (value < edge0) +		return (LLDATATYPE)0; + +	if (value >= edge1) +		return (LLDATATYPE)1; + +	// Scale/bias into [0..1] range +	LLDATATYPE scaled_value = (value - edge0) / (edge1 - edge0); + +	return scaled_value * scaled_value * (3 - 2 * scaled_value); +} + +#endif // LL_LLSMOOTHSTEP_H diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index 32ee0227d0..6597ef46da 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -185,6 +185,8 @@ public:  	// Defaults to destroy().  	virtual void	onClose(bool app_quitting) { destroy(); } +	// This cannot be "const" until all derived floater canClose() +	// methods are const as well.  JC  	virtual BOOL	canClose() { return TRUE; }  	virtual void	setVisible(BOOL visible); diff --git a/indra/newview/linux_tools/client-readme.txt b/indra/newview/linux_tools/client-readme.txt index ff607b778a..87087be778 100644 --- a/indra/newview/linux_tools/client-readme.txt +++ b/indra/newview/linux_tools/client-readme.txt @@ -104,9 +104,8 @@ the Beta release of the Linux client.    stability.  See PROBLEM 3 in the TROUBLESHOOTING section if you wish to    turn these on to possibly enhance your experience. -* MISC - The following features are known to not yet be fully operational on -  the Linux client: -  * Movie recording (soon to be deprecated) +* MISC - The following features are not currently fully implemented on the +  Linux client and are therefore known not to work properly:    * Full Unicode font rendering  * UPLOAD / SAVE / COLOR-PICKER DIALOGS - These only appear when the client diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 156b4a395d..ac92ee8525 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -51,6 +51,7 @@  #include "llquaternion.h"  #include "v3math.h"  #include "v4math.h" +#include "llsmoothstep.h"  #include "llsdutil.h"  //#include "vmath.h" @@ -176,6 +177,8 @@ const F32 AVATAR_ZOOM_MIN_Z_FACTOR = 1.15f;  const F32 MAX_CAMERA_DISTANCE_FROM_AGENT = 50.f; +const F32 MAX_CAMERA_SMOOTH_DISTANCE = 20.0f; +  const F32 HEAD_BUFFER_SIZE = 0.3f;  const F32 CUSTOMIZE_AVATAR_CAMERA_ANIM_SLOP = 0.2f; @@ -272,6 +275,13 @@ void LLAgentFriendObserver::changed(U32 mask)  LLAgent::LLAgent()  :	mViewerPort(NET_USE_OS_ASSIGNED_PORT),  	mDrawDistance( DEFAULT_FAR_PLANE ), + +	mDoubleTapRunTimer(), +	mDoubleTapRunMode(DOUBLETAP_NONE), + +	mbAlwaysRun(false), +	mbRunning(false), +  	mAccess(SIM_ACCESS_PG),  	mGroupPowers(0),  	mGroupID(), @@ -303,7 +313,6 @@ LLAgent::LLAgent()  	mLastCameraMode( CAMERA_MODE_THIRD_PERSON ),  	mViewsPushed(FALSE), -	mbAlwaysRun(FALSE),  	mShowAvatar(TRUE),  	mCameraAnimating( FALSE ), @@ -329,6 +338,8 @@ LLAgent::LLAgent()  	mFocusObjectOffset(),  	mFocusDotRadius( 0.1f ),			// meters  	mTrackFocusObject(TRUE), +	mCameraSmoothingLastPositionGlobal(), +	mCameraSmoothingLastPositionAgent(),  	mFrameAgent(), @@ -3185,8 +3196,9 @@ void LLAgent::updateCamera()  			}  			// ...adjust position for animation -			camera_pos_global = lerp(mAnimationCameraStartGlobal, camera_target_global, fraction_of_animation); -			mFocusGlobal = lerp(mAnimationFocusStartGlobal, focus_target_global, fraction_of_animation); +			F32 smooth_fraction_of_animation = llsmoothstep(0.0f, 1.0f, fraction_of_animation); +			camera_pos_global = lerp(mAnimationCameraStartGlobal, camera_target_global, smooth_fraction_of_animation); +			mFocusGlobal = lerp(mAnimationFocusStartGlobal, focus_target_global, smooth_fraction_of_animation);  		}  		else  		{ @@ -3205,13 +3217,52 @@ void LLAgent::updateCamera()  			getAvatarObject()->updateAttachmentVisibility(mCameraMode);  		}  	} -	else +	else   	{  		camera_pos_global = camera_target_global;  		mFocusGlobal = focus_target_global;  		mShowAvatar = TRUE;  	} +	// smoothing +	if (TRUE) 	 +	{ +		LLVector3d agent_pos = getPositionGlobal(); +		LLVector3d camera_pos_agent = camera_pos_global - agent_pos; +		 +		if (cameraThirdPerson()) // only smooth in third person mode +		{ +			F32 smoothing = llclampf(1.f - pow(2.f, -4.f * gSavedSettings.getF32("CameraPositionSmoothing") / gFPSClamped)); +			// we use average FPS instead of LLCriticalDamp b/c exact frame time is jittery + +					 +			if (!mFocusObject)  // we differentiate on avatar mode  +			{ +				// for avatar-relative focus, we smooth in avatar space - +				// the avatar moves too jerkily w/r/t global space to smooth there. + +				LLVector3d delta = camera_pos_agent - mCameraSmoothingLastPositionAgent; +				if (delta.magVec() < MAX_CAMERA_SMOOTH_DISTANCE)  // only smooth over short distances please +				{ +					camera_pos_agent = lerp(camera_pos_agent, mCameraSmoothingLastPositionAgent, smoothing); +					camera_pos_global = camera_pos_agent + agent_pos; +				} +			} +			else +			{ +				LLVector3d delta = camera_pos_global - mCameraSmoothingLastPositionGlobal; +				if (delta.magVec() < MAX_CAMERA_SMOOTH_DISTANCE) // only smooth over short distances please +				{ +					camera_pos_global = lerp(camera_pos_global, mCameraSmoothingLastPositionGlobal, smoothing); +				} +			} +		} +								  +		mCameraSmoothingLastPositionGlobal = camera_pos_global; +		mCameraSmoothingLastPositionAgent = camera_pos_agent; +	} + +	  	mCameraCurrentFOVZoomFactor = lerp(mCameraCurrentFOVZoomFactor, mCameraFOVZoomFactor, LLCriticalDamp::getInterpolant(FOV_ZOOM_HALF_LIFE));  //	llinfos << "Current FOV Zoom: " << mCameraCurrentFOVZoomFactor << " Target FOV Zoom: " << mCameraFOVZoomFactor << " Object penetration: " << mFocusObjectDist << llendl; @@ -4990,6 +5041,20 @@ void LLAgent::sendAnimationRequest(const LLUUID &anim_id, EAnimRequest request)  	sendReliableMessage();  } +void LLAgent::sendWalkRun(bool running) +{ +	LLMessageSystem* msgsys = gMessageSystem; +	if (msgsys) +	{ +		msgsys->newMessageFast(_PREHASH_SetAlwaysRun); +		msgsys->nextBlockFast(_PREHASH_AgentData); +		msgsys->addUUIDFast(_PREHASH_AgentID, getID()); +		msgsys->addUUIDFast(_PREHASH_SessionID, getSessionID()); +		msgsys->addBOOLFast(_PREHASH_AlwaysRun, BOOL(running) ); +		sendReliableMessage(); +	} +} +  void LLAgent::friendsChanged()  {  	LLCollectProxyBuddies collector; diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index 6fe978b6cb..469d2e4fe0 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -201,16 +201,17 @@ public:  	void			heardChat(const LLUUID& id);  	void			lookAtLastChat(); -	LLUUID			getLastChatter() { return mLastChatterID; } -	F32				getTypingTime() { return mTypingTimer.getElapsedTimeF32(); } +	F32			getTypingTime() { return mTypingTimer.getElapsedTimeF32(); }  	void			setAFK();  	void			clearAFK();  	BOOL			getAFK() const; -	void			setAlwaysRun()	{ mbAlwaysRun = TRUE; } -	void			clearAlwaysRun() { mbAlwaysRun = FALSE; } -	BOOL			getAlwaysRun() const { return mbAlwaysRun; } +	void			setAlwaysRun() { mbAlwaysRun = true; } +	void			clearAlwaysRun() { mbAlwaysRun = false; } + +	void			setRunning() { mbRunning = true; } +	void			clearRunning() { mbRunning = false; }  	void			setBusy();  	void			clearBusy(); @@ -220,8 +221,7 @@ public:  	void			setGodLevel(U8 god_level)	{ mGodLevel = god_level; }  	void			setFirstLogin(BOOL b)		{ mFirstLogin = b; }  	void			setGenderChosen(BOOL b)		{ mGenderChosen = b; } -		 -	BOOL			getAdminOverride() const	{ return mAdminOverride; } +  	// update internal datastructures and update the server with the  	// new contribution level. Returns true if the group id was found  	// and contribution could be set. @@ -255,6 +255,11 @@ public:  	F32				getFocusObjectDist() const	{ return mFocusObjectDist; }  	BOOL			inPrelude();  	BOOL			canManageEstate() const; +	BOOL			getAdminOverride() const	{ return mAdminOverride; } + +	LLUUID			getLastChatter() const { return mLastChatterID; } +	bool			getAlwaysRun() const { return mbAlwaysRun; } +	bool			getRunning() const { return mbRunning; }  	const LLUUID&	getInventoryRootID() const 	{ return mInventoryRootID; } @@ -535,6 +540,15 @@ public:  	F32				getNearChatRadius() { return mNearChatRadius; } +	enum EDoubleTapRunMode +	{ +		DOUBLETAP_NONE, +		DOUBLETAP_FORWARD, +		DOUBLETAP_BACKWARD, +		DOUBLETAP_SLIDELEFT, +		DOUBLETAP_SLIDERIGHT +	}; +  	enum ETeleportState  	{  		TELEPORT_NONE = 0,			// No teleport in progress @@ -637,6 +651,8 @@ public:  	BOOL			areWearablesLoaded() { return mWearablesLoaded; } +	void sendWalkRun(bool running); +  	void observeFriends();  	void friendsChanged(); @@ -709,7 +725,13 @@ public:  	static std::map<LLString, LLString> sTeleportErrorMessages;  	static std::map<LLString, LLString> sTeleportProgressMessages; +	LLFrameTimer mDoubleTapRunTimer; +	EDoubleTapRunMode mDoubleTapRunMode; +  private: +	bool mbAlwaysRun; // should the avatar run by default rather than walk +	bool mbRunning;	// is the avatar trying to run right now +  	// Access or "maturity" level  	U8				mAccess;	// SIM_ACCESS_MATURE or SIM_ACCESS_PG  	ETeleportState	mTeleportState; @@ -738,7 +760,6 @@ private:  	BOOL			mViewsPushed;					// keep track of whether or not we have pushed views.  	BOOL            mCustomAnim ;                   //current animation is ANIM_AGENT_CUSTOMIZE ? -	BOOL			mbAlwaysRun;					// should the avatar run rather than walk  	BOOL			mShowAvatar;					// should we render the avatar?  	BOOL			mCameraAnimating;				// camera is transitioning from one mode to another  	LLVector3d		mAnimationCameraStartGlobal;	// camera start position, global coords @@ -762,7 +783,9 @@ private:  	BOOL			mSitCameraEnabled;				// use provided camera information when sitting?  	LLVector3		mSitCameraPos;					// root relative camera pos when sitting  	LLVector3		mSitCameraFocus;				// root relative camera target when sitting - +	LLVector3d      mCameraSmoothingLastPositionGlobal;     +	LLVector3d      mCameraSmoothingLastPositionAgent;     +	  	//Ventrella  	LLVector3		mCameraUpVector;				// camera's up direction in world coordinates (determines the 'roll' of the view)  	//End Ventrella diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp index 52736c8c60..5450b6de26 100644 --- a/indra/newview/llfloaterbuyland.cpp +++ b/indra/newview/llfloaterbuyland.cpp @@ -187,6 +187,7 @@ public:  	virtual void draw();  	virtual BOOL canClose();  	virtual void onClose(bool app_quitting); +	/*virtual*/ void setMinimized(BOOL b);  private:  	class SelectionObserver : public LLParcelObserver @@ -968,9 +969,27 @@ void LLFloaterBuyLandUI::draw()  	}  } +// virtual  BOOL LLFloaterBuyLandUI::canClose()  { -	return (mTransaction ? FALSE : TRUE) && mCurrency.canCancel(); +	bool can_close = (mTransaction ? FALSE : TRUE) && mCurrency.canCancel(); +	if (!can_close) +	{ +		// explain to user why they can't do this, see DEV-9605 +		gViewerWindow->alertXml("CannotCloseFloaterBuyLand"); +	} +	return can_close; +} + +// virtual +void LLFloaterBuyLandUI::setMinimized(BOOL minimize) +{ +	bool restored = (isMinimized() && !minimize); +	LLFloater::setMinimized(minimize); +	if (restored) +	{ +		refreshUI(); +	}  }  void LLFloaterBuyLandUI::onClose(bool app_quitting) diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp index 4963b42a62..eea729393c 100644 --- a/indra/newview/llmoveview.cpp +++ b/indra/newview/llmoveview.cpp @@ -39,11 +39,9 @@  // Viewer includes  #include "llagent.h"  #include "llviewercontrol.h" -#include "llfontgl.h"  #include "llbutton.h"  #include "llviewerwindow.h"  #include "lljoystickbutton.h" -#include "llresmgr.h"  #include "llvieweruictrlfactory.h"  // @@ -54,8 +52,6 @@ const F32 MOVE_BUTTON_DELAY = 0.0f;  const F32 YAW_NUDGE_RATE = 0.05f;	// fraction of normal speed  const F32 NUDGE_TIME = 0.25f;		// in seconds -const char *MOVE_TITLE = ""; -  //  // Global statics  // @@ -69,8 +65,7 @@ LLFloaterMove* LLFloaterMove::sInstance = NULL;  // protected  LLFloaterMove::LLFloaterMove() -:	LLFloater("move floater", "FloaterMoveRect", MOVE_TITLE, FALSE, 100, 100, DRAG_ON_TOP, -			  MINIMIZE_NO) +:	LLFloater("move floater")  {  	setIsChrome(TRUE);  	gUICtrlFactory->buildFloater(this,"floater_moveview.xml");  @@ -105,9 +100,6 @@ LLFloaterMove::LLFloaterMove()  	mMoveDownButton->setHeldDownDelay(MOVE_BUTTON_DELAY);  	mMoveDownButton->setHeldDownCallback( moveDown ); -	mFlyButton = LLUICtrlFactory::getButtonByName(this, "fly btn");  -	childSetAction("fly btn",onFlyButtonClicked,NULL); -  	sInstance = this;  } @@ -168,12 +160,6 @@ BOOL LLFloaterMove::visible(void*)  	return (sInstance != NULL);  } -// protected static  -void LLFloaterMove::onFlyButtonClicked(void *) -{ -	gAgent.toggleFlying(); -} -  // protected static   F32 LLFloaterMove::getYawRate( F32 time ) diff --git a/indra/newview/llmoveview.h b/indra/newview/llmoveview.h index e08f20a027..4d55206194 100644 --- a/indra/newview/llmoveview.h +++ b/indra/newview/llmoveview.h @@ -51,7 +51,7 @@ protected:  public:  	/*virtual*/ void onClose(bool app_quitting); -	static void onFlyButtonClicked(void* userdata); +  	static F32	getYawRate(F32 time);  	static void show(void*); @@ -72,8 +72,6 @@ protected:  	static void moveDown(void* userdata);  public: -	LLButton*				mFlyButton; -  	LLJoystickAgentTurn*	mForwardButton;  	LLJoystickAgentTurn*	mBackwardButton;  	LLJoystickAgentSlide*	mSlideLeftButton; diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp index e51afa30ea..f5b4fc83ca 100644 --- a/indra/newview/llpanelgroupinvite.cpp +++ b/indra/newview/llpanelgroupinvite.cpp @@ -43,6 +43,7 @@  #include "llviewerobject.h"  #include "llviewerobjectlist.h"  #include "llvieweruictrlfactory.h" +#include "llviewerwindow.h"  class LLPanelGroupInvite::impl  { @@ -65,6 +66,7 @@ public:  	static void callbackAddUsers(const std::vector<std::string>& names,  								 const std::vector<LLUUID>& agent_ids,  								 void* user_data); +	static void inviteOwnerCallback(S32 option, void* userdata);  public:  	LLUUID mGroupID; @@ -75,6 +77,8 @@ public:  	LLButton		*mOKButton;   	LLButton		*mRemoveButton;  	LLTextBox		*mGroupName; +	LLTextBox		*mOwnerWarning; +	bool		mConfirmedOwnerInvite;  	void (*mCloseCallback)(void* data); @@ -82,16 +86,19 @@ public:  }; -LLPanelGroupInvite::impl::impl(const LLUUID& group_id) +LLPanelGroupInvite::impl::impl(const LLUUID& group_id): +	mGroupID( group_id ), +	mLoadingText (), +	mInvitees ( NULL ), +	mRoleNames( NULL ), +	mOKButton ( NULL ), +	mRemoveButton( NULL ), +	mGroupName( NULL ), +	mOwnerWarning ( NULL ), +	mConfirmedOwnerInvite( false ), +	mCloseCallback( NULL ), +	mCloseCallbackUserData( NULL )  { -	mGroupID = group_id; - -	mInvitees  = NULL; -	mRoleNames = NULL; -	mRemoveButton = NULL; - -	mCloseCallback = NULL; -	mCloseCallbackUserData = NULL;  }  LLPanelGroupInvite::impl::~impl() @@ -140,12 +147,23 @@ void LLPanelGroupInvite::impl::submitInvitations()  {  	std::map<LLUUID, LLUUID> role_member_pairs; +	LLGroupMgrGroupData* gdatap = gGroupMgr->getGroupData(mGroupID); +  	// Default to everyone role.  	LLUUID role_id = LLUUID::null;  	if (mRoleNames)  	{  		role_id = mRoleNames->getCurrentID(); +		 +		// owner role: display confirmation and wait for callback +		if ((role_id == gdatap->mOwnerRole) && (!mConfirmedOwnerInvite)) +		{ +			LLString::format_map_t args; +			args["[MESSAGE]"] = mOwnerWarning->getText(); +			gViewerWindow->alertXml("GenericAlertYesCancel", args, inviteOwnerCallback, this); +			return; // we'll be called again if user confirms +		}  	}  	//loop over the users @@ -163,6 +181,28 @@ void LLPanelGroupInvite::impl::submitInvitations()  	(*mCloseCallback)(mCloseCallbackUserData);  } +//static +void LLPanelGroupInvite::impl::inviteOwnerCallback(S32 option, void* userdata) +{ +	LLPanelGroupInvite::impl* self = (LLPanelGroupInvite::impl*)userdata; +	if (!self) return; + +	switch(option) +	{ +	case 0: +		// user confirmed that they really want a new group owner +		self->mConfirmedOwnerInvite = true; +		self->submitInvitations(); +		break; +	case 1: +		// fall through +	default: +		break; +	} +} + + +  void LLPanelGroupInvite::impl::addRoleNames(LLGroupMgrGroupData* gdatap)  {  	LLGroupMgrGroupData::member_list_t::iterator agent_iter = @@ -413,7 +453,7 @@ void LLPanelGroupInvite::update()  void LLPanelGroupInvite::updateLists()  {  	LLGroupMgrGroupData* gdatap = gGroupMgr->getGroupData(mImplementation->mGroupID); -	BOOL waiting = FALSE; +	bool waiting = false;  	if (gdatap)   	{ @@ -426,7 +466,7 @@ void LLPanelGroupInvite::updateLists()  		}   		else   		{ -			waiting = TRUE; +			waiting = true;  		}  		if (gdatap->isRoleDataComplete() && gdatap->isMemberDataComplete())   		{ @@ -442,12 +482,12 @@ void LLPanelGroupInvite::updateLists()  		}   		else   		{ -			waiting = TRUE; +			waiting = true;  		}  	}   	else   	{ -		waiting = TRUE; +		waiting = true;  	}  	if (waiting)  @@ -523,6 +563,8 @@ BOOL LLPanelGroupInvite::postBuild()  		button->setCallbackUserData(mImplementation);  	} +	mImplementation->mOwnerWarning = (LLTextBox*)getChildByName("confirm_invite_owner_str", recurse); +  	update();  	return (mImplementation->mRoleNames && diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp index 28b09358ef..2d67e432c3 100644 --- a/indra/newview/llprogressview.cpp +++ b/indra/newview/llprogressview.cpp @@ -67,12 +67,10 @@ const S32 ANIMATION_FRAMES = 1; //13;  // XUI:translate  LLProgressView::LLProgressView(const std::string& name, const LLRect &rect)  -: LLPanel(name, rect, FALSE), -mMouseDownInActiveArea( false ) +:	LLPanel(name, rect, FALSE), +	mPercentDone( 0.f ), +	mMouseDownInActiveArea( false )  { -	mPercentDone = 0.f; -	mDrawBackground = TRUE; -  	const S32 CANCEL_BTN_WIDTH = 70;  	const S32 CANCEL_BTN_OFFSET = 16;  	LLRect r; @@ -218,39 +216,37 @@ void LLProgressView::draw()  	}  	// Paint bitmap if we've got one -	if (mDrawBackground) +	glPushMatrix(); +	if (gStartImageGL)  	{ -		glPushMatrix(); -		if (gStartImageGL) +		LLGLSUIDefault gls_ui; +		LLViewerImage::bindTexture(gStartImageGL); +		gGL.color4f(1.f, 1.f, 1.f, mFadeTimer.getStarted() ? clamp_rescale(mFadeTimer.getElapsedTimeF32(), 0.f, FADE_IN_TIME, 1.f, 0.f) : 1.f); +		F32 image_aspect = (F32)gStartImageWidth / (F32)gStartImageHeight; +		F32 view_aspect = (F32)width / (F32)height; +		// stretch image to maintain aspect ratio +		if (image_aspect > view_aspect)  		{ -			LLGLSUIDefault gls_ui; -			LLViewerImage::bindTexture(gStartImageGL); -			gGL.color4f(1.f, 1.f, 1.f, mFadeTimer.getStarted() ? clamp_rescale(mFadeTimer.getElapsedTimeF32(), 0.f, FADE_IN_TIME, 1.f, 0.f) : 1.f); -			F32 image_aspect = (F32)gStartImageWidth / (F32)gStartImageHeight; -			F32 view_aspect = (F32)width / (F32)height; -			// stretch image to maintain aspect ratio -			if (image_aspect > view_aspect) -			{ -				glTranslatef(-0.5f * (image_aspect / view_aspect - 1.f) * width, 0.f, 0.f); -				glScalef(image_aspect / view_aspect, 1.f, 1.f); -			} -			else -			{ -				glTranslatef(0.f, -0.5f * (view_aspect / image_aspect - 1.f) * height, 0.f); -				glScalef(1.f, view_aspect / image_aspect, 1.f); -			} -			gl_rect_2d_simple_tex( getRect().getWidth(), getRect().getHeight() ); -			gStartImageGL->unbindTexture(0, GL_TEXTURE_2D); +			glTranslatef(-0.5f * (image_aspect / view_aspect - 1.f) * width, 0.f, 0.f); +			glScalef(image_aspect / view_aspect, 1.f, 1.f);  		}  		else  		{ -			LLGLSNoTexture gls_no_texture; -			gGL.color4f(0.f, 0.f, 0.f, 1.f); -			gl_rect_2d(getRect()); +			glTranslatef(0.f, -0.5f * (view_aspect / image_aspect - 1.f) * height, 0.f); +			glScalef(1.f, view_aspect / image_aspect, 1.f);  		} -		glPopMatrix(); +		gl_rect_2d_simple_tex( getRect().getWidth(), getRect().getHeight() ); +		gStartImageGL->unbindTexture(0, GL_TEXTURE_2D); +	} +	else +	{ +		LLGLSNoTexture gls_no_texture; +		gGL.color4f(0.f, 0.f, 0.f, 1.f); +		gl_rect_2d(getRect());  	} +	glPopMatrix(); +	// Handle fade-in animation  	if (mFadeTimer.getStarted())  	{  		LLView::draw(); @@ -294,31 +290,31 @@ void LLProgressView::draw()  	S32 background_box_height = background_box_top - background_box_bottom + 1;  	gl_draw_scaled_image_with_border( background_box_left + 2,  -									  background_box_bottom - 2,  -									  16,  -									  16, -									  background_box_width,  -									  background_box_height, -									  shadow_imagep, -									  gColors.getColor( "ColorDropShadow" ) ); +									background_box_bottom - 2,  +									16,  +									16, +									background_box_width,  +									background_box_height, +									shadow_imagep, +									gColors.getColor( "ColorDropShadow" ) );  	gl_draw_scaled_image_with_border( background_box_left,  -									  background_box_bottom,  -									  16,  -									  16, -									  background_box_width,  -									  background_box_height, -									  bar_imagep, -									  LLColor4( 0.0f, 0.0f, 0.0f, 0.5f ) ); +									background_box_bottom,  +									16,  +									16, +									background_box_width,  +									background_box_height, +									bar_imagep, +									LLColor4( 0.0f, 0.0f, 0.0f, 0.4f ) );  	gl_draw_scaled_image_with_border( background_box_left + 1, -									  background_box_bottom + 1,  -									  16, -									  16, -									  background_box_width - 2, -									  background_box_height - 2, -									  bar_imagep, -									  LLColor4( 0.4f, 0.4f, 0.4f, 0.4f ) ); +									background_box_bottom + 1,  +									16, +									16, +									background_box_width - 2, +									background_box_height - 2, +									bar_imagep, +									LLColor4( 0.4f, 0.4f, 0.4f, 0.3f ) );  	// we'll need this later for catching a click if it looks like it contains a link  	if ( mMessage.find( "http://" ) != std::string::npos ) diff --git a/indra/newview/llprogressview.h b/indra/newview/llprogressview.h index 8f242b865a..e9fe7e817e 100644 --- a/indra/newview/llprogressview.h +++ b/indra/newview/llprogressview.h @@ -66,7 +66,6 @@ public:  	static void onCancelButtonClicked( void* );  protected: -	BOOL mDrawBackground;  	F32 mPercentDone;  	LLString mText;  	LLString mMessage; @@ -75,8 +74,8 @@ protected:  	LLFrameTimer mProgressTimer;  	LLRect mOutlineRect;  	bool mMouseDownInActiveArea; -	static LLProgressView* sInstance; +	static LLProgressView* sInstance;  };  #endif // LL_LLPROGRESSVIEW_H diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index e189e28c7d..d2bc8f4100 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -2253,8 +2253,9 @@ BOOL idle_startup()  		else  		{  			update_texture_fetch(); -			set_startup_status(0.60f + 0.40f * timeout_frac, "Precaching...", -							   gAgent.mMOTD.c_str()); +			set_startup_status(0.60f + 0.40f * timeout_frac, +				"Loading world...", +					gAgent.mMOTD.c_str());  		}  		return do_normal_idle; diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index f4de261240..b4107192d6 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -1465,6 +1465,16 @@ void LLToolDragAndDrop::dropObject(LLViewerObject* raycast_target,  	// Select the object only if we're editing.  	BOOL rez_selected = gToolMgr->inEdit(); + +	LLVector3 ray_start = regionp->getPosRegionFromGlobal(mLastCameraPos); +	LLVector3 ray_end   = regionp->getPosRegionFromGlobal(mLastHitPos); +	// currently the ray's end point is an approximation, +	// and is sometimes too short (causing failure.)  so we +	// double the ray's length: +	LLVector3 ray_direction = ray_start - ray_end; +	ray_end = ray_end - ray_direction; +	 +	  	// Message packing code should be it's own uninterrupted block  	LLMessageSystem* msg = gMessageSystem;  	if (mSource == SOURCE_NOTECARD) @@ -1488,8 +1498,8 @@ void LLToolDragAndDrop::dropObject(LLViewerObject* raycast_target,  	// optimization.  	msg->addUUIDFast(_PREHASH_FromTaskID, source_id);  	msg->addU8Fast(_PREHASH_BypassRaycast, (U8) bypass_sim_raycast); -	msg->addVector3Fast(_PREHASH_RayStart, regionp->getPosRegionFromGlobal(mLastCameraPos)); -	msg->addVector3Fast(_PREHASH_RayEnd, regionp->getPosRegionFromGlobal(mLastHitPos)); +	msg->addVector3Fast(_PREHASH_RayStart, ray_start); +	msg->addVector3Fast(_PREHASH_RayEnd, ray_end);  	msg->addUUIDFast(_PREHASH_RayTargetID, ray_target_id );  	msg->addBOOLFast(_PREHASH_RayEndIsIntersection, FALSE);  	msg->addBOOLFast(_PREHASH_RezSelected, rez_selected); diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp index 9e4f196601..5f167e62ad 100644 --- a/indra/newview/llurldispatcher.cpp +++ b/indra/newview/llurldispatcher.cpp @@ -89,6 +89,11 @@ private:  	static void regionHandleCallback(U64 handle, const std::string& url,  		const LLUUID& snapshot_id, bool teleport); +		// Called by LLWorldMap when a location has been resolved to a +	    // region name + +	static void regionNameCallback(U64 handle, const std::string& url, +		const LLUUID& snapshot_id, bool teleport);  		// Called by LLWorldMap when a region name has been resolved to a  		// location in-world, used by places-panel display. @@ -220,14 +225,14 @@ bool LLURLDispatcherImpl::dispatchRegion(const std::string& url, BOOL right_mous  	// Request a region handle by name  	gWorldMap->sendNamedRegionRequest(region_name, -		LLURLDispatcherImpl::regionHandleCallback, -		url, -		false);	// don't teleport +									  LLURLDispatcherImpl::regionNameCallback, +									  url, +									  false);	// don't teleport  	return true;  }  /*static*/ -void LLURLDispatcherImpl::regionHandleCallback(U64 region_handle, const std::string& url, const LLUUID& snapshot_id, bool teleport) +void LLURLDispatcherImpl::regionNameCallback(U64 region_handle, const std::string& url, const LLUUID& snapshot_id, bool teleport)  {  	std::string sim_string = stripProtocol(url);  	std::string region_name; @@ -241,6 +246,54 @@ void LLURLDispatcherImpl::regionHandleCallback(U64 region_handle, const std::str  	local_pos.mV[VY] = (F32)y;  	local_pos.mV[VZ] = (F32)z; +	 +	// determine whether the point is in this region +	if ((x >= 0) && (x < REGION_WIDTH_UNITS) && +		(y >= 0) && (y < REGION_WIDTH_UNITS)) +	{ +		// if so, we're done +		regionHandleCallback(region_handle, url, snapshot_id, teleport); +	} + +	else +	{ +		// otherwise find the new region from the location +		 +		// add the position to get the new region +		LLVector3d global_pos = from_region_handle(region_handle) + LLVector3d(local_pos); + +		U64 new_region_handle = to_region_handle(global_pos); +		gWorldMap->sendHandleRegionRequest(new_region_handle, +										   LLURLDispatcherImpl::regionHandleCallback, +										   url, teleport); +	} +} + +/* static */ +void LLURLDispatcherImpl::regionHandleCallback(U64 region_handle, const std::string& url, const LLUUID& snapshot_id, bool teleport) +{ +	std::string sim_string = stripProtocol(url); +	std::string region_name; +	S32 x = 128; +	S32 y = 128; +	S32 z = 0; +	LLURLSimString::parse(sim_string, ®ion_name, &x, &y, &z); + +	// remap x and y to local coordinates +	S32 local_x = x % REGION_WIDTH_UNITS; +	S32 local_y = y % REGION_WIDTH_UNITS; +	if (local_x < 0) +		local_x += REGION_WIDTH_UNITS; +	if (local_y < 0) +		local_y += REGION_WIDTH_UNITS; +	 +	LLVector3 local_pos; +	local_pos.mV[VX] = (F32)local_x; +	local_pos.mV[VY] = (F32)local_y; +	local_pos.mV[VZ] = (F32)z; + + +	  	if (teleport)  	{  		LLVector3d global_pos = from_region_handle(region_handle); diff --git a/indra/newview/llviewerkeyboard.cpp b/indra/newview/llviewerkeyboard.cpp index 8a5a5e99c9..db0da19927 100644 --- a/indra/newview/llviewerkeyboard.cpp +++ b/indra/newview/llviewerkeyboard.cpp @@ -83,82 +83,101 @@ void agent_push_down( EKeystate s )  	gAgent.moveUp(-1);  } -void agent_push_forward( EKeystate s ) +static void agent_handle_doubletap_run(EKeystate s, LLAgent::EDoubleTapRunMode mode)  { -	if( KEYSTATE_UP == s  ) return; -	F32 time = gKeyboard->getCurKeyElapsedTime(); -	S32 frame_count = llround(gKeyboard->getCurKeyElapsedFrameCount()); - -	if( time < NUDGE_TIME || frame_count <= NUDGE_FRAMES) +	if (KEYSTATE_UP == s)  	{ -		gAgent.moveAtNudge(1); +		// Releasing a walk-key resets the double-tap timer +		gAgent.mDoubleTapRunTimer.reset(); +		if (gAgent.mDoubleTapRunMode == mode && +		    gAgent.getRunning() && +		    !gAgent.getAlwaysRun()) +		{ +			// Turn off temporary running. +			gAgent.clearRunning(); +			gAgent.sendWalkRun(gAgent.getRunning()); +		} +		gAgent.mDoubleTapRunMode = mode;  	} -	else +	else if (KEYSTATE_DOWN == s && +		 gAgent.mDoubleTapRunMode == mode && +		 gAgent.mDoubleTapRunTimer.getElapsedTimeF32() < NUDGE_TIME)  	{ -		gAgent.moveAt(1); +		// Same walk-key was pushed again quickly; this is a double-tap +		// so engage temporary running. +		gAgent.setRunning(); +		gAgent.sendWalkRun(gAgent.getRunning());  	}  } - -void agent_push_backward( EKeystate s ) +static void agent_push_forwardbackward( EKeystate s, S32 direction, LLAgent::EDoubleTapRunMode mode )  { -	if( KEYSTATE_UP == s  ) return; -	S32 frame_count = llround(gKeyboard->getCurKeyElapsedFrameCount()); +	agent_handle_doubletap_run(s, mode); +	if (KEYSTATE_UP == s) return; +  	F32 time = gKeyboard->getCurKeyElapsedTime(); +	S32 frame_count = llround(gKeyboard->getCurKeyElapsedFrameCount());  	if( time < NUDGE_TIME || frame_count <= NUDGE_FRAMES)  	{ -		gAgent.moveAtNudge(-1); +		gAgent.moveAtNudge(direction);  	}  	else  	{ -		gAgent.moveAt(-1); +		gAgent.moveAt(direction);  	}  } -void agent_slide_left( EKeystate s ) +void agent_push_forward( EKeystate s )  { -	if( KEYSTATE_UP == s  ) return; +	agent_push_forwardbackward(s, 1, LLAgent::DOUBLETAP_FORWARD); +} + + +void agent_push_backward( EKeystate s ) +{ +	agent_push_forwardbackward(s, -1, LLAgent::DOUBLETAP_BACKWARD); +} + +static void agent_slide_leftright( EKeystate s, S32 direction, LLAgent::EDoubleTapRunMode mode ) +{ +	agent_handle_doubletap_run(s, mode); +	if( KEYSTATE_UP == s ) return;  	F32 time = gKeyboard->getCurKeyElapsedTime();  	S32 frame_count = llround(gKeyboard->getCurKeyElapsedFrameCount());  	if( time < NUDGE_TIME || frame_count <= NUDGE_FRAMES)  	{ -		gAgent.moveLeftNudge(1); +		gAgent.moveLeftNudge(direction);  	}  	else  	{ -		gAgent.moveLeft(1); +		gAgent.moveLeft(direction);  	}  } -void agent_slide_right( EKeystate s ) +void agent_slide_left( EKeystate s )  { -	if( KEYSTATE_UP == s  ) return; -	F32 time = gKeyboard->getCurKeyElapsedTime(); -	S32 frame_count = llround(gKeyboard->getCurKeyElapsedFrameCount()); +	agent_slide_leftright(s, 1, LLAgent::DOUBLETAP_SLIDELEFT); +} -	if( time < NUDGE_TIME || frame_count <= NUDGE_FRAMES) -	{ -		gAgent.moveLeftNudge(-1); -	} -	else -	{ -		gAgent.moveLeft(-1); -	} + +void agent_slide_right( EKeystate s ) +{ +	agent_slide_leftright(s, -1, LLAgent::DOUBLETAP_SLIDERIGHT);  }  void agent_turn_left( EKeystate s )  { -	if( KEYSTATE_UP == s  ) return; -	F32 time = gKeyboard->getCurKeyElapsedTime();  	if (gToolCamera->mouseSteerMode())  	{  		agent_slide_left(s);  	}  	else  	{ +		if (KEYSTATE_UP == s) return; +		F32 time = gKeyboard->getCurKeyElapsedTime();  		gAgent.moveYaw( LLFloaterMove::getYawRate( time ) );  	}  } @@ -166,14 +185,14 @@ void agent_turn_left( EKeystate s )  void agent_turn_right( EKeystate s )  { -	if( KEYSTATE_UP == s  ) return; -	F32 time = gKeyboard->getCurKeyElapsedTime();  	if (gToolCamera->mouseSteerMode())  	{  		agent_slide_right(s);  	}  	else  	{ +		if (KEYSTATE_UP == s) return; +		F32 time = gKeyboard->getCurKeyElapsedTime();  		gAgent.moveYaw( -LLFloaterMove::getYawRate( time ) );  	}  } diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 8ef9d9c913..a384d24947 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -4881,23 +4881,22 @@ class LLWorldAlwaysRun : public view_listener_t  {  	bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata)  	{ +		// as well as altering the default walk-vs-run state, +		// we also change the *current* walk-vs-run state.  		if (gAgent.getAlwaysRun())  		{  			gAgent.clearAlwaysRun(); +			gAgent.clearRunning();  		}  		else  		{  			gAgent.setAlwaysRun(); +			gAgent.setRunning();  		} -		LLMessageSystem *msg = gMessageSystem; +		// tell the simulator. +		gAgent.sendWalkRun(gAgent.getAlwaysRun()); -		msg->newMessageFast(_PREHASH_SetAlwaysRun); -		msg->nextBlockFast(_PREHASH_AgentData); -		msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); -		msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); -		msg->addBOOLFast(_PREHASH_AlwaysRun, gAgent.getAlwaysRun() ); -		gAgent.sendReliableMessage();  		return true;  	}  }; diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 5200c321db..6bd81e76e9 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -2834,13 +2834,8 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)  		avatarp->mFootPlane.clearVec();  	} -	// reset always run status -	msg->newMessageFast(_PREHASH_SetAlwaysRun); -	msg->nextBlockFast(_PREHASH_AgentData); -	msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); -	msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); -	msg->addBOOLFast(_PREHASH_AlwaysRun, gAgent.getAlwaysRun()); -	gAgent.sendReliableMessage(); +	// send walk-vs-run status +	gAgent.sendWalkRun(gAgent.getRunning() || gAgent.getAlwaysRun());  	if (LLFloaterReleaseMsg::checkVersion(version_channel_char))  	{ diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index dcceb397d3..900fd6fc8b 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1802,9 +1802,11 @@ void adjust_rect_bottom_center(const LLString& control, const LLRect& window)  	LLRect r = gSavedSettings.getRect(control);  	if (r.mLeft == 0 && r.mBottom == 0)  	{ +		// *TODO: Adjust based on XUI XML +		const S32 TOOLBAR_HEIGHT = 64;  		r.setOriginAndSize(  			window.getWidth()/2 - r.getWidth()/2, -			0, +			TOOLBAR_HEIGHT,  			r.getWidth(),  			r.getHeight());  		gSavedSettings.setRect(control, r); @@ -1838,9 +1840,9 @@ void LLViewerWindow::adjustRectanglesForFirstUse(const LLRect& window)  {  	LLRect r; -	adjust_rect_bottom_center("FloaterMoveRect", window); +	adjust_rect_bottom_center("FloaterMoveRect2", window); -	adjust_rect_bottom_center("FloaterCameraRect", window); +	adjust_rect_bottom_center("FloaterCameraRect2", window);  	adjust_rect_top_left("FloaterCustomizeAppearanceRect", window); @@ -1856,8 +1858,6 @@ void LLViewerWindow::adjustRectanglesForFirstUse(const LLRect& window)  	adjust_rect_top_right("FloaterLagMeter", window); -	adjust_rect_top_right("FloaterLagMeter", window); -  	adjust_rect_top_left("FloaterBuildOptionsRect", window);  	// bottom-right diff --git a/indra/newview/llworldmap.cpp b/indra/newview/llworldmap.cpp index 50c9ceeb0a..6d0853a6dc 100644 --- a/indra/newview/llworldmap.cpp +++ b/indra/newview/llworldmap.cpp @@ -108,6 +108,7 @@ LLWorldMap::LLWorldMap() :  	mNeighborMapWidth(0),  	mNeighborMapHeight(0),  	mSLURLRegionName(), +	mSLURLRegionHandle(0),  	mSLURL(),  	mSLURLCallback(0),  	mSLURLTeleport(false) @@ -409,6 +410,7 @@ void LLWorldMap::sendNamedRegionRequest(std::string region_name,  		bool teleport)	// immediately teleport when result returned  {  	mSLURLRegionName = region_name; +	mSLURLRegionHandle = 0;  	mSLURL = callback_url;  	mSLURLCallback = callback;  	mSLURLTeleport = teleport; @@ -416,6 +418,26 @@ void LLWorldMap::sendNamedRegionRequest(std::string region_name,  	sendNamedRegionRequest(region_name);  } +void LLWorldMap::sendHandleRegionRequest(U64 region_handle,  +		url_callback_t callback, +		const std::string& callback_url, +		bool teleport)	// immediately teleport when result returned +{ +	mSLURLRegionName.clear(); +	mSLURLRegionHandle = region_handle; +	mSLURL = callback_url; +	mSLURLCallback = callback; +	mSLURLTeleport = teleport; + +	U32 global_x; +	U32 global_y; +	from_region_handle(region_handle, &global_x, &global_y); +	U16 grid_x = (U16)(global_x / REGION_WIDTH_UNITS); +	U16 grid_y = (U16)(global_y / REGION_WIDTH_UNITS); +	 +	sendMapBlockRequest(grid_x, grid_y, grid_x, grid_y, true); +} +  // public  void LLWorldMap::sendMapBlockRequest(U16 min_x, U16 min_y, U16 max_x, U16 max_y, bool return_nonexistent)  { @@ -566,17 +588,6 @@ void LLWorldMap::processMapBlockReply(LLMessageSystem* msg, void**)  			found_null_sim = true;  		} -		else if(gWorldMap->mSLURLCallback != NULL) -		{ -			// Server returns definitive capitalization, SLURL might -			// not have that. -			if (!stricmp(gWorldMap->mSLURLRegionName.c_str(), name)) -			{ -				gWorldMap->mSLURLCallback(handle, gWorldMap->mSLURL, image_id, gWorldMap->mSLURLTeleport); -				gWorldMap->mSLURLCallback = NULL; -				gWorldMap->mSLURLRegionName.clear(); -			} -		}  		else  		{  			adjust = gWorldMap->extendAABB(x_meters,  @@ -642,6 +653,22 @@ void LLWorldMap::processMapBlockReply(LLMessageSystem* msg, void**)  				}  			}  		} +				 +		if(gWorldMap->mSLURLCallback != NULL) +		{ +			// Server returns definitive capitalization, SLURL might +			// not have that. +			if (!stricmp(gWorldMap->mSLURLRegionName.c_str(), name) || (gWorldMap->mSLURLRegionHandle == handle)) +			{ +				url_callback_t callback = gWorldMap->mSLURLCallback; + +				gWorldMap->mSLURLCallback = NULL; +				gWorldMap->mSLURLRegionName.clear(); +				gWorldMap->mSLURLRegionHandle = 0; + +				callback(handle, gWorldMap->mSLURL, image_id, gWorldMap->mSLURLTeleport); +			} +		}  	}  	if(adjust) gFloaterWorldMap->adjustZoomSliderBounds(); diff --git a/indra/newview/llworldmap.h b/indra/newview/llworldmap.h index b0c6f352b0..3c9dc781fa 100644 --- a/indra/newview/llworldmap.h +++ b/indra/newview/llworldmap.h @@ -153,6 +153,10 @@ public:  		url_callback_t callback,  		const std::string& callback_url,  		bool teleport); +	void sendHandleRegionRequest(U64 region_handle,  +		url_callback_t callback, +		const std::string& callback_url, +		bool teleport);  	void sendItemRequest(U32 type, U64 handle = 0);  	static void processMapLayerReply(LLMessageSystem*, void**); @@ -217,6 +221,7 @@ private:  	// search for named region for url processing  	std::string mSLURLRegionName; +	U64 mSLURLRegionHandle;  	std::string mSLURL;  	url_callback_t mSLURLCallback;  	bool mSLURLTeleport; | 
