diff --git a/autobuild.xml b/autobuild.xml
index 4b24f0369d..d91bd02b7d 100644
--- a/autobuild.xml
+++ b/autobuild.xml
@@ -52,9 +52,9 @@
archive
name
linux64
@@ -838,9 +838,9 @@
archive
name
linux64
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 0a137b3ef1..401d4b938c 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -25282,6 +25282,28 @@ Change of this parameter will affect the layout of buttons in notification toast
Value
0
+ FSLookAtTargetLimitDistance
+
+ FSLookAtTargetMaxDistance
+
diff --git a/indra/newview/llhudeffectlookat.cpp b/indra/newview/llhudeffectlookat.cpp
index 3c29239e30..c1bbc1344d 100644
--- a/indra/newview/llhudeffectlookat.cpp
+++ b/indra/newview/llhudeffectlookat.cpp
@@ -476,21 +476,64 @@ BOOL LLHUDEffectLookAt::setLookAt(ELookAtType target_type, LLViewerObject *objec
F32 current_time = mTimer.getElapsedTimeF32();
- // type of lookat behavior or target object has changed
- BOOL lookAtChanged = (target_type != mTargetType) || (object != mTargetObject);
+ // FIRE-23524 Option to limit look at target to a sphere around the avatar's head.
+ //// type of lookat behavior or target object has changed
+ //BOOL lookAtChanged = (target_type != mTargetType) || (object != mTargetObject);
- // lookat position has moved a certain amount and we haven't just sent an update
- lookAtChanged = lookAtChanged || ((dist_vec_squared(position, mLastSentOffsetGlobal) > MIN_DELTAPOS_FOR_UPDATE_SQUARED) &&
- ((current_time - mLastSendTime) > (1.f / MAX_SENDS_PER_SEC)));
+ //// lookat position has moved a certain amount and we haven't just sent an update
+ //lookAtChanged = lookAtChanged || ((dist_vec_squared(position, mLastSentOffsetGlobal) > MIN_DELTAPOS_FOR_UPDATE_SQUARED) &&
+ // ((current_time - mLastSendTime) > (1.f / MAX_SENDS_PER_SEC)));
- if (lookAtChanged)
+ //if (lookAtChanged)
+ //{
+ // mLastSentOffsetGlobal = position;
+ // F32 timeout = (*mAttentions)[target_type].mTimeout;
+ // setDuration(timeout);
+ // setNeedsSendToSim(TRUE);
+ //}
+ //
+ //if (target_type == LOOKAT_TARGET_CLEAR)
+ //{
+ // clearLookAtTarget();
+ //}
+ //else
+ //{
+ // mTargetType = target_type;
+ // mTargetObject = object;
+ // if (object)
+ // {
+ // mTargetOffsetGlobal.setVec(position);
+ // }
+ // else
+ // {
+ // mTargetOffsetGlobal = gAgent.getPosGlobalFromAgent(position);
+ // }
+ //}
+
+ static LLCachedControl s_EnableLimiter(gSavedSettings, "FSLookAtTargetLimitDistance");
+ bool lookAtShouldClamp = s_EnableLimiter &&
+ (*mAttentions)[mTargetType].mName != "None" &&
+ (*mAttentions)[mTargetType].mName != "Idle" &&
+ (*mAttentions)[mTargetType].mName != "AutoListen";
+
+ if (!lookAtShouldClamp) //We do a similar but seperate calculation if we are doing limited distances
{
- mLastSentOffsetGlobal = position;
- F32 timeout = (*mAttentions)[target_type].mTimeout;
- setDuration(timeout);
- setNeedsSendToSim(TRUE);
+ // type of lookat behavior or target object has changed
+ bool lookAtChanged = (target_type != mTargetType) || (object != mTargetObject);
+
+ // lookat position has moved a certain amount and we haven't just sent an update
+ lookAtChanged = lookAtChanged || ((dist_vec_squared(position, mLastSentOffsetGlobal) > MIN_DELTAPOS_FOR_UPDATE_SQUARED) &&
+ ((current_time - mLastSendTime) > (1.f / MAX_SENDS_PER_SEC)));
+
+ if (lookAtChanged)
+ {
+ mLastSentOffsetGlobal = position;
+ F32 timeout = (*mAttentions)[target_type].mTimeout;
+ setDuration(timeout);
+ setNeedsSendToSim(TRUE);
+ }
}
-
+
if (target_type == LOOKAT_TARGET_CLEAR)
{
clearLookAtTarget();
@@ -501,12 +544,64 @@ BOOL LLHUDEffectLookAt::setLookAt(ELookAtType target_type, LLViewerObject *objec
mTargetObject = object;
if (object)
{
- mTargetOffsetGlobal.setVec(position);
+ if (lookAtShouldClamp)
+ {
+ if (mTargetObject->isAvatar() && ((LLVOAvatar*)(LLViewerObject*)mTargetObject)->isSelf())
+ {
+ //We use this branch and mimic our mouse/first person look pose.
+ mTargetOffsetGlobal.setVec(gAgent.getPosGlobalFromAgent(gAgentAvatarp->mHeadp->getWorldPosition() + position));
+ mTargetObject = NULL;
+ }
+ else
+ {
+ //Otherwise, mimic looking at the object.
+ mTargetOffsetGlobal.setVec(object->getPositionGlobal() + (LLVector3d)(position * object->getRotationRegion()));
+ mTargetObject = NULL;
+ }
+ }
+ else
+ {
+ mTargetOffsetGlobal.setVec(position);
+ }
}
else
{
mTargetOffsetGlobal = gAgent.getPosGlobalFromAgent(position);
}
+
+ if (lookAtShouldClamp)
+ {
+ static LLCachedControl s_Radius(gSavedSettings, "FSLookAtTargetMaxDistance");
+
+ LLVector3d headPosition = gAgent.getPosGlobalFromAgent(gAgentAvatarp->mHeadp->getWorldPosition());
+ float distance = dist_vec(mTargetOffsetGlobal, headPosition);
+
+ if (distance > s_Radius)
+ {
+ LLVector3d vecDistFromObjectToHead = mTargetOffsetGlobal - headPosition;
+ vecDistFromObjectToHead *= s_Radius / distance;
+ mTargetOffsetGlobal.setVec(headPosition + vecDistFromObjectToHead);
+ }
+
+ //Do the changed calculation except this time for limited distances
+ // type of lookat behavior or target object has changed
+ bool lookAtChanged = (target_type != mTargetType);
+
+ // lookat position has moved a certain amount and we haven't just sent an update
+ lookAtChanged = lookAtChanged ||
+ ((dist_vec_squared(gAgent.getPosAgentFromGlobal(mTargetOffsetGlobal), mLastSentOffsetGlobal) > MIN_DELTAPOS_FOR_UPDATE_SQUARED) &&
+ ((current_time - mLastSendTime) > (1.f / MAX_SENDS_PER_SEC)));
+
+ if (lookAtChanged)
+ {
+ mLastSentOffsetGlobal = gAgent.getPosAgentFromGlobal(mTargetOffsetGlobal);
+ F32 timeout = (*mAttentions)[target_type].mTimeout;
+ setDuration(timeout);
+ setNeedsSendToSim(TRUE);
+ }
+ }
+ // FIRE-23524 Option to limit look at target to a sphere around the avatar's head.
+
mKillTime = mTimer.getElapsedTimeF32() + mDuration;
update();
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml
index 77983a5271..01be173b89 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml
@@ -76,6 +76,10 @@
+
+
+ m
+
diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml
index da79b8d2b4..ff31222a61 100644
--- a/indra/newview/skins/default/xui/en/floater_about.xml
+++ b/indra/newview/skins/default/xui/en/floater_about.xml
@@ -165,7 +165,7 @@ Additional code generously contributed to Firestorm by:
top_pad="4"
width="450"
wrap="true">
-Albatroz Hird, Alexie Birman, Andromeda Rage, Animats, Armin Weatherwax, Beq Janus, Casper Warden, Chalice Yao, Cron Stardust, Damian Zhaoying, Dan Threebeards, Dawa Gurbux, Denver Maksim, Drake Arconis, Felyza Wishbringer, f0rbidden, Fractured Crystal, Geenz Spad, Gibson Firehawk, Hitomi Tiponi, Inusaito Sayori, Jean Severine, Katharine Berry, Kittin Ninetails, Kool Koolhoven, Lance Corrimal, Lassie, Latif Khalifa, Magne Metaverse LLC, Magus Freston, Manami Hokkigai, MartinRJ Fayray, McCabe Maxstead, Melancholy Lemon, Melysmile, Mimika Oh, Mister Acacia, mygoditsfullofstars, Mysty Saunders, Nagi Michinaga, Name Short, nhede Core, NiranV Dean, Nogardrevlis Lectar, Paladin Forzane, paperwork, Penny Patton, Peyton Menges, programmtest, Qwerty Venom, Revolution Smythe, Sahkolihaa Contepomi, sal Kaligawa, Samm Florian, Satomi Ahn, Sei Lisa, Sempervirens Oddfellow, Shin Wasp, Shyotl Kuhr, Sione Lomu, Skills Hak, StarlightShining, Sunset Faulkes, Thickbrick Sleaford, Vaalith Jinn, Vincent Sylvester, Whirly Fizzle, Xenhat Liamano, Zwagoth Klaar and others.
+Albatroz Hird, Alexie Birman, Andromeda Rage, Animats, Armin Weatherwax, Beq Janus, Casper Warden, Chalice Yao, Chaser Zaks, Cron Stardust, Damian Zhaoying, Dan Threebeards, Dawa Gurbux, Denver Maksim, Drake Arconis, Felyza Wishbringer, f0rbidden, Fractured Crystal, Geenz Spad, Gibson Firehawk, Hitomi Tiponi, Inusaito Sayori, Jean Severine, Katharine Berry, Kittin Ninetails, Kool Koolhoven, Lance Corrimal, Lassie, Latif Khalifa, Magne Metaverse LLC, Magus Freston, Manami Hokkigai, MartinRJ Fayray, McCabe Maxstead, Melancholy Lemon, Melysmile, Mimika Oh, Mister Acacia, mygoditsfullofstars, Mysty Saunders, Nagi Michinaga, Name Short, nhede Core, NiranV Dean, Nogardrevlis Lectar, Paladin Forzane, paperwork, Penny Patton, Peyton Menges, programmtest, Qwerty Venom, Revolution Smythe, Sahkolihaa Contepomi, sal Kaligawa, Samm Florian, Satomi Ahn, Sei Lisa, Sempervirens Oddfellow, Shin Wasp, Shyotl Kuhr, Sione Lomu, Skills Hak, StarlightShining, Sunset Faulkes, Thickbrick Sleaford, Vaalith Jinn, Vincent Sylvester, Whirly Fizzle, Xenhat Liamano, Zwagoth Klaar and others.
+
+
+
+ m
+
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml
index 62ed3599e5..552a28b7cf 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml
@@ -70,6 +70,7 @@
+
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 89dbb313f2..43b61eabb5 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -1500,17 +1500,17 @@ class DarwinManifest(ViewerManifest):
dylibs += path_optional(os.path.join(relpkgdir, libfile), libfile)
# dylibs that vary based on configuration
- # if self.args['configuration'].lower() == 'debug':
- # for libfile in (
- # "libfmodexL.dylib",
- # ):
- # dylibs += path_optional(os.path.join(debpkgdir, libfile), libfile)
- # else:
- # for libfile in (
- # "libfmodex.dylib",
- # ):
- # dylibs += path_optional(os.path.join(relpkgdir, libfile), libfile)
-
+ if self.args['configuration'].lower() == 'debug':
+ for libfile in (
+ "libfmodexL.dylib",
+ ):
+ dylibs += path_optional(os.path.join(debpkgdir, libfile), libfile)
+ else:
+ for libfile in (
+ "libfmodex.dylib",
+ ):
+ dylibs += path_optional(os.path.join(relpkgdir, libfile), libfile)
+
# our apps
executable_path = {}
for app_bld_dir, app in (("mac_crash_logger", "mac-crash-logger.app"),