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