diff options
Diffstat (limited to 'indra/newview')
| -rw-r--r-- | indra/newview/app_settings/settings.xml | 22 | ||||
| -rw-r--r-- | indra/newview/llhudeffectlookat.cpp | 26 | 
2 files changed, 47 insertions, 1 deletions
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index c416944a24..531aa9984c 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -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> diff --git a/indra/newview/llhudeffectlookat.cpp b/indra/newview/llhudeffectlookat.cpp index 845a003500..f726ef1354 100644 --- a/indra/newview/llhudeffectlookat.cpp +++ b/indra/newview/llhudeffectlookat.cpp @@ -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  | 
