From 02dba611b21f1a1e72083ab36475b627489779e7 Mon Sep 17 00:00:00 2001
From: Andrey Kleshchev <andreykproductengine@lindenlab.com>
Date: Fri, 21 Feb 2020 16:57:37 +0200
Subject: SL-10326 Develop submenu option Allow Select Avatar was defective

Viewer should now filter out position changes from server when avatar is being edited.
---
 indra/newview/llagentcamera.cpp | 12 +++++++++
 indra/newview/llselectmgr.cpp   | 54 ++++++++++++++++++++++++++++++++---------
 indra/newview/llselectmgr.h     |  7 ++++++
 3 files changed, 61 insertions(+), 12 deletions(-)

(limited to 'indra')

diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp
index 85b7d7b06f..26b60b89f5 100644
--- a/indra/newview/llagentcamera.cpp
+++ b/indra/newview/llagentcamera.cpp
@@ -355,6 +355,18 @@ void LLAgentCamera::resetView(BOOL reset_camera, BOOL change_camera)
 	}
 
 	mHUDTargetZoom = 1.f;
+
+    if (LLSelectMgr::getInstance()->mAllowSelectAvatar)
+    {
+        // resetting camera also resets position overrides in debug mode 'AllowSelectAvatar'
+        LLObjectSelectionHandle selected_handle = LLSelectMgr::getInstance()->getSelection();
+        if (selected_handle->getObjectCount() == 1
+            && selected_handle->getFirstObject() != NULL
+            && selected_handle->getFirstObject()->isAvatar())
+        {
+            LLSelectMgr::getInstance()->resetObjectOverrides(selected_handle);
+        }
+    }
 }
 
 // Allow camera to be moved somewhere other than behind avatar.
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index aee6bcb05e..9d491e0e00 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -304,6 +304,27 @@ void LLSelectMgr::updateEffects()
 	}
 }
 
+void LLSelectMgr::resetObjectOverrides()
+{
+    resetObjectOverrides(getSelection());
+}
+
+void LLSelectMgr::resetObjectOverrides(LLObjectSelectionHandle selected_handle)
+{
+    struct f : public LLSelectedNodeFunctor
+    {
+        virtual bool apply(LLSelectNode* node)
+        {
+            node->mLastPositionLocal.setVec(0, 0, 0);
+            node->mLastRotation = LLQuaternion();
+            node->mLastScale.setVec(0, 0, 0);
+            return true;
+        }
+    } func;
+
+    selected_handle->applyToNodes(&func);
+}
+
 void LLSelectMgr::overrideObjectUpdates()
 {
 	//override any position updates from simulator on objects being edited
@@ -5131,18 +5152,27 @@ void LLSelectMgr::sendListToRegions(LLObjectSelectionHandle selected_handle,
 
 	bool link_operation = message_name == "ObjectLink";
 
-	//clear update override data (allow next update through)
-	struct f : public LLSelectedNodeFunctor
-	{
-		virtual bool apply(LLSelectNode* node)
-		{
-			node->mLastPositionLocal.setVec(0,0,0);
-			node->mLastRotation = LLQuaternion();
-			node->mLastScale.setVec(0,0,0);
-			return true;
-		}
-	} func;
-	selected_handle->applyToNodes(&func);
+    if (mAllowSelectAvatar)
+    {
+        if (selected_handle->getObjectCount() == 1
+            && selected_handle->getFirstObject() != NULL
+            && selected_handle->getFirstObject()->isAvatar())
+        {
+            // Server doesn't move avatars at the moment, it is a local debug feature,
+            // but server does update position regularly, so do not drop mLastPositionLocal
+            // Position override for avatar gets reset in LLAgentCamera::resetView().
+        }
+        else
+        {
+            // drop mLastPositionLocal (allow next update through)
+            resetObjectOverrides(selected_handle);
+        }
+    }
+    else
+    {
+        //clear update override data (allow next update through)
+        resetObjectOverrides(selected_handle);
+    }
 
 	std::queue<LLSelectNode*> nodes_to_send;
 
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index 3bed484b58..75d11dd06b 100644
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -458,6 +458,13 @@ public:
 	void clearSelections();
 	void update();
 	void updateEffects(); // Update HUD effects
+
+	// When we edit object's position/rotation/scale we set local
+	// overrides and ignore any updates (override received valeus).
+	// When we send data to server, we send local values and reset
+	// overrides
+	void resetObjectOverrides();
+	void resetObjectOverrides(LLObjectSelectionHandle selected_handle);
 	void overrideObjectUpdates();
 
 	// Returns the previous value of mForceSelection
-- 
cgit v1.2.3