From fc0d618c2f3489e62b28d6e83978d39ea70c1e7e Mon Sep 17 00:00:00 2001
From: Whirly <none@none>
Date: Wed, 20 Aug 2014 23:41:33 +0100
Subject: [PATCH] STORM-2078 Editing an objects rotation with the rotation
 rings often causes the object to jump to position <0,0,0> on the region and
 rotation changes to <0,0,0>

---
 doc/contributions.txt           |  3 +++
 indra/newview/llmaniprotate.cpp | 10 +++++-----
 2 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/doc/contributions.txt b/doc/contributions.txt
index 7e8ab46b1a4..27be8613055 100755
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -885,6 +885,8 @@ Mm Alder
 	VWR-4794
 	VWR-13578
 Mo Hax
+Moon Metty
+	STORM-2078
 Mourna Biziou
 Mr Greggan
 	VWR-445
@@ -1358,6 +1360,7 @@ Whirly Fizzle
 	VWR-29543
 	MAINT-873
 	STORM-1930
+	STORM-2078
 Whoops Babii
 	VWR-631
 	VWR-1640
diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp
index 7861573908b..50863ac9700 100755
--- a/indra/newview/llmaniprotate.cpp
+++ b/indra/newview/llmaniprotate.cpp
@@ -1241,9 +1241,9 @@ LLQuaternion LLManipRotate::dragUnconstrained( S32 x, S32 y )
 
 	LLVector3 axis = mMouseDown % mMouseCur;
 	axis.normVec();
-	F32 angle = acos(mMouseDown * mMouseCur);
+	F32 angle = atan2(sqrtf(axis * axis), mMouseDown * mMouseCur);
 	LLQuaternion sphere_rot( angle, axis );
-
+	
 	if (is_approx_zero(1.f - mMouseDown * mMouseCur))
 	{
 		return LLQuaternion::DEFAULT;
@@ -1638,9 +1638,9 @@ LLQuaternion LLManipRotate::dragConstrained( S32 x, S32 y )
 			mInSnapRegime = FALSE;
 		}
 
-		angle = acos(mMouseCur * mMouseDown);
-
-		F32 dir = (mMouseDown % mMouseCur) * constraint_axis;  // cross product
+		LLVector3 cross_product = mMouseDown % mMouseCur;
+		angle = atan2(sqrtf(cross_product * cross_product), mMouseCur * mMouseDown);
+		F32 dir = cross_product * constraint_axis;  // cross product
 		if( dir < 0.f )
 		{
 			angle *= -1.f;
-- 
GitLab