lltoolselect.cpp

Go to the documentation of this file.
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 // Globals
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 // True if you selected an object.
00065 BOOL LLToolSelect::handleMouseDown(S32 x, S32 y, MASK mask)
00066 {
00067         BOOL handled = FALSE;
00068 
00069         // didn't click in any UI object, so must have clicked in the world
00070         LLViewerObject* object = NULL;
00071 
00072         // You must hit the body for this tool to think you hit the object.
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         // Pass mousedown to agent
00086         LLTool::handleMouseDown(x, y, mask);
00087 
00088         return handled;
00089 }
00090 
00091 BOOL LLToolSelect::handleDoubleClick(S32 x, S32 y, MASK mask)
00092 {
00093         //RN: double click to toggle individual/linked picking???
00094         return LLTool::handleDoubleClick(x, y, mask);
00095 }
00096 
00097 // static
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         // *NOTE: These settings must be cleaned up at bottom of function.
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         // If no object, check for icon, then just deselect
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                         // Save the current zoom values because deselect resets them.
00157                         F32 target_zoom;
00158                         F32 current_zoom;
00159                         LLSelectMgr::getInstance()->getAgentHUDZoom(target_zoom, current_zoom);
00160 
00161                         // JC - Change behavior to make it easier to select children
00162                         // of linked sets. 9/3/2002
00163                         if( !already_selected || ignore_group)
00164                         {
00165                                 // ...lose current selection in favor of just this object
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                         // restore the zoom to the previously stored values.
00179                         LLSelectMgr::getInstance()->setAgentHUDZoom(target_zoom, current_zoom);
00180                 }
00181 
00182                 if (!gAgent.getFocusOnAvatar() &&                                                                               // if camera not glued to avatar
00183                         LLVOAvatar::findAvatarFromAttachment(object) != gAgent.getAvatarObject() &&     // and it's not one of your attachments
00184                         object != gAgent.getAvatarObject())                                                                     // and it's not you
00185                 {
00186                         // have avatar turn to face the selected object(s)
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                                 // this is just a temporary selection
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                 } //if(temp_select)
00226         } //if(!object)
00227 
00228         // Cleanup temp select settings above.
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 );  // Calls onMouseCaptureLost() indirectly
00254         }
00255 }
00256 
00257 
00258 void LLToolSelect::stopEditing()
00259 {
00260         if(     hasMouseCapture() )
00261         {
00262                 setMouseCapture( FALSE );  // Calls onMouseCaptureLost() indirectly
00263         }
00264 }
00265 
00266 void LLToolSelect::onMouseCaptureLost()
00267 {
00268         // Finish drag
00269 
00270         LLSelectMgr::getInstance()->enableSilhouette(TRUE);
00271 
00272         // Clean up drag-specific variables
00273         mIgnoreGroup = FALSE;
00274 }
00275 
00276 
00277 

Generated on Fri May 16 08:34:08 2008 for SecondLife by  doxygen 1.5.5