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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lltoolselectrect.cpp
  3.  * @brief A tool to select multiple objects with a screen-space rectangle.
  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. // File includes
  34. #include "lltoolselectrect.h"
  35. // Library includes
  36. #include "llgl.h"
  37. #include "llrender.h"
  38. #include "lldarray.h"
  39. // Viewer includes
  40. #include "llviewercontrol.h"
  41. #include "llui.h"
  42. #include "llselectmgr.h"
  43. #include "lltoolmgr.h"
  44. #include "llviewerobject.h"
  45. #include "llviewerobjectlist.h"
  46. #include "llviewerwindow.h"
  47. #include "llviewercamera.h"
  48. #include "llglheaders.h"
  49. // Globals
  50. const S32 SLOP_RADIUS = 5;
  51. //
  52. // Member functions
  53. //
  54. LLToolSelectRect::LLToolSelectRect( LLToolComposite* composite )
  55. :
  56. LLToolSelect( composite ),
  57. mDragStartX(0),
  58. mDragStartY(0),
  59. mDragEndX(0),
  60. mDragEndY(0),
  61. mDragLastWidth(0),
  62. mDragLastHeight(0),
  63. mMouseOutsideSlop(FALSE)
  64. { }
  65. void dialog_refresh_all(void);
  66. BOOL LLToolSelectRect::handleMouseDown(S32 x, S32 y, MASK mask)
  67. {
  68. handlePick(gViewerWindow->pickImmediate(x, y, TRUE));
  69. LLTool::handleMouseDown(x, y, mask);
  70. return mPick.getObject().notNull();
  71. }
  72. void LLToolSelectRect::handlePick(const LLPickInfo& pick)
  73. {
  74. mPick = pick;
  75. // start dragging rectangle
  76. setMouseCapture( TRUE );
  77. mDragStartX = pick.mMousePt.mX;
  78. mDragStartY = pick.mMousePt.mY;
  79. mDragEndX = pick.mMousePt.mX;
  80. mDragEndY = pick.mMousePt.mY;
  81. mMouseOutsideSlop = FALSE;
  82. }
  83. BOOL LLToolSelectRect::handleMouseUp(S32 x, S32 y, MASK mask)
  84. {
  85. setMouseCapture( FALSE );
  86. if( mMouseOutsideSlop )
  87. {
  88. mDragLastWidth = 0;
  89. mDragLastHeight = 0;
  90. mMouseOutsideSlop = FALSE;
  91. if (mask == MASK_CONTROL)
  92. {
  93. LLSelectMgr::getInstance()->deselectHighlightedObjects();
  94. }
  95. else
  96. {
  97. LLSelectMgr::getInstance()->selectHighlightedObjects();
  98. }
  99. return TRUE;
  100. }
  101. else
  102. {
  103. return LLToolSelect::handleMouseUp(x, y, mask);
  104. }
  105. }
  106. BOOL LLToolSelectRect::handleHover(S32 x, S32 y, MASK mask)
  107. {
  108. if( hasMouseCapture() )
  109. {
  110. if (mMouseOutsideSlop || outsideSlop(x, y, mDragStartX, mDragStartY))
  111. {
  112. if (!mMouseOutsideSlop && !(mask & MASK_SHIFT) && !(mask & MASK_CONTROL))
  113. {
  114. // just started rect select, and not adding to current selection
  115. LLSelectMgr::getInstance()->deselectAll();
  116. }
  117. mMouseOutsideSlop = TRUE;
  118. mDragEndX = x;
  119. mDragEndY = y;
  120. handleRectangleSelection(x, y, mask);
  121. }
  122. else
  123. {
  124. return LLToolSelect::handleHover(x, y, mask);
  125. }
  126. lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolSelectRect (active)" << llendl;
  127. }
  128. else
  129. {
  130. lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolSelectRect (inactive)" << llendl;
  131. }
  132. gViewerWindow->setCursor(UI_CURSOR_ARROW);
  133. return TRUE;
  134. }
  135. void LLToolSelectRect::draw()
  136. {
  137. if( hasMouseCapture() && mMouseOutsideSlop)
  138. {
  139. if (gKeyboard->currentMask(TRUE) == MASK_CONTROL)
  140. {
  141. gGL.color4f(1.f, 0.f, 0.f, 1.f);
  142. }
  143. else
  144. {
  145. gGL.color4f(1.f, 1.f, 0.f, 1.f);
  146. }
  147. gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
  148. gl_rect_2d(
  149. llmin(mDragStartX, mDragEndX),
  150. llmax(mDragStartY, mDragEndY),
  151. llmax(mDragStartX, mDragEndX),
  152. llmin(mDragStartY, mDragEndY),
  153. FALSE);
  154. if (gKeyboard->currentMask(TRUE) == MASK_CONTROL)
  155. {
  156. gGL.color4f(1.f, 0.f, 0.f, 0.1f);
  157. }
  158. else
  159. {
  160. gGL.color4f(1.f, 1.f, 0.f, 0.1f);
  161. }
  162. gl_rect_2d(
  163. llmin(mDragStartX, mDragEndX),
  164. llmax(mDragStartY, mDragEndY),
  165. llmax(mDragStartX, mDragEndX),
  166. llmin(mDragStartY, mDragEndY));
  167. }
  168. }
  169. // true if x,y outside small box around start_x,start_y
  170. BOOL LLToolSelectRect::outsideSlop(S32 x, S32 y, S32 start_x, S32 start_y)
  171. {
  172. S32 dx = x - start_x;
  173. S32 dy = y - start_y;
  174. return (dx <= -SLOP_RADIUS || SLOP_RADIUS <= dx || dy <= -SLOP_RADIUS || SLOP_RADIUS <= dy);
  175. }
  176. //
  177. // Static functions
  178. //