From bcd84433717e42ec8675009e1335caf915cc1a41 Mon Sep 17 00:00:00 2001
From: Monroe Linden <monroe@lindenlab.com>
Date: Fri, 6 Aug 2010 20:06:16 -0700
Subject: [PATCH] Fixes for EXT-8563 "VWR-20156: Prim Media on HUDs has no
 Audio or Interactivity"

Backed out changeset 1b65d0d42c67 (the fix for EXT-5205), and replaced it with a check in LLPanelPrimMediaControls::nextZoomLevel().

Made LLViewerMediaImpl::calculateInterest() not attempt to calculate distances to HUD attachments, since their global positions are invalid.
---
 indra/newview/llpanelprimmediacontrols.cpp |  7 +++++++
 indra/newview/lltoolpie.cpp                |  1 -
 indra/newview/llviewermedia.cpp            | 19 ++++++++++++-------
 3 files changed, 19 insertions(+), 8 deletions(-)

diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index 0648d996851..9cc775d4273 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -985,6 +985,13 @@ void LLPanelPrimMediaControls::onClickZoom()
 
 void LLPanelPrimMediaControls::nextZoomLevel()
 {
+	LLViewerObject* objectp = getTargetObject();
+	if(objectp && objectp->isHUDAttachment())
+	{
+		// Never allow zooming on HUD attachments.
+		return;
+	}
+	
 	int index = 0;
 	while (index < kNumZoomLevels)
 	{
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index 95c4f01e469..4d4a1e078de 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -1270,7 +1270,6 @@ bool LLToolPie::handleMediaClick(const LLPickInfo& pick)
 
 	if (!parcel ||
 		objectp.isNull() ||
-		objectp->isHUDAttachment() ||
 		pick.mObjectFace < 0 || 
 		pick.mObjectFace >= objectp->getNumTEs()) 
 	{
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 34e30b3ccd1..44d9bb13733 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -3053,20 +3053,25 @@ void LLViewerMediaImpl::calculateInterest()
 	
 	// Calculate distance from the avatar, for use in the proximity calculation.
 	mProximityDistance = 0.0f;
+	mProximityCamera = 0.0f;
 	if(!mObjectList.empty())
 	{
 		// Just use the first object in the list.  We could go through the list and find the closest object, but this should work well enough.
 		std::list< LLVOVolume* >::iterator iter = mObjectList.begin() ;
 		LLVOVolume* objp = *iter ;
 		llassert_always(objp != NULL) ;
+		
+		// The distance calculation is invalid for HUD attachments -- leave both mProximityDistance and mProximityCamera at 0 for them.
+		if(!objp->isHUDAttachment())
+		{
+			LLVector3d obj_global = objp->getPositionGlobal() ;
+			LLVector3d agent_global = gAgent.getPositionGlobal() ;
+			LLVector3d global_delta = agent_global - obj_global ;
+			mProximityDistance = global_delta.magVecSquared();  // use distance-squared because it's cheaper and sorts the same.
 
-		LLVector3d obj_global = objp->getPositionGlobal() ;
-		LLVector3d agent_global = gAgent.getPositionGlobal() ;
-		LLVector3d global_delta = agent_global - obj_global ;
-		mProximityDistance = global_delta.magVecSquared();  // use distance-squared because it's cheaper and sorts the same.
-
-		LLVector3d camera_delta = gAgentCamera.getCameraPositionGlobal() - obj_global;
-		mProximityCamera = camera_delta.magVec();
+			LLVector3d camera_delta = gAgentCamera.getCameraPositionGlobal() - obj_global;
+			mProximityCamera = camera_delta.magVec();
+		}
 	}
 	
 	if(mNeedsMuteCheck)
-- 
GitLab