From 6ca9572497f3ccfa3cd46130685baada752e7fe1 Mon Sep 17 00:00:00 2001 From: McCabe Maxsted Date: Sat, 13 Jun 2009 01:18:31 -0700 Subject: Applied Aimee's patch for VWR-13221: Allow panning of the mini-map --- linden/indra/newview/app_settings/settings.xml | 11 ++ linden/indra/newview/llnetmap.cpp | 148 +++++++++++++++++++-- linden/indra/newview/llnetmap.h | 33 ++++- .../skins/default/xui/en-us/menu_mini_map.xml | 6 + 4 files changed, 183 insertions(+), 15 deletions(-) (limited to 'linden') diff --git a/linden/indra/newview/app_settings/settings.xml b/linden/indra/newview/app_settings/settings.xml index ba2a9e4..f23daee 100644 --- a/linden/indra/newview/app_settings/settings.xml +++ b/linden/indra/newview/app_settings/settings.xml @@ -4797,6 +4797,17 @@ Value 410 + MiniMapCenter + + Comment + Sets the focal point of the minimap. (0=None, 1=Camera) + Persist + 1 + Type + S32 + Value + 1 + MiniMapRotate Comment diff --git a/linden/indra/newview/llnetmap.cpp b/linden/indra/newview/llnetmap.cpp index 71eb35b..585e8eb 100644 --- a/linden/indra/newview/llnetmap.cpp +++ b/linden/indra/newview/llnetmap.cpp @@ -94,6 +94,8 @@ LLNetMap::LLNetMap(const std::string& name) : // Register event listeners for popup menu (new LLScaleMap())->registerListener(this, "MiniMap.ZoomLevel"); + (new LLCenterMap())->registerListener(this, "MiniMap.Center"); + (new LLCheckCenterMap())->registerListener(this, "MiniMap.CheckCenter"); (new LLStopTracking())->registerListener(this, "MiniMap.StopTracking"); (new LLEnableTracking())->registerListener(this, "MiniMap.EnableTracking"); (new LLShowAgentProfile())->registerListener(this, "MiniMap.ShowProfile"); @@ -160,8 +162,11 @@ void LLNetMap::draw() createObjectImage(); } - mCurPanX = lerp(mCurPanX, mTargetPanX, LLCriticalDamp::getInterpolant(0.1f)); - mCurPanY = lerp(mCurPanY, mTargetPanY, LLCriticalDamp::getInterpolant(0.1f)); + if (gSavedSettings.getS32( "MiniMapCenter" ) != MAP_CENTER_NONE) + { + mCurPanX = lerp(mCurPanX, mTargetPanX, LLCriticalDamp::getInterpolant(0.1f)); + mCurPanY = lerp(mCurPanY, mTargetPanY, LLCriticalDamp::getInterpolant(0.1f)); + } F32 rotation = 0; @@ -261,26 +266,24 @@ void LLNetMap::draw() } gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); } - - - LLVector3d old_center = mObjectImageCenterGlobal; - LLVector3d new_center = gAgent.getCameraPositionGlobal(); - - new_center.mdV[0] = (5.f/mObjectMapTPM)*floor(0.2f*mObjectMapTPM*new_center.mdV[0]); - new_center.mdV[1] = (5.f/mObjectMapTPM)*floor(0.2f*mObjectMapTPM*new_center.mdV[1]); - new_center.mdV[2] = 0.f; + // Redraw object layer periodically if (mUpdateNow || (map_timer.getElapsedTimeF32() > 0.5f)) { mUpdateNow = FALSE; - mObjectImageCenterGlobal = new_center; - // Center moved enough. + // Locate the centre of the object layer, accounting for panning + LLVector3 new_center = globalPosToView(gAgent.getCameraPositionGlobal(), rotate_map); + new_center.mV[0] -= mCurPanX; + new_center.mV[1] -= mCurPanY; + new_center.mV[2] = 0.f; + mObjectImageCenterGlobal = viewPosToGlobal(llround(new_center.mV[0]), llround(new_center.mV[1]), rotate_map); + // Create the base texture. U8 *default_texture = mObjectRawImagep->getData(); memset( default_texture, 0, mObjectImagep->getWidth() * mObjectImagep->getHeight() * mObjectImagep->getComponents() ); - // Draw buildings + // Draw objects gObjectList.renderObjectsForMap(*this); mObjectImagep->setSubImage(mObjectRawImagep, 0, 0, mObjectImagep->getWidth(), mObjectImagep->getHeight()); @@ -728,6 +731,99 @@ void LLNetMap::createObjectImage() mUpdateNow = TRUE; } +BOOL LLNetMap::handleMouseDown( S32 x, S32 y, MASK mask ) +{ + if (!(mask & MASK_SHIFT)) return FALSE; + + // Start panning + gFocusMgr.setMouseCapture( this ); + + mMouseDownPanX = llround(mCurPanX); + mMouseDownPanY = llround(mCurPanY); + mMouseDownX = x; + mMouseDownY = y; + return TRUE; +} + +BOOL LLNetMap::handleMouseUp( S32 x, S32 y, MASK mask ) +{ + if (hasMouseCapture()) + { + if (mPanning) + { + // restore mouse cursor + S32 local_x, local_y; + local_x = mMouseDownX + llfloor(mCurPanX - mMouseDownPanX); + local_y = mMouseDownY + llfloor(mCurPanY - mMouseDownPanY); + LLRect clip_rect = getRect(); + clip_rect.stretch(-8); + clip_rect.clipPointToRect(mMouseDownX, mMouseDownY, local_x, local_y); + LLUI::setCursorPositionLocal(this, local_x, local_y); + + // finish the pan + mPanning = FALSE; + + mMouseDownX = 0; + mMouseDownY = 0; + + // auto centre + mTargetPanX = 0; + mTargetPanY = 0; + } + gViewerWindow->showCursor(); + gFocusMgr.setMouseCapture( NULL ); + return TRUE; + } + return FALSE; +} + +// static +BOOL LLNetMap::outsideSlop(S32 x, S32 y, S32 start_x, S32 start_y) +{ + S32 dx = x - start_x; + S32 dy = y - start_y; + S32 SLOP = 4; + + return (dx <= -SLOP || SLOP <= dx || dy <= -SLOP || SLOP <= dy); +} + +BOOL LLNetMap::handleHover( S32 x, S32 y, MASK mask ) +{ + if (hasMouseCapture()) + { + if (mPanning || outsideSlop(x, y, mMouseDownX, mMouseDownY)) + { + // just started panning, so hide cursor + if (!mPanning) + { + mPanning = TRUE; + gViewerWindow->hideCursor(); + } + + F32 delta_x = (F32)(gViewerWindow->getCurrentMouseDX()); + F32 delta_y = (F32)(gViewerWindow->getCurrentMouseDY()); + + // Set pan to value at start of drag + offset + mCurPanX += delta_x; + mCurPanY += delta_y; + mTargetPanX = mCurPanX; + mTargetPanY = mCurPanY; + + gViewerWindow->moveCursorToCenter(); + } + + // Doesn't matter, cursor should be hidden + gViewerWindow->setCursor( UI_CURSOR_CROSS ); + return TRUE; + } + else + { + gViewerWindow->setCursor( UI_CURSOR_CROSS ); + lldebugst(LLERR_USER_INPUT) << "hover handled by LLNetMap" << llendl; + return TRUE; + } +} + BOOL LLNetMap::handleDoubleClick( S32 x, S32 y, MASK mask ) { if (gSavedSettings.getBOOL( "MiniMapTeleport" )) @@ -780,6 +876,32 @@ bool LLNetMap::LLScaleMap::handleEvent(LLPointer event, const LLSD& use return true; } +bool LLNetMap::LLCenterMap::handleEvent(LLPointer event, const LLSD& userdata) +{ + S32 center = userdata.asInteger(); + + if (gSavedSettings.getS32("MiniMapCenter") == center) + { + gSavedSettings.setS32("MiniMapCenter", MAP_CENTER_NONE); + } + else + { + gSavedSettings.setS32("MiniMapCenter", userdata.asInteger()); + } + + return true; +} + +bool LLNetMap::LLCheckCenterMap::handleEvent(LLPointer event, const LLSD& userdata) +{ + LLNetMap *self = mPtr; + EMiniMapCenter center = (EMiniMapCenter)userdata["data"].asInteger(); + BOOL enabled = (gSavedSettings.getS32("MiniMapCenter") == center); + + self->findControl(userdata["control"].asString())->setValue(enabled); + return true; +} + bool LLNetMap::LLStopTracking::handleEvent(LLPointer event, const LLSD& userdata) { LLTracker::stopTracking(NULL); diff --git a/linden/indra/newview/llnetmap.h b/linden/indra/newview/llnetmap.h index be5593d..508e882 100644 --- a/linden/indra/newview/llnetmap.h +++ b/linden/indra/newview/llnetmap.h @@ -40,9 +40,14 @@ #include "llimage.h" #include "llimagegl.h" - class LLTextBox; +typedef enum e_minimap_center +{ + MAP_CENTER_NONE = 0, + MAP_CENTER_CAMERA = 1 +} EMiniMapCenter; + class LLNetMap : public LLPanel { public: @@ -51,6 +56,9 @@ public: virtual void draw(); virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); + virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); + virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); + virtual BOOL handleHover( S32 x, S32 y, MASK mask ); virtual BOOL handleDoubleClick( S32 x, S32 y, MASK mask ); virtual BOOL handleRightMouseDown( S32 x, S32 y, MASK mask ); virtual BOOL handleScrollWheel(S32 x, S32 y, S32 clicks); @@ -62,7 +70,7 @@ private: void setScale( F32 scale ); - // *TODO: Enable panning of the mini-map + // Not used at present void translatePan( F32 delta_x, F32 delta_y ); void setPan( F32 x, F32 y ) { mTargetPanX = x; mTargetPanY = y; } @@ -90,6 +98,13 @@ private: F32 mTargetPanY; F32 mCurPanX; F32 mCurPanY; + + BOOL mPanning; // map has been dragged + S32 mMouseDownPanX; // value at start of drag + S32 mMouseDownPanY; // value at start of drag + S32 mMouseDownX; + S32 mMouseDownY; + BOOL mUpdateNow; LLVector3d mObjectImageCenterGlobal; LLPointer mObjectRawImagep; @@ -102,6 +117,8 @@ private: static BOOL sRotateMap; static LLNetMap* sInstance; static BOOL isAgentUnderCursor(void*) { return sInstance && sInstance->mClosestAgentToCursor.notNull(); } + static BOOL outsideSlop(S32 x, S32 y, S32 start_x, S32 start_y); + static void showAgentProfile(void*); BOOL isAgentUnderCursor() { return mClosestAgentToCursor.notNull(); } @@ -111,6 +128,18 @@ private: /*virtual*/ bool handleEvent(LLPointer event, const LLSD& userdata); }; + class LLCenterMap : public LLMemberListener + { + public: + /*virtual*/ bool handleEvent(LLPointer event, const LLSD& userdata); + }; + + class LLCheckCenterMap : public LLMemberListener + { + public: + /*virtual*/ bool handleEvent(LLPointer event, const LLSD& userdata); + }; + class LLStopTracking : public LLMemberListener { public: diff --git a/linden/indra/newview/skins/default/xui/en-us/menu_mini_map.xml b/linden/indra/newview/skins/default/xui/en-us/menu_mini_map.xml index 1fee7d1..68eb4e6 100644 --- a/linden/indra/newview/skins/default/xui/en-us/menu_mini_map.xml +++ b/linden/indra/newview/skins/default/xui/en-us/menu_mini_map.xml @@ -14,6 +14,12 @@ + + + + + -- cgit v1.1