00001
00032 #include "llviewerprecompiledheaders.h"
00033
00034 #include "lltoolselect.h"
00035
00036 #include "llagent.h"
00037 #include "llviewercontrol.h"
00038 #include "lldrawable.h"
00039 #include "llmanip.h"
00040 #include "llmenugl.h"
00041 #include "llselectmgr.h"
00042 #include "lltoolmgr.h"
00043 #include "llfloaterscriptdebug.h"
00044 #include "llviewercamera.h"
00045 #include "llviewermenu.h"
00046 #include "llviewerobject.h"
00047 #include "llviewerobjectlist.h"
00048 #include "llviewerregion.h"
00049 #include "llviewerwindow.h"
00050 #include "llvoavatar.h"
00051 #include "llworld.h"
00052
00053
00054 extern BOOL gAllowSelectAvatar;
00055
00056 const F32 SELECTION_ROTATION_TRESHOLD = 0.1f;
00057
00058 LLToolSelect::LLToolSelect( LLToolComposite* composite )
00059 : LLTool( "Select", composite ),
00060 mIgnoreGroup( FALSE )
00061 {
00062 }
00063
00064
00065 BOOL LLToolSelect::handleMouseDown(S32 x, S32 y, MASK mask)
00066 {
00067 BOOL handled = FALSE;
00068
00069
00070 LLViewerObject* object = NULL;
00071
00072
00073 object = gObjectList.findObject( gLastHitObjectID );
00074
00075 if (object)
00076 {
00077 mSelectObjectID = object->getID();
00078 handled = TRUE;
00079 }
00080 else
00081 {
00082 mSelectObjectID.setNull();
00083 }
00084
00085
00086 LLTool::handleMouseDown(x, y, mask);
00087
00088 return handled;
00089 }
00090
00091 BOOL LLToolSelect::handleDoubleClick(S32 x, S32 y, MASK mask)
00092 {
00093
00094 return LLTool::handleDoubleClick(x, y, mask);
00095 }
00096
00097
00098 LLSafeHandle<LLObjectSelection> LLToolSelect::handleObjectSelection(LLViewerObject *object, MASK mask, BOOL ignore_group, BOOL temp_select)
00099 {
00100 BOOL select_owned = gSavedSettings.getBOOL("SelectOwnedOnly");
00101 BOOL select_movable = gSavedSettings.getBOOL("SelectMovableOnly");
00102
00103
00104 if (temp_select || gAllowSelectAvatar)
00105 {
00106 gSavedSettings.setBOOL("SelectOwnedOnly", FALSE);
00107 gSavedSettings.setBOOL("SelectMovableOnly", FALSE);
00108 LLSelectMgr::getInstance()->setForceSelection(TRUE);
00109 }
00110
00111 BOOL extend_select = (mask == MASK_SHIFT) || (mask == MASK_CONTROL);
00112
00113
00114 if (!object)
00115 {
00116 if (gLastHitHUDIcon && gLastHitHUDIcon->getSourceObject())
00117 {
00118 LLFloaterScriptDebug::show(gLastHitHUDIcon->getSourceObject()->getID());
00119 }
00120 else if (!extend_select)
00121 {
00122 LLSelectMgr::getInstance()->deselectAll();
00123 }
00124 }
00125 else
00126 {
00127 BOOL already_selected = object->isSelected();
00128
00129 if ( extend_select )
00130 {
00131 if ( already_selected )
00132 {
00133 if ( ignore_group )
00134 {
00135 LLSelectMgr::getInstance()->deselectObjectOnly(object);
00136 }
00137 else
00138 {
00139 LLSelectMgr::getInstance()->deselectObjectAndFamily(object, TRUE, TRUE);
00140 }
00141 }
00142 else
00143 {
00144 if ( ignore_group )
00145 {
00146 LLSelectMgr::getInstance()->selectObjectOnly(object, SELECT_ALL_TES);
00147 }
00148 else
00149 {
00150 LLSelectMgr::getInstance()->selectObjectAndFamily(object);
00151 }
00152 }
00153 }
00154 else
00155 {
00156
00157 F32 target_zoom;
00158 F32 current_zoom;
00159 LLSelectMgr::getInstance()->getAgentHUDZoom(target_zoom, current_zoom);
00160
00161
00162
00163 if( !already_selected || ignore_group)
00164 {
00165
00166 LLSelectMgr::getInstance()->deselectAll();
00167 }
00168
00169 if ( ignore_group )
00170 {
00171 LLSelectMgr::getInstance()->selectObjectOnly(object, SELECT_ALL_TES);
00172 }
00173 else
00174 {
00175 LLSelectMgr::getInstance()->selectObjectAndFamily(object);
00176 }
00177
00178
00179 LLSelectMgr::getInstance()->setAgentHUDZoom(target_zoom, current_zoom);
00180 }
00181
00182 if (!gAgent.getFocusOnAvatar() &&
00183 LLVOAvatar::findAvatarFromAttachment(object) != gAgent.getAvatarObject() &&
00184 object != gAgent.getAvatarObject())
00185 {
00186
00187 LLVector3d selection_center = LLSelectMgr::getInstance()->getSelectionCenterGlobal();
00188 selection_center = selection_center - gAgent.getPositionGlobal();
00189 LLVector3 selection_dir;
00190 selection_dir.setVec(selection_center);
00191 selection_dir.mV[VZ] = 0.f;
00192 selection_dir.normVec();
00193 if (!object->isAvatar() && gAgent.getAtAxis() * selection_dir < 0.6f)
00194 {
00195 LLQuaternion target_rot;
00196 target_rot.shortestArc(LLVector3::x_axis, selection_dir);
00197 gAgent.startAutoPilotGlobal(gAgent.getPositionGlobal(), "", &target_rot, NULL, NULL, 1.f, SELECTION_ROTATION_TRESHOLD);
00198 }
00199 }
00200
00201 if (temp_select)
00202 {
00203 if (!already_selected)
00204 {
00205 LLViewerObject* root_object = (LLViewerObject*)object->getRootEdit();
00206 LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
00207
00208
00209 LLSelectNode* select_node = selection->findNode(root_object);
00210 if (select_node)
00211 {
00212 select_node->setTransient(TRUE);
00213 }
00214
00215 for (S32 i = 0; i < (S32)root_object->mChildList.size(); i++)
00216 {
00217 select_node = selection->findNode(root_object->mChildList[i]);
00218 if (select_node)
00219 {
00220 select_node->setTransient(TRUE);
00221 }
00222 }
00223
00224 }
00225 }
00226 }
00227
00228
00229 if (temp_select || gAllowSelectAvatar)
00230 {
00231 gSavedSettings.setBOOL("SelectOwnedOnly", select_owned);
00232 gSavedSettings.setBOOL("SelectMovableOnly", select_movable);
00233 LLSelectMgr::getInstance()->setForceSelection(FALSE);
00234 }
00235
00236 return LLSelectMgr::getInstance()->getSelection();
00237 }
00238
00239 BOOL LLToolSelect::handleMouseUp(S32 x, S32 y, MASK mask)
00240 {
00241 mIgnoreGroup = gSavedSettings.getBOOL("EditLinkedParts");
00242
00243 LLViewerObject* object = gObjectList.findObject(mSelectObjectID);
00244 LLToolSelect::handleObjectSelection(object, mask, mIgnoreGroup, FALSE);
00245
00246 return LLTool::handleMouseUp(x, y, mask);
00247 }
00248
00249 void LLToolSelect::handleDeselect()
00250 {
00251 if( hasMouseCapture() )
00252 {
00253 setMouseCapture( FALSE );
00254 }
00255 }
00256
00257
00258 void LLToolSelect::stopEditing()
00259 {
00260 if( hasMouseCapture() )
00261 {
00262 setMouseCapture( FALSE );
00263 }
00264 }
00265
00266 void LLToolSelect::onMouseCaptureLost()
00267 {
00268
00269
00270 LLSelectMgr::getInstance()->enableSilhouette(TRUE);
00271
00272
00273 mIgnoreGroup = FALSE;
00274 }
00275
00276
00277