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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lltoolselect.cpp
  3.  * @brief LLToolSelect class implementation
  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. #include "lltoolselect.h"
  34. #include "llagent.h"
  35. #include "llviewercontrol.h"
  36. #include "lldrawable.h"
  37. #include "llmanip.h"
  38. #include "llmenugl.h"
  39. #include "llselectmgr.h"
  40. #include "lltoolmgr.h"
  41. #include "llfloaterscriptdebug.h"
  42. #include "llviewercamera.h"
  43. #include "llviewermenu.h"
  44. #include "llviewerobject.h"
  45. #include "llviewerobjectlist.h" 
  46. #include "llviewerregion.h" 
  47. #include "llviewerwindow.h"
  48. #include "llvoavatarself.h"
  49. #include "llworld.h"
  50. // Globals
  51. //extern BOOL gAllowSelectAvatar;
  52. const F32 SELECTION_ROTATION_TRESHOLD = 0.1f;
  53. LLToolSelect::LLToolSelect( LLToolComposite* composite )
  54. : LLTool( std::string("Select"), composite ),
  55. mIgnoreGroup( FALSE )
  56. {
  57.  }
  58. // True if you selected an object.
  59. BOOL LLToolSelect::handleMouseDown(S32 x, S32 y, MASK mask)
  60. {
  61. // do immediate pick query
  62. mPick = gViewerWindow->pickImmediate(x, y, TRUE);
  63. // Pass mousedown to agent
  64. LLTool::handleMouseDown(x, y, mask);
  65. return mPick.getObject().notNull();
  66. }
  67. // static
  68. LLObjectSelectionHandle LLToolSelect::handleObjectSelection(const LLPickInfo& pick, BOOL ignore_group, BOOL temp_select, BOOL select_root)
  69. {
  70. LLViewerObject* object = pick.getObject();
  71. if (select_root)
  72. {
  73. object = object->getRootEdit();
  74. }
  75. BOOL select_owned = gSavedSettings.getBOOL("SelectOwnedOnly");
  76. BOOL select_movable = gSavedSettings.getBOOL("SelectMovableOnly");
  77. // *NOTE: These settings must be cleaned up at bottom of function.
  78. if (temp_select || LLSelectMgr::getInstance()->mAllowSelectAvatar)
  79. {
  80. gSavedSettings.setBOOL("SelectOwnedOnly", FALSE);
  81. gSavedSettings.setBOOL("SelectMovableOnly", FALSE);
  82. LLSelectMgr::getInstance()->setForceSelection(TRUE);
  83. }
  84. BOOL extend_select = (pick.mKeyMask == MASK_SHIFT) || (pick.mKeyMask == MASK_CONTROL);
  85. // If no object, check for icon, then just deselect
  86. if (!object)
  87. {
  88. LLHUDIcon* last_hit_hud_icon = pick.mHUDIcon;
  89. if (last_hit_hud_icon && last_hit_hud_icon->getSourceObject())
  90. {
  91. LLFloaterScriptDebug::show(last_hit_hud_icon->getSourceObject()->getID());
  92. }
  93. else if (!extend_select)
  94. {
  95. LLSelectMgr::getInstance()->deselectAll();
  96. }
  97. }
  98. else
  99. {
  100. BOOL already_selected = object->isSelected();
  101. if ( extend_select )
  102. {
  103. if ( already_selected )
  104. {
  105. if ( ignore_group )
  106. {
  107. LLSelectMgr::getInstance()->deselectObjectOnly(object);
  108. }
  109. else
  110. {
  111. LLSelectMgr::getInstance()->deselectObjectAndFamily(object, TRUE, TRUE);
  112. }
  113. }
  114. else
  115. {
  116. if ( ignore_group )
  117. {
  118. LLSelectMgr::getInstance()->selectObjectOnly(object, SELECT_ALL_TES);
  119. }
  120. else
  121. {
  122. LLSelectMgr::getInstance()->selectObjectAndFamily(object);
  123. }
  124. }
  125. }
  126. else
  127. {
  128. // Save the current zoom values because deselect resets them.
  129. F32 target_zoom;
  130. F32 current_zoom;
  131. LLSelectMgr::getInstance()->getAgentHUDZoom(target_zoom, current_zoom);
  132. // JC - Change behavior to make it easier to select children
  133. // of linked sets. 9/3/2002
  134. if( !already_selected || ignore_group)
  135. {
  136. // ...lose current selection in favor of just this object
  137. LLSelectMgr::getInstance()->deselectAll();
  138. }
  139. if ( ignore_group )
  140. {
  141. LLSelectMgr::getInstance()->selectObjectOnly(object, SELECT_ALL_TES);
  142. }
  143. else
  144. {
  145. LLSelectMgr::getInstance()->selectObjectAndFamily(object);
  146. }
  147. // restore the zoom to the previously stored values.
  148. LLSelectMgr::getInstance()->setAgentHUDZoom(target_zoom, current_zoom);
  149. }
  150. if (!gAgent.getFocusOnAvatar() && // if camera not glued to avatar
  151. LLVOAvatar::findAvatarFromAttachment(object) != gAgent.getAvatarObject() && // and it's not one of your attachments
  152. object != gAgent.getAvatarObject()) // and it's not you
  153. {
  154. // have avatar turn to face the selected object(s)
  155. LLVector3d selection_center = LLSelectMgr::getInstance()->getSelectionCenterGlobal();
  156. selection_center = selection_center - gAgent.getPositionGlobal();
  157. LLVector3 selection_dir;
  158. selection_dir.setVec(selection_center);
  159. selection_dir.mV[VZ] = 0.f;
  160. selection_dir.normVec();
  161. if (!object->isAvatar() && gAgent.getAtAxis() * selection_dir < 0.6f)
  162. {
  163. LLQuaternion target_rot;
  164. target_rot.shortestArc(LLVector3::x_axis, selection_dir);
  165. gAgent.startAutoPilotGlobal(gAgent.getPositionGlobal(), "", &target_rot, NULL, NULL, 1.f, SELECTION_ROTATION_TRESHOLD);
  166. }
  167. }
  168. if (temp_select)
  169. {
  170. if (!already_selected)
  171. {
  172. LLViewerObject* root_object = (LLViewerObject*)object->getRootEdit();
  173. LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
  174. // this is just a temporary selection
  175. LLSelectNode* select_node = selection->findNode(root_object);
  176. if (select_node)
  177. {
  178. select_node->setTransient(TRUE);
  179. }
  180. LLViewerObject::const_child_list_t& child_list = root_object->getChildren();
  181. for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
  182.  iter != child_list.end(); iter++)
  183. {
  184. LLViewerObject* child = *iter;
  185. select_node = selection->findNode(child);
  186. if (select_node)
  187. {
  188. select_node->setTransient(TRUE);
  189. }
  190. }
  191. }
  192. } //if(temp_select)
  193. } //if(!object)
  194. // Cleanup temp select settings above.
  195. if (temp_select ||LLSelectMgr::getInstance()->mAllowSelectAvatar)
  196. {
  197. gSavedSettings.setBOOL("SelectOwnedOnly", select_owned);
  198. gSavedSettings.setBOOL("SelectMovableOnly", select_movable);
  199. LLSelectMgr::getInstance()->setForceSelection(FALSE);
  200. }
  201. return LLSelectMgr::getInstance()->getSelection();
  202. }
  203. BOOL LLToolSelect::handleMouseUp(S32 x, S32 y, MASK mask)
  204. {
  205. mIgnoreGroup = gSavedSettings.getBOOL("EditLinkedParts");
  206. handleObjectSelection(mPick, mIgnoreGroup, FALSE);
  207. return LLTool::handleMouseUp(x, y, mask);
  208. }
  209. void LLToolSelect::handleDeselect()
  210. {
  211. if( hasMouseCapture() )
  212. {
  213. setMouseCapture( FALSE );  // Calls onMouseCaptureLost() indirectly
  214. }
  215. }
  216. void LLToolSelect::stopEditing()
  217. {
  218. if( hasMouseCapture() )
  219. {
  220. setMouseCapture( FALSE );  // Calls onMouseCaptureLost() indirectly
  221. }
  222. }
  223. void LLToolSelect::onMouseCaptureLost()
  224. {
  225. // Finish drag
  226. LLSelectMgr::getInstance()->enableSilhouette(TRUE);
  227. // Clean up drag-specific variables
  228. mIgnoreGroup = FALSE;
  229. }