From f4d4fb2ad0927ebb8545bac1abd1b74918a006f5 Mon Sep 17 00:00:00 2001
From: maxim_productengine <mnikolenko@productengine.com>
Date: Fri, 22 Nov 2019 14:34:20 +0200
Subject: [PATCH] SL-12288 Enhancement for Rotate and Track camera controls

---
 indra/newview/llagentcamera.cpp               |  58 ++++++++++-
 indra/newview/llagentcamera.h                 |  13 ++-
 indra/newview/lljoystickbutton.cpp            |  95 ++++++++++++++----
 indra/newview/lljoystickbutton.h              |   9 +-
 .../textures/bottomtray/Cam_Rotate_Center.png | Bin 0 -> 10689 bytes
 .../bottomtray/Cam_Tracking_Center.png        | Bin 0 -> 1714 bytes
 .../skins/default/textures/textures.xml       |   2 +
 7 files changed, 155 insertions(+), 22 deletions(-)
 create mode 100644 indra/newview/skins/default/textures/bottomtray/Cam_Rotate_Center.png
 create mode 100644 indra/newview/skins/default/textures/bottomtray/Cam_Tracking_Center.png

diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp
index e5fba7f28f9..67b117657f0 100644
--- a/indra/newview/llagentcamera.cpp
+++ b/indra/newview/llagentcamera.cpp
@@ -184,6 +184,9 @@ LLAgentCamera::LLAgentCamera() :
 	clearGeneralKeys();
 	clearOrbitKeys();
 	clearPanKeys();
+
+	resetPanDiff();
+	resetOrbitDiff();
 }
 
 // Requires gSavedSettings to be initialized.
@@ -343,7 +346,8 @@ void LLAgentCamera::resetView(BOOL reset_camera, BOOL change_camera)
 
 		mCameraFOVZoomFactor = 0.f;
 	}
-
+	resetPanDiff();
+	resetOrbitDiff();
 	mHUDTargetZoom = 1.f;
 }
 
@@ -822,6 +826,7 @@ void LLAgentCamera::cameraOrbitAround(const F32 radians)
 	}
 	else
 	{
+		mOrbitAroundRadians += radians;
 		mCameraFocusOffsetTarget.rotVec(radians, 0.f, 0.f, 1.f);
 		
 		cameraZoomIn(1.f);
@@ -853,12 +858,34 @@ void LLAgentCamera::cameraOrbitOver(const F32 angle)
 		LLVector3d left_axis;
 		left_axis.setVec(LLViewerCamera::getInstance()->getLeftAxis());
 		F32 new_angle = llclamp(angle_from_up - angle, 1.f * DEG_TO_RAD, 179.f * DEG_TO_RAD);
+		mOrbitOverAngle += angle_from_up - new_angle;
 		mCameraFocusOffsetTarget.rotVec(angle_from_up - new_angle, left_axis);
 
 		cameraZoomIn(1.f);
 	}
 }
 
+void LLAgentCamera::resetCameraOrbit()
+{
+	LLVector3 camera_offset_unit(mCameraFocusOffsetTarget);
+	camera_offset_unit.normalize();
+
+	LLVector3d left_axis;
+	left_axis.setVec(LLViewerCamera::getInstance()->getLeftAxis());
+	mCameraFocusOffsetTarget.rotVec(-mOrbitOverAngle, left_axis);
+	
+	mCameraFocusOffsetTarget.rotVec(-mOrbitAroundRadians, 0.f, 0.f, 1.f);
+
+	cameraZoomIn(1.f);
+	resetOrbitDiff();
+}
+
+void LLAgentCamera::resetOrbitDiff()
+{
+	mOrbitAroundRadians = 0;
+	mOrbitOverAngle = 0;
+}
+
 //-----------------------------------------------------------------------------
 // cameraZoomIn()
 //-----------------------------------------------------------------------------
@@ -997,6 +1024,8 @@ void LLAgentCamera::cameraPanIn(F32 meters)
 	LLVector3d at_axis;
 	at_axis.setVec(LLViewerCamera::getInstance()->getAtAxis());
 
+	mPanFocusDiff += meters * at_axis;
+
 	mFocusTargetGlobal += meters * at_axis;
 	mFocusGlobal = mFocusTargetGlobal;
 	// don't enforce zoom constraints as this is the only way for users to get past them easily
@@ -1013,6 +1042,8 @@ void LLAgentCamera::cameraPanLeft(F32 meters)
 	LLVector3d left_axis;
 	left_axis.setVec(LLViewerCamera::getInstance()->getLeftAxis());
 
+	mPanFocusDiff += meters * left_axis;
+
 	mFocusTargetGlobal += meters * left_axis;
 	mFocusGlobal = mFocusTargetGlobal;
 
@@ -1033,6 +1064,8 @@ void LLAgentCamera::cameraPanUp(F32 meters)
 	LLVector3d up_axis;
 	up_axis.setVec(LLViewerCamera::getInstance()->getUpAxis());
 
+	mPanFocusDiff += meters * up_axis;
+
 	mFocusTargetGlobal += meters * up_axis;
 	mFocusGlobal = mFocusTargetGlobal;
 
@@ -1045,6 +1078,26 @@ void LLAgentCamera::cameraPanUp(F32 meters)
 	mCameraSmoothingLastPositionGlobal = calcCameraPositionTargetGlobal();
 }
 
+void LLAgentCamera::resetCameraPan()
+{
+	mFocusTargetGlobal -= mPanFocusDiff;
+
+	mFocusGlobal = mFocusTargetGlobal;
+	mCameraSmoothingStop = true;
+
+	cameraZoomIn(1.f);
+	updateFocusOffset();
+
+	mCameraSmoothingLastPositionGlobal = calcCameraPositionTargetGlobal();
+
+	resetPanDiff();
+}
+
+void LLAgentCamera::resetPanDiff()
+{
+	mPanFocusDiff.clear();
+}
+
 //-----------------------------------------------------------------------------
 // updateLookAt()
 //-----------------------------------------------------------------------------
@@ -2330,6 +2383,9 @@ void LLAgentCamera::switchCameraPreset(ECameraPreset preset)
 
 	mCameraPreset = preset;
 
+	resetPanDiff();
+	resetOrbitDiff();
+
 	gSavedSettings.setU32("CameraPreset", mCameraPreset);
 }
 
diff --git a/indra/newview/llagentcamera.h b/indra/newview/llagentcamera.h
index 8a922bf6786..0608507d1ad 100644
--- a/indra/newview/llagentcamera.h
+++ b/indra/newview/llagentcamera.h
@@ -262,7 +262,8 @@ class LLAgentCamera
 	void			cameraOrbitAround(const F32 radians);	// Rotate camera CCW radians about build focus point
 	void			cameraOrbitOver(const F32 radians);		// Rotate camera forward radians over build focus point
 	void			cameraOrbitIn(const F32 meters);		// Move camera in toward build focus point
-
+	void			resetCameraOrbit();
+	void			resetOrbitDiff();
 	//--------------------------------------------------------------------
 	// Zoom
 	//--------------------------------------------------------------------
@@ -279,8 +280,9 @@ class LLAgentCamera
 public:
 	void			cameraPanIn(const F32 meters);
 	void			cameraPanLeft(const F32 meters);
-	void			cameraPanUp(const F32 meters);
-	
+	void			cameraPanUp(const F32 meters);	
+	void			resetCameraPan();
+	void			resetPanDiff();
 	//--------------------------------------------------------------------
 	// View
 	//--------------------------------------------------------------------
@@ -367,6 +369,9 @@ class LLAgentCamera
 	F32				mOrbitInKey;
 	F32				mOrbitOutKey;
 
+	F32				mOrbitAroundRadians;
+	F32				mOrbitOverAngle;
+
 	//--------------------------------------------------------------------
 	// Pan
 	//--------------------------------------------------------------------
@@ -394,6 +399,8 @@ class LLAgentCamera
 	F32				mPanInKey;
 	F32				mPanOutKey;
 
+	LLVector3d		mPanFocusDiff;
+
 /**                    Keys
  **                                                                            **
  *******************************************************************************/
diff --git a/indra/newview/lljoystickbutton.cpp b/indra/newview/lljoystickbutton.cpp
index 59e14e6cc01..eb4e4f4100d 100644
--- a/indra/newview/lljoystickbutton.cpp
+++ b/indra/newview/lljoystickbutton.cpp
@@ -37,6 +37,7 @@
 #include "llui.h"
 #include "llagent.h"
 #include "llagentcamera.h"
+#include "llviewercamera.h"
 #include "llviewertexture.h"
 #include "llviewertexturelist.h"
 #include "llviewerwindow.h"
@@ -54,6 +55,8 @@ static LLDefaultChildRegistry::Register<LLJoystickCameraTrack> r5("joystick_trac
 const F32 NUDGE_TIME = 0.25f;		// in seconds
 const F32 ORBIT_NUDGE_RATE = 0.05f; // fraction of normal speed
 
+const S32 CENTER_DOT_RADIUS = 7;
+
 //
 // Public Methods
 //
@@ -138,9 +141,25 @@ bool LLJoystick::pointInCircle(S32 x, S32 y) const
 	//center is x and y coordinates of center of joystick circle, and also its radius
 	int center = this->getLocalRect().getHeight()/2;
 	bool in_circle = (x - center) * (x - center) + (y - center) * (y - center) <= center * center;
+	
 	return in_circle;
 }
 
+bool LLJoystick::pointInCenterDot(S32 x, S32 y, S32 radius) const
+{
+	if (this->getLocalRect().getHeight() != this->getLocalRect().getWidth())
+	{
+		LL_WARNS() << "Joystick shape is not square" << LL_ENDL;
+		return true;
+	}
+
+	S32 center = this->getLocalRect().getHeight() / 2;
+
+	bool in_center_circle = (x - center) * (x - center) + (y - center) * (y - center) <= radius * radius;
+
+	return in_center_circle;
+}
+
 BOOL LLJoystick::handleMouseDown(S32 x, S32 y, MASK mask)
 {
 	//LL_INFOS() << "joystick mouse down " << x << ", " << y << LL_ENDL;
@@ -403,8 +422,11 @@ LLJoystickCameraRotate::LLJoystickCameraRotate(const LLJoystickCameraRotate::Par
 	mInLeft( FALSE ),
 	mInTop( FALSE ),
 	mInRight( FALSE ),
-	mInBottom( FALSE )
-{ }
+	mInBottom( FALSE ),
+	mInCenter( FALSE )
+{ 
+	mCenterImageName = "Cam_Rotate_Center";
+}
 
 
 void LLJoystickCameraRotate::updateSlop()
@@ -434,7 +456,16 @@ BOOL LLJoystickCameraRotate::handleMouseDown(S32 x, S32 y, MASK mask)
 	S32 dx = x - horiz_center;
 	S32 dy = y - vert_center;
 
-	if (dy > dx && dy > -dx)
+	if (pointInCenterDot(x, y, CENTER_DOT_RADIUS))
+	{
+		mInitialOffset.mX = 0;
+		mInitialOffset.mY = 0;
+		mInitialQuadrant = JQ_ORIGIN;
+		mInCenter = TRUE;
+
+		resetJoystickCamera();
+	}
+	else if (dy > dx && dy > -dx)
 	{
 		// top
 		mInitialOffset.mX = 0;
@@ -469,9 +500,20 @@ BOOL LLJoystickCameraRotate::handleMouseDown(S32 x, S32 y, MASK mask)
 BOOL LLJoystickCameraRotate::handleMouseUp(S32 x, S32 y, MASK mask)
 {
 	gAgent.setMovementLocked(FALSE);
+	mInCenter = FALSE;
 	return LLJoystick::handleMouseUp(x, y, mask);
 }
 
+BOOL LLJoystickCameraRotate::handleHover(S32 x, S32 y, MASK mask)
+{
+	if (!pointInCenterDot(x, y, CENTER_DOT_RADIUS))
+	{
+		mInCenter = FALSE;
+	}
+
+	return LLJoystick::handleHover(x, y, mask);
+}
+
 void LLJoystickCameraRotate::onHeldDown()
 {
 	updateSlop();
@@ -504,6 +546,11 @@ void LLJoystickCameraRotate::onHeldDown()
 	}
 }
 
+void LLJoystickCameraRotate::resetJoystickCamera()
+{
+	gAgentCamera.resetCameraOrbit();
+}
+
 F32 LLJoystickCameraRotate::getOrbitRate()
 {
 	F32 time = getElapsedHeldDownTime();
@@ -536,24 +583,31 @@ void LLJoystickCameraRotate::draw()
 	getImageUnselected()->draw( 0, 0 );
 	LLPointer<LLUIImage> image = getImageSelected();
 
-	if( mInTop )
+	if (mInCenter)
 	{
-		drawRotatedImage( getImageSelected(), 0 );
+		drawRotatedImage(LLUI::getUIImage(mCenterImageName), 0);
 	}
-
-	if( mInRight )
+	else
 	{
-		drawRotatedImage( getImageSelected(), 1 );
-	}
+		if (mInTop)
+		{
+			drawRotatedImage(getImageSelected(), 0);
+		}
 
-	if( mInBottom )
-	{
-		drawRotatedImage( getImageSelected(), 2 );
-	}
+		if (mInRight)
+		{
+			drawRotatedImage(getImageSelected(), 1);
+		}
 
-	if( mInLeft )
-	{
-		drawRotatedImage( getImageSelected(), 3 );
+		if (mInBottom)
+		{
+			drawRotatedImage(getImageSelected(), 2);
+		}
+
+		if (mInLeft)
+		{
+			drawRotatedImage(getImageSelected(), 3);
+		}
 	}
 }
 
@@ -613,7 +667,9 @@ LLJoystickCameraTrack::Params::Params()
 
 LLJoystickCameraTrack::LLJoystickCameraTrack(const LLJoystickCameraTrack::Params& p)
 :	LLJoystickCameraRotate(p)
-{}
+{
+	mCenterImageName = "Cam_Tracking_Center";
+}
 
 
 void LLJoystickCameraTrack::onHeldDown()
@@ -646,3 +702,8 @@ void LLJoystickCameraTrack::onHeldDown()
 		gAgentCamera.setPanDownKey(getOrbitRate());
 	}
 }
+
+void LLJoystickCameraTrack::resetJoystickCamera()
+{
+	gAgentCamera.resetCameraPan();
+}
diff --git a/indra/newview/lljoystickbutton.h b/indra/newview/lljoystickbutton.h
index 4e6c774cadf..3e29215f61b 100644
--- a/indra/newview/lljoystickbutton.h
+++ b/indra/newview/lljoystickbutton.h
@@ -79,7 +79,8 @@ class LLJoystick
 	 * Image containing circle is square and this square has adherent points with joystick
 	 * circle. Make sure to change method according to shape other than square. 
 	 */
-	bool			pointInCircle(S32 x, S32 y) const;
+	bool	pointInCircle(S32 x, S32 y) const;
+	bool	pointInCenterDot(S32 x, S32 y, S32 radius) const;
 	
 	static std::string nameFromQuadrant(const EJoystickQuadrant quadrant);
 	static EJoystickQuadrant quadrantFromName(const std::string& name);
@@ -147,7 +148,9 @@ class LLJoystickCameraRotate
 
 	virtual BOOL	handleMouseDown(S32 x, S32 y, MASK mask);
 	virtual BOOL	handleMouseUp(S32 x, S32 y, MASK mask);
+	virtual BOOL	handleHover(S32 x, S32 y, MASK mask);
 	virtual void	onHeldDown();
+	virtual void	resetJoystickCamera();
 	virtual void	draw();
 
 protected:
@@ -160,6 +163,9 @@ class LLJoystickCameraRotate
 	BOOL			mInTop;
 	BOOL			mInRight;
 	BOOL			mInBottom;
+	BOOL			mInCenter;
+
+	std::string		mCenterImageName;
 };
 
 
@@ -176,6 +182,7 @@ class LLJoystickCameraTrack
 
 	LLJoystickCameraTrack(const LLJoystickCameraTrack::Params&);
 	virtual void	onHeldDown();
+	virtual void	resetJoystickCamera();
 };
 
 #endif  // LL_LLJOYSTICKBUTTON_H
diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Rotate_Center.png b/indra/newview/skins/default/textures/bottomtray/Cam_Rotate_Center.png
new file mode 100644
index 0000000000000000000000000000000000000000..ffc3c85ea2a96cb82eeb487625eac03bb1c90aa2
GIT binary patch
literal 10689
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

literal 0
HcmV?d00001

diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Tracking_Center.png b/indra/newview/skins/default/textures/bottomtray/Cam_Tracking_Center.png
new file mode 100644
index 0000000000000000000000000000000000000000..2812d614e6abc12f8f3ec1bcbad8f2f445e6f3e2
GIT binary patch
literal 1714
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
IM6N<$f~LqfN&o-=

literal 0
HcmV?d00001

diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index b086f7dfa87..2a4171f11bb 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -113,8 +113,10 @@ with the same filename but different name
 
   <texture name="Cam_Rotate_In" file_name="bottomtray/Cam_Rotate_In.png" preload="false" />
   <texture name="Cam_Rotate_Out" file_name="bottomtray/Cam_Rotate_Out.png" preload="false" />
+  <texture name="Cam_Rotate_Center" file_name="bottomtray/Cam_Rotate_Center.png" preload="false" />
   <texture name="Cam_Tracking_In" file_name="bottomtray/Cam_Tracking_In.png" preload="false" />
   <texture name="Cam_Tracking_Out" file_name="bottomtray/Cam_Tracking_Out.png" preload="false" />
+  <texture name="Cam_Tracking_Center" file_name="bottomtray/Cam_Tracking_Center.png" preload="false" />
 
   <texture name="Checkbox_Off_Disabled" file_name="widgets/Checkbox_Disabled.png" preload="true" />
   <texture name="Checkbox_On_Disabled" file_name="widgets/Checkbox_On_Disabled.png" preload="true" />
-- 
GitLab