summaryrefslogtreecommitdiff
path: root/indra/newview/llagentcamera.cpp
diff options
context:
space:
mode:
authorErik Kundiman <erik@megapahit.org>2026-09-22 14:55:50 +0800
committerErik Kundiman <erik@megapahit.org>2026-09-22 14:55:50 +0800
commit384327bb07a7bacfd551a310dcc2b40a0983c7f5 (patch)
tree6109f89295e0b8c1dad899637b0c28d159faf62f /indra/newview/llagentcamera.cpp
parent66877554dbdec33d28171420a2b4fde65e309e7c (diff)
parent7412083c86a2d47b70f93a6395792a67255bbf33 (diff)
Merge tag 'Second_Life_Develop#7412083c-2026-09-15' into 26.5
Diffstat (limited to 'indra/newview/llagentcamera.cpp')
-rw-r--r--indra/newview/llagentcamera.cpp61
1 files changed, 30 insertions, 31 deletions
diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp
index 3bc67f2caa..195ca6cda5 100644
--- a/indra/newview/llagentcamera.cpp
+++ b/indra/newview/llagentcamera.cpp
@@ -150,6 +150,8 @@ LLAgentCamera::LLAgentCamera() :
mSitCameraEnabled(false),
mCameraSmoothingLastPositionGlobal(),
mCameraSmoothingLastPositionAgent(),
+ mCameraSmoothingLastFocusGlobal(),
+ mCameraSmoothingLastFocusValid(false),
mCameraSmoothingStop(false),
mCameraUpVector(LLVector3::z_axis), // default is straight up
@@ -1052,6 +1054,13 @@ void LLAgentCamera::cameraOrbitIn(const F32 meters)
}
}
+void LLAgentCamera::setCameraSmoothingLastPositionGlobal(const LLVector3d& camera_position_global)
+{
+ mCameraSmoothingLastPositionGlobal = camera_position_global;
+ mCameraSmoothingLastFocusGlobal = mFocusGlobal;
+ mCameraSmoothingLastFocusValid = true;
+}
+
//-----------------------------------------------------------------------------
// cameraPanIn()
//-----------------------------------------------------------------------------
@@ -1067,7 +1076,7 @@ void LLAgentCamera::cameraPanIn(F32 meters)
// don't enforce zoom constraints as this is the only way for users to get past them easily
updateFocusOffset();
// NOTE: panning movements expect the camera to move exactly with the focus target, not animated behind -Nyx
- mCameraSmoothingLastPositionGlobal = calcCameraPositionTargetGlobal();
+ setCameraSmoothingLastPositionGlobal(calcCameraPositionTargetGlobal());
}
//-----------------------------------------------------------------------------
@@ -1089,7 +1098,7 @@ void LLAgentCamera::cameraPanLeft(F32 meters)
cameraZoomIn(1.f);
updateFocusOffset();
// NOTE: panning movements expect the camera to move exactly with the focus target, not animated behind - Nyx
- mCameraSmoothingLastPositionGlobal = calcCameraPositionTargetGlobal();
+ setCameraSmoothingLastPositionGlobal(calcCameraPositionTargetGlobal());
}
//-----------------------------------------------------------------------------
@@ -1111,7 +1120,7 @@ void LLAgentCamera::cameraPanUp(F32 meters)
cameraZoomIn(1.f);
updateFocusOffset();
// NOTE: panning movements expect the camera to move exactly with the focus target, not animated behind -Nyx
- mCameraSmoothingLastPositionGlobal = calcCameraPositionTargetGlobal();
+ setCameraSmoothingLastPositionGlobal(calcCameraPositionTargetGlobal());
}
void LLAgentCamera::resetCameraPan()
@@ -1124,7 +1133,7 @@ void LLAgentCamera::resetCameraPan()
cameraZoomIn(1.f);
updateFocusOffset();
- mCameraSmoothingLastPositionGlobal = calcCameraPositionTargetGlobal();
+ setCameraSmoothingLastPositionGlobal(calcCameraPositionTargetGlobal());
resetPanDiff();
}
@@ -1466,6 +1475,21 @@ void LLAgentCamera::updateCamera()
camera_pos_global = camera_pos_agent + agent_pos;
}
}
+ else if (mTrackFocusObject && mFocusObject.notNull())
+ {
+ // Keep tracked-object translation exact and smooth only changes
+ // to the camera offset, as is done in avatar-relative mode.
+ LLVector3d camera_pos_focus = camera_pos_global - mFocusGlobal;
+ LLVector3d last_camera_pos_focus =
+ mCameraSmoothingLastPositionGlobal - mCameraSmoothingLastFocusGlobal;
+ LLVector3d delta = camera_pos_focus - last_camera_pos_focus;
+ if (mCameraSmoothingLastFocusValid &&
+ delta.magVec() < MAX_CAMERA_SMOOTH_DISTANCE)
+ {
+ camera_pos_focus = lerp(last_camera_pos_focus, camera_pos_focus, smoothing);
+ camera_pos_global = camera_pos_focus + mFocusGlobal;
+ }
+ }
else
{
LLVector3d delta = camera_pos_global - mCameraSmoothingLastPositionGlobal;
@@ -1476,7 +1500,7 @@ void LLAgentCamera::updateCamera()
}
}
- mCameraSmoothingLastPositionGlobal = camera_pos_global;
+ setCameraSmoothingLastPositionGlobal(camera_pos_global);
mCameraSmoothingLastPositionAgent = camera_pos_agent;
mCameraSmoothingStop = false;
}
@@ -1661,33 +1685,8 @@ LLVector3d LLAgentCamera::calcFocusPositionTargetGlobal()
{
if (mFocusObject.notNull() && !mFocusObject->isDead() && mFocusObject->mDrawable.notNull())
{
- LLDrawable* drawablep = mFocusObject->mDrawable;
-
- if (mTrackFocusObject &&
- drawablep &&
- drawablep->isActive())
- {
- if (!mFocusObject->isAvatar())
- {
- if (mFocusObject->isSelected())
- {
- gPipeline.updateMoveNormalAsync(drawablep);
- }
- else
- {
- if (drawablep->isState(LLDrawable::MOVE_UNDAMPED))
- {
- gPipeline.updateMoveNormalAsync(drawablep);
- }
- else
- {
- gPipeline.updateMoveDampedAsync(drawablep);
- }
- }
- }
- }
// if not tracking object, update offset based on new object position
- else
+ if (!mTrackFocusObject)
{
updateFocusOffset();
}