llfloatermap.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:7k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llfloatermap.cpp
  3.  * @brief The "mini-map" or radar in the upper right part of the screen.
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #include "llviewerprecompiledheaders.h"
  33. // self include
  34. #include "llfloatermap.h"
  35. // Library includes
  36. #include "llfloaterreg.h"
  37. #include "llfontgl.h"
  38. #include "llglheaders.h"
  39. // Viewer includes
  40. #include "llagent.h"
  41. #include "llviewercontrol.h"
  42. #include "llnetmap.h"
  43. #include "lltracker.h"
  44. #include "llviewercamera.h"
  45. #include "lldraghandle.h"
  46. #include "lltextbox.h"
  47. #include "llviewermenu.h"
  48. //
  49. // Constants
  50. //
  51. const F32 MAP_MINOR_DIR_THRESHOLD = 0.08f;
  52. //
  53. // Member functions
  54. //
  55. LLFloaterMap::LLFloaterMap(const LLSD& key) 
  56. : LLFloater(key),
  57.   mPopupMenu(NULL),
  58.   mTextBoxEast(NULL),
  59.   mTextBoxNorth(NULL),
  60.   mTextBoxWest(NULL),
  61.   mTextBoxSouth(NULL),
  62.   mTextBoxSouthEast(NULL),
  63.   mTextBoxNorthEast(NULL),
  64.   mTextBoxNorthWest(NULL),
  65.   mTextBoxSouthWest(NULL),
  66.   mMap(NULL)
  67. {
  68. //Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this, "floater_map.xml", FALSE);
  69. }
  70. LLFloaterMap::~LLFloaterMap()
  71. {
  72. }
  73. BOOL LLFloaterMap::postBuild()
  74. {
  75. mMap = getChild<LLNetMap>("Net Map");
  76. mMap->setScale(gSavedSettings.getF32("MiniMapScale"));
  77. mMap->setToolTipMsg(getString("ToolTipMsg"));
  78. sendChildToBack(mMap);
  79. mTextBoxNorth = getChild<LLTextBox> ("floater_map_north");
  80. mTextBoxEast = getChild<LLTextBox> ("floater_map_east");
  81. mTextBoxWest = getChild<LLTextBox> ("floater_map_west");
  82. mTextBoxSouth = getChild<LLTextBox> ("floater_map_south");
  83. mTextBoxSouthEast = getChild<LLTextBox> ("floater_map_southeast");
  84. mTextBoxNorthEast = getChild<LLTextBox> ("floater_map_northeast");
  85. mTextBoxSouthWest = getChild<LLTextBox> ("floater_map_southwest");
  86. mTextBoxNorthWest = getChild<LLTextBox> ("floater_map_northwest");
  87. LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
  88. registrar.add("Minimap.Zoom", boost::bind(&LLFloaterMap::handleZoom, this, _2));
  89. registrar.add("Minimap.Tracker", boost::bind(&LLFloaterMap::handleStopTracking, this, _2));
  90. mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_mini_map.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
  91. if (mPopupMenu && !LLTracker::isTracking(0))
  92. {
  93. mPopupMenu->setItemEnabled ("Stop Tracking", false);
  94. }
  95. updateMinorDirections();
  96. // Get the drag handle all the way in back
  97. sendChildToBack(getDragHandle());
  98. setIsChrome(TRUE);
  99. getDragHandle()->setTitleVisible(TRUE);
  100. // keep onscreen
  101. gFloaterView->adjustToFitScreen(this, FALSE);
  102. return TRUE;
  103. }
  104. BOOL LLFloaterMap::handleDoubleClick( S32 x, S32 y, MASK mask )
  105. {
  106. LLFloaterReg::showInstance("world_map");
  107. return TRUE;
  108. }
  109. BOOL LLFloaterMap::handleRightMouseDown(S32 x, S32 y, MASK mask)
  110. {
  111. if (mPopupMenu)
  112. {
  113. mPopupMenu->buildDrawLabels();
  114. mPopupMenu->updateParent(LLMenuGL::sMenuContainer);
  115. LLMenuGL::showPopup(this, mPopupMenu, x, y);
  116. }
  117. return TRUE;
  118. }
  119. void LLFloaterMap::setDirectionPos( LLTextBox* text_box, F32 rotation )
  120. {
  121. // Rotation is in radians.
  122. // Rotation of 0 means x = 1, y = 0 on the unit circle.
  123. F32 map_half_height = (F32)(getRect().getHeight() / 2) - getHeaderHeight()/2;
  124. F32 map_half_width = (F32)(getRect().getWidth() / 2) ;
  125. F32 text_half_height = (F32)(text_box->getRect().getHeight() / 2);
  126. F32 text_half_width = (F32)(text_box->getRect().getWidth() / 2);
  127. F32 radius = llmin( map_half_height - text_half_height, map_half_width - text_half_width );
  128. // Inset by a little to account for position display.
  129. radius -= 8.f;
  130. text_box->setOrigin( 
  131. llround(map_half_width - text_half_width + radius * cos( rotation )),
  132. llround(map_half_height - text_half_height + radius * sin( rotation )) );
  133. }
  134. void LLFloaterMap::updateMinorDirections()
  135. {
  136. if (mTextBoxNorthEast == NULL)
  137. {
  138. return;
  139. }
  140. // Hide minor directions if they cover too much of the map
  141. bool show_minors = mTextBoxNorthEast->getRect().getHeight() < MAP_MINOR_DIR_THRESHOLD *
  142. llmin(getRect().getWidth(), getRect().getHeight());
  143. mTextBoxNorthEast->setVisible(show_minors);
  144. mTextBoxNorthWest->setVisible(show_minors);
  145. mTextBoxSouthWest->setVisible(show_minors);
  146. mTextBoxSouthEast->setVisible(show_minors);
  147. }
  148. // virtual
  149. void LLFloaterMap::draw()
  150. {
  151. F32 rotation = 0;
  152. static LLUICachedControl<bool> rotate_map("MiniMapRotate", true);
  153. if( rotate_map )
  154. {
  155. // rotate subsequent draws to agent rotation
  156. rotation = atan2( LLViewerCamera::getInstance()->getAtAxis().mV[VX], LLViewerCamera::getInstance()->getAtAxis().mV[VY] );
  157. }
  158. setDirectionPos( mTextBoxEast,  rotation );
  159. setDirectionPos( mTextBoxNorth, rotation + F_PI_BY_TWO );
  160. setDirectionPos( mTextBoxWest,  rotation + F_PI );
  161. setDirectionPos( mTextBoxSouth, rotation + F_PI + F_PI_BY_TWO );
  162. setDirectionPos( mTextBoxNorthEast, rotation + F_PI_BY_TWO / 2);
  163. setDirectionPos( mTextBoxNorthWest, rotation + F_PI_BY_TWO + F_PI_BY_TWO / 2);
  164. setDirectionPos( mTextBoxSouthWest, rotation + F_PI + F_PI_BY_TWO / 2);
  165. setDirectionPos( mTextBoxSouthEast, rotation + F_PI + F_PI_BY_TWO + F_PI_BY_TWO / 2);
  166. // Note: we can't just gAgent.check cameraMouselook() because the transition states are wrong.
  167. if( gAgent.cameraMouselook())
  168. {
  169. setMouseOpaque(FALSE);
  170. getDragHandle()->setMouseOpaque(FALSE);
  171. }
  172. else
  173. {
  174. setMouseOpaque(TRUE);
  175. getDragHandle()->setMouseOpaque(TRUE);
  176. }
  177. if (LLTracker::isTracking(0))
  178. {
  179. mPopupMenu->setItemEnabled ("Stop Tracking", true);
  180. }
  181. LLFloater::draw();
  182. }
  183. void LLFloaterMap::reshape(S32 width, S32 height, BOOL called_from_parent)
  184. {
  185. LLFloater::reshape(width, height, called_from_parent);
  186. updateMinorDirections();
  187. }
  188. void LLFloaterMap::handleZoom(const LLSD& userdata)
  189. {
  190. std::string level = userdata.asString();
  191. F32 scale = 0.0f;
  192. if (level == std::string("close"))
  193. scale = LLNetMap::MAP_SCALE_MAX;
  194. else if (level == std::string("medium"))
  195. scale = LLNetMap::MAP_SCALE_MID;
  196. else if (level == std::string("far"))
  197. scale = LLNetMap::MAP_SCALE_MIN;
  198. if (scale != 0.0f)
  199. {
  200. gSavedSettings.setF32("MiniMapScale", scale );
  201. mMap->setScale(scale);
  202. }
  203. }
  204. void LLFloaterMap::handleStopTracking (const LLSD& userdata)
  205. {
  206. if (mPopupMenu)
  207. {
  208. mPopupMenu->setItemEnabled ("Stop Tracking", false);
  209. LLTracker::stopTracking ((void*)LLTracker::isTracking(NULL));
  210. }
  211. }