summaryrefslogtreecommitdiff
path: root/indra/newview/llvoavatar.cpp
diff options
context:
space:
mode:
authorRoxie Linden <roxie@lindenlab.com>2024-05-06 16:40:12 -0700
committerRoxie Linden <roxie@lindenlab.com>2024-05-06 16:40:12 -0700
commit4af9128db1fb65ff99d1e8086352698f46e049b4 (patch)
tree4b98d8afb138a4a1ac9f2d4b01a7d83dce314d17 /indra/newview/llvoavatar.cpp
parent05b2dd913fcb1c5485ce19885e4e60f26752e6b0 (diff)
parent10aa7f4254fd04c24f15f507188705146f92ee60 (diff)
Merge branch 'main' of https://github.com/secondlife/viewer into roxie/webrtc-voice
Diffstat (limited to 'indra/newview/llvoavatar.cpp')
-rw-r--r--indra/newview/llvoavatar.cpp69
1 files changed, 43 insertions, 26 deletions
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index a600482d5b..b5ef3bf19b 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -2578,7 +2578,7 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time)
{
if (!mIsControlAvatar)
{
- idleUpdateNameTag( mLastRootPos );
+ idleUpdateNameTag(idleCalcNameTagPosition(mLastRootPos));
}
return;
}
@@ -2662,7 +2662,9 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time)
bool voice_enabled = (visualizers_in_calls || LLVoiceClient::getInstance()->inProximalChannel()) &&
LLVoiceClient::getInstance()->getVoiceEnabled(mID);
- idleUpdateVoiceVisualizer( voice_enabled );
+ LLVector3 hud_name_pos = idleCalcNameTagPosition(mLastRootPos);
+
+ idleUpdateVoiceVisualizer(voice_enabled, hud_name_pos);
idleUpdateMisc( detailed_update );
idleUpdateAppearanceAnimation();
if (detailed_update)
@@ -2673,7 +2675,7 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time)
idleUpdateWindEffect();
}
- idleUpdateNameTag( mLastRootPos );
+ idleUpdateNameTag(hud_name_pos);
// Complexity has stale mechanics, but updates still can be very rapid
// so spread avatar complexity calculations over frames to lesen load from
@@ -2713,7 +2715,7 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time)
idleUpdateDebugInfo();
}
-void LLVOAvatar::idleUpdateVoiceVisualizer(bool voice_enabled)
+void LLVOAvatar::idleUpdateVoiceVisualizer(bool voice_enabled, const LLVector3 &position)
{
bool render_visualizer = voice_enabled;
@@ -2802,24 +2804,7 @@ void LLVOAvatar::idleUpdateVoiceVisualizer(bool voice_enabled)
}
}
}
-
- //--------------------------------------------------------------------------------------------
- // here we get the approximate head position and set as sound source for the voice symbol
- // (the following version uses a tweak of "mHeadOffset" which handle sitting vs. standing)
- //--------------------------------------------------------------------------------------------
-
- if ( isSitting() )
- {
- LLVector3 headOffset = LLVector3( 0.0f, 0.0f, mHeadOffset.mV[2] );
- mVoiceVisualizer->setVoiceSourceWorldPosition( mRoot->getWorldPosition() + headOffset );
- }
- else
- {
- LLVector3 tagPos = mRoot->getWorldPosition();
- tagPos[VZ] -= mPelvisToFoot;
- tagPos[VZ] += ( mBodySize[VZ] + 0.125f ); // does not need mAvatarOffset -Nyx
- mVoiceVisualizer->setVoiceSourceWorldPosition( tagPos );
- }
+ mVoiceVisualizer->setPositionAgent(position);
}//if ( voiceEnabled )
}
@@ -3335,7 +3320,8 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
new_name = TRUE;
}
- idleUpdateNameTagPosition(root_pos_last);
+ mNameText->setPositionAgent(root_pos_last);
+
idleUpdateNameTagText(new_name);
idleUpdateNameTagAlpha(new_name, alpha);
}
@@ -3612,7 +3598,7 @@ void LLVOAvatar::invalidateNameTags()
}
// Compute name tag position during idle update
-void LLVOAvatar::idleUpdateNameTagPosition(const LLVector3& root_pos_last)
+LLVector3 LLVOAvatar::idleCalcNameTagPosition(const LLVector3 &root_pos_last)
{
LLQuaternion root_rot = mRoot->getWorldRotation();
LLQuaternion inv_root_rot = ~root_rot;
@@ -3626,7 +3612,6 @@ void LLVOAvatar::idleUpdateNameTagPosition(const LLVector3& root_pos_last)
local_camera_up.normalize();
local_camera_up = local_camera_up * inv_root_rot;
-
// position is based on head position, does not require mAvatarOffset here. - Nyx
LLVector3 avatar_ellipsoid(mBodySize.mV[VX] * 0.4f,
mBodySize.mV[VY] * 0.4f,
@@ -3648,7 +3633,26 @@ void LLVOAvatar::idleUpdateNameTagPosition(const LLVector3& root_pos_last)
name_position += (local_camera_up * root_rot) - (projected_vec(local_camera_at * root_rot, camera_to_av));
name_position += pixel_up_vec * NAMETAG_VERTICAL_SCREEN_OFFSET;
- mNameText->setPositionAgent(name_position);
+ const F32 water_height = getRegion()->getWaterHeight();
+ static const F32 WATER_HEIGHT_DELTA = 0.25f;
+ if (name_position[VZ] < water_height + WATER_HEIGHT_DELTA)
+ {
+ if (LLViewerCamera::getInstance()->getOrigin()[VZ] >= water_height)
+ {
+ name_position[VZ] = water_height;
+ }
+ else if (mNameText) // both camera and HUD are below watermark
+ {
+ F32 name_world_height = mNameText->getWorldHeight();
+ F32 max_z_position = water_height - name_world_height;
+ if (name_position[VZ] > max_z_position)
+ {
+ name_position[VZ] = max_z_position;
+ }
+ }
+ }
+
+ return name_position;
}
void LLVOAvatar::idleUpdateNameTagAlpha(bool new_name, F32 alpha)
@@ -3743,6 +3747,10 @@ bool LLVOAvatar::isVisuallyMuted()
{
muted = true;
}
+ else if (mIsControlAvatar)
+ {
+ muted = isTooSlow();
+ }
else
{
muted = isTooComplex() || isTooSlow();
@@ -4291,6 +4299,15 @@ void LLVOAvatar::updateOrientation(LLAgent& agent, F32 speed, F32 delta_time)
if (mTurning)
{
pelvis_rot_threshold *= 0.4f;
+ // account for fps, assume that above value is for ~60fps
+ constexpr F32 default_frame_sec = 0.016f;
+ F32 prev_frame_sec = LLFrameTimer::getFrameDeltaTimeF32();
+ if (default_frame_sec > prev_frame_sec)
+ {
+ // reduce threshold since turn rate per second is constant,
+ // shorter frame means shorter turn.
+ pelvis_rot_threshold *= prev_frame_sec/default_frame_sec;
+ }
}
// am I done turning?