diff options
Diffstat (limited to 'indra/newview')
| -rw-r--r-- | indra/newview/llnetmap.cpp | 133 | ||||
| -rw-r--r-- | indra/newview/llworld.cpp | 51 | ||||
| -rw-r--r-- | indra/newview/llworldmapview.cpp | 23 | ||||
| -rw-r--r-- | indra/newview/llworldmapview.h | 4 | 
4 files changed, 95 insertions, 116 deletions
diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp index 15d5d7c162..1bda7640bd 100644 --- a/indra/newview/llnetmap.cpp +++ b/indra/newview/llnetmap.cpp @@ -74,6 +74,8 @@ const F32 DOT_SCALE = 0.75f;  const F32 MIN_PICK_SCALE = 2.f;  const S32 MOUSE_DRAG_SLOP = 2;		// How far the mouse needs to move before we think it's a drag +const F64 COARSEUPDATE_MAX_Z = 1020.0f; +  LLNetMap::LLNetMap (const Params & p)  :	LLUICtrl (p),  	mBackgroundColor (p.bg_color()), @@ -300,7 +302,8 @@ void LLNetMap::draw()  		}  		LLVector3 map_center_agent = gAgent.getPosAgentFromGlobal(mObjectImageCenterGlobal); -		map_center_agent -= gAgentCamera.getCameraPositionAgent(); +		LLVector3 camera_position = gAgentCamera.getCameraPositionAgent(); +		map_center_agent -= camera_position;  		map_center_agent.mV[VX] *= mScale/region_width;  		map_center_agent.mV[VY] *= mScale/region_width; @@ -321,9 +324,6 @@ void LLNetMap::draw()  		gGL.popMatrix(); -		LLVector3d pos_global; -		LLVector3 pos_map; -  		// Mouse pointer in local coordinates  		S32 local_mouse_x;  		S32 local_mouse_y; @@ -333,90 +333,67 @@ void LLNetMap::draw()  		F32 closest_dist_squared = F32_MAX; // value will be overridden in the loop  		F32 min_pick_dist_squared = (mDotRadius * MIN_PICK_SCALE) * (mDotRadius * MIN_PICK_SCALE); +		LLVector3 pos_map; +		uuid_vec_t avatar_ids; +		std::vector<LLVector3d> positions; +		bool unknown_relative_z; + +		LLWorld::getInstance()->getAvatars(&avatar_ids, &positions, gAgentCamera.getCameraPositionGlobal()); +  		// Draw avatars -		for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); -			 iter != LLWorld::getInstance()->getRegionList().end(); ++iter) +		for (U32 i = 0; i < avatar_ids.size(); i++)  		{ -			LLViewerRegion* regionp = *iter; -			const LLVector3d& origin_global = regionp->getOriginGlobal(); - -			S32 count = regionp->mMapAvatars.count(); -			S32 i; -			LLVector3 pos_local; -			U32 compact_local; -			U8 bits; -			// TODO: it'd be very cool to draw these in sorted order from lowest Z to highest. -			// just be careful to sort the avatar IDs along with the positions. -MG -			for (i = 0; i < count; i++) -			{ -				compact_local = regionp->mMapAvatars.get(i); +			pos_map = globalPosToView(positions[i]); +			LLUUID uuid = avatar_ids[i]; -				bits = compact_local & 0xFF; -				pos_local.mV[VZ] = F32(bits) * 4.f; -				compact_local >>= 8; +			bool show_as_friend = (LLAvatarTracker::instance().getBuddyInfo(uuid) != NULL); -				bits = compact_local & 0xFF; -				pos_local.mV[VY] = (F32)bits; -				compact_local >>= 8; +			LLColor4 color = show_as_friend ? map_avatar_friend_color : map_avatar_color; -				bits = compact_local & 0xFF; -				pos_local.mV[VX] = (F32)bits; +			unknown_relative_z = positions[i].mdV[VZ] == COARSEUPDATE_MAX_Z && +					camera_position.mV[VZ] >= COARSEUPDATE_MAX_Z; -				pos_global.setVec( pos_local ); -				pos_global += origin_global; +			LLWorldMapView::drawAvatar( +				pos_map.mV[VX], pos_map.mV[VY],  +				color,  +				pos_map.mV[VZ], mDotRadius, +				unknown_relative_z); -				pos_map = globalPosToView(pos_global); - -				LLUUID uuid(NULL); -				BOOL show_as_friend = FALSE; -				if( i < regionp->mMapAvatarIDs.count()) +			if(uuid.notNull()) +			{ +				bool selected = false; +				uuid_vec_t::iterator sel_iter = gmSelected.begin(); +				for (; sel_iter != gmSelected.end(); sel_iter++)  				{ -					uuid = regionp->mMapAvatarIDs.get(i); -					show_as_friend = (LLAvatarTracker::instance().getBuddyInfo(uuid) != NULL); +					if(*sel_iter == uuid) +					{ +						selected = true; +						break; +					}  				} - -				LLColor4 color = show_as_friend ? map_avatar_friend_color : map_avatar_color; -				LLWorldMapView::drawAvatar( -					pos_map.mV[VX], pos_map.mV[VY],  -					color,  -					pos_map.mV[VZ], mDotRadius); - -				if(uuid.notNull()) +				if(selected)  				{ -					bool selected = false; -					uuid_vec_t::iterator sel_iter = gmSelected.begin(); -					for (; sel_iter != gmSelected.end(); sel_iter++) +					if( (pos_map.mV[VX] < 0) || +						(pos_map.mV[VY] < 0) || +						(pos_map.mV[VX] >= getRect().getWidth()) || +						(pos_map.mV[VY] >= getRect().getHeight()) )  					{ -						if(*sel_iter == uuid) -						{ -							selected = true; -							break; -						} -					} -					if(selected) +						S32 x = llround( pos_map.mV[VX] ); +						S32 y = llround( pos_map.mV[VY] ); +						LLWorldMapView::drawTrackingCircle( getRect(), x, y, color, 1, 10); +					} else  					{ -						if( (pos_map.mV[VX] < 0) || -							(pos_map.mV[VY] < 0) || -							(pos_map.mV[VX] >= getRect().getWidth()) || -							(pos_map.mV[VY] >= getRect().getHeight()) ) -						{ -							S32 x = llround( pos_map.mV[VX] ); -							S32 y = llround( pos_map.mV[VY] ); -							LLWorldMapView::drawTrackingCircle( getRect(), x, y, color, 1, 10); -						} else -						{ -							LLWorldMapView::drawTrackingDot(pos_map.mV[VX],pos_map.mV[VY],color,0.f); -						} +						LLWorldMapView::drawTrackingDot(pos_map.mV[VX],pos_map.mV[VY],color,0.f);  					}  				} +			} -				F32	dist_to_cursor_squared = dist_vec_squared(LLVector2(pos_map.mV[VX], pos_map.mV[VY]), -											  LLVector2(local_mouse_x,local_mouse_y)); -				if(dist_to_cursor_squared < min_pick_dist_squared && dist_to_cursor_squared < closest_dist_squared) -				{ -					closest_dist_squared = dist_to_cursor_squared; -					mClosestAgentToCursor = regionp->mMapAvatarIDs.get(i); -				} +			F32	dist_to_cursor_squared = dist_vec_squared(LLVector2(pos_map.mV[VX], pos_map.mV[VY]), +										  LLVector2(local_mouse_x,local_mouse_y)); +			if(dist_to_cursor_squared < min_pick_dist_squared && dist_to_cursor_squared < closest_dist_squared) +			{ +				closest_dist_squared = dist_to_cursor_squared; +				mClosestAgentToCursor = uuid;  			}  		} @@ -440,7 +417,7 @@ void LLNetMap::draw()  		}  		// Draw dot for self avatar position -		pos_global = gAgent.getPositionGlobal(); +		LLVector3d pos_global = gAgent.getPositionGlobal();  		pos_map = globalPosToView(pos_global);  		S32 dot_width = llround(mDotRadius * 2.f);  		LLUIImagePtr you = LLWorldMapView::sAvatarYouLargeImage; @@ -514,9 +491,11 @@ void LLNetMap::reshape(S32 width, S32 height, BOOL called_from_parent)  	createObjectImage();  } -LLVector3 LLNetMap::globalPosToView( const LLVector3d& global_pos ) +LLVector3 LLNetMap::globalPosToView(const LLVector3d& global_pos)  { -	LLVector3d relative_pos_global = global_pos - gAgentCamera.getCameraPositionGlobal(); +	LLVector3d camera_position = gAgentCamera.getCameraPositionGlobal(); + +	LLVector3d relative_pos_global = global_pos - camera_position;  	LLVector3 pos_local;  	pos_local.setVec(relative_pos_global);  // convert to floats from doubles @@ -541,7 +520,7 @@ LLVector3 LLNetMap::globalPosToView( const LLVector3d& global_pos )  void LLNetMap::drawTracking(const LLVector3d& pos_global, const LLColor4& color,   							BOOL draw_arrow )  { -	LLVector3 pos_local = globalPosToView( pos_global ); +	LLVector3 pos_local = globalPosToView(pos_global);  	if( (pos_local.mV[VX] < 0) ||  		(pos_local.mV[VY] < 0) ||  		(pos_local.mV[VX] >= getRect().getWidth()) || diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index 676287c0ad..5b2e78477c 100644 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -1161,24 +1161,13 @@ void send_agent_resume()  static LLVector3d unpackLocalToGlobalPosition(U32 compact_local, const LLVector3d& region_origin)  { -	LLVector3d pos_global; -	LLVector3 pos_local; -	U8 bits; +	LLVector3d pos_local; -	bits = compact_local & 0xFF; -	pos_local.mV[VZ] = F32(bits) * 4.f; -	compact_local >>= 8; +	pos_local.mdV[VZ] = (compact_local & 0xFFU) * 4; +	pos_local.mdV[VY] = (compact_local >> 8) & 0xFFU; +	pos_local.mdV[VX] = (compact_local >> 16) & 0xFFU; -	bits = compact_local & 0xFF; -	pos_local.mV[VY] = (F32)bits; -	compact_local >>= 8; - -	bits = compact_local & 0xFF; -	pos_local.mV[VX] = (F32)bits; - -	pos_global.setVec( pos_local ); -	pos_global += region_origin; -	return pos_global; +	return region_origin + pos_local;  }  void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector<LLVector3d>* positions, const LLVector3d& relative_to, F32 radius) const @@ -1199,22 +1188,20 @@ void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector<LLVector3d>* positi  		iter != LLCharacter::sInstances.end(); ++iter)  	{  		LLVOAvatar* pVOAvatar = (LLVOAvatar*) *iter; -		if(!pVOAvatar->isDead() && !pVOAvatar->isSelf()) -		{ -			LLUUID uuid = pVOAvatar->getID(); -			if(!uuid.isNull()) +		LLVector3d pos_global = pVOAvatar->getPositionGlobal(); +		LLUUID uuid = pVOAvatar->getID(); +		if( !pVOAvatar->isDead() && +			!pVOAvatar->isSelf() && +			!uuid.isNull() && +			dist_vec_squared(pos_global, relative_to) <= radius_squared)  			{ -				LLVector3d pos_global = pVOAvatar->getPositionGlobal(); -				if(dist_vec_squared(pos_global, relative_to) <= radius_squared) +				if(positions != NULL)  				{ -					if(positions != NULL) -					{ -						positions->push_back(pos_global); -					} -					if(avatar_ids !=NULL) -					{ -						avatar_ids->push_back(uuid); -					} +					positions->push_back(pos_global); +				} +				if(avatar_ids !=NULL) +				{ +					avatar_ids->push_back(uuid);  				}  			}  		} @@ -1233,9 +1220,9 @@ void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector<LLVector3d>* positi  			{  				LLUUID uuid = regionp->mMapAvatarIDs.get(i);  				// if this avatar doesn't already exist in the list, add it -				if(uuid.notNull() && avatar_ids!=NULL && std::find(avatar_ids->begin(), avatar_ids->end(), uuid) == avatar_ids->end()) +				if(uuid.notNull() && avatar_ids != NULL && std::find(avatar_ids->begin(), avatar_ids->end(), uuid) == avatar_ids->end())  				{ -					if(positions != NULL) +					if (positions != NULL)  					{  						positions->push_back(pos_global);  					} diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index e50851b8e7..fc3ab1a0c0 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -77,6 +77,7 @@ LLUIImagePtr LLWorldMapView::sAvatarYouLargeImage = NULL;  LLUIImagePtr LLWorldMapView::sAvatarLevelImage = NULL;  LLUIImagePtr LLWorldMapView::sAvatarAboveImage = NULL;  LLUIImagePtr LLWorldMapView::sAvatarBelowImage = NULL; +LLUIImagePtr LLWorldMapView::sAvatarUnknownImage = NULL;  LLUIImagePtr LLWorldMapView::sTelehubImage = NULL;  LLUIImagePtr LLWorldMapView::sInfohubImage = NULL; @@ -120,6 +121,7 @@ void LLWorldMapView::initClass()  	sAvatarLevelImage =		LLUI::getUIImage("map_avatar_32.tga");  	sAvatarAboveImage =		LLUI::getUIImage("map_avatar_above_32.tga");  	sAvatarBelowImage =		LLUI::getUIImage("map_avatar_below_32.tga"); +	sAvatarUnknownImage =	LLUI::getUIImage("map_avatar_unknown_32.tga");  	sHomeImage =			LLUI::getUIImage("map_home.tga");  	sTelehubImage = 		LLUI::getUIImage("map_telehub.tga"); @@ -149,6 +151,7 @@ void LLWorldMapView::cleanupClass()  	sAvatarLevelImage = NULL;  	sAvatarAboveImage = NULL;  	sAvatarBelowImage = NULL; +	sAvatarUnknownImage = NULL;  	sTelehubImage = NULL;  	sInfohubImage = NULL; @@ -1147,17 +1150,25 @@ void LLWorldMapView::drawAvatar(F32 x_pixels,  								F32 y_pixels,  								const LLColor4& color,  								F32 relative_z, -								F32 dot_radius) +								F32 dot_radius, +								bool unknown_relative_z)  {  	const F32 HEIGHT_THRESHOLD = 7.f;  	LLUIImagePtr dot_image = sAvatarLevelImage; -	if(relative_z < -HEIGHT_THRESHOLD)  +	if (unknown_relative_z)  	{ -		dot_image = sAvatarBelowImage;  +		dot_image = sAvatarUnknownImage;  	} -	else if(relative_z > HEIGHT_THRESHOLD)  -	{  -		dot_image = sAvatarAboveImage; +	else +	{ +		if(relative_z < -HEIGHT_THRESHOLD) +		{ +			dot_image = sAvatarBelowImage;  +		} +		else if(relative_z > HEIGHT_THRESHOLD)  +		{  +			dot_image = sAvatarAboveImage; +		}  	}  	S32 dot_width = llround(dot_radius * 2.f);  	dot_image->draw(llround(x_pixels - dot_radius), diff --git a/indra/newview/llworldmapview.h b/indra/newview/llworldmapview.h index 9ab53b1ba3..a2a6dc53fb 100644 --- a/indra/newview/llworldmapview.h +++ b/indra/newview/llworldmapview.h @@ -112,7 +112,8 @@ public:  								F32 y_pixels,   								const LLColor4& color,  								F32 relative_z = 0.f, -								F32 dot_radius = 3.f); +								F32 dot_radius = 3.f, +								bool reached_max_z = false);  	static void		drawIconName(F32 x_pixels,   									F32 y_pixels,   									const LLColor4& color, @@ -138,6 +139,7 @@ public:  	static LLUIImagePtr	sAvatarLevelImage;  	static LLUIImagePtr	sAvatarAboveImage;  	static LLUIImagePtr	sAvatarBelowImage; +	static LLUIImagePtr	sAvatarUnknownImage;  	static LLUIImagePtr	sTelehubImage;  	static LLUIImagePtr	sInfohubImage;  | 
