From 87ce783bfb4cc918fc14205f5c28e6bafdb52326 Mon Sep 17 00:00:00 2001
From: Rye Mutt <rye@alchemyviewer.org>
Date: Thu, 31 Dec 2020 02:27:59 -0500
Subject: [PATCH] Some lifeblood into the mouselook experience

---
 .../newview/app_settings/settings_alchemy.xml |  11 ++
 indra/newview/lltoolgun.cpp                   | 102 +++++++++++-------
 indra/newview/lltracker.cpp                   |  14 ++-
 indra/newview/lltracker.h                     |   4 +-
 indra/newview/llworldmapview.cpp              |   3 +
 indra/newview/llworldmapview.h                |   1 +
 .../default/textures/direction_arrow.tga      | Bin 1068 -> 4140 bytes
 .../skins/default/textures/target_arrow.tga   | Bin 0 -> 4140 bytes
 .../skins/default/textures/textures.xml       |   3 +-
 .../newview/skins/default/xui/en/strings.xml  |   3 +
 10 files changed, 98 insertions(+), 43 deletions(-)
 create mode 100644 indra/newview/skins/default/textures/target_arrow.tga

diff --git a/indra/newview/app_settings/settings_alchemy.xml b/indra/newview/app_settings/settings_alchemy.xml
index dd5eca0002c..7c3b814fe3a 100644
--- a/indra/newview/app_settings/settings_alchemy.xml
+++ b/indra/newview/app_settings/settings_alchemy.xml
@@ -420,6 +420,17 @@
       <key>Value</key>
       <integer>1</integer>
     </map>
+    <key>AlchemyMouselookIFFMarkers</key>
+    <map>
+      <key>Comment</key>
+      <string>Display target markers for offscreen avatars in mouselook</string>
+      <key>Persist</key>
+      <integer>1</integer>
+      <key>Type</key>
+      <string>Boolean</string>
+      <key>Value</key>
+      <integer>1</integer>
+    </map>
     <key>AlchemyMouselookIFFRange</key>
     <map>
       <key>Comment</key>
diff --git a/indra/newview/lltoolgun.cpp b/indra/newview/lltoolgun.cpp
index fd030b8b902..fdf4d7f8d03 100644
--- a/indra/newview/lltoolgun.cpp
+++ b/indra/newview/lltoolgun.cpp
@@ -51,8 +51,12 @@
 
 //#include "alavatarcolormgr.h"
 #include "llavatarnamecache.h"
+#include "llagent.h"
 #include "llnetmap.h"
 #include "llworld.h"
+#include "lltrans.h"
+#include "lltracker.h"
+#include "rlvhandler.h"
 
 LLToolGun::LLToolGun( LLToolComposite* composite )
 :	LLTool( std::string("gun"), composite ),
@@ -126,17 +130,17 @@ BOOL LLToolGun::handleHover(S32 x, S32 y, MASK mask)
 			static LLCachedControl<bool> mouse_sun(gSavedSettings, "MouseSun");
 			if (mouse_sun)
 			{
-                LLVector3 sunpos = LLViewerCamera::getInstance()->getAtAxis();
+                const LLVector3& sunpos = LLViewerCamera::getInstance()->getAtAxis();
 				gSky.setSunDirectionCFR(sunpos);
-				gSavedSettings.setVector3("SkySunDefaultPosition", LLViewerCamera::getInstance()->getAtAxis());
+				gSavedSettings.setVector3("SkySunDefaultPosition", sunpos);
 			}
 
 			static LLCachedControl<bool> mouse_moon(gSavedSettings, "MouseMoon");
             if (mouse_moon)
 			{
-                LLVector3 moonpos = LLViewerCamera::getInstance()->getAtAxis();
+				const LLVector3& moonpos = LLViewerCamera::getInstance()->getAtAxis();
 				gSky.setMoonDirectionCFR(moonpos);
-				gSavedSettings.setVector3("SkyMoonDefaultPosition", LLViewerCamera::getInstance()->getAtAxis());
+				gSavedSettings.setVector3("SkyMoonDefaultPosition", moonpos);
 			}
 
 			gViewerWindow->moveCursorToCenter();
@@ -162,53 +166,79 @@ BOOL LLToolGun::handleHover(S32 x, S32 y, MASK mask)
 
 void LLToolGun::draw()
 {
+	static const std::string unknown_agent = LLTrans::getString("UnknownAvatar");
+
 	static LLCachedControl<bool> show_crosshairs(gSavedSettings, "ShowCrosshairs");
 	static LLCachedControl<bool> show_iff(gSavedSettings, "AlchemyMouselookIFF", true);
+	static LLCachedControl<bool> show_iff_markers(gSavedSettings, "AlchemyMouselookIFFMarkers", false);
 	static LLCachedControl<F32> iff_range(gSavedSettings, "AlchemyMouselookIFFRange", 380.f);
-	if (show_crosshairs)
+	static LLCachedControl<F32> userPresetX(gSavedSettings, "AlchemyMouselookTextOffsetX", 0.f);
+	static LLCachedControl<F32> userPresetY(gSavedSettings, "AlchemyMouselookTextOffsetY", -25.f);
+	static LLCachedControl<U32> userPresetHAlign(gSavedSettings, "AlchemyMouselookTextHAlign", 2);
+
+	const S32 windowWidth = gViewerWindow->getWorldViewRectScaled().getWidth();
+	const S32 windowHeight = gViewerWindow->getWorldViewRectScaled().getHeight();
+
+	LLColor4 crosshair_color = LLColor4::white;
+	crosshair_color.mV[VALPHA] = 0.75f;
+
+	if (show_iff)
 	{
-		const S32 windowWidth = gViewerWindow->getWorldViewRectScaled().getWidth();
-		const S32 windowHeight = gViewerWindow->getWorldViewRectScaled().getHeight();
-		LLColor4 targetColor = LLColor4::white;
-		targetColor.mV[VALPHA] = 0.5f;
-		if (show_iff)
+		bool target_rendered = false;
+
+		LLVector3d myPosition = gAgentCamera.getCameraPositionGlobal();
+		LLQuaternion myRotation = LLViewerCamera::getInstance()->getQuaternion();
+		myRotation.set(-myRotation.mQ[VX], -myRotation.mQ[VY], -myRotation.mQ[VZ], myRotation.mQ[VW]);
+
+		LLWorld::pos_map_t positions;
+		LLWorld::getInstance()->getAvatars(&positions, gAgent.getPositionGlobal(), iff_range);
+		for (const auto& position : positions)
 		{
-			LLVector3d myPosition = gAgentCamera.getCameraPositionGlobal();
-			LLQuaternion myRotation = LLViewerCamera::getInstance()->getQuaternion();
-			myRotation.set(-myRotation.mQ[VX], -myRotation.mQ[VY], -myRotation.mQ[VZ], myRotation.mQ[VW]);
-
-			LLWorld::pos_map_t positions;
-			LLWorld::getInstance()->getAvatars(&positions, gAgent.getPositionGlobal(), iff_range);
-			for (const auto& position : positions)
-            {
-				const auto& id = position.first;
-				const auto& targetPosition = position.second;
-				if (id == gAgentID || targetPosition.isNull())
-				{
-					continue;
-				}
+			const auto& id = position.first;
+			const auto& targetPosition = position.second;
+			if (id == gAgentID || targetPosition.isNull())
+			{
+				continue;
+			}
 
+			if (show_iff_markers)
+			{
+				LLTracker::instance()->drawMarker(targetPosition, crosshair_color, true);
+			}
+
+			if (!target_rendered && !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
+			{
 				LLVector3d magicVector = (targetPosition - myPosition) * myRotation;
 				magicVector.setVec(-magicVector.mdV[VY], magicVector.mdV[VZ], magicVector.mdV[VX]);
+
 				if (magicVector.mdV[VX] > -0.75 && magicVector.mdV[VX] < 0.75 && magicVector.mdV[VZ] > 0.0 && magicVector.mdV[VY] > -1.5 && magicVector.mdV[VY] < 1.5) // Do not fuck with these, cheater. :(
 				{
 					LLAvatarName avatarName;
-					LLAvatarNameCache::get(id, &avatarName);
-					//targetColor = ALAvatarColorMgr::instance().getColor(id);
-					targetColor.mV[VALPHA] = 0.5f;
-					LLFontGL::getFontSansSerifBold()->renderUTF8(
-						llformat("%s : %.2fm", avatarName.getCompleteName().c_str(), (targetPosition - myPosition).magVec()),
-						0, (windowWidth / 2.f), (windowHeight / 2.f) - 25.f, targetColor,
-						LLFontGL::HCENTER, LLFontGL::TOP, LLFontGL::BOLD, LLFontGL::NO_SHADOW
-						);
+					std::string targetName = unknown_agent;
+					if (LLAvatarNameCache::get(id, &avatarName))
+					{
+						targetName = avatarName.getCompleteName();
+					}
 
-					break;
+					LLFontGL::getFontSansSerifBold()->renderUTF8(
+						llformat("%s : %.2fm", targetName.c_str(), (targetPosition - myPosition).magVec()),
+						0, (windowWidth / 2.f) + userPresetX, (windowHeight / 2.f) + userPresetY, crosshair_color,
+						(LLFontGL::HAlign)((S32)userPresetHAlign), LLFontGL::TOP, LLFontGL::BOLD, LLFontGL::NO_SHADOW
+					);
+
+					if (!show_iff_markers)
+					{
+						break;
+					}
+					target_rendered = true;
 				}
 			}
 		}
-
+	}
+	if (show_crosshairs)
+	{
 		mCrosshairp->draw(
 			(windowWidth - mCrosshairp->getWidth()) / 2,
-			(windowHeight - mCrosshairp->getHeight()) / 2, targetColor);
+			(windowHeight - mCrosshairp->getHeight()) / 2, crosshair_color);
 	}
-}
+}
\ No newline at end of file
diff --git a/indra/newview/lltracker.cpp b/indra/newview/lltracker.cpp
index 7e5b8797a7a..731b537f2a2 100644
--- a/indra/newview/lltracker.cpp
+++ b/indra/newview/lltracker.cpp
@@ -162,7 +162,7 @@ void LLTracker::drawHUDArrow()
 void LLTracker::render3D()
 {
 	static const LLCachedControl<bool> render_tracker_beacon(gSavedSettings, "RenderTrackerBeacon");
-	if (!gFloaterWorldMap || !render_tracker_beacon)
+	if (!instance()->isTracking(NULL) || !gFloaterWorldMap || !render_tracker_beacon)
 	{
 		return;
 	}
@@ -673,7 +673,7 @@ void LLTracker::clearFocus()
 	instance()->mTrackingStatus = TRACKING_NOTHING;
 }
 
-void LLTracker::drawMarker(const LLVector3d& pos_global, const LLColor4& color)
+void LLTracker::drawMarker(const LLVector3d& pos_global, const LLColor4& color, bool is_iff /*= false*/)
 {
 	// get position
 	LLVector3 pos_local = gAgent.getPosAgentFromGlobal(pos_global);
@@ -684,8 +684,9 @@ void LLTracker::drawMarker(const LLVector3d& pos_global, const LLColor4& color)
 	S32 y = 0;
 	const BOOL CLAMP = TRUE;
 
-	if (LLViewerCamera::getInstance()->projectPosAgentToScreen(pos_local, screen, CLAMP)
-		|| LLViewerCamera::getInstance()->projectPosAgentToScreenEdge(pos_local, screen) )
+	bool on_screen = LLViewerCamera::getInstance()->projectPosAgentToScreen(pos_local, screen, CLAMP);
+	if (on_screen && is_iff) return;
+	if (on_screen || LLViewerCamera::getInstance()->projectPosAgentToScreenEdge(pos_local, screen) )
 	{
 		gHUDView->screenPointToLocal(screen.mX, screen.mY, &x, &y);
 
@@ -703,6 +704,7 @@ void LLTracker::drawMarker(const LLVector3d& pos_global, const LLColor4& color)
 		S32 y_center = lltrunc(0.5f * (F32)rect.getHeight());
 		x = x - x_center;	// x and y relative to center
 		y = y - y_center;
+		if (is_iff) y += 100;
 		F32 dist = sqrt((F32)(x*x + y*y));
 		S32 half_arrow_size = lltrunc(0.5f * HUD_ARROW_SIZE);
 		if (dist > 0.f)
@@ -752,7 +754,9 @@ void LLTracker::drawMarker(const LLVector3d& pos_global, const LLColor4& color)
 									 mHUDArrowCenterY - half_arrow_size, 
 									 HUD_ARROW_SIZE, HUD_ARROW_SIZE, 
 									 RAD_TO_DEG * angle, 
-									 LLWorldMapView::sTrackArrowImage->getImage(), 
+									 is_iff ?
+										LLWorldMapView::sIFFArrowImage->getImage() :
+										LLWorldMapView::sTrackArrowImage->getImage(),
 									 color);
 	}
 }
diff --git a/indra/newview/lltracker.h b/indra/newview/lltracker.h
index 4a6f10b767d..dbc8d8bd135 100644
--- a/indra/newview/lltracker.h
+++ b/indra/newview/lltracker.h
@@ -103,6 +103,9 @@ class LLTracker
 	
 	static const std::string& getLabel() { return instance()->mLabel; }
 	static const std::string& getToolTip() { return instance()->mToolTip; }
+
+	void drawMarker(const LLVector3d& pos_global, const LLColor4& color, bool is_iff = false);
+
 protected:
 	LLTracker();
 	~LLTracker();
@@ -119,7 +122,6 @@ class LLTracker
 	void stopTrackingLocation(bool clear_ui = false, bool dest_reached = false);
 	void stopTrackingLandmark(bool clear_ui = false);
 
-	void drawMarker(const LLVector3d& pos_global, const LLColor4& color);
 	void setLandmarkVisited();
 	void cacheLandmarkPosition();
 	void purgeBeaconText();
diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp
index ddd9e856d02..7c8c24dc009 100644
--- a/indra/newview/llworldmapview.cpp
+++ b/indra/newview/llworldmapview.cpp
@@ -91,6 +91,7 @@ LLUIImagePtr LLWorldMapView::sEventAdultImage = NULL;
 
 LLUIImagePtr LLWorldMapView::sTrackCircleImage = NULL;
 LLUIImagePtr LLWorldMapView::sTrackArrowImage = NULL;
+LLUIImagePtr LLWorldMapView::sIFFArrowImage = NULL;
 
 LLUIImagePtr LLWorldMapView::sClassifiedsImage = NULL;
 LLUIImagePtr LLWorldMapView::sForSaleImage = NULL;
@@ -136,6 +137,7 @@ void LLWorldMapView::initClass()
 
 	sTrackCircleImage =		LLUI::getUIImage("map_track_16.tga");
 	sTrackArrowImage =		LLUI::getUIImage("direction_arrow.tga");
+	sIFFArrowImage =		LLUI::getUIImage("target_arrow.tga");
 	sClassifiedsImage =		LLUI::getUIImage("icon_top_pick.tga");
 	sForSaleImage =			LLUI::getUIImage("icon_for_sale.tga");
 	// To Do: update the image resource for adult lands on sale.
@@ -165,6 +167,7 @@ void LLWorldMapView::cleanupClass()
 
 	sTrackCircleImage = NULL;
 	sTrackArrowImage = NULL;
+	sIFFArrowImage = NULL;
 	sClassifiedsImage = NULL;
 	sForSaleImage = NULL;
 	sForSaleAdultImage = NULL;
diff --git a/indra/newview/llworldmapview.h b/indra/newview/llworldmapview.h
index 7391a762bd7..c6078161923 100644
--- a/indra/newview/llworldmapview.h
+++ b/indra/newview/llworldmapview.h
@@ -152,6 +152,7 @@ class LLWorldMapView final : public LLPanel
 	static LLUIImagePtr	sClassifiedsImage;
 	static LLUIImagePtr	sForSaleImage;
 	static LLUIImagePtr	sForSaleAdultImage;
+	static LLUIImagePtr	sIFFArrowImage;
 
 	static F32		sMapScale;				// scale = size of a region in pixels
 
diff --git a/indra/newview/skins/default/textures/direction_arrow.tga b/indra/newview/skins/default/textures/direction_arrow.tga
index f3ef1068c4725af68f190c9e0330ed0447410ebc..59149e1d505b16c6f100910eeb858da92d97bc78 100644
GIT binary patch
literal 4140
zcmeHJO-lk%6dhuMG7&>b42uMZLa2mX2)ZcCp@BZ8kBKyJ<HC&_+Z5EsR&HFl@@LdP
z@Tb{5@&;aS-i$9YD43ClGjnI&x#!%k(X<84J+?IZExA|Wf2hEJQ$W}C#aJx1lF4Ke
zhGDE@;T-p1`)xjvNMt#i&8AG#JZQJucDLJYG@H%SQmM3)N~PlS@`2--B#vp9Cvi;@
z*7ig=`u+YRd?FuK=i!6E^NM&rfM>N@EzsHrZ^4Dha5#LKmk)?%u~;-jjKN^=1V6Aw
zqtTma=X^jcbd`MIv_?)r>*+#F!CS;2+@7KjO0ke=-DtI1=eBK^{dg+)@XBH_GbfqW
zIgux6{T##-`g8W4_&yhlKpnt8pU-c0Ivq#cgJD>NW8pl&u96SZ{($(SZlIS8135>r
zs5p*uM0O8PW-pWdQ1(7*6S)MP{qhk$ptiwtJRZM`JnQxPG3o(&ll?<tKOuY0?|t|N
zjtcnLUxttUU3{4x{sCY5eh@y>Kdzv^R9`MWuzTXe=^vHxXZg1gkbiE!@$8LwgEN*4
zn`*$VL*E)u=ygH4?_zsu<2&_7Gi?p}(@aCJcl%F;@$&2qu8g<TH&txJgW|741LQyT
z-swz755}C6%^6PfA7jh%0r$wCDDqjXGvpc<Z;vh<@0oqq4;%MoGXc14{uX3&iD4J#
z@g0Jiga%wp(sZ7{wa@oQm(3gBJP+clYGb;5$yL(DLVso7K1wrR6;FJQ=^}oACXv6e
eiO+}Ep#pzZf!k}Rc4ysKmlwPDrgc`^(>?)-62N5u

literal 1068
zcmZQzU}As)0R{mE1r8XG#`J#*%?IiK&(6-yNv1jfK>%b1CHnsW0Ty?_%*9KC9RMXj
zX0WiZutME}EJZXMWCkVrK^8&HAlgo3g~;~9%)v)v)62}v%mUOy41j9~DhB&oLPA20
z7>!UhVEr(?WTYclSTS&Maq*I1FH9-e&C=4+3NQguX--Z~9#Zv?qCO-j)HTdA*wf!n
MH^R-+$5oF300ra!(EtDd

diff --git a/indra/newview/skins/default/textures/target_arrow.tga b/indra/newview/skins/default/textures/target_arrow.tga
new file mode 100644
index 0000000000000000000000000000000000000000..cd14b7df9a27a81792346b828ae4aa7bc594cba7
GIT binary patch
literal 4140
zcmeHJ&2Lgc5a-)UA0JW_Efgv#5lEB}FOVJ-Oo^mKVuc1h^q}D*1k==uq<ZUx3kUuZ
z{{;R34<;s78wi1e2h)Uuk@ToDuWxYQ3Xj*OnwoT*$L#EG=l9#$nc3B7bQ)^Q8u*(d
z?LuC7;D7Ug!C)|2t=4&u$FmR!1Qy}Dfqfjqxxc+1v)O#v>-AnurBZjx<?`d5ot<Y}
zTU!rfu~^XMa@o&{gI256!G~=u(YD26G2^}u4h}wyMx*aPrPgRPULhyoa77IVG_2$+
zoQFo($BIs;pM&P}`L1O$nRvI`{m61?wOVga!eItJVWXtJR<G9^Y&M$^4u_YD#bUPC
z>wTKSLG@XPn}Z*o4~xt8kprB=d@vaFR4SE?!C>%(<M2lE19C9%c6ps_^W&()95&Vm
zqA!qxAP8pQ;I7qbn}>&oUyqKCeo#EXS+E=w^Wqpn`}>;Uh)DB)2;_iy7l}k}*6a1>
z!{P87;iF{YLGdieFb6ABX$>z;CetO1`FK1Y+}qo$vF9LhAU{ma3$iH#oS@J;kmGpN
zK~7*S`2BuYB9VwRo6Xm(53rB9iS+?|B}_0Y4x!Cyb2QH4vRp6@pawcI7IL}Vy>`3(
zj^~ii=kKGR$QCcr9zVwG)9|q-VNDE$LY_jQ@IV3Ijy8!q+2?f{=OwLUB)DIv#~55$
zS-GA}CTID79&N(^%Y04tcsy38HIf{kKg6F2{kpok8ix3LdCK?`?Xh@lpTQ<vQDU99
z+wB78-|p`23k7Uh{((K!`=5X<4q@&)91aU$FK=&eKgIgP#vGITQ}d4YNEoD(M4r+d
z$uYLm>9j_pQGc~s%}uDkbPvh)O?K5t1{*OEU;HTF@%|~5O4)wD|C#kWQ+H?XTZspP
zN=>$RqtR$`yWI=x>+7*jr^DaBGi#j^COb#qyu|kp<oVM6{{DM*-zR;4uvjPQPkDc(
zp}yXNJUsPztL1<>hjpBJe=h#Z_orH(=Y1W-m8=GxcfM!I4==5=w0BxtxsCkVX8K7w
O`{;HdmCmf)(fk5{-k<US

literal 0
HcmV?d00001

diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 94d55363f0d..4d079281bfd 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -788,7 +788,8 @@ with the same filename but different name
   <texture name="button_anim_play.tga" />
   <texture name="button_anim_play_selected.tga" />
   <texture name="crosshairs.tga" />
-  <texture name="direction_arrow.tga" file_name="world/BeaconArrow.png" />
+  <texture name="direction_arrow.tga" />
+  <texture name="target_arrow.tga" />
 
   <texture name="icon_avatar_offline.tga" />
   <texture name="icon_avatar_online.tga" />
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 646beef124b..8d80dd76bc3 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -4330,4 +4330,7 @@ and report the problem.
 
   <string name="outfit_photo_load_codec_error">Invalid image format. Please use another image</string>
 
+  <!-- Alchemy Strings -->
+  <string name="UnknownAvatar">Unknown Avatar</string>
+  
 </strings>
-- 
GitLab