diff options
| author | Erik Kundiman <erik@megapahit.org> | 2026-09-22 14:55:50 +0800 |
|---|---|---|
| committer | Erik Kundiman <erik@megapahit.org> | 2026-09-22 14:55:50 +0800 |
| commit | 384327bb07a7bacfd551a310dcc2b40a0983c7f5 (patch) | |
| tree | 6109f89295e0b8c1dad899637b0c28d159faf62f /indra/newview/llagentcamera.cpp | |
| parent | 66877554dbdec33d28171420a2b4fde65e309e7c (diff) | |
| parent | 7412083c86a2d47b70f93a6395792a67255bbf33 (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.cpp | 61 |
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(); } |
