Initial limit look at distance code

master
Kyler Eastridge 2025-07-28 02:51:19 +01:00 committed by Andrey Kleshchev
parent 82477c484d
commit eb9c83cda3
2 changed files with 47 additions and 1 deletions

View File

@ -16267,5 +16267,27 @@
<key>Value</key>
<integer>1</integer>
</map>
<key>LimitLookAtHints</key>
<map>
<key>Comment</key>
<string>Whether or not to clamp the look at targets around the avatar head before sending</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>LimitLookAtHintsDistance</key>
<map>
<key>Comment</key>
<string>Distance to limit look at target to</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<integer>4</integer>
</map>
</map>
</llsd>

View File

@ -37,6 +37,7 @@
#include "lldrawable.h"
#include "llviewerobjectlist.h"
#include "llviewercontrol.h"
#include "llvoavatarself.h"
#include "llrendersphere.h"
#include "llselectmgr.h"
#include "llglheaders.h"
@ -390,7 +391,7 @@ void LLHUDEffectLookAt::setTargetPosGlobal(const LLVector3d &target_pos_global)
// setLookAt()
// called by agent logic to set look at behavior locally, and propagate to sim
//-----------------------------------------------------------------------------
bool LLHUDEffectLookAt::setLookAt(ELookAtType target_type, LLViewerObject *object, LLVector3 position)
bool LLHUDEffectLookAt::setLookAt(ELookAtType target_type, LLViewerObject* object, LLVector3 position)
{
static LLCachedControl<bool> enable_lookat_hints(gSavedSettings, "EnableLookAtHints", true);
if (!enable_lookat_hints)
@ -415,6 +416,29 @@ bool LLHUDEffectLookAt::setLookAt(ELookAtType target_type, LLViewerObject *objec
return false;
}
static LLCachedControl<bool> limit_lookat_hints(gSavedSettings, "LimitLookAtHints", true);
// Don't affect the look at if object is gAgentAvatarp (cursor head follow)
if (limit_lookat_hints && object != gAgentAvatarp)
{
// If it is a object
if (object)
{
position += object->getRenderPosition();
object = NULL;
}
LLVector3 agentHeadPosition = gAgentAvatarp->mHeadp->getWorldPosition();
float dist = (float)dist_vec(agentHeadPosition, position);
static LLCachedControl<F32> limit_lookat_hints_distance(gSavedSettings, "LimitLookAtHintsDistance", 2.0f);
if (dist > limit_lookat_hints_distance)
{
LLVector3 headOffset = position - agentHeadPosition;
headOffset *= limit_lookat_hints_distance / dist;
position.setVec(agentHeadPosition + headOffset);
}
}
F32 current_time = mTimer.getElapsedTimeF32();
// type of lookat behavior or target object has changed