summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/newview/llagentcamera.cpp12
-rw-r--r--indra/newview/llselectmgr.cpp54
-rw-r--r--indra/newview/llselectmgr.h7
3 files changed, 61 insertions, 12 deletions
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