summaryrefslogtreecommitdiff
path: root/indra/newview/llworldmapview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llworldmapview.cpp')
-rw-r--r--indra/newview/llworldmapview.cpp111
1 files changed, 64 insertions, 47 deletions
diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp
index 1940d65ae4..0c17b5e297 100644
--- a/indra/newview/llworldmapview.cpp
+++ b/indra/newview/llworldmapview.cpp
@@ -2,31 +2,25 @@
* @file llworldmapview.cpp
* @brief LLWorldMapView class implementation
*
- * $LicenseInfo:firstyear=2001&license=viewergpl$
- *
- * Copyright (c) 2001-2009, Linden Research, Inc.
- *
+ * $LicenseInfo:firstyear=2001&license=viewerlgpl$
* Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
*
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
*
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
* $/LicenseInfo$
*/
@@ -44,7 +38,9 @@
#include "lltooltip.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llcallingcard.h"
+#include "llcommandhandler.h"
#include "llviewercontrol.h"
#include "llfloatermap.h"
#include "llfloaterworldmap.h"
@@ -128,10 +124,10 @@ void LLWorldMapView::initClass()
sHomeImage = LLUI::getUIImage("map_home.tga");
sTelehubImage = LLUI::getUIImage("map_telehub.tga");
sInfohubImage = LLUI::getUIImage("map_infohub.tga");
- sEventImage = LLUI::getUIImage("map_event.tga");
- sEventMatureImage = LLUI::getUIImage("map_event_mature.tga");
+ sEventImage = LLUI::getUIImage("Parcel_PG_Dark");
+ sEventMatureImage = LLUI::getUIImage("Parcel_M_Dark");
// To Do: update the image resource for adult events.
- sEventAdultImage = LLUI::getUIImage("map_event_adult.tga");
+ sEventAdultImage = LLUI::getUIImage("Parcel_R_Dark");
sTrackCircleImage = LLUI::getUIImage("map_track_16.tga");
sTrackArrowImage = LLUI::getUIImage("direction_arrow.tga");
@@ -310,7 +306,7 @@ void LLWorldMapView::draw()
const S32 height = getRect().getHeight();
const F32 half_width = F32(width) / 2.0f;
const F32 half_height = F32(height) / 2.0f;
- LLVector3d camera_global = gAgent.getCameraPositionGlobal();
+ LLVector3d camera_global = gAgentCamera.getCameraPositionGlobal();
S32 level = LLWorldMipmap::scaleToLevel(sMapScale);
@@ -884,35 +880,61 @@ void LLWorldMapView::drawFrustum()
F32 half_width_meters = far_clip_meters * tan( horiz_fov / 2 );
F32 half_width_pixels = half_width_meters * meters_to_pixels;
- F32 ctr_x = getRect().getWidth() * 0.5f + sPanX;
- F32 ctr_y = getRect().getHeight() * 0.5f + sPanY;
+ F32 ctr_x = getLocalRect().getWidth() * 0.5f + sPanX;
+ F32 ctr_y = getLocalRect().getHeight() * 0.5f + sPanY;
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
// Since we don't rotate the map, we have to rotate the frustum.
gGL.pushMatrix();
+ {
gGL.translatef( ctr_x, ctr_y, 0 );
- glRotatef( atan2( LLViewerCamera::getInstance()->getAtAxis().mV[VX], LLViewerCamera::getInstance()->getAtAxis().mV[VY] ) * RAD_TO_DEG, 0.f, 0.f, -1.f);
// Draw triangle with more alpha in far pixels to make it
// fade out in distance.
gGL.begin( LLRender::TRIANGLES );
+ {
+ // get camera look at and left axes
+ LLVector3 at_axis = LLViewerCamera::instance().getAtAxis();
+ LLVector3 left_axis = LLViewerCamera::instance().getLeftAxis();
+
+ // grab components along XY plane
+ LLVector2 cam_lookat(at_axis.mV[VX], at_axis.mV[VY]);
+ LLVector2 cam_left(left_axis.mV[VX], left_axis.mV[VY]);
+
+ // but, when looking near straight up or down...
+ if (is_approx_zero(cam_lookat.magVecSquared()))
+ {
+ //...just fall back to looking down the x axis
+ cam_lookat = LLVector2(1.f, 0.f); // x axis
+ cam_left = LLVector2(0.f, 1.f); // y axis
+ }
+
+ // normalize to unit length
+ cam_lookat.normVec();
+ cam_left.normVec();
+
gGL.color4f(1.f, 1.f, 1.f, 0.25f);
gGL.vertex2f( 0, 0 );
gGL.color4f(1.f, 1.f, 1.f, 0.02f);
- gGL.vertex2f( -half_width_pixels, far_clip_pixels );
+
+ // use 2d camera vectors to render frustum triangle
+ LLVector2 vert = cam_lookat * far_clip_pixels + cam_left * half_width_pixels;
+ gGL.vertex2f(vert.mV[VX], vert.mV[VY]);
- gGL.color4f(1.f, 1.f, 1.f, 0.02f);
- gGL.vertex2f( half_width_pixels, far_clip_pixels );
+ vert = cam_lookat * far_clip_pixels - cam_left * half_width_pixels;
+ gGL.vertex2f(vert.mV[VX], vert.mV[VY]);
+ }
gGL.end();
+ }
gGL.popMatrix();
}
LLVector3 LLWorldMapView::globalPosToView( const LLVector3d& global_pos )
{
- LLVector3d relative_pos_global = global_pos - gAgent.getCameraPositionGlobal();
+ LLVector3d relative_pos_global = global_pos - gAgentCamera.getCameraPositionGlobal();
LLVector3 pos_local;
pos_local.setVec(relative_pos_global); // convert to floats from doubles
@@ -1005,7 +1027,7 @@ LLVector3d LLWorldMapView::viewPosToGlobal( S32 x, S32 y )
LLVector3d pos_global;
pos_global.setVec( pos_local );
- pos_global += gAgent.getCameraPositionGlobal();
+ pos_global += gAgentCamera.getCameraPositionGlobal();
if(gAgent.isGodlike())
{
pos_global.mdV[VZ] = GODLY_TELEPORT_HEIGHT; // Godly height should always be 200.
@@ -1044,18 +1066,10 @@ BOOL LLWorldMapView::handleToolTip( S32 x, S32 y, MASK mask )
// zoomed out, so don't display anything about the count. JC
if (agent_count > 0)
{
- // Merov: i18n horror!!! Even using gettext(), concatenating strings is not localizable.
- // The singular/plural switch form here under might make no sense in some languages. Don't do that.
- message += llformat("\n%d ", agent_count);
-
- if (agent_count == 1)
- {
- message += "person";
- }
- else
- {
- message += "people";
- }
+ LLStringUtil::format_map_t string_args;
+ string_args["[NUMBER]"] = llformat("%d", agent_count);
+ message += '\n';
+ message += getString((agent_count == 1 ? "world_map_person" : "world_map_people") , string_args);
}
}
tooltip_msg.assign( message );
@@ -1637,7 +1651,7 @@ void LLWorldMapView::updateVisibleBlocks()
// Load the blocks visible in the current World Map view
// Get the World Map view coordinates and boundaries
- LLVector3d camera_global = gAgent.getCameraPositionGlobal();
+ LLVector3d camera_global = gAgentCamera.getCameraPositionGlobal();
const S32 width = getRect().getWidth();
const S32 height = getRect().getHeight();
const F32 half_width = F32(width) / 2.0f;
@@ -1726,7 +1740,10 @@ BOOL LLWorldMapView::handleDoubleClick( S32 x, S32 y, MASK mask )
id.toString(uuid_str);
uuid_str = uuid_str.substr(28);
sscanf(uuid_str.c_str(), "%X", &event_id);
- LLFloaterReg::showInstance("search", LLSD().with("category", "events").with("id", event_id));
+ // Invoke the event details floater if someone is clicking on an event.
+ LLSD params(LLSD::emptyArray());
+ params.append(event_id);
+ LLCommandDispatcher::dispatch("event", params, LLSD(), NULL, true);
break;
}
case MAP_ITEM_LAND_FOR_SALE: