diff --git a/indra/newview/app_settings/settings_alchemy.xml b/indra/newview/app_settings/settings_alchemy.xml index dd5eca0002c738f95224a261ddf5a03c08259e3c..7c3b814fe3a8a590033d2a0b61bf6f6b3643ebd3 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 fd030b8b9022d4b1089dae5e68b23356684f8c04..fdf4d7f8d03ac2eb5208959eea69321e0c8ca50b 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 7e5b8797a7aafdc1d0788fc27e3e8d7ab82e627d..731b537f2a2b33b45c4c24187e9363c7853ff377 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 4a6f10b767dda24893c8d494501227fec2f9137b..dbc8d8bd1356282f5d452f8a192176f950ee3ebd 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 ddd9e856d02fc31089ba6ed677e6e709d42651b0..7c8c24dc00994e382c8293d07d4dd1d909897c3e 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 7391a762bd78f4a32dbce5c3fdb0f217204ea79c..c607816192304365fe38366b67d3c9fd6fc8846d 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 Binary files a/indra/newview/skins/default/textures/direction_arrow.tga and b/indra/newview/skins/default/textures/direction_arrow.tga differ 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 Binary files /dev/null and b/indra/newview/skins/default/textures/target_arrow.tga differ diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 94d55363f0d73274785415a7ec956d8c78ee838b..4d079281bfd2b240f4e5a2f7b7b34b94a4cbd8ac 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 646beef124b9942ff750bd2d573e502f3dc0f73e..8d80dd76bc30ee3f488f7f95d59b5941e92aa71e 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>