diff options
| -rwxr-xr-x | doc/contributions.txt | 10 | ||||
| -rwxr-xr-x | indra/llui/lltexteditor.cpp | 24 | ||||
| -rwxr-xr-x | indra/llui/lltexteditor.h | 2 | ||||
| -rwxr-xr-x | indra/newview/app_settings/settings.xml | 11 | ||||
| -rwxr-xr-x | indra/newview/app_settings/settings_minimal.xml | 5 | ||||
| -rwxr-xr-x | indra/newview/llchatbar.cpp | 2 | ||||
| -rwxr-xr-x | indra/newview/llfloaterbulkpermission.cpp | 36 | ||||
| -rwxr-xr-x | indra/newview/llfloaterbulkpermission.h | 16 | ||||
| -rwxr-xr-x | indra/newview/llfloaterimnearbychat.cpp | 2 | ||||
| -rwxr-xr-x | indra/newview/llfloaterimnearbychatlistener.cpp | 4 | ||||
| -rwxr-xr-x | indra/newview/llmaniprotate.cpp | 232 | ||||
| -rwxr-xr-x | indra/newview/llpanelpeople.cpp | 4 | ||||
| -rwxr-xr-x | indra/newview/skins/default/xui/en/floater_bulk_perms.xml | 19 | ||||
| -rwxr-xr-x | indra/newview/skins/default/xui/en/panel_group_notices.xml | 4 | ||||
| -rwxr-xr-x | indra/newview/skins/default/xui/en/panel_people.xml | 14 | ||||
| -rwxr-xr-x | indra/newview/skins/default/xui/en/panel_preferences_advanced.xml | 2 | 
16 files changed, 255 insertions, 132 deletions
| diff --git a/doc/contributions.txt b/doc/contributions.txt index 9a390f6660..113fd659e3 100755 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -175,6 +175,7 @@ Ansariel Hiller  	STORM-1685  	STORM-1713  	STORM-1899 +	STORM-1931  Aralara Rajal  Ardy Lay  	STORM-859 @@ -313,6 +314,7 @@ Cron Stardust  	VWR-10579  	VWR-25120  	STORM-1075 +	STORM-1919  Cypren Christenson  	STORM-417  Dante Tucker @@ -500,6 +502,8 @@ Ima Mechanique  	STORM-959  	STORM-1175  	STORM-1708 +	STORM-1855 +	VWR-20553  Imnotgoing Sideways  Inma Rau  Innula Zenovka @@ -643,12 +647,15 @@ Jonathan Yap  	STORM-1793  	STORM-1810  	STORM-1877 +	STORM-1892 +	STORM-1894  	STORM-1860  	STORM-1852  	STORM-1870  	STORM-1872  	STORM-1858  	STORM-1862 +	STORM-1918  	OPEN-161  Kadah Coba  	STORM-1060 @@ -696,6 +703,7 @@ Kunnis Basiat  	VWR-82  	VWR-102  Lance Corrimal +	STORM-1910  	VWR-25269  Latif Khalifa  	VWR-5370 @@ -750,6 +758,7 @@ Marianne McCann  Marine Kelley      CHUIBUG-134      STORM-281 +    STORM-1910  MartinRJ Fayray      STORM-1844      STORM-1845 @@ -1046,6 +1055,7 @@ Satanello Miami  Satomi Ahn  	STORM-501  	STORM-229 +	VWR-20553  	VWR-24502  Scrim Pinion  Scrippy Scofield diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index 834f213097..d6c5c5c48e 100755 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -1125,7 +1125,8 @@ void LLTextEditor::addChar(llwchar wc)  	}  } -void LLTextEditor::addLineBreakChar() + +void LLTextEditor::addLineBreakChar(BOOL group_together)  {  	if( !getEnabled() )  	{ @@ -1143,7 +1144,7 @@ void LLTextEditor::addLineBreakChar()  	LLStyleConstSP sp(new LLStyle(LLStyle::Params()));  	LLTextSegmentPtr segment = new LLLineBreakTextSegment(sp, mCursorPos); -	S32 pos = execute(new TextCmdAddChar(mCursorPos, FALSE, '\n', segment)); +	S32 pos = execute(new TextCmdAddChar(mCursorPos, group_together, '\n', segment));  	setCursorPos(mCursorPos + pos);  } @@ -1484,21 +1485,28 @@ void LLTextEditor::pasteTextWithLinebreaks(LLWString & clean_string)  	std::basic_string<llwchar>::size_type start = 0;  	std::basic_string<llwchar>::size_type pos = clean_string.find('\n',start); -	while(pos!=-1) +	while((pos != -1) && (pos != clean_string.length() -1))  	{  		if(pos!=start)  		{  			std::basic_string<llwchar> str = std::basic_string<llwchar>(clean_string,start,pos-start); -			setCursorPos(mCursorPos + insert(mCursorPos, str, FALSE, LLTextSegmentPtr())); +			setCursorPos(mCursorPos + insert(mCursorPos, str, TRUE, LLTextSegmentPtr()));  		} -		addLineBreakChar(); -		 +		addLineBreakChar(TRUE);			// Add a line break and group with the next addition. +  		start = pos+1;  		pos = clean_string.find('\n',start);  	} -	std::basic_string<llwchar> str = std::basic_string<llwchar>(clean_string,start,clean_string.length()-start); -	setCursorPos(mCursorPos + insert(mCursorPos, str, FALSE, LLTextSegmentPtr())); +	if (pos != start) +	{ +		std::basic_string<llwchar> str = std::basic_string<llwchar>(clean_string,start,clean_string.length()-start); +		setCursorPos(mCursorPos + insert(mCursorPos, str, FALSE, LLTextSegmentPtr())); +	} +	else +	{ +		addLineBreakChar(FALSE);		// Add a line break and end the grouping. +	}  }  // copy selection to primary diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h index 969e072704..ad46ed45ec 100755 --- a/indra/llui/lltexteditor.h +++ b/indra/llui/lltexteditor.h @@ -248,7 +248,7 @@ protected:  	// Undoable operations  	void			addChar(llwchar c); // at mCursorPos  	S32				addChar(S32 pos, llwchar wc); -	void			addLineBreakChar(); +	void			addLineBreakChar(BOOL group_together = FALSE);  	S32				overwriteChar(S32 pos, llwchar wc);  	void			removeChar();  	S32 			removeChar(S32 pos); diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 344079b640..9b9984367b 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -6987,6 +6987,17 @@        <key>Value</key>        <real>90.0</real>      </map> +    <key>PlayChatAnim</key> +    <map> +      <key>Comment</key> +      <string>Your avatar plays the chat animation whenever you say, shout or whisper something in nearby chat</string> +      <key>Persist</key> +      <integer>1</integer> +      <key>Type</key> +      <string>Boolean</string> +      <key>Value</key> +      <integer>1</integer> +    </map>      <key>PlayTypingAnim</key>      <map>        <key>Comment</key> diff --git a/indra/newview/app_settings/settings_minimal.xml b/indra/newview/app_settings/settings_minimal.xml index 01a70f2671..e660c1a33b 100755 --- a/indra/newview/app_settings/settings_minimal.xml +++ b/indra/newview/app_settings/settings_minimal.xml @@ -1 +1,4 @@ -<llsd/>
\ No newline at end of file +<?xml version="1.0"?> +<llsd> +  <undef/> +</llsd> diff --git a/indra/newview/llchatbar.cpp b/indra/newview/llchatbar.cpp index 7d0331757b..b3bc0ba966 100755 --- a/indra/newview/llchatbar.cpp +++ b/indra/newview/llchatbar.cpp @@ -381,7 +381,7 @@ void LLChatBar::sendChat( EChatType type )  			if (!utf8_revised_text.empty())  			{  				// Chat with animation -				sendChatFromViewer(utf8_revised_text, type, TRUE); +				sendChatFromViewer(utf8_revised_text, type, gSavedSettings.getBOOL("PlayChatAnim"));  			}  		}  	} diff --git a/indra/newview/llfloaterbulkpermission.cpp b/indra/newview/llfloaterbulkpermission.cpp index 39b6e465f3..76f62a7880 100755 --- a/indra/newview/llfloaterbulkpermission.cpp +++ b/indra/newview/llfloaterbulkpermission.cpp @@ -57,6 +57,7 @@ LLFloaterBulkPermission::LLFloaterBulkPermission(const LLSD& seed)  	mDone(FALSE)  {  	mID.generate(); +	mCommitCallbackRegistrar.add("BulkPermission.Ok",		boost::bind(&LLFloaterBulkPermission::onOkBtn, this));  	mCommitCallbackRegistrar.add("BulkPermission.Apply",	boost::bind(&LLFloaterBulkPermission::onApplyBtn, this));  	mCommitCallbackRegistrar.add("BulkPermission.Close",	boost::bind(&LLFloaterBulkPermission::onCloseBtn, this));  	mCommitCallbackRegistrar.add("BulkPermission.CheckAll",	boost::bind(&LLFloaterBulkPermission::onCheckAll, this)); @@ -66,6 +67,21 @@ LLFloaterBulkPermission::LLFloaterBulkPermission(const LLSD& seed)  BOOL LLFloaterBulkPermission::postBuild()  { +	mBulkChangeIncludeAnimations = gSavedSettings.getBOOL("BulkChangeIncludeAnimations"); +	mBulkChangeIncludeBodyParts = gSavedSettings.getBOOL("BulkChangeIncludeBodyParts"); +	mBulkChangeIncludeClothing = gSavedSettings.getBOOL("BulkChangeIncludeClothing"); +	mBulkChangeIncludeGestures = gSavedSettings.getBOOL("BulkChangeIncludeGestures"); +	mBulkChangeIncludeNotecards = gSavedSettings.getBOOL("BulkChangeIncludeNotecards"); +	mBulkChangeIncludeObjects = gSavedSettings.getBOOL("BulkChangeIncludeObjects"); +	mBulkChangeIncludeScripts = gSavedSettings.getBOOL("BulkChangeIncludeScripts"); +	mBulkChangeIncludeSounds = gSavedSettings.getBOOL("BulkChangeIncludeSounds"); +	mBulkChangeIncludeTextures = gSavedSettings.getBOOL("BulkChangeIncludeTextures"); +	mBulkChangeShareWithGroup = gSavedSettings.getBOOL("BulkChangeShareWithGroup"); +	mBulkChangeEveryoneCopy = gSavedSettings.getBOOL("BulkChangeEveryoneCopy"); +	mBulkChangeNextOwnerModify = gSavedSettings.getBOOL("BulkChangeNextOwnerModify"); +	mBulkChangeNextOwnerCopy = gSavedSettings.getBOOL("BulkChangeNextOwnerCopy"); +	mBulkChangeNextOwnerTransfer = gSavedSettings.getBOOL("BulkChangeNextOwnerTransfer"); +  	return TRUE;  } @@ -144,6 +160,12 @@ void LLFloaterBulkPermission::inventoryChanged(LLViewerObject* viewer_object,  	}  } +void LLFloaterBulkPermission::onOkBtn() +{ +	doApply(); +	closeFloater(); +} +  void LLFloaterBulkPermission::onApplyBtn()  {  	doApply(); @@ -151,6 +173,20 @@ void LLFloaterBulkPermission::onApplyBtn()  void LLFloaterBulkPermission::onCloseBtn()  { +	gSavedSettings.setBOOL("BulkChangeIncludeAnimations", mBulkChangeIncludeAnimations); +	gSavedSettings.setBOOL("BulkChangeIncludeBodyParts", mBulkChangeIncludeBodyParts); +	gSavedSettings.setBOOL("BulkChangeIncludeClothing", mBulkChangeIncludeClothing); +	gSavedSettings.setBOOL("BulkChangeIncludeGestures", mBulkChangeIncludeGestures); +	gSavedSettings.setBOOL("BulkChangeIncludeNotecards", mBulkChangeIncludeNotecards); +	gSavedSettings.setBOOL("BulkChangeIncludeObjects", mBulkChangeIncludeObjects); +	gSavedSettings.setBOOL("BulkChangeIncludeScripts", mBulkChangeIncludeScripts); +	gSavedSettings.setBOOL("BulkChangeIncludeSounds", mBulkChangeIncludeSounds); +	gSavedSettings.setBOOL("BulkChangeIncludeTextures", mBulkChangeIncludeTextures); +	gSavedSettings.setBOOL("BulkChangeShareWithGroup", mBulkChangeShareWithGroup); +	gSavedSettings.setBOOL("BulkChangeEveryoneCopy", mBulkChangeEveryoneCopy); +	gSavedSettings.setBOOL("BulkChangeNextOwnerModify", mBulkChangeNextOwnerModify); +	gSavedSettings.setBOOL("BulkChangeNextOwnerCopy", mBulkChangeNextOwnerCopy); +	gSavedSettings.setBOOL("BulkChangeNextOwnerTransfer", mBulkChangeNextOwnerTransfer);  	closeFloater();  } diff --git a/indra/newview/llfloaterbulkpermission.h b/indra/newview/llfloaterbulkpermission.h index 7dd05df7ee..25e76eca65 100755 --- a/indra/newview/llfloaterbulkpermission.h +++ b/indra/newview/llfloaterbulkpermission.h @@ -72,6 +72,7 @@ private:  								bool is_new);  	void onCloseBtn(); +	void onOkBtn();  	void onApplyBtn();  	void onCommitCopy();  	void onCheckAll() { doCheckUncheckAll(TRUE); } @@ -94,6 +95,21 @@ private:  	LLUUID mCurrentObjectID;  	BOOL mDone; +	bool mBulkChangeIncludeAnimations; +	bool mBulkChangeIncludeBodyParts; +	bool mBulkChangeIncludeClothing; +	bool mBulkChangeIncludeGestures; +	bool mBulkChangeIncludeNotecards; +	bool mBulkChangeIncludeObjects; +	bool mBulkChangeIncludeScripts; +	bool mBulkChangeIncludeSounds; +	bool mBulkChangeIncludeTextures; +	bool mBulkChangeShareWithGroup; +	bool mBulkChangeEveryoneCopy; +	bool mBulkChangeNextOwnerModify; +	bool mBulkChangeNextOwnerCopy; +	bool mBulkChangeNextOwnerTransfer; +  	LLUUID mID;  	const char* mStartString; diff --git a/indra/newview/llfloaterimnearbychat.cpp b/indra/newview/llfloaterimnearbychat.cpp index 56b0c15cb9..ebc6579546 100755 --- a/indra/newview/llfloaterimnearbychat.cpp +++ b/indra/newview/llfloaterimnearbychat.cpp @@ -582,7 +582,7 @@ void LLFloaterIMNearbyChat::sendChat( EChatType type )  			if (!utf8_revised_text.empty())  			{  				// Chat with animation -				sendChatFromViewer(utf8_revised_text, type, TRUE); +				sendChatFromViewer(utf8_revised_text, type, gSavedSettings.getBOOL("PlayChatAnim"));  			}  		} diff --git a/indra/newview/llfloaterimnearbychatlistener.cpp b/indra/newview/llfloaterimnearbychatlistener.cpp index 14a22bcd84..5a5f6c72c8 100755 --- a/indra/newview/llfloaterimnearbychatlistener.cpp +++ b/indra/newview/llfloaterimnearbychatlistener.cpp @@ -33,7 +33,7 @@  #include "llagent.h"  #include "llchat.h" - +#include "llviewercontrol.h"  LLFloaterIMNearbyChatListener::LLFloaterIMNearbyChatListener(LLFloaterIMNearbyChat & chatbar) @@ -95,6 +95,6 @@ void LLFloaterIMNearbyChatListener::sendChat(LLSD const & chat_data) const  	}  	// Send it as if it was typed in -	mChatbar.sendChatFromViewer(chat_to_send, type_o_chat, (BOOL)(channel == 0)); +	mChatbar.sendChatFromViewer(chat_to_send, type_o_chat, ((BOOL)(channel == 0)) && gSavedSettings.getBOOL("PlayChatAnim"));  } diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp index d79f1040bb..4cbdfde868 100755 --- a/indra/newview/llmaniprotate.cpp +++ b/indra/newview/llmaniprotate.cpp @@ -1376,74 +1376,28 @@ LLQuaternion LLManipRotate::dragConstrained( S32 x, S32 y )  		BOOL hit = getMousePointOnPlaneAgent(projected_mouse, x, y, snap_plane_center, constraint_axis);  		projected_mouse -= snap_plane_center; -		S32 snap_plane = 0; - -		F32 dot = cam_to_snap_plane * constraint_axis; -		if (llabs(dot) < 0.01f) -		{ -			// looking at ring edge on, project onto view plane and check if mouse is past ring -			getMousePointOnPlaneAgent(projected_mouse, x, y, snap_plane_center, cam_to_snap_plane); -			projected_mouse -= snap_plane_center; -			dot = projected_mouse * constraint_axis; -			if (projected_mouse * constraint_axis > 0) -			{ -				snap_plane = 1; -			} -			projected_mouse -= dot * constraint_axis; -		} -		else if (dot > 0.f) -		{ -			// look for mouse position outside and in front of snap circle -			if (hit && projected_mouse.magVec() > SNAP_GUIDE_INNER_RADIUS * mRadiusMeters && projected_mouse * cam_to_snap_plane < 0.f) -			{ -				snap_plane = 1; -			} -		} -		else -		{ -			// look for mouse position inside or in back of snap circle -			if (projected_mouse.magVec() < SNAP_GUIDE_INNER_RADIUS * mRadiusMeters || projected_mouse * cam_to_snap_plane > 0.f || !hit) -			{ -				snap_plane = 1; -			} -		} - -		if (snap_plane == 0) -		{ -			// try other plane -			snap_plane_center = (center - (constraint_axis * mRadiusMeters * 0.5f)); -			if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) -			{ -				cam_to_snap_plane.setVec(1.f, 0.f, 0.f); -			} -			else -			{ -				cam_to_snap_plane = snap_plane_center - gAgentCamera.getCameraPositionAgent(); -				cam_to_snap_plane.normVec(); -			} - -			hit = getMousePointOnPlaneAgent(projected_mouse, x, y, snap_plane_center, constraint_axis); -			projected_mouse -= snap_plane_center; - -			dot = cam_to_snap_plane * constraint_axis; +		if (gSavedSettings.getBOOL("SnapEnabled")) { +			S32 snap_plane = 0; +	 +			F32 dot = cam_to_snap_plane * constraint_axis;  			if (llabs(dot) < 0.01f)  			{  				// looking at ring edge on, project onto view plane and check if mouse is past ring  				getMousePointOnPlaneAgent(projected_mouse, x, y, snap_plane_center, cam_to_snap_plane);  				projected_mouse -= snap_plane_center;  				dot = projected_mouse * constraint_axis; -				if (projected_mouse * constraint_axis < 0) +				if (projected_mouse * constraint_axis > 0)  				{ -					snap_plane = 2; +					snap_plane = 1;  				}  				projected_mouse -= dot * constraint_axis;  			} -			else if (dot < 0.f) +			else if (dot > 0.f)  			{  				// look for mouse position outside and in front of snap circle  				if (hit && projected_mouse.magVec() > SNAP_GUIDE_INNER_RADIUS * mRadiusMeters && projected_mouse * cam_to_snap_plane < 0.f)  				{ -					snap_plane = 2; +					snap_plane = 1;  				}  			}  			else @@ -1451,78 +1405,136 @@ LLQuaternion LLManipRotate::dragConstrained( S32 x, S32 y )  				// look for mouse position inside or in back of snap circle  				if (projected_mouse.magVec() < SNAP_GUIDE_INNER_RADIUS * mRadiusMeters || projected_mouse * cam_to_snap_plane > 0.f || !hit)  				{ -					snap_plane = 2; +					snap_plane = 1;  				}  			} -		} - -		if (snap_plane > 0) -		{ -			LLVector3 cam_at_axis; -			if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) -			{ -				cam_at_axis.setVec(1.f, 0.f, 0.f); -			} -			else -			{ -				cam_at_axis = snap_plane_center - gAgentCamera.getCameraPositionAgent(); -				cam_at_axis.normVec(); -			} - -			// first, project mouse onto screen plane at point tangent to rotation radius.  -			getMousePointOnPlaneAgent(projected_mouse, x, y, snap_plane_center, cam_at_axis); -			// project that point onto rotation plane -			projected_mouse -= snap_plane_center; -			projected_mouse -= projected_vec(projected_mouse, constraint_axis); - -			F32 mouse_lateral_dist = llmin(SNAP_GUIDE_INNER_RADIUS * mRadiusMeters, projected_mouse.magVec()); -			F32 mouse_depth = SNAP_GUIDE_INNER_RADIUS * mRadiusMeters; -			if (llabs(mouse_lateral_dist) > 0.01f) -			{ -				mouse_depth = sqrtf((SNAP_GUIDE_INNER_RADIUS * mRadiusMeters) * (SNAP_GUIDE_INNER_RADIUS * mRadiusMeters) -  -									(mouse_lateral_dist * mouse_lateral_dist)); -			} -			LLVector3 projected_camera_at = cam_at_axis - projected_vec(cam_at_axis, constraint_axis); -			projected_mouse -= mouse_depth * projected_camera_at; - -			if (!mInSnapRegime) +	 +			if (snap_plane == 0)  			{ -				mSmoothRotate = TRUE; +				// try other plane +				snap_plane_center = (center - (constraint_axis * mRadiusMeters * 0.5f)); +				if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) +				{ +					cam_to_snap_plane.setVec(1.f, 0.f, 0.f); +				} +				else +				{ +					cam_to_snap_plane = snap_plane_center - gAgentCamera.getCameraPositionAgent(); +					cam_to_snap_plane.normVec(); +				} +	 +				hit = getMousePointOnPlaneAgent(projected_mouse, x, y, snap_plane_center, constraint_axis); +				projected_mouse -= snap_plane_center; +	 +				dot = cam_to_snap_plane * constraint_axis; +				if (llabs(dot) < 0.01f) +				{ +					// looking at ring edge on, project onto view plane and check if mouse is past ring +					getMousePointOnPlaneAgent(projected_mouse, x, y, snap_plane_center, cam_to_snap_plane); +					projected_mouse -= snap_plane_center; +					dot = projected_mouse * constraint_axis; +					if (projected_mouse * constraint_axis < 0) +					{ +						snap_plane = 2; +					} +					projected_mouse -= dot * constraint_axis; +				} +				else if (dot < 0.f) +				{ +					// look for mouse position outside and in front of snap circle +					if (hit && projected_mouse.magVec() > SNAP_GUIDE_INNER_RADIUS * mRadiusMeters && projected_mouse * cam_to_snap_plane < 0.f) +					{ +						snap_plane = 2; +					} +				} +				else +				{ +					// look for mouse position inside or in back of snap circle +					if (projected_mouse.magVec() < SNAP_GUIDE_INNER_RADIUS * mRadiusMeters || projected_mouse * cam_to_snap_plane > 0.f || !hit) +					{ +						snap_plane = 2; +					} +				}  			} -			mInSnapRegime = TRUE; -			// 0 to 360 deg -			F32 mouse_angle = fmodf(atan2(projected_mouse * axis1, projected_mouse * axis2) * RAD_TO_DEG + 360.f, 360.f); -			F32 relative_mouse_angle = fmodf(mouse_angle + (SNAP_ANGLE_DETENTE / 2), SNAP_ANGLE_INCREMENT); -			//fmodf(llround(mouse_angle * RAD_TO_DEG, 7.5f) + 360.f, 360.f); - -			LLVector3 object_axis; -			getObjectAxisClosestToMouse(object_axis); -			object_axis = object_axis * first_object_node->mSavedRotation; - -			// project onto constraint plane -			object_axis = object_axis - (object_axis * getConstraintAxis()) * getConstraintAxis(); -			object_axis.normVec(); - -			if (relative_mouse_angle < SNAP_ANGLE_DETENTE) +			if (snap_plane > 0)  			{ -				F32 quantized_mouse_angle = mouse_angle - (relative_mouse_angle - (SNAP_ANGLE_DETENTE * 0.5f)); -				angle = (quantized_mouse_angle * DEG_TO_RAD) - atan2(object_axis * axis1, object_axis * axis2); +				LLVector3 cam_at_axis; +				if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD) +				{ +					cam_at_axis.setVec(1.f, 0.f, 0.f); +				} +				else +				{ +					cam_at_axis = snap_plane_center - gAgentCamera.getCameraPositionAgent(); +					cam_at_axis.normVec(); +				} +	 +				// first, project mouse onto screen plane at point tangent to rotation radius.  +				getMousePointOnPlaneAgent(projected_mouse, x, y, snap_plane_center, cam_at_axis); +				// project that point onto rotation plane +				projected_mouse -= snap_plane_center; +				projected_mouse -= projected_vec(projected_mouse, constraint_axis); +	 +				F32 mouse_lateral_dist = llmin(SNAP_GUIDE_INNER_RADIUS * mRadiusMeters, projected_mouse.magVec()); +				F32 mouse_depth = SNAP_GUIDE_INNER_RADIUS * mRadiusMeters; +				if (llabs(mouse_lateral_dist) > 0.01f) +				{ +					mouse_depth = sqrtf((SNAP_GUIDE_INNER_RADIUS * mRadiusMeters) * (SNAP_GUIDE_INNER_RADIUS * mRadiusMeters) -  +										(mouse_lateral_dist * mouse_lateral_dist)); +				} +				LLVector3 projected_camera_at = cam_at_axis - projected_vec(cam_at_axis, constraint_axis); +				projected_mouse -= mouse_depth * projected_camera_at; +	 +				if (!mInSnapRegime) +				{ +					mSmoothRotate = TRUE; +				} +				mInSnapRegime = TRUE; +				// 0 to 360 deg +				F32 mouse_angle = fmodf(atan2(projected_mouse * axis1, projected_mouse * axis2) * RAD_TO_DEG + 360.f, 360.f); +				 +				F32 relative_mouse_angle = fmodf(mouse_angle + (SNAP_ANGLE_DETENTE / 2), SNAP_ANGLE_INCREMENT); +				//fmodf(llround(mouse_angle * RAD_TO_DEG, 7.5f) + 360.f, 360.f); +	 +				LLVector3 object_axis; +				getObjectAxisClosestToMouse(object_axis); +				object_axis = object_axis * first_object_node->mSavedRotation; +	 +				// project onto constraint plane +				object_axis = object_axis - (object_axis * getConstraintAxis()) * getConstraintAxis(); +				object_axis.normVec(); +	 +				if (relative_mouse_angle < SNAP_ANGLE_DETENTE) +				{ +					F32 quantized_mouse_angle = mouse_angle - (relative_mouse_angle - (SNAP_ANGLE_DETENTE * 0.5f)); +					angle = (quantized_mouse_angle * DEG_TO_RAD) - atan2(object_axis * axis1, object_axis * axis2); +				} +				else +				{ +					angle = (mouse_angle * DEG_TO_RAD) - atan2(object_axis * axis1, object_axis * axis2); +				} +				return LLQuaternion( -angle, constraint_axis );  			}  			else  			{ -				angle = (mouse_angle * DEG_TO_RAD) - atan2(object_axis * axis1, object_axis * axis2); +				if (mInSnapRegime) +				{ +					mSmoothRotate = TRUE; +				} +				mInSnapRegime = FALSE;  			} -			return LLQuaternion( -angle, constraint_axis );  		} -		else -		{ +		else {  			if (mInSnapRegime)  			{  				mSmoothRotate = TRUE;  			}  			mInSnapRegime = FALSE; - +		} +		 +		if (!mInSnapRegime) +		{  			LLVector3 up_from_axis = mCenterToCamNorm % constraint_axis;  			up_from_axis.normVec();  			LLVector3 cur_intersection; diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 4138558bad..d7c634d619 100755 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -76,6 +76,8 @@ static const std::string BLOCKED_TAB_NAME	= "blocked_panel"; // blocked avatars  static const std::string COLLAPSED_BY_USER  = "collapsed_by_user"; +extern S32 gMaxAgentGroups; +  /** Comparator for comparing avatar items by last interaction date */  class LLAvatarItemRecentComparator : public LLAvatarItemComparator  { @@ -808,6 +810,8 @@ void LLPanelPeople::updateButtons()  		LLPanel* groups_panel = mTabContainer->getCurrentPanel();  		groups_panel->getChildView("minus_btn")->setEnabled(item_selected && selected_id.notNull()); // a real group selected +		groups_panel->getChild<LLUICtrl>("groupcount")->setTextArg("[COUNT]", llformat("%d",gAgent.mGroups.count())); +		groups_panel->getChild<LLUICtrl>("groupcount")->setTextArg("[REMAINING]", llformat("%d",(gMaxAgentGroups-gAgent.mGroups.count())));  	}  	else  	{ diff --git a/indra/newview/skins/default/xui/en/floater_bulk_perms.xml b/indra/newview/skins/default/xui/en/floater_bulk_perms.xml index 4e0cfb0cd4..e7ab3cacdc 100755 --- a/indra/newview/skins/default/xui/en/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/en/floater_bulk_perms.xml @@ -6,7 +6,7 @@   layout="topleft"   name="floaterbulkperms"   help_topic="floaterbulkperms" - title="EDIT CONTENT PERMISSIONS" + title="ADJUST CONTENT PERMISSIONS"   width="410">      <floater.string       name="nothing_to_modify_text"> @@ -192,7 +192,7 @@       name="newperms"       top="90"       width="250"> -        New Content Permissions +        Adjust Content Permissions To      </text>        <text         type="string" @@ -292,11 +292,22 @@       height="23"       label="OK"       layout="topleft" -     left="205" -     name="apply" +     left="110" +     name="ok"       top_pad="10"       width="90">        <button.commit_callback +       function="BulkPermission.Ok"/> +    </button> +    <button +     follows="left|top" +     height="23" +     label="Apply" +     layout="topleft" +     left_pad="5" +     name="apply" +     width="90"> +      <button.commit_callback         function="BulkPermission.Apply"/>      </button>      <button diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml index 6d5fb51e85..c8ce5cdebf 100755 --- a/indra/newview/skins/default/xui/en/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml @@ -202,14 +202,14 @@ Maximum 200 per group daily              Drag and drop item here to attach it:          </text>          <icon -         height="72" +         height="48"           image_name="DropTarget"           layout="topleft"           left_pad="10"           mouse_opaque="true"           name="drop_icon"           top_delta="-10" -         width="72" /> +         width="110" />          <button           follows="left|top"           layout="topleft" diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index 7ce2627be9..ed274d0233 100755 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -480,10 +480,22 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M                       function="People.Group.Minus" />                  </dnd_button>              </panel> +            <text +                type="string" +                length="1" +                follows="all" +                height="14" +                layout="topleft" +                right="-10" +                top_pad="4" +                left="3" +                name="groupcount"> +              You belong to [COUNT] groups, and can join [REMAINING] more. +            </text>              <group_list               allow_select="true"                follows="all" -             height="406" +             height="388"               layout="topleft"               left="3"               name="group_list" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml index 2cc9d9c1b0..50fd57494f 100755 --- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml @@ -138,7 +138,7 @@     initial_value="1"     layout="topleft"     left_pad="0" -   max_val="1.4" +   max_val="1.5"     min_val="0.75"     name="ui_scale_slider"     top_pad="-14" | 
