aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/linden/indra/newview/llselectmgr.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--linden/indra/newview/llselectmgr.cpp1715
1 files changed, 765 insertions, 950 deletions
diff --git a/linden/indra/newview/llselectmgr.cpp b/linden/indra/newview/llselectmgr.cpp
index 9b13441..4e0cb17 100644
--- a/linden/indra/newview/llselectmgr.cpp
+++ b/linden/indra/newview/llselectmgr.cpp
@@ -122,6 +122,10 @@ LLColor4 LLSelectMgr::sHighlightParentColor;
122LLColor4 LLSelectMgr::sHighlightChildColor; 122LLColor4 LLSelectMgr::sHighlightChildColor;
123LLColor4 LLSelectMgr::sContextSilhouetteColor; 123LLColor4 LLSelectMgr::sContextSilhouetteColor;
124 124
125static LLObjectSelection* get_null_object_selection();
126template<>
127 const LLHandle<LLObjectSelection>::NullFunc
128 LLHandle<LLObjectSelection>::sNullFunc = get_null_object_selection;
125 129
126//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 130//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
127// struct LLDeRezInfo 131// struct LLDeRezInfo
@@ -146,6 +150,13 @@ struct LLDeRezInfo
146// Functions 150// Functions
147// 151//
148 152
153LLObjectSelection* get_null_object_selection()
154{
155 static LLObjectSelectionHandle null_ptr(new LLObjectSelection());
156 return (LLObjectSelection*)null_ptr;
157}
158
159
149//----------------------------------------------------------------------------- 160//-----------------------------------------------------------------------------
150// LLSelectMgr() 161// LLSelectMgr()
151//----------------------------------------------------------------------------- 162//-----------------------------------------------------------------------------
@@ -177,7 +188,9 @@ LLSelectMgr::LLSelectMgr()
177 gSavedSettings.setS32("GridMode", (S32)GRID_MODE_WORLD); 188 gSavedSettings.setS32("GridMode", (S32)GRID_MODE_WORLD);
178 mGridValid = FALSE; 189 mGridValid = FALSE;
179 190
180 mSelectType = SELECT_TYPE_WORLD; 191 mSelectedObjects = new LLObjectSelection();
192 mHoverObjects = new LLObjectSelection();
193 mHighlightedObjects = new LLObjectSelection();
181} 194}
182 195
183 196
@@ -186,78 +199,72 @@ LLSelectMgr::LLSelectMgr()
186//----------------------------------------------------------------------------- 199//-----------------------------------------------------------------------------
187LLSelectMgr::~LLSelectMgr() 200LLSelectMgr::~LLSelectMgr()
188{ 201{
189 mHoverObjects.deleteAllNodes(); 202 mHoverObjects->deleteAllNodes();
190 mSelectedObjects.deleteAllNodes(); 203 mSelectedObjects->deleteAllNodes();
191 mHighlightedObjects.deleteAllNodes(); 204 mHighlightedObjects->deleteAllNodes();
192 mRectSelectedObjects.clear(); 205 mRectSelectedObjects.clear();
193 mGridObjects.deleteAllNodes(); 206 mGridObjects.deleteAllNodes();
194 mUndoQueue.clear();
195 mRedoQueue.clear();
196}
197
198bool LLSelectMgr::applyToObjects(LLSelectedObjectFunctor* func)
199{
200 bool result = true;
201 LLViewerObject* object;
202 for (object = getFirstObject(); object != NULL; object = getNextObject())
203 {
204 result = result && func->apply(object);
205 }
206 return result;
207}
208
209bool LLSelectMgr::applyToRootObjects(LLSelectedObjectFunctor* func)
210{
211 bool result = true;
212 LLViewerObject* object;
213 for (object = getFirstRootObject();
214 object != NULL;
215 object = getNextRootObject())
216 {
217 result = result && func->apply(object);
218 }
219 return result;
220} 207}
221 208
222bool LLSelectMgr::applyToNodes(LLSelectedNodeFunctor *func) 209void LLSelectMgr::updateEffects()
223{ 210{
224 bool result = true; 211 if (mEffectsTimer.getElapsedTimeF32() > 1.f)
225 LLSelectNode* node;
226 for (node = getFirstNode(); node != NULL; node = getNextNode())
227 { 212 {
228 result = result && func->apply(node); 213 mSelectedObjects->updateEffects();
214 mEffectsTimer.reset();
229 } 215 }
230 return result;
231} 216}
232 217
233void LLSelectMgr::updateEffects() 218void LLSelectMgr::overrideObjectUpdates()
234{ 219{
235 if (mEffectsTimer.getElapsedTimeF32() > 1.f) 220 //override any position updates from simulator on objects being edited
221 LLSelectNode* selectNode;
222 for (selectNode = gSelectMgr->getSelection()->getFirstNode();
223 selectNode != NULL;
224 selectNode = gSelectMgr->getSelection()->getNextNode())
236 { 225 {
237 mSelectedObjects.updateEffects(); 226 LLViewerObject* object = selectNode->getObject();
238 mEffectsTimer.reset(); 227
228 if (object->permMove())
229 {
230 if (!selectNode->mLastPositionLocal.isExactlyZero())
231 {
232 object->setPosition(selectNode->mLastPositionLocal);
233 }
234 if (selectNode->mLastRotation != LLQuaternion())
235 {
236 object->setRotation(selectNode->mLastRotation);
237 }
238 if (!selectNode->mLastScale.isExactlyZero())
239 {
240 object->setScale(selectNode->mLastScale);
241 }
242 }
239 } 243 }
240} 244}
241 245
242//----------------------------------------------------------------------------- 246//-----------------------------------------------------------------------------
243// Select just the object, not any other group members. 247// Select just the object, not any other group members.
244//----------------------------------------------------------------------------- 248//-----------------------------------------------------------------------------
245void LLSelectMgr::selectObjectOnly(LLViewerObject* object, S32 face) 249LLObjectSelectionHandle LLSelectMgr::selectObjectOnly(LLViewerObject* object, S32 face)
246{ 250{
247 llassert( object ); 251 llassert( object );
248 252
253 //remember primary object
254 mSelectedObjects->mPrimaryObject = object;
255
249 // Don't add an object that is already in the list 256 // Don't add an object that is already in the list
250 if (object->isSelected() ) { 257 if (object->isSelected() ) {
251 // make sure point at position is updated 258 // make sure point at position is updated
252 updatePointAt(); 259 updatePointAt();
253 gEditMenuHandler = this; 260 gEditMenuHandler = this;
254 return; 261 return NULL;
255 } 262 }
256 263
257 if (!canSelectObject(object)) 264 if (!canSelectObject(object))
258 { 265 {
259 //make_ui_sound("UISndInvalidOp"); 266 //make_ui_sound("UISndInvalidOp");
260 return; 267 return NULL;
261 } 268 }
262 269
263 // llinfos << "Adding object to selected object list" << llendl; 270 // llinfos << "Adding object to selected object list" << llendl;
@@ -291,19 +298,24 @@ void LLSelectMgr::selectObjectOnly(LLViewerObject* object, S32 face)
291 298
292 // have selection manager handle edit menu immediately after 299 // have selection manager handle edit menu immediately after
293 // user selects an object 300 // user selects an object
294 if (getObjectCount()) 301 if (mSelectedObjects->getObjectCount())
295 { 302 {
296 gEditMenuHandler = this; 303 gEditMenuHandler = this;
297 } 304 }
305
306 return mSelectedObjects;
298} 307}
299 308
300//----------------------------------------------------------------------------- 309//-----------------------------------------------------------------------------
301// Select the object, parents and children. 310// Select the object, parents and children.
302//----------------------------------------------------------------------------- 311//-----------------------------------------------------------------------------
303void LLSelectMgr::selectObjectAndFamily(LLViewerObject* obj, BOOL add_to_end) 312LLObjectSelectionHandle LLSelectMgr::selectObjectAndFamily(LLViewerObject* obj, BOOL add_to_end)
304{ 313{
305 llassert( obj ); 314 llassert( obj );
306 315
316 //remember primary object
317 mSelectedObjects->mPrimaryObject = obj;
318
307 // This may be incorrect if things weren't family selected before... - djs 07/08/02 319 // This may be incorrect if things weren't family selected before... - djs 07/08/02
308 // Don't add an object that is already in the list 320 // Don't add an object that is already in the list
309 if (obj->isSelected() ) 321 if (obj->isSelected() )
@@ -311,13 +323,13 @@ void LLSelectMgr::selectObjectAndFamily(LLViewerObject* obj, BOOL add_to_end)
311 // make sure pointat position is updated 323 // make sure pointat position is updated
312 updatePointAt(); 324 updatePointAt();
313 gEditMenuHandler = this; 325 gEditMenuHandler = this;
314 return; 326 return NULL;
315 } 327 }
316 328
317 if (!canSelectObject(obj)) 329 if (!canSelectObject(obj))
318 { 330 {
319 //make_ui_sound("UISndInvalidOp"); 331 //make_ui_sound("UISndInvalidOp");
320 return; 332 return NULL;
321 } 333 }
322 334
323 // Since we're selecting a family, start at the root, but 335 // Since we're selecting a family, start at the root, but
@@ -366,16 +378,18 @@ void LLSelectMgr::selectObjectAndFamily(LLViewerObject* obj, BOOL add_to_end)
366 378
367 // have selection manager handle edit menu immediately after 379 // have selection manager handle edit menu immediately after
368 // user selects an object 380 // user selects an object
369 if (getObjectCount()) 381 if (mSelectedObjects->getObjectCount())
370 { 382 {
371 gEditMenuHandler = this; 383 gEditMenuHandler = this;
372 } 384 }
385
386 return mSelectedObjects;
373} 387}
374 388
375//----------------------------------------------------------------------------- 389//-----------------------------------------------------------------------------
376// Select the object, parents and children. 390// Select the object, parents and children.
377//----------------------------------------------------------------------------- 391//-----------------------------------------------------------------------------
378void LLSelectMgr::selectObjectAndFamily(const LLDynamicArray<LLViewerObject*>& object_list, 392LLObjectSelectionHandle LLSelectMgr::selectObjectAndFamily(const LLDynamicArray<LLViewerObject*>& object_list,
379 BOOL send_to_sim) 393 BOOL send_to_sim)
380{ 394{
381 // Collect all of the objects, children included 395 // Collect all of the objects, children included
@@ -383,7 +397,10 @@ void LLSelectMgr::selectObjectAndFamily(const LLDynamicArray<LLViewerObject*>& o
383 LLViewerObject *object; 397 LLViewerObject *object;
384 S32 i; 398 S32 i;
385 399
386 if (object_list.count() < 1) return; 400 //clear primary object (no primary object)
401 mSelectedObjects->mPrimaryObject = NULL;
402
403 if (object_list.count() < 1) return NULL;
387 404
388 // NOTE -- we add the objects in REVERSE ORDER 405 // NOTE -- we add the objects in REVERSE ORDER
389 // to preserve the order in the mSelectedObjects list 406 // to preserve the order in the mSelectedObjects list
@@ -429,25 +446,25 @@ void LLSelectMgr::selectObjectAndFamily(const LLDynamicArray<LLViewerObject*>& o
429 446
430 // have selection manager handle edit menu immediately after 447 // have selection manager handle edit menu immediately after
431 // user selects an object 448 // user selects an object
432 if (getObjectCount()) 449 if (mSelectedObjects->getObjectCount())
433 { 450 {
434 gEditMenuHandler = this; 451 gEditMenuHandler = this;
435 } 452 }
453
454 return mSelectedObjects;
436} 455}
437 456
438// Use for when the simulator kills an object. This version also 457// Use for when the simulator kills an object. This version also
439// handles informing the current tool of the object's deletion. 458// handles informing the current tool of the object's deletion.
440// 459//
441// Caller needs to call dialog_refresh_all if necessary. 460// Caller needs to call dialog_refresh_all if necessary.
442BOOL LLSelectMgr::selectionRemoveObject(const LLUUID &id) 461BOOL LLSelectMgr::removeObjectFromSelections(const LLUUID &id)
443{ 462{
444
445
446 BOOL object_found = FALSE; 463 BOOL object_found = FALSE;
447 LLTool *tool = NULL; 464 LLTool *tool = NULL;
448 if (!gNoRender) 465 if (!gNoRender)
449 { 466 {
450 tool = gToolMgr->getCurrentTool( gKeyboard->currentMask(TRUE) ); 467 tool = gToolMgr->getCurrentTool();
451 468
452 // It's possible that the tool is editing an object that is not selected 469 // It's possible that the tool is editing an object that is not selected
453 LLViewerObject* tool_editing_object = tool->getEditingObject(); 470 LLViewerObject* tool_editing_object = tool->getEditingObject();
@@ -462,13 +479,13 @@ BOOL LLSelectMgr::selectionRemoveObject(const LLUUID &id)
462 if( !object_found ) 479 if( !object_found )
463 { 480 {
464 LLViewerObject* prevobjp = NULL; 481 LLViewerObject* prevobjp = NULL;
465 for( LLViewerObject* tobjp = getFirstObject(); tobjp != NULL; tobjp = getNextObject() ) 482 for( LLViewerObject* tobjp = mSelectedObjects->getFirstObject(); tobjp != NULL; tobjp = mSelectedObjects->getNextObject() )
466 { 483 {
467 if (tobjp == prevobjp) 484 if (tobjp == prevobjp)
468 { 485 {
469 // Somehow we got stuck in an infinite loop... (DaveP) 486 // Somehow we got stuck in an infinite loop... (DaveP)
470 // this logic is kind of twisted, not sure how this is happening, so... 487 // this logic is kind of twisted, not sure how this is happening, so...
471 llwarns << "Detected infinite loop #1 in LLSelectMgr::selectionRemoveObject:|" << llendl; 488 llwarns << "Detected infinite loop #1 in LLSelectMgr::removeObjectFromSelections:|" << llendl;
472 //MikeS. adding warning and comment... 489 //MikeS. adding warning and comment...
473 //These infinite loops happen because the LLSelectMgr iteration routines are non-reentrant. 490 //These infinite loops happen because the LLSelectMgr iteration routines are non-reentrant.
474 //deselectObjectAndFamily uses getFirstObject and getNextObject to mess with the array, 491 //deselectObjectAndFamily uses getFirstObject and getNextObject to mess with the array,
@@ -492,7 +509,7 @@ BOOL LLSelectMgr::selectionRemoveObject(const LLUUID &id)
492 if(object_found == TRUE){ 509 if(object_found == TRUE){
493 //MikeS. adding warning... This happens when removing a linked attachment while sitting on an object.. 510 //MikeS. adding warning... This happens when removing a linked attachment while sitting on an object..
494 //I think the selection manager needs to be rewritten. BAD. 511 //I think the selection manager needs to be rewritten. BAD.
495 llwarns << "Detected infinite loop #2 in LLSelectMgr::selectionRemoveObject:|" << llendl; 512 llwarns << "Detected infinite loop #2 in LLSelectMgr::removeObjectFromSelections:|" << llendl;
496 break; 513 break;
497 } 514 }
498 object_found = TRUE; 515 object_found = TRUE;
@@ -613,11 +630,11 @@ void LLSelectMgr::addAsFamily(LLDynamicArray<LLViewerObject*>& objects, BOOL add
613 nodep = new LLSelectNode(objectp, TRUE); 630 nodep = new LLSelectNode(objectp, TRUE);
614 if (add_to_end) 631 if (add_to_end)
615 { 632 {
616 mSelectedObjects.addNodeAtEnd(nodep); 633 mSelectedObjects->addNodeAtEnd(nodep);
617 } 634 }
618 else 635 else
619 { 636 {
620 mSelectedObjects.addNode(nodep); 637 mSelectedObjects->addNode(nodep);
621 } 638 }
622 objectp->setSelected(TRUE); 639 objectp->setSelected(TRUE);
623 640
@@ -634,7 +651,7 @@ void LLSelectMgr::addAsFamily(LLDynamicArray<LLViewerObject*>& objects, BOOL add
634 { 651 {
635 // we want this object to be selected for real 652 // we want this object to be selected for real
636 // so clear transient flag 653 // so clear transient flag
637 LLSelectNode* select_node = findSelectNode(objectp); 654 LLSelectNode* select_node = mSelectedObjects->findNode(objectp);
638 if (select_node) 655 if (select_node)
639 { 656 {
640 select_node->setTransient(FALSE); 657 select_node->setTransient(FALSE);
@@ -650,21 +667,21 @@ void LLSelectMgr::addAsFamily(LLDynamicArray<LLViewerObject*>& objects, BOOL add
650void LLSelectMgr::addAsIndividual(LLViewerObject *objectp, S32 face, BOOL undoable) 667void LLSelectMgr::addAsIndividual(LLViewerObject *objectp, S32 face, BOOL undoable)
651{ 668{
652 // check to see if object is already in list 669 // check to see if object is already in list
653 LLSelectNode *nodep = findSelectNode(objectp); 670 LLSelectNode *nodep = mSelectedObjects->findNode(objectp);
654 671
655 // if not in list, add it 672 // if not in list, add it
656 if (!nodep) 673 if (!nodep)
657 { 674 {
658 nodep = new LLSelectNode(objectp, TRUE); 675 nodep = new LLSelectNode(objectp, TRUE);
659 mSelectedObjects.addNode(nodep); 676 mSelectedObjects->addNode(nodep);
660 } 677 }
661 else 678 else
662 { 679 {
663 // make this a full-fledged selection 680 // make this a full-fledged selection
664 nodep->setTransient(FALSE); 681 nodep->setTransient(FALSE);
665 // Move it to the front of the list 682 // Move it to the front of the list
666 mSelectedObjects.removeNode(nodep); 683 mSelectedObjects->removeNode(nodep);
667 mSelectedObjects.addNode(nodep); 684 mSelectedObjects->addNode(nodep);
668 } 685 }
669 686
670 // Make sure the object is tagged as selected 687 // Make sure the object is tagged as selected
@@ -698,26 +715,26 @@ void LLSelectMgr::addAsIndividual(LLViewerObject *objectp, S32 face, BOOL undoab
698} 715}
699 716
700 717
701void LLSelectMgr::setHoverObject(LLViewerObject *objectp) 718LLObjectSelectionHandle LLSelectMgr::setHoverObject(LLViewerObject *objectp)
702{ 719{
703 // Always blitz hover list when setting 720 // Always blitz hover list when setting
704 mHoverObjects.deleteAllNodes(); 721 mHoverObjects->deleteAllNodes();
705 722
706 if (!objectp) 723 if (!objectp)
707 { 724 {
708 return; 725 return NULL;
709 } 726 }
710 727
711 // Can't select yourself 728 // Can't select yourself
712 if (objectp->mID == gAgentID) 729 if (objectp->mID == gAgentID)
713 { 730 {
714 return; 731 return NULL;
715 } 732 }
716 733
717 // Can't select land 734 // Can't select land
718 if (objectp->getPCode() == LLViewerObject::LL_VO_SURFACE_PATCH) 735 if (objectp->getPCode() == LLViewerObject::LL_VO_SURFACE_PATCH)
719 { 736 {
720 return; 737 return NULL;
721 } 738 }
722 739
723 // Collect all of the objects 740 // Collect all of the objects
@@ -733,15 +750,16 @@ void LLSelectMgr::setHoverObject(LLViewerObject *objectp)
733 { 750 {
734 cur_objectp = objects[i]; 751 cur_objectp = objects[i];
735 nodep = new LLSelectNode(cur_objectp, FALSE); 752 nodep = new LLSelectNode(cur_objectp, FALSE);
736 mHoverObjects.addNodeAtEnd(nodep); 753 mHoverObjects->addNodeAtEnd(nodep);
737 } 754 }
738 755
739 requestObjectPropertiesFamily(objectp); 756 requestObjectPropertiesFamily(objectp);
757 return mHoverObjects;
740} 758}
741 759
742LLSelectNode *LLSelectMgr::getHoverNode() 760LLSelectNode *LLSelectMgr::getHoverNode()
743{ 761{
744 return getHoverObjects().getFirstRootNode(); 762 return getHoverObjects()->getFirstRootNode();
745} 763}
746 764
747void LLSelectMgr::highlightObjectOnly(LLViewerObject* objectp) 765void LLSelectMgr::highlightObjectOnly(LLViewerObject* objectp)
@@ -842,20 +860,23 @@ void LLSelectMgr::unhighlightObjectAndFamily(LLViewerObject* objectp)
842void LLSelectMgr::unhighlightAll() 860void LLSelectMgr::unhighlightAll()
843{ 861{
844 mRectSelectedObjects.clear(); 862 mRectSelectedObjects.clear();
845 mHighlightedObjects.deleteAllNodes(); 863 mHighlightedObjects->deleteAllNodes();
846} 864}
847 865
848void LLSelectMgr::selectHighlightedObjects() 866LLObjectSelectionHandle LLSelectMgr::selectHighlightedObjects()
849{ 867{
850 if (!mHighlightedObjects.getNumNodes()) 868 if (!mHighlightedObjects->getNumNodes())
851 { 869 {
852 return; 870 return NULL;
853 } 871 }
854 872
873 //clear primary object
874 mSelectedObjects->mPrimaryObject = NULL;
875
855 LLSelectNode *nodep; 876 LLSelectNode *nodep;
856 for (nodep = mHighlightedObjects.getFirstNode(); 877 for (nodep = mHighlightedObjects->getFirstNode();
857 nodep; 878 nodep;
858 nodep = mHighlightedObjects.getNextNode()) 879 nodep = mHighlightedObjects->getNextNode())
859 { 880 {
860 LLViewerObject* objectp = nodep->getObject(); 881 LLViewerObject* objectp = nodep->getObject();
861 882
@@ -871,12 +892,12 @@ void LLSelectMgr::selectHighlightedObjects()
871 } 892 }
872 893
873 LLSelectNode* new_nodep = new LLSelectNode(*nodep); 894 LLSelectNode* new_nodep = new LLSelectNode(*nodep);
874 mSelectedObjects.addNode(new_nodep); 895 mSelectedObjects->addNode(new_nodep);
875 896
876 // flag this object as selected 897 // flag this object as selected
877 objectp->setSelected(TRUE); 898 objectp->setSelected(TRUE);
878 899
879 mSelectType = getSelectTypeForObject(objectp); 900 mSelectedObjects->mSelectType = getSelectTypeForObject(objectp);
880 901
881 // request properties on root objects 902 // request properties on root objects
882 if (objectp->isRootEdit()) 903 if (objectp->isRootEdit())
@@ -892,10 +913,12 @@ void LLSelectMgr::selectHighlightedObjects()
892 saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK); 913 saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK);
893 updatePointAt(); 914 updatePointAt();
894 915
895 if (getObjectCount()) 916 if (mSelectedObjects->getObjectCount())
896 { 917 {
897 gEditMenuHandler = this; 918 gEditMenuHandler = this;
898 } 919 }
920
921 return mSelectedObjects;
899} 922}
900 923
901void LLSelectMgr::deselectHighlightedObjects() 924void LLSelectMgr::deselectHighlightedObjects()
@@ -957,7 +980,7 @@ void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 &
957 grid_object = NULL; 980 grid_object = NULL;
958 } 981 }
959 982
960 if (mGridMode == GRID_MODE_LOCAL && gSelectMgr->getObjectCount()) 983 if (mGridMode == GRID_MODE_LOCAL && mSelectedObjects->getObjectCount())
961 { 984 {
962 LLBBox bbox = mSavedSelectionBBox; 985 LLBBox bbox = mSavedSelectionBBox;
963 mGridOrigin = mSavedSelectionBBox.getCenterAgent(); 986 mGridOrigin = mSavedSelectionBBox.getCenterAgent();
@@ -1011,18 +1034,18 @@ void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 &
1011 } 1034 }
1012 else // GRID_MODE_WORLD or just plain default 1035 else // GRID_MODE_WORLD or just plain default
1013 { 1036 {
1014 LLViewerObject* first_object = gSelectMgr->getFirstRootObject(); 1037 LLViewerObject* first_object = mSelectedObjects->getFirstRootObject();
1015 if (!first_object) 1038 if (!first_object)
1016 { 1039 {
1017 first_object = gSelectMgr->getFirstObject(); 1040 first_object = mSelectedObjects->getFirstObject();
1018 } 1041 }
1019 1042
1020 mGridOrigin.clearVec(); 1043 mGridOrigin.clearVec();
1021 mGridRotation.loadIdentity(); 1044 mGridRotation.loadIdentity();
1022 1045
1023 mSelectType = getSelectTypeForObject( first_object ); 1046 mSelectedObjects->mSelectType = getSelectTypeForObject( first_object );
1024 1047
1025 switch (mSelectType) 1048 switch (mSelectedObjects->mSelectType)
1026 { 1049 {
1027 case SELECT_TYPE_ATTACHMENT: 1050 case SELECT_TYPE_ATTACHMENT:
1028 if (first_object) 1051 if (first_object)
@@ -1051,59 +1074,6 @@ void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 &
1051 mGridValid = TRUE; 1074 mGridValid = TRUE;
1052} 1075}
1053 1076
1054
1055
1056LLSelectNode* LLSelectMgr::findSelectNode(LLViewerObject *object)
1057{
1058 return mSelectedObjects.findNode(object);
1059}
1060
1061//-----------------------------------------------------------------------------
1062// contains()
1063//-----------------------------------------------------------------------------
1064BOOL LLSelectMgr::contains(LLViewerObject* object)
1065{
1066 return mSelectedObjects.findNode(object) != NULL;
1067}
1068
1069
1070//-----------------------------------------------------------------------------
1071// contains()
1072//-----------------------------------------------------------------------------
1073BOOL LLSelectMgr::contains(LLViewerObject* object, S32 te)
1074{
1075 LLSelectNode *nodep;
1076 if (te == SELECT_ALL_TES)
1077 {
1078 // ...all faces
1079 for (nodep = mSelectedObjects.getFirstNode(); nodep; nodep = mSelectedObjects.getNextNode() )
1080 {
1081 if (nodep->getObject() == object)
1082 {
1083 BOOL all_selected = TRUE;
1084 for (S32 i = 0; i < SELECT_MAX_TES; i++)
1085 {
1086 all_selected = all_selected && nodep->isTESelected(i);
1087 }
1088 return all_selected;
1089 }
1090 }
1091 return FALSE;
1092 }
1093 else
1094 {
1095 // ...one face
1096 for (nodep = mSelectedObjects.getFirstNode(); nodep; nodep = mSelectedObjects.getNextNode() )
1097 {
1098 if (nodep->getObject() == object && nodep->isTESelected(te))
1099 {
1100 return TRUE;
1101 }
1102 }
1103 return FALSE;
1104 }
1105}
1106
1107//----------------------------------------------------------------------------- 1077//-----------------------------------------------------------------------------
1108// remove() - an array of objects 1078// remove() - an array of objects
1109//----------------------------------------------------------------------------- 1079//-----------------------------------------------------------------------------
@@ -1116,14 +1086,14 @@ void LLSelectMgr::remove(LLDynamicArray<LLViewerObject*>& objects)
1116 for(S32 i = 0; i < count; i++) 1086 for(S32 i = 0; i < count; i++)
1117 { 1087 {
1118 objectp = objects.get(i); 1088 objectp = objects.get(i);
1119 for(nodep = mSelectedObjects.getFirstNode(); 1089 for(nodep = mSelectedObjects->getFirstNode();
1120 nodep != NULL; 1090 nodep != NULL;
1121 nodep = mSelectedObjects.getNextNode()) 1091 nodep = mSelectedObjects->getNextNode())
1122 { 1092 {
1123 if(nodep->getObject() == objectp) 1093 if(nodep->getObject() == objectp)
1124 { 1094 {
1125 objectp->setSelected(FALSE); 1095 objectp->setSelected(FALSE);
1126 mSelectedObjects.removeNode(nodep); 1096 mSelectedObjects->removeNode(nodep);
1127 break; 1097 break;
1128 } 1098 }
1129 } 1099 }
@@ -1140,7 +1110,7 @@ void LLSelectMgr::remove(LLViewerObject *objectp, S32 te, BOOL undoable)
1140{ 1110{
1141 // check if object already in list 1111 // check if object already in list
1142 // *FIX: can we just check isSelected()? 1112 // *FIX: can we just check isSelected()?
1143 LLSelectNode *nodep = findSelectNode(objectp); 1113 LLSelectNode *nodep = mSelectedObjects->findNode(objectp);
1144 1114
1145 if (!nodep) 1115 if (!nodep)
1146 { 1116 {
@@ -1152,12 +1122,12 @@ void LLSelectMgr::remove(LLViewerObject *objectp, S32 te, BOOL undoable)
1152 if (objectp->getNumTEs() <= 0) 1122 if (objectp->getNumTEs() <= 0)
1153 { 1123 {
1154 // object doesn't have faces, so blow it away 1124 // object doesn't have faces, so blow it away
1155 mSelectedObjects.removeNode(nodep); 1125 mSelectedObjects->removeNode(nodep);
1156 objectp->setSelected( FALSE ); 1126 objectp->setSelected( FALSE );
1157 } 1127 }
1158 else if (te == SELECT_ALL_TES) 1128 else if (te == SELECT_ALL_TES)
1159 { 1129 {
1160 mSelectedObjects.removeNode(nodep); 1130 mSelectedObjects->removeNode(nodep);
1161 objectp->setSelected( FALSE ); 1131 objectp->setSelected( FALSE );
1162 } 1132 }
1163 else if (0 <= te && te < SELECT_MAX_TES) 1133 else if (0 <= te && te < SELECT_MAX_TES)
@@ -1183,7 +1153,7 @@ void LLSelectMgr::remove(LLViewerObject *objectp, S32 te, BOOL undoable)
1183 // ...all faces now turned off, so remove 1153 // ...all faces now turned off, so remove
1184 if (!found) 1154 if (!found)
1185 { 1155 {
1186 mSelectedObjects.removeNode(nodep); 1156 mSelectedObjects->removeNode(nodep);
1187 objectp->setSelected( FALSE ); 1157 objectp->setSelected( FALSE );
1188 1158
1189 // BUG: Doesn't update simulator that object is gone. 1159 // BUG: Doesn't update simulator that object is gone.
@@ -1206,12 +1176,12 @@ void LLSelectMgr::remove(LLViewerObject *objectp, S32 te, BOOL undoable)
1206void LLSelectMgr::removeAll() 1176void LLSelectMgr::removeAll()
1207{ 1177{
1208 LLViewerObject *objectp; 1178 LLViewerObject *objectp;
1209 for (objectp = mSelectedObjects.getFirstObject(); objectp; objectp = mSelectedObjects.getNextObject() ) 1179 for (objectp = mSelectedObjects->getFirstObject(); objectp; objectp = mSelectedObjects->getNextObject() )
1210 { 1180 {
1211 objectp->setSelected( FALSE ); 1181 objectp->setSelected( FALSE );
1212 } 1182 }
1213 1183
1214 mSelectedObjects.deleteAllNodes(); 1184 mSelectedObjects->deleteAllNodes();
1215 1185
1216 updateSelectionCenter(); 1186 updateSelectionCenter();
1217 dialog_refresh_all(); 1187 dialog_refresh_all();
@@ -1228,9 +1198,9 @@ void LLSelectMgr::promoteSelectionToRoot()
1228 1198
1229 LLSelectNode* nodep; 1199 LLSelectNode* nodep;
1230 LLViewerObject *objectp; 1200 LLViewerObject *objectp;
1231 for (nodep = mSelectedObjects.getFirstNode(); 1201 for (nodep = mSelectedObjects->getFirstNode();
1232 nodep; 1202 nodep;
1233 nodep = mSelectedObjects.getNextNode() ) 1203 nodep = mSelectedObjects->getNextNode() )
1234 { 1204 {
1235 if (nodep->mIndividualSelection) 1205 if (nodep->mIndividualSelection)
1236 { 1206 {
@@ -1266,9 +1236,9 @@ void LLSelectMgr::demoteSelectionToIndividuals()
1266{ 1236{
1267 LLDynamicArray<LLViewerObject*> objects; 1237 LLDynamicArray<LLViewerObject*> objects;
1268 1238
1269 for (LLViewerObject* root_objectp = mSelectedObjects.getFirstRootObject(); 1239 for (LLViewerObject* root_objectp = mSelectedObjects->getFirstRootObject();
1270 root_objectp; 1240 root_objectp;
1271 root_objectp = mSelectedObjects.getNextRootObject()) 1241 root_objectp = mSelectedObjects->getNextRootObject())
1272 { 1242 {
1273 root_objectp->addThisAndNonJointChildren(objects); 1243 root_objectp->addThisAndNonJointChildren(objects);
1274 } 1244 }
@@ -1284,71 +1254,20 @@ void LLSelectMgr::demoteSelectionToIndividuals()
1284} 1254}
1285 1255
1286//----------------------------------------------------------------------------- 1256//-----------------------------------------------------------------------------
1287// getObjectCount()
1288//-----------------------------------------------------------------------------
1289S32 LLSelectMgr::getObjectCount()
1290{
1291 return mSelectedObjects.getNumNodes();
1292}
1293
1294
1295//-----------------------------------------------------------------------------
1296// getTECount()
1297//-----------------------------------------------------------------------------
1298S32 LLSelectMgr::getTECount()
1299{
1300 S32 count = 0;
1301
1302 LLSelectNode* nodep;
1303 for (nodep = mSelectedObjects.getFirstNode(); nodep; nodep = mSelectedObjects.getNextNode() )
1304 {
1305 if (nodep->getObject())
1306 {
1307 S32 num_tes = nodep->getObject()->getNumTEs();
1308 for (S32 te = 0; te < num_tes; te++)
1309 {
1310 if (nodep->isTESelected(te))
1311 {
1312 count++;
1313 }
1314 }
1315 }
1316 }
1317
1318 return count;
1319}
1320
1321//-----------------------------------------------------------------------------
1322// getRootObjectCount()
1323//-----------------------------------------------------------------------------
1324S32 LLSelectMgr::getRootObjectCount()
1325{
1326 LLSelectNode *nodep;
1327
1328 S32 count = 0;
1329 for(nodep = mSelectedObjects.getFirstRootNode(); nodep; nodep = mSelectedObjects.getNextRootNode())
1330 {
1331 ++count;
1332 }
1333 return count;
1334}
1335
1336
1337//-----------------------------------------------------------------------------
1338// dump() 1257// dump()
1339//----------------------------------------------------------------------------- 1258//-----------------------------------------------------------------------------
1340void LLSelectMgr::dump() 1259void LLSelectMgr::dump()
1341{ 1260{
1342 llinfos << "Selection Manager: " << mSelectedObjects.getNumNodes() << " items" << llendl; 1261 llinfos << "Selection Manager: " << mSelectedObjects->getNumNodes() << " items" << llendl;
1343 1262
1344 llinfos << "TE mode " << mTEMode << llendl; 1263 llinfos << "TE mode " << mTEMode << llendl;
1345 1264
1346 S32 i = 0; 1265 S32 i = 0;
1347 1266
1348 LLViewerObject *objectp; 1267 LLViewerObject *objectp;
1349 for (objectp = mSelectedObjects.getFirstObject(); 1268 for (objectp = mSelectedObjects->getFirstObject();
1350 objectp; 1269 objectp;
1351 objectp = mSelectedObjects.getNextObject()) 1270 objectp = mSelectedObjects->getNextObject())
1352 { 1271 {
1353 llinfos << "Object " << i << " type " << LLPrimitive::pCodeToString(objectp->getPCode()) << llendl; 1272 llinfos << "Object " << i << " type " << LLPrimitive::pCodeToString(objectp->getPCode()) << llendl;
1354 llinfos << " hasLSL " << objectp->flagScripted() << llendl; 1273 llinfos << " hasLSL " << objectp->flagScripted() << llendl;
@@ -1366,14 +1285,14 @@ void LLSelectMgr::dump()
1366 1285
1367 // Face iterator 1286 // Face iterator
1368 S32 te; 1287 S32 te;
1369 for (mSelectedObjects.getFirstTE(&objectp, &te); 1288 for (mSelectedObjects->getFirstTE(&objectp, &te);
1370 objectp; 1289 objectp;
1371 mSelectedObjects.getNextTE(&objectp, &te)) 1290 mSelectedObjects->getNextTE(&objectp, &te))
1372 { 1291 {
1373 llinfos << "Object " << objectp << " te " << te << llendl; 1292 llinfos << "Object " << objectp << " te " << te << llendl;
1374 } 1293 }
1375 1294
1376 llinfos << mHighlightedObjects.getNumNodes() << " objects currently highlighted." << llendl; 1295 llinfos << mHighlightedObjects->getNumNodes() << " objects currently highlighted." << llendl;
1377 1296
1378 llinfos << "Center global " << mSelectionCenterGlobal << llendl; 1297 llinfos << "Center global " << mSelectionCenterGlobal << llendl;
1379} 1298}
@@ -1402,7 +1321,7 @@ void LLSelectMgr::selectionSetImage(const LLUUID& imageid)
1402 1321
1403 if(item 1322 if(item
1404 && !item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID()) 1323 && !item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID())
1405 && (mSelectedObjects.getNumNodes() > 1) ) 1324 && (mSelectedObjects->getNumNodes() > 1) )
1406 { 1325 {
1407 llwarns << "Attempted to apply no-copy texture to multiple objects" 1326 llwarns << "Attempted to apply no-copy texture to multiple objects"
1408 << llendl; 1327 << llendl;
@@ -1412,43 +1331,43 @@ void LLSelectMgr::selectionSetImage(const LLUUID& imageid)
1412 LLViewerObject* objectp; 1331 LLViewerObject* objectp;
1413 S32 te; 1332 S32 te;
1414 1333
1415 // Apply the texture to each side 1334 for (mSelectedObjects->getFirstTE(&objectp, &te); objectp; mSelectedObjects->getNextTE(&objectp, &te))
1416 for (mSelectedObjects.getFirstTE(&objectp, &te); objectp; mSelectedObjects.getNextTE(&objectp, &te))
1417 { 1335 {
1418
1419 if (item) 1336 if (item)
1420 { 1337 {
1421 LLToolDragAndDrop::dropTextureOneFace(objectp,te,item,LLToolDragAndDrop::SOURCE_AGENT,LLUUID::null); 1338 if (te == -1) // all faces
1422
1423 // HACK! HACK! ARG!
1424 // *TODO: Replace mSelectedObjects with a REAL container class!
1425 LLViewerObject* tmp_object;
1426 S32 tmp_te;
1427 mSelectedObjects.getCurrentTE(&tmp_object,&tmp_te);
1428 if ((tmp_object != objectp) || (tmp_te != te) )
1429 { 1339 {
1430 //AAARG someone has moved our list around! 1340 LLToolDragAndDrop::dropTextureAllFaces(objectp,
1431 mSelectedObjects.getFirstTE(&tmp_object, &tmp_te); 1341 item,
1432 while ((tmp_object != objectp) || (tmp_te != te)) 1342 LLToolDragAndDrop::SOURCE_AGENT,
1433 { 1343 LLUUID::null);
1434 mSelectedObjects.getNextTE(&tmp_object, &tmp_te); 1344 }
1435 } 1345 else // one face
1346 {
1347 LLToolDragAndDrop::dropTextureOneFace(objectp,
1348 te,
1349 item,
1350 LLToolDragAndDrop::SOURCE_AGENT,
1351 LLUUID::null);
1436 } 1352 }
1437 } 1353 }
1438 else 1354
1355 else // not an inventory item
1439 { 1356 {
1440 // Texture picker defaults aren't inventory items 1357 // Texture picker defaults aren't inventory items
1441 // * Don't need to worry about permissions for them 1358 // * Don't need to worry about permissions for them
1442 // * Can just apply the texture and be done with it. 1359 // * Can just apply the texture and be done with it.
1443 objectp->setTEImage(te, gImageList.getImage(imageid)); 1360 objectp->setTEImage(te, gImageList.getImage(imageid));
1361
1444 objectp->sendTEUpdate(); 1362 objectp->sendTEUpdate();
1445 } 1363 }
1446 } 1364 }
1447 1365
1366
1448 // 1 particle effect per object 1367 // 1 particle effect per object
1449 if (mSelectType != SELECT_TYPE_HUD) 1368 if (mSelectedObjects->mSelectType != SELECT_TYPE_HUD)
1450 { 1369 {
1451 for (objectp = mSelectedObjects.getFirstObject(); objectp; objectp = mSelectedObjects.getNextObject()) 1370 for (objectp = mSelectedObjects->getFirstObject(); objectp; objectp = mSelectedObjects->getNextObject())
1452 { 1371 {
1453 LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)gHUDManager->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE); 1372 LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)gHUDManager->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE);
1454 effectp->setSourceObject(gAgent.getAvatarObject()); 1373 effectp->setSourceObject(gAgent.getAvatarObject());
@@ -1466,7 +1385,7 @@ void LLSelectMgr::selectionSetColor(const LLColor4 &color)
1466{ 1385{
1467 LLViewerObject* object; 1386 LLViewerObject* object;
1468 S32 te; 1387 S32 te;
1469 for (mSelectedObjects.getFirstTE(&object, &te); object; mSelectedObjects.getNextTE(&object, &te) ) 1388 for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) )
1470 { 1389 {
1471 if (object->permModify()) 1390 if (object->permModify())
1472 { 1391 {
@@ -1475,7 +1394,7 @@ void LLSelectMgr::selectionSetColor(const LLColor4 &color)
1475 } 1394 }
1476 } 1395 }
1477 1396
1478 for ( object = mSelectedObjects.getFirstObject(); object; object = mSelectedObjects.getNextObject() ) 1397 for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
1479 { 1398 {
1480 if (object->permModify()) 1399 if (object->permModify())
1481 { 1400 {
@@ -1492,7 +1411,7 @@ void LLSelectMgr::selectionSetColorOnly(const LLColor4 &color)
1492 LLViewerObject* object; 1411 LLViewerObject* object;
1493 LLColor4 new_color = color; 1412 LLColor4 new_color = color;
1494 S32 te; 1413 S32 te;
1495 for (mSelectedObjects.getFirstTE(&object, &te); object; mSelectedObjects.getNextTE(&object, &te) ) 1414 for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) )
1496 { 1415 {
1497 if (object->permModify()) 1416 if (object->permModify())
1498 { 1417 {
@@ -1503,7 +1422,7 @@ void LLSelectMgr::selectionSetColorOnly(const LLColor4 &color)
1503 } 1422 }
1504 } 1423 }
1505 1424
1506 for ( object = mSelectedObjects.getFirstObject(); object; object = mSelectedObjects.getNextObject() ) 1425 for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
1507 { 1426 {
1508 if (object->permModify()) 1427 if (object->permModify())
1509 { 1428 {
@@ -1519,7 +1438,7 @@ void LLSelectMgr::selectionSetAlphaOnly(const F32 alpha)
1519{ 1438{
1520 LLViewerObject* object; 1439 LLViewerObject* object;
1521 S32 te; 1440 S32 te;
1522 for (mSelectedObjects.getFirstTE(&object, &te); object; mSelectedObjects.getNextTE(&object, &te) ) 1441 for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) )
1523 { 1442 {
1524 if (object->permModify()) 1443 if (object->permModify())
1525 { 1444 {
@@ -1530,7 +1449,7 @@ void LLSelectMgr::selectionSetAlphaOnly(const F32 alpha)
1530 } 1449 }
1531 } 1450 }
1532 1451
1533 for ( object = mSelectedObjects.getFirstObject(); object; object = mSelectedObjects.getNextObject() ) 1452 for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
1534 { 1453 {
1535 if (object->permModify()) 1454 if (object->permModify())
1536 { 1455 {
@@ -1544,11 +1463,11 @@ void LLSelectMgr::selectionRevertColors()
1544 LLViewerObject* object; 1463 LLViewerObject* object;
1545 S32 te; 1464 S32 te;
1546 1465
1547 for (mSelectedObjects.getFirstTE(&object, &te); object; mSelectedObjects.getNextTE(&object, &te) ) 1466 for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) )
1548 { 1467 {
1549 if (object->permModify()) 1468 if (object->permModify())
1550 { 1469 {
1551 LLSelectNode* nodep = mSelectedObjects.findNode(object); 1470 LLSelectNode* nodep = mSelectedObjects->findNode(object);
1552 if (nodep && te < (S32)nodep->mSavedColors.size()) 1471 if (nodep && te < (S32)nodep->mSavedColors.size())
1553 { 1472 {
1554 LLColor4 color = nodep->mSavedColors[te]; 1473 LLColor4 color = nodep->mSavedColors[te];
@@ -1558,7 +1477,7 @@ void LLSelectMgr::selectionRevertColors()
1558 } 1477 }
1559 } 1478 }
1560 1479
1561 for ( object = mSelectedObjects.getFirstObject(); object; object = mSelectedObjects.getNextObject() ) 1480 for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
1562 { 1481 {
1563 if (object->permModify()) 1482 if (object->permModify())
1564 { 1483 {
@@ -1573,11 +1492,11 @@ BOOL LLSelectMgr::selectionRevertTextures()
1573 S32 te; 1492 S32 te;
1574 1493
1575 BOOL revert_successful = TRUE; 1494 BOOL revert_successful = TRUE;
1576 for (mSelectedObjects.getFirstTE(&object, &te); object; mSelectedObjects.getNextTE(&object, &te) ) 1495 for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) )
1577 { 1496 {
1578 if (object->permModify()) 1497 if (object->permModify())
1579 { 1498 {
1580 LLSelectNode* nodep = mSelectedObjects.findNode(object); 1499 LLSelectNode* nodep = mSelectedObjects->findNode(object);
1581 if (nodep && te < (S32)nodep->mSavedTextures.size()) 1500 if (nodep && te < (S32)nodep->mSavedTextures.size())
1582 { 1501 {
1583 LLUUID id = nodep->mSavedTextures[te]; 1502 LLUUID id = nodep->mSavedTextures[te];
@@ -1596,7 +1515,7 @@ BOOL LLSelectMgr::selectionRevertTextures()
1596 } 1515 }
1597 1516
1598 // propagate texture changes to server 1517 // propagate texture changes to server
1599 for ( object = mSelectedObjects.getFirstObject(); object; object = mSelectedObjects.getNextObject() ) 1518 for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
1600 { 1519 {
1601 if (object->permModify()) 1520 if (object->permModify())
1602 { 1521 {
@@ -1611,7 +1530,7 @@ void LLSelectMgr::selectionSetBumpmap(U8 bumpmap)
1611{ 1530{
1612 LLViewerObject* object; 1531 LLViewerObject* object;
1613 S32 te; 1532 S32 te;
1614 for (mSelectedObjects.getFirstTE(&object, &te); object; mSelectedObjects.getNextTE(&object, &te) ) 1533 for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) )
1615 { 1534 {
1616 if (object->permModify()) 1535 if (object->permModify())
1617 { 1536 {
@@ -1620,7 +1539,7 @@ void LLSelectMgr::selectionSetBumpmap(U8 bumpmap)
1620 } 1539 }
1621 } 1540 }
1622 1541
1623 for ( object = mSelectedObjects.getFirstObject(); object; object = mSelectedObjects.getNextObject() ) 1542 for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
1624 { 1543 {
1625 if (object->permModify()) 1544 if (object->permModify())
1626 { 1545 {
@@ -1633,7 +1552,7 @@ void LLSelectMgr::selectionSetTexGen(U8 texgen)
1633{ 1552{
1634 LLViewerObject* object; 1553 LLViewerObject* object;
1635 S32 te; 1554 S32 te;
1636 for (mSelectedObjects.getFirstTE(&object, &te); object; mSelectedObjects.getNextTE(&object, &te) ) 1555 for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) )
1637 { 1556 {
1638 if (object->permModify()) 1557 if (object->permModify())
1639 { 1558 {
@@ -1642,7 +1561,7 @@ void LLSelectMgr::selectionSetTexGen(U8 texgen)
1642 } 1561 }
1643 } 1562 }
1644 1563
1645 for ( object = mSelectedObjects.getFirstObject(); object; object = mSelectedObjects.getNextObject() ) 1564 for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
1646 { 1565 {
1647 if (object->permModify()) 1566 if (object->permModify())
1648 { 1567 {
@@ -1656,7 +1575,7 @@ void LLSelectMgr::selectionSetShiny(U8 shiny)
1656{ 1575{
1657 LLViewerObject* object; 1576 LLViewerObject* object;
1658 S32 te; 1577 S32 te;
1659 for (mSelectedObjects.getFirstTE(&object, &te); object; mSelectedObjects.getNextTE(&object, &te) ) 1578 for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) )
1660 { 1579 {
1661 if (object->permModify()) 1580 if (object->permModify())
1662 { 1581 {
@@ -1665,7 +1584,7 @@ void LLSelectMgr::selectionSetShiny(U8 shiny)
1665 } 1584 }
1666 } 1585 }
1667 1586
1668 for ( object = mSelectedObjects.getFirstObject(); object; object = mSelectedObjects.getNextObject() ) 1587 for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
1669 { 1588 {
1670 if (object->permModify()) 1589 if (object->permModify())
1671 { 1590 {
@@ -1678,7 +1597,7 @@ void LLSelectMgr::selectionSetFullbright(U8 fullbright)
1678{ 1597{
1679 LLViewerObject* object; 1598 LLViewerObject* object;
1680 S32 te; 1599 S32 te;
1681 for (mSelectedObjects.getFirstTE(&object, &te); object; mSelectedObjects.getNextTE(&object, &te) ) 1600 for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) )
1682 { 1601 {
1683 if (object->permModify()) 1602 if (object->permModify())
1684 { 1603 {
@@ -1687,7 +1606,7 @@ void LLSelectMgr::selectionSetFullbright(U8 fullbright)
1687 } 1606 }
1688 } 1607 }
1689 1608
1690 for ( object = mSelectedObjects.getFirstObject(); object; object = mSelectedObjects.getNextObject() ) 1609 for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
1691 { 1610 {
1692 if (object->permModify()) 1611 if (object->permModify())
1693 { 1612 {
@@ -1718,7 +1637,7 @@ void LLSelectMgr::selectionSetMediaTypeAndURL(U8 media_type, const std::string&
1718 media_flags = LLTextureEntry::MF_WEB_PAGE; 1637 media_flags = LLTextureEntry::MF_WEB_PAGE;
1719 } 1638 }
1720 1639
1721 for (mSelectedObjects.getFirstTE(&object, &te); object; mSelectedObjects.getNextTE(&object, &te) ) 1640 for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te) )
1722 { 1641 {
1723 if (object->permModify()) 1642 if (object->permModify())
1724 { 1643 {
@@ -1727,7 +1646,7 @@ void LLSelectMgr::selectionSetMediaTypeAndURL(U8 media_type, const std::string&
1727 } 1646 }
1728 } 1647 }
1729 1648
1730 for ( object = mSelectedObjects.getFirstObject(); object; object = mSelectedObjects.getNextObject() ) 1649 for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
1731 { 1650 {
1732 if (object->permModify()) 1651 if (object->permModify())
1733 { 1652 {
@@ -1749,7 +1668,7 @@ LLPermissions* LLSelectMgr::findObjectPermissions(const LLViewerObject* object)
1749{ 1668{
1750 LLSelectNode* nodep; 1669 LLSelectNode* nodep;
1751 1670
1752 for (nodep = mSelectedObjects.getFirstNode(); nodep; nodep = mSelectedObjects.getNextNode() ) 1671 for (nodep = mSelectedObjects->getFirstNode(); nodep; nodep = mSelectedObjects->getNextNode() )
1753 { 1672 {
1754 if((nodep->getObject() == object) && nodep->mValid) 1673 if((nodep->getObject() == object) && nodep->mValid)
1755 { 1674 {
@@ -1768,7 +1687,7 @@ BOOL LLSelectMgr::selectionGetTexUUID(LLUUID& id)
1768{ 1687{
1769 LLViewerObject* first_objectp; 1688 LLViewerObject* first_objectp;
1770 S32 first_te; 1689 S32 first_te;
1771 mSelectedObjects.getPrimaryTE(&first_objectp, &first_te); 1690 mSelectedObjects->getPrimaryTE(&first_objectp, &first_te);
1772 1691
1773 // nothing selected 1692 // nothing selected
1774 if (!first_objectp) 1693 if (!first_objectp)
@@ -1786,7 +1705,7 @@ BOOL LLSelectMgr::selectionGetTexUUID(LLUUID& id)
1786 BOOL identical = TRUE; 1705 BOOL identical = TRUE;
1787 LLViewerObject *objectp; 1706 LLViewerObject *objectp;
1788 S32 te; 1707 S32 te;
1789 for (mSelectedObjects.getFirstTE(&objectp, &te); objectp; mSelectedObjects.getNextTE(&objectp, &te) ) 1708 for (mSelectedObjects->getFirstTE(&objectp, &te); objectp; mSelectedObjects->getNextTE(&objectp, &te) )
1790 { 1709 {
1791 if (objectp->getTEImage(te) != first_imagep) 1710 if (objectp->getTEImage(te) != first_imagep)
1792 { 1711 {
@@ -1806,7 +1725,7 @@ BOOL LLSelectMgr::selectionGetColor(LLColor4 &color)
1806{ 1725{
1807 LLViewerObject* first_object; 1726 LLViewerObject* first_object;
1808 S32 first_te; 1727 S32 first_te;
1809 mSelectedObjects.getPrimaryTE(&first_object, &first_te); 1728 mSelectedObjects->getPrimaryTE(&first_object, &first_te);
1810 1729
1811 // nothing selected 1730 // nothing selected
1812 if (!first_object) 1731 if (!first_object)
@@ -1827,7 +1746,7 @@ BOOL LLSelectMgr::selectionGetColor(LLColor4 &color)
1827 BOOL identical = TRUE; 1746 BOOL identical = TRUE;
1828 LLViewerObject* object; 1747 LLViewerObject* object;
1829 S32 te; 1748 S32 te;
1830 for (mSelectedObjects.getFirstTE(&object, &te); object; mSelectedObjects.getNextTE(&object, &te)) 1749 for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te))
1831 { 1750 {
1832 if (!object->getTE(te) || (object->getTE(te)->getColor() != first_color)) 1751 if (!object->getTE(te) || (object->getTE(te)->getColor() != first_color))
1833 { 1752 {
@@ -1848,7 +1767,7 @@ BOOL LLSelectMgr::selectionGetBumpmap(U8 *bumpmap)
1848{ 1767{
1849 LLViewerObject* first_object; 1768 LLViewerObject* first_object;
1850 S32 first_te; 1769 S32 first_te;
1851 mSelectedObjects.getPrimaryTE(&first_object, &first_te); 1770 mSelectedObjects->getPrimaryTE(&first_object, &first_te);
1852 1771
1853 // nothing selected 1772 // nothing selected
1854 if (!first_object) 1773 if (!first_object)
@@ -1869,7 +1788,7 @@ BOOL LLSelectMgr::selectionGetBumpmap(U8 *bumpmap)
1869 BOOL identical = TRUE; 1788 BOOL identical = TRUE;
1870 LLViewerObject* object; 1789 LLViewerObject* object;
1871 S32 te; 1790 S32 te;
1872 for (mSelectedObjects.getFirstTE(&object, &te); object; mSelectedObjects.getNextTE(&object, &te)) 1791 for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te))
1873 { 1792 {
1874 if (!object->getTE(te) || (object->getTE(te)->getBumpmap() != first_value)) 1793 if (!object->getTE(te) || (object->getTE(te)->getBumpmap() != first_value))
1875 { 1794 {
@@ -1889,7 +1808,7 @@ BOOL LLSelectMgr::selectionGetShiny(U8 *shiny)
1889{ 1808{
1890 LLViewerObject* first_object; 1809 LLViewerObject* first_object;
1891 S32 first_te; 1810 S32 first_te;
1892 mSelectedObjects.getPrimaryTE(&first_object, &first_te); 1811 mSelectedObjects->getPrimaryTE(&first_object, &first_te);
1893 1812
1894 // nothing selected 1813 // nothing selected
1895 if (!first_object) 1814 if (!first_object)
@@ -1910,7 +1829,7 @@ BOOL LLSelectMgr::selectionGetShiny(U8 *shiny)
1910 BOOL identical = TRUE; 1829 BOOL identical = TRUE;
1911 LLViewerObject* object; 1830 LLViewerObject* object;
1912 S32 te; 1831 S32 te;
1913 for (mSelectedObjects.getFirstTE(&object, &te); object; mSelectedObjects.getNextTE(&object, &te)) 1832 for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te))
1914 { 1833 {
1915 if (!object->getTE(te) || (object->getTE(te)->getShiny() != first_value)) 1834 if (!object->getTE(te) || (object->getTE(te)->getShiny() != first_value))
1916 { 1835 {
@@ -1930,7 +1849,7 @@ BOOL LLSelectMgr::selectionGetFullbright(U8 *fullbright)
1930{ 1849{
1931 LLViewerObject* first_object; 1850 LLViewerObject* first_object;
1932 S32 first_te; 1851 S32 first_te;
1933 mSelectedObjects.getPrimaryTE(&first_object, &first_te); 1852 mSelectedObjects->getPrimaryTE(&first_object, &first_te);
1934 1853
1935 // nothing selected 1854 // nothing selected
1936 if (!first_object) 1855 if (!first_object)
@@ -1951,7 +1870,7 @@ BOOL LLSelectMgr::selectionGetFullbright(U8 *fullbright)
1951 BOOL identical = TRUE; 1870 BOOL identical = TRUE;
1952 LLViewerObject* object; 1871 LLViewerObject* object;
1953 S32 te; 1872 S32 te;
1954 for (mSelectedObjects.getFirstTE(&object, &te); object; mSelectedObjects.getNextTE(&object, &te)) 1873 for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te))
1955 { 1874 {
1956 if (!object->getTE(te) || (object->getTE(te)->getFullbright() != first_value)) 1875 if (!object->getTE(te) || (object->getTE(te)->getFullbright() != first_value))
1957 { 1876 {
@@ -1969,7 +1888,7 @@ bool LLSelectMgr::selectionGetMediaType(U8 *media_type)
1969{ 1888{
1970 LLViewerObject* first_object; 1889 LLViewerObject* first_object;
1971 S32 first_te; 1890 S32 first_te;
1972 mSelectedObjects.getPrimaryTE(&first_object, &first_te); 1891 mSelectedObjects->getPrimaryTE(&first_object, &first_te);
1973 1892
1974 // nothing selected 1893 // nothing selected
1975 if (!first_object) 1894 if (!first_object)
@@ -1990,7 +1909,7 @@ bool LLSelectMgr::selectionGetMediaType(U8 *media_type)
1990 bool identical = true; 1909 bool identical = true;
1991 LLViewerObject* object; 1910 LLViewerObject* object;
1992 S32 te; 1911 S32 te;
1993 for (mSelectedObjects.getFirstTE(&object, &te); object; mSelectedObjects.getNextTE(&object, &te)) 1912 for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te))
1994 { 1913 {
1995 if (!object->getTE(te) || (object->getTE(te)->getMediaFlags() != first_value)) 1914 if (!object->getTE(te) || (object->getTE(te)->getMediaFlags() != first_value))
1996 { 1915 {
@@ -2011,7 +1930,7 @@ bool LLSelectMgr::selectionGetMediaType(U8 *media_type)
2011void LLSelectMgr::selectionSetMaterial(U8 material) 1930void LLSelectMgr::selectionSetMaterial(U8 material)
2012{ 1931{
2013 LLViewerObject* object; 1932 LLViewerObject* object;
2014 for (object = mSelectedObjects.getFirstObject(); object != NULL; object = mSelectedObjects.getNextObject() ) 1933 for (object = mSelectedObjects->getFirstObject(); object != NULL; object = mSelectedObjects->getNextObject() )
2015 { 1934 {
2016 if (object->permModify()) 1935 if (object->permModify())
2017 { 1936 {
@@ -2027,7 +1946,7 @@ void LLSelectMgr::selectionSetMaterial(U8 material)
2027BOOL LLSelectMgr::selectionAllPCode(LLPCode code) 1946BOOL LLSelectMgr::selectionAllPCode(LLPCode code)
2028{ 1947{
2029 LLViewerObject *object; 1948 LLViewerObject *object;
2030 for ( object = mSelectedObjects.getFirstObject(); object; object = mSelectedObjects.getNextObject() ) 1949 for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
2031 { 1950 {
2032 if (object->getPCode() != code) 1951 if (object->getPCode() != code)
2033 { 1952 {
@@ -2042,13 +1961,13 @@ BOOL LLSelectMgr::selectionAllPCode(LLPCode code)
2042//----------------------------------------------------------------------------- 1961//-----------------------------------------------------------------------------
2043BOOL LLSelectMgr::selectionGetMaterial(U8 *out_material) 1962BOOL LLSelectMgr::selectionGetMaterial(U8 *out_material)
2044{ 1963{
2045 LLViewerObject *object = mSelectedObjects.getFirstObject(); 1964 LLViewerObject *object = mSelectedObjects->getFirstObject();
2046 if (!object) return FALSE; 1965 if (!object) return FALSE;
2047 1966
2048 U8 material = object->getMaterial(); 1967 U8 material = object->getMaterial();
2049 1968
2050 BOOL identical = TRUE; 1969 BOOL identical = TRUE;
2051 for ( object = mSelectedObjects.getFirstObject(); object; object = mSelectedObjects.getNextObject() ) 1970 for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
2052 { 1971 {
2053 if ( material != object->getMaterial()) 1972 if ( material != object->getMaterial())
2054 { 1973 {
@@ -2063,13 +1982,13 @@ BOOL LLSelectMgr::selectionGetMaterial(U8 *out_material)
2063 1982
2064BOOL LLSelectMgr::selectionGetClickAction(U8 *out_action) 1983BOOL LLSelectMgr::selectionGetClickAction(U8 *out_action)
2065{ 1984{
2066 LLViewerObject *object = mSelectedObjects.getFirstObject(); 1985 LLViewerObject *object = mSelectedObjects->getFirstObject();
2067 if (!object) return FALSE; 1986 if (!object) return FALSE;
2068 1987
2069 U8 action = object->getClickAction(); 1988 U8 action = object->getClickAction();
2070 1989
2071 BOOL identical = TRUE; 1990 BOOL identical = TRUE;
2072 for ( object = mSelectedObjects.getFirstObject(); object; object = mSelectedObjects.getNextObject() ) 1991 for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
2073 { 1992 {
2074 if ( action != object->getClickAction()) 1993 if ( action != object->getClickAction())
2075 { 1994 {
@@ -2085,7 +2004,7 @@ BOOL LLSelectMgr::selectionGetClickAction(U8 *out_action)
2085void LLSelectMgr::selectionSetClickAction(U8 action) 2004void LLSelectMgr::selectionSetClickAction(U8 action)
2086{ 2005{
2087 LLViewerObject* object = NULL; 2006 LLViewerObject* object = NULL;
2088 for ( object = mSelectedObjects.getFirstObject(); object; object = mSelectedObjects.getNextObject() ) 2007 for ( object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
2089 { 2008 {
2090 object->setClickAction(action); 2009 object->setClickAction(action);
2091 } 2010 }
@@ -2118,7 +2037,7 @@ void LLSelectMgr::sendGodlikeRequest(const LLString& request, const LLString& pa
2118 } 2037 }
2119 2038
2120 godlike_request_t data(request, param); 2039 godlike_request_t data(request, param);
2121 if(!getRootObjectCount()) 2040 if(!mSelectedObjects->getRootObjectCount())
2122 { 2041 {
2123 LLMessageSystem* msg = gMessageSystem; 2042 LLMessageSystem* msg = gMessageSystem;
2124 msg->newMessage(message_type.c_str()); 2043 msg->newMessage(message_type.c_str());
@@ -2158,8 +2077,8 @@ void LLSelectMgr::packGodlikeHead(void* user_data)
2158// static 2077// static
2159void LLSelectMgr::packObjectIDAsParam(LLSelectNode* node, void *) 2078void LLSelectMgr::packObjectIDAsParam(LLSelectNode* node, void *)
2160{ 2079{
2161 char buf [MAX_STRING]; 2080 char buf [MAX_STRING]; /* Flawfinder: ignore */
2162 sprintf(buf, "%u", node->getObject()->getLocalID()); 2081 snprintf(buf, MAX_STRING, "%u", node->getObject()->getLocalID()); /* Flawfinder: ignore */
2163 gMessageSystem->nextBlock("ParamList"); 2082 gMessageSystem->nextBlock("ParamList");
2164 gMessageSystem->addString("Parameter", buf); 2083 gMessageSystem->addString("Parameter", buf);
2165} 2084}
@@ -2172,7 +2091,7 @@ void LLSelectMgr::selectionResetRotation()
2172 LLQuaternion identity(0.f, 0.f, 0.f, 1.f); 2091 LLQuaternion identity(0.f, 0.f, 0.f, 1.f);
2173 2092
2174 LLViewerObject* object; 2093 LLViewerObject* object;
2175 for (object = mSelectedObjects.getFirstRootObject(); object; object = mSelectedObjects.getNextRootObject() ) 2094 for (object = mSelectedObjects->getFirstRootObject(); object; object = mSelectedObjects->getNextRootObject() )
2176 { 2095 {
2177 object->setRotation(identity); 2096 object->setRotation(identity);
2178 if (object->mDrawable.notNull()) 2097 if (object->mDrawable.notNull())
@@ -2188,7 +2107,7 @@ void LLSelectMgr::selectionRotateAroundZ(F32 degrees)
2188 LLQuaternion rot( degrees * DEG_TO_RAD, LLVector3(0,0,1) ); 2107 LLQuaternion rot( degrees * DEG_TO_RAD, LLVector3(0,0,1) );
2189 2108
2190 LLViewerObject* object; 2109 LLViewerObject* object;
2191 for (object = mSelectedObjects.getFirstRootObject(); object; object = mSelectedObjects.getNextRootObject() ) 2110 for (object = mSelectedObjects->getFirstRootObject(); object; object = mSelectedObjects->getNextRootObject() )
2192 { 2111 {
2193 object->setRotation( object->getRotationEdit() * rot ); 2112 object->setRotation( object->getRotationEdit() * rot );
2194 if (object->mDrawable.notNull()) 2113 if (object->mDrawable.notNull())
@@ -2207,7 +2126,7 @@ void LLSelectMgr::selectionTexScaleAutofit(F32 repeats_per_meter)
2207{ 2126{
2208 LLViewerObject* object; 2127 LLViewerObject* object;
2209 S32 te; 2128 S32 te;
2210 for (mSelectedObjects.getFirstTE(&object, &te); object; mSelectedObjects.getNextTE(&object, &te)) 2129 for (mSelectedObjects->getFirstTE(&object, &te); object; mSelectedObjects->getNextTE(&object, &te))
2211 { 2130 {
2212 if (!object->permModify()) 2131 if (!object->permModify())
2213 { 2132 {
@@ -2232,7 +2151,7 @@ void LLSelectMgr::selectionTexScaleAutofit(F32 repeats_per_meter)
2232 object->setTEScale(te, new_s, new_t); 2151 object->setTEScale(te, new_s, new_t);
2233 } 2152 }
2234 2153
2235 for (object = mSelectedObjects.getFirstObject(); object; object = mSelectedObjects.getNextObject()) 2154 for (object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject())
2236 { 2155 {
2237 if (object->permModify()) 2156 if (object->permModify())
2238 { 2157 {
@@ -2299,7 +2218,7 @@ void LLSelectMgr::adjustTexturesByScale(BOOL send_to_sim, BOOL stretch)
2299 2218
2300 BOOL send = FALSE; 2219 BOOL send = FALSE;
2301 2220
2302 for (selectNode = mSelectedObjects.getFirstNode(); selectNode; selectNode = mSelectedObjects.getNextNode()) 2221 for (selectNode = mSelectedObjects->getFirstNode(); selectNode; selectNode = mSelectedObjects->getNextNode())
2303 { 2222 {
2304 object = selectNode->getObject(); 2223 object = selectNode->getObject();
2305 if (!object->permModify()) 2224 if (!object->permModify())
@@ -2357,7 +2276,7 @@ void LLSelectMgr::selectionResetTexInfo(S32 selected_face)
2357 S32 start_face, end_face; 2276 S32 start_face, end_face;
2358 2277
2359 LLViewerObject* object; 2278 LLViewerObject* object;
2360 for (object = mSelectedObjects.getFirstObject(); object; object = mSelectedObjects.getNextObject()) 2279 for (object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject())
2361 { 2280 {
2362 if (!object->permModify()) 2281 if (!object->permModify())
2363 { 2282 {
@@ -2392,259 +2311,12 @@ void LLSelectMgr::selectionResetTexInfo(S32 selected_face)
2392} 2311}
2393 2312
2394//----------------------------------------------------------------------------- 2313//-----------------------------------------------------------------------------
2395// getFirstEditableObject()
2396//-----------------------------------------------------------------------------
2397LLViewerObject* LLSelectMgr::getFirstEditableObject(BOOL get_root)
2398{
2399 LLViewerObject* object = NULL;
2400 for(LLViewerObject* cur = mSelectedObjects.getFirstObject(); cur; cur = mSelectedObjects.getNextObject())
2401 {
2402 if( cur->permModify() )
2403 {
2404 object = cur;
2405 break;
2406 }
2407 }
2408
2409 if (get_root && object)
2410 {
2411 LLViewerObject *parent;
2412 while ((parent = (LLViewerObject*)object->getParent()))
2413 {
2414 if (parent->isSelected())
2415 {
2416 object = parent;
2417 }
2418 else
2419 {
2420 break;
2421 }
2422 }
2423 }
2424
2425 return object;
2426}
2427
2428//-----------------------------------------------------------------------------
2429// getFirstMoveableObject()
2430//-----------------------------------------------------------------------------
2431LLViewerObject* LLSelectMgr::getFirstMoveableObject(BOOL get_root)
2432{
2433 LLViewerObject* object = NULL;
2434 for(LLViewerObject* cur = mSelectedObjects.getFirstObject(); cur; cur = mSelectedObjects.getNextObject())
2435 {
2436 if( cur->permMove() )
2437 {
2438 object = cur;
2439 break;
2440 }
2441 }
2442
2443 if (get_root && object && !object->isJointChild())
2444 {
2445 LLViewerObject *parent;
2446 while ((parent = (LLViewerObject*)object->getParent()))
2447 {
2448 if (parent->isSelected())
2449 {
2450 object = parent;
2451 }
2452 else
2453 {
2454 break;
2455 }
2456 }
2457 }
2458
2459 return object;
2460}
2461
2462//-----------------------------------------------------------------------------
2463// getFirstEditableNode()
2464//-----------------------------------------------------------------------------
2465LLSelectNode* LLSelectMgr::getFirstEditableNode(BOOL get_root)
2466{
2467 LLSelectNode* selectNode = NULL;
2468
2469 if (get_root)
2470 {
2471 for(selectNode = mSelectedObjects.getFirstRootNode(); selectNode; selectNode = mSelectedObjects.getNextRootNode())
2472 {
2473 if( selectNode->getObject()->permModify() )
2474 {
2475 return selectNode;
2476 break;
2477 }
2478 }
2479 }
2480 for(selectNode = mSelectedObjects.getFirstNode(); selectNode; selectNode = mSelectedObjects.getNextNode())
2481 {
2482 if( selectNode->getObject()->permModify() )
2483 {
2484 return selectNode;
2485 break;
2486 }
2487 }
2488
2489 return NULL;
2490}
2491
2492//-----------------------------------------------------------------------------
2493// getFirstMoveableNode()
2494//-----------------------------------------------------------------------------
2495LLSelectNode* LLSelectMgr::getFirstMoveableNode(BOOL get_root)
2496{
2497 LLSelectNode* selectNode = NULL;
2498
2499 if (get_root)
2500 {
2501 for(selectNode = mSelectedObjects.getFirstRootNode(); selectNode; selectNode = mSelectedObjects.getNextRootNode())
2502 {
2503 if( selectNode->getObject()->permMove() )
2504 {
2505 return selectNode;
2506 break;
2507 }
2508 }
2509 }
2510 for(selectNode = mSelectedObjects.getFirstNode(); selectNode; selectNode = mSelectedObjects.getNextNode())
2511 {
2512 if( selectNode->getObject()->permMove() )
2513 {
2514 return selectNode;
2515 break;
2516 }
2517 }
2518
2519 return NULL;
2520}
2521
2522//-----------------------------------------------------------------------------
2523// getFirstDeleteableObject()
2524//-----------------------------------------------------------------------------
2525LLViewerObject* LLSelectMgr::getFirstDeleteableObject(BOOL get_root)
2526{
2527 //RN: don't currently support deletion of child objects, as that requires separating them first
2528 // then derezzing to trash
2529 get_root = TRUE;
2530
2531 LLViewerObject* object = NULL;
2532 if (get_root)
2533 {
2534 for(LLViewerObject* current = getFirstRootObject();
2535 current != NULL;
2536 current = getNextRootObject())
2537 {
2538 // you can delete an object if permissions allow it, you are
2539 // the owner, you are an officer in the group that owns the
2540 // object, or you are not the owner but it is on land you own
2541 // or land owned by your group. (whew!)
2542 if( (current->permModify())
2543 || (current->permYouOwner())
2544 || (!current->permAnyOwner()) // public
2545 || (current->isOverAgentOwnedLand())
2546 || (current->isOverGroupOwnedLand())
2547 )
2548 {
2549
2550 if( !current->isAttachment() )
2551 {
2552 object = current;
2553 break;
2554 }
2555 }
2556 }
2557 }
2558 else
2559 {
2560 for(LLViewerObject* current = getFirstObject();
2561 current != NULL;
2562 current = getNextObject())
2563 {
2564 // you can delete an object if permissions allow it, you are
2565 // the owner, you are an officer in the group that owns the
2566 // object, or you are not the owner but it is on land you own
2567 // or land owned by your group. (whew!)
2568 if( (current->permModify())
2569 || (current->permYouOwner())
2570 || (!current->permAnyOwner()) // public
2571 || (current->isOverAgentOwnedLand())
2572 || (current->isOverGroupOwnedLand())
2573 )
2574 {
2575 if( !current->isAttachment() )
2576 {
2577 object = current;
2578 break;
2579 }
2580 }
2581 }
2582 }
2583
2584 return object;
2585}
2586
2587//-----------------------------------------------------------------------------
2588// getFirstCopyableObject()
2589//-----------------------------------------------------------------------------
2590LLViewerObject* LLSelectMgr::getFirstCopyableObject(BOOL get_root)
2591{
2592 LLViewerObject* object = NULL;
2593 for(LLViewerObject* cur = mSelectedObjects.getFirstObject(); cur; cur = mSelectedObjects.getNextObject())
2594 {
2595 if( cur->permCopy() && !cur->isAttachment())
2596 {
2597 object = cur;
2598 break;
2599 }
2600 }
2601
2602 if (get_root && object)
2603 {
2604 LLViewerObject *parent;
2605 while ((parent = (LLViewerObject*)object->getParent()))
2606 {
2607 if (parent->isSelected())
2608 {
2609 object = parent;
2610 }
2611 else
2612 {
2613 break;
2614 }
2615 }
2616 }
2617
2618 return object;
2619}
2620
2621//-----------------------------------------------------------------------------
2622// areMultpleEditableObjectsSelected()
2623//-----------------------------------------------------------------------------
2624BOOL LLSelectMgr::areMultpleEditableObjectsSelected()
2625{
2626 S32 count = 0;
2627 for( LLViewerObject* cur = mSelectedObjects.getFirstObject(); cur; cur = mSelectedObjects.getNextObject() )
2628 {
2629 if( cur->permModify() )
2630 {
2631 count++;
2632 if( count > 1 )
2633 {
2634 return TRUE;
2635 }
2636 }
2637 }
2638 return FALSE;
2639}
2640
2641//-----------------------------------------------------------------------------
2642// selectGetAllRootsValid() 2314// selectGetAllRootsValid()
2643// Returns true if the viewer has information on all selected objects 2315// Returns true if the viewer has information on all selected objects
2644//----------------------------------------------------------------------------- 2316//-----------------------------------------------------------------------------
2645BOOL LLSelectMgr::selectGetAllRootsValid() 2317BOOL LLSelectMgr::selectGetAllRootsValid()
2646{ 2318{
2647 for( LLSelectNode* node = getFirstRootNode(); node; node = getNextRootNode() ) 2319 for( LLSelectNode* node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode() )
2648 { 2320 {
2649 2321
2650 if( !node->mValid ) 2322 if( !node->mValid )
@@ -2667,7 +2339,7 @@ BOOL LLSelectMgr::selectGetAllRootsValid()
2667//----------------------------------------------------------------------------- 2339//-----------------------------------------------------------------------------
2668BOOL LLSelectMgr::selectGetAllValid() 2340BOOL LLSelectMgr::selectGetAllValid()
2669{ 2341{
2670 for( LLSelectNode* node = getFirstNode(); node; node = getNextNode() ) 2342 for( LLSelectNode* node = mSelectedObjects->getFirstNode(); node; node = mSelectedObjects->getNextNode() )
2671 { 2343 {
2672 2344
2673 if( !node->mValid ) 2345 if( !node->mValid )
@@ -2690,7 +2362,7 @@ BOOL LLSelectMgr::selectGetAllValid()
2690//----------------------------------------------------------------------------- 2362//-----------------------------------------------------------------------------
2691BOOL LLSelectMgr::selectGetModify() 2363BOOL LLSelectMgr::selectGetModify()
2692{ 2364{
2693 for( LLSelectNode* node = getFirstNode(); node; node = getNextNode() ) 2365 for( LLSelectNode* node = mSelectedObjects->getFirstNode(); node; node = mSelectedObjects->getNextNode() )
2694 { 2366 {
2695 if( !node->mValid ) 2367 if( !node->mValid )
2696 { 2368 {
@@ -2712,7 +2384,7 @@ BOOL LLSelectMgr::selectGetModify()
2712//----------------------------------------------------------------------------- 2384//-----------------------------------------------------------------------------
2713BOOL LLSelectMgr::selectGetRootsModify() 2385BOOL LLSelectMgr::selectGetRootsModify()
2714{ 2386{
2715 for( LLSelectNode* node = getFirstRootNode(); node; node = getNextRootNode() ) 2387 for( LLSelectNode* node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode() )
2716 { 2388 {
2717 if( !node->mValid ) 2389 if( !node->mValid )
2718 { 2390 {
@@ -2735,7 +2407,7 @@ BOOL LLSelectMgr::selectGetRootsModify()
2735//----------------------------------------------------------------------------- 2407//-----------------------------------------------------------------------------
2736BOOL LLSelectMgr::selectGetRootsTransfer() 2408BOOL LLSelectMgr::selectGetRootsTransfer()
2737{ 2409{
2738 for(LLSelectNode* node = getFirstRootNode(); node; node = getNextRootNode()) 2410 for(LLSelectNode* node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode())
2739 { 2411 {
2740 if(!node->mValid) 2412 if(!node->mValid)
2741 { 2413 {
@@ -2756,7 +2428,7 @@ BOOL LLSelectMgr::selectGetRootsTransfer()
2756//----------------------------------------------------------------------------- 2428//-----------------------------------------------------------------------------
2757BOOL LLSelectMgr::selectGetRootsCopy() 2429BOOL LLSelectMgr::selectGetRootsCopy()
2758{ 2430{
2759 for(LLSelectNode* node = getFirstRootNode(); node; node = getNextRootNode()) 2431 for(LLSelectNode* node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode())
2760 { 2432 {
2761 if(!node->mValid) 2433 if(!node->mValid)
2762 { 2434 {
@@ -2777,8 +2449,8 @@ BOOL LLSelectMgr::selectGetRootsCopy()
2777//----------------------------------------------------------------------------- 2449//-----------------------------------------------------------------------------
2778BOOL LLSelectMgr::selectGetCreator(LLUUID& id, LLString& name) 2450BOOL LLSelectMgr::selectGetCreator(LLUUID& id, LLString& name)
2779{ 2451{
2780 LLSelectNode* node = getFirstRootNode(); 2452 LLSelectNode* node = mSelectedObjects->getFirstRootNode();
2781 if(!node) node = getFirstNode(); 2453 if(!node) node = mSelectedObjects->getFirstNode();
2782 if(!node) return FALSE; 2454 if(!node) return FALSE;
2783 if(!node->mValid) return FALSE; 2455 if(!node->mValid) return FALSE;
2784 LLViewerObject* obj = node->getObject(); 2456 LLViewerObject* obj = node->getObject();
@@ -2788,7 +2460,7 @@ BOOL LLSelectMgr::selectGetCreator(LLUUID& id, LLString& name)
2788 id = node->mPermissions->getCreator(); 2460 id = node->mPermissions->getCreator();
2789 2461
2790 BOOL identical = TRUE; 2462 BOOL identical = TRUE;
2791 for ( node = getNextRootNode(); node; node = getNextRootNode() ) 2463 for ( node = mSelectedObjects->getNextRootNode(); node; node = mSelectedObjects->getNextRootNode() )
2792 { 2464 {
2793 if (!node->mValid) 2465 if (!node->mValid)
2794 { 2466 {
@@ -2805,8 +2477,8 @@ BOOL LLSelectMgr::selectGetCreator(LLUUID& id, LLString& name)
2805 2477
2806 if (identical) 2478 if (identical)
2807 { 2479 {
2808 char firstname[DB_FIRST_NAME_BUF_SIZE]; 2480 char firstname[DB_FIRST_NAME_BUF_SIZE]; /* Flawfinder: ignore */
2809 char lastname[DB_LAST_NAME_BUF_SIZE]; 2481 char lastname[DB_LAST_NAME_BUF_SIZE]; /* Flawfinder: ignore */
2810 gCacheName->getName(id, firstname, lastname); 2482 gCacheName->getName(id, firstname, lastname);
2811 name.assign( firstname ); 2483 name.assign( firstname );
2812 name.append( " " ); 2484 name.append( " " );
@@ -2827,8 +2499,8 @@ BOOL LLSelectMgr::selectGetCreator(LLUUID& id, LLString& name)
2827//----------------------------------------------------------------------------- 2499//-----------------------------------------------------------------------------
2828BOOL LLSelectMgr::selectGetOwner(LLUUID& id, LLString& name) 2500BOOL LLSelectMgr::selectGetOwner(LLUUID& id, LLString& name)
2829{ 2501{
2830 LLSelectNode* node = getFirstRootNode(); 2502 LLSelectNode* node = mSelectedObjects->getFirstRootNode();
2831 if(!node) node = getFirstNode(); 2503 if(!node) node = mSelectedObjects->getFirstNode();
2832 if(!node) return FALSE; 2504 if(!node) return FALSE;
2833 if(!node->mValid) return FALSE; 2505 if(!node->mValid) return FALSE;
2834 LLViewerObject* obj = node->getObject(); 2506 LLViewerObject* obj = node->getObject();
@@ -2840,7 +2512,7 @@ BOOL LLSelectMgr::selectGetOwner(LLUUID& id, LLString& name)
2840 node->mPermissions->getOwnership(id, group_owner); 2512 node->mPermissions->getOwnership(id, group_owner);
2841 2513
2842 BOOL identical = TRUE; 2514 BOOL identical = TRUE;
2843 for ( node = getNextRootNode(); node; node = getNextRootNode() ) 2515 for ( node = mSelectedObjects->getNextRootNode(); node; node = mSelectedObjects->getNextRootNode() )
2844 { 2516 {
2845 if (!node->mValid) 2517 if (!node->mValid)
2846 { 2518 {
@@ -2868,8 +2540,8 @@ BOOL LLSelectMgr::selectGetOwner(LLUUID& id, LLString& name)
2868 } 2540 }
2869 else if(!public_owner) 2541 else if(!public_owner)
2870 { 2542 {
2871 char firstname[DB_FIRST_NAME_BUF_SIZE]; 2543 char firstname[DB_FIRST_NAME_BUF_SIZE]; /* Flawfinder: ignore */
2872 char lastname[DB_LAST_NAME_BUF_SIZE]; 2544 char lastname[DB_LAST_NAME_BUF_SIZE]; /* Flawfinder: ignore */
2873 gCacheName->getName(id, firstname, lastname); 2545 gCacheName->getName(id, firstname, lastname);
2874 name.assign( firstname ); 2546 name.assign( firstname );
2875 name.append( " " ); 2547 name.append( " " );
@@ -2895,8 +2567,8 @@ BOOL LLSelectMgr::selectGetOwner(LLUUID& id, LLString& name)
2895//----------------------------------------------------------------------------- 2567//-----------------------------------------------------------------------------
2896BOOL LLSelectMgr::selectGetLastOwner(LLUUID& id, LLString& name) 2568BOOL LLSelectMgr::selectGetLastOwner(LLUUID& id, LLString& name)
2897{ 2569{
2898 LLSelectNode* node = getFirstRootNode(); 2570 LLSelectNode* node = mSelectedObjects->getFirstRootNode();
2899 if(!node) node = getFirstNode(); 2571 if(!node) node = mSelectedObjects->getFirstNode();
2900 if(!node) return FALSE; 2572 if(!node) return FALSE;
2901 if(!node->mValid) return FALSE; 2573 if(!node->mValid) return FALSE;
2902 LLViewerObject* obj = node->getObject(); 2574 LLViewerObject* obj = node->getObject();
@@ -2906,7 +2578,7 @@ BOOL LLSelectMgr::selectGetLastOwner(LLUUID& id, LLString& name)
2906 id = node->mPermissions->getLastOwner(); 2578 id = node->mPermissions->getLastOwner();
2907 2579
2908 BOOL identical = TRUE; 2580 BOOL identical = TRUE;
2909 for ( node = getNextRootNode(); node; node = getNextRootNode() ) 2581 for ( node = mSelectedObjects->getNextRootNode(); node; node = mSelectedObjects->getNextRootNode() )
2910 { 2582 {
2911 if (!node->mValid) 2583 if (!node->mValid)
2912 { 2584 {
@@ -2927,8 +2599,8 @@ BOOL LLSelectMgr::selectGetLastOwner(LLUUID& id, LLString& name)
2927 { 2599 {
2928 if(!public_owner) 2600 if(!public_owner)
2929 { 2601 {
2930 char firstname[DB_FIRST_NAME_BUF_SIZE]; 2602 char firstname[DB_FIRST_NAME_BUF_SIZE]; /* Flawfinder: ignore */
2931 char lastname[DB_LAST_NAME_BUF_SIZE]; 2603 char lastname[DB_LAST_NAME_BUF_SIZE]; /* Flawfinder: ignore */
2932 gCacheName->getName(id, firstname, lastname); 2604 gCacheName->getName(id, firstname, lastname);
2933 name.assign( firstname ); 2605 name.assign( firstname );
2934 name.append( " " ); 2606 name.append( " " );
@@ -2954,8 +2626,8 @@ BOOL LLSelectMgr::selectGetLastOwner(LLUUID& id, LLString& name)
2954//----------------------------------------------------------------------------- 2626//-----------------------------------------------------------------------------
2955BOOL LLSelectMgr::selectGetGroup(LLUUID& id) 2627BOOL LLSelectMgr::selectGetGroup(LLUUID& id)
2956{ 2628{
2957 LLSelectNode* node = getFirstRootNode(); 2629 LLSelectNode* node = mSelectedObjects->getFirstRootNode();
2958 if(!node) node = getFirstNode(); 2630 if(!node) node = mSelectedObjects->getFirstNode();
2959 if(!node) return FALSE; 2631 if(!node) return FALSE;
2960 if(!node->mValid) return FALSE; 2632 if(!node->mValid) return FALSE;
2961 LLViewerObject* obj = node->getObject(); 2633 LLViewerObject* obj = node->getObject();
@@ -2965,7 +2637,7 @@ BOOL LLSelectMgr::selectGetGroup(LLUUID& id)
2965 id = node->mPermissions->getGroup(); 2637 id = node->mPermissions->getGroup();
2966 2638
2967 BOOL identical = TRUE; 2639 BOOL identical = TRUE;
2968 for ( node = getNextRootNode(); node; node = getNextRootNode() ) 2640 for ( node = mSelectedObjects->getNextRootNode(); node; node = mSelectedObjects->getNextRootNode() )
2969 { 2641 {
2970 if (!node->mValid) 2642 if (!node->mValid)
2971 { 2643 {
@@ -2990,8 +2662,8 @@ BOOL LLSelectMgr::selectGetGroup(LLUUID& id)
2990//----------------------------------------------------------------------------- 2662//-----------------------------------------------------------------------------
2991BOOL LLSelectMgr::selectIsGroupOwned() 2663BOOL LLSelectMgr::selectIsGroupOwned()
2992{ 2664{
2993 LLSelectNode* node = getFirstRootNode(); 2665 LLSelectNode* node = mSelectedObjects->getFirstRootNode();
2994 if(!node) node = getFirstNode(); 2666 if(!node) node = mSelectedObjects->getFirstNode();
2995 if(!node) return FALSE; 2667 if(!node) return FALSE;
2996 if(!node->mValid) return FALSE; 2668 if(!node->mValid) return FALSE;
2997 LLViewerObject* obj = node->getObject(); 2669 LLViewerObject* obj = node->getObject();
@@ -3002,7 +2674,7 @@ BOOL LLSelectMgr::selectIsGroupOwned()
3002 2674
3003 if(is_group_owned) 2675 if(is_group_owned)
3004 { 2676 {
3005 for ( node = getNextRootNode(); node; node = getNextRootNode() ) 2677 for ( node = mSelectedObjects->getNextRootNode(); node; node = mSelectedObjects->getNextRootNode() )
3006 { 2678 {
3007 if (!node->mValid) 2679 if (!node->mValid)
3008 { 2680 {
@@ -3031,7 +2703,7 @@ BOOL LLSelectMgr::selectIsGroupOwned()
3031//----------------------------------------------------------------------------- 2703//-----------------------------------------------------------------------------
3032BOOL LLSelectMgr::selectGetPerm(U8 which_perm, U32* mask_on, U32* mask_off) 2704BOOL LLSelectMgr::selectGetPerm(U8 which_perm, U32* mask_on, U32* mask_off)
3033{ 2705{
3034 LLSelectNode* node = getFirstRootNode(); 2706 LLSelectNode* node = mSelectedObjects->getFirstRootNode();
3035 if (!node) return FALSE; 2707 if (!node) return FALSE;
3036 if (!node->mValid) return FALSE; 2708 if (!node->mValid) return FALSE;
3037 2709
@@ -3040,7 +2712,7 @@ BOOL LLSelectMgr::selectGetPerm(U8 which_perm, U32* mask_on, U32* mask_off)
3040 U32 mask_or = 0x00000000; 2712 U32 mask_or = 0x00000000;
3041 BOOL all_valid = TRUE; 2713 BOOL all_valid = TRUE;
3042 2714
3043 for ( node = getFirstRootNode(); node; node = getNextRootNode() ) 2715 for ( node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode() )
3044 { 2716 {
3045 if (!node->mValid) 2717 if (!node->mValid)
3046 { 2718 {
@@ -3094,17 +2766,17 @@ BOOL LLSelectMgr::selectGetPerm(U8 which_perm, U32* mask_on, U32* mask_off)
3094 2766
3095BOOL LLSelectMgr::selectGetOwnershipCost(S32* out_cost) 2767BOOL LLSelectMgr::selectGetOwnershipCost(S32* out_cost)
3096{ 2768{
3097 return mSelectedObjects.getOwnershipCost(*out_cost); 2769 return mSelectedObjects->getOwnershipCost(*out_cost);
3098} 2770}
3099 2771
3100BOOL LLSelectMgr::selectGetPermissions(LLPermissions& perm) 2772BOOL LLSelectMgr::selectGetPermissions(LLPermissions& perm)
3101{ 2773{
3102 LLSelectNode* node = getFirstRootNode(); 2774 LLSelectNode* node = mSelectedObjects->getFirstRootNode();
3103 if (!node) return FALSE; 2775 if (!node) return FALSE;
3104 if (!node->mValid) return FALSE; 2776 if (!node->mValid) return FALSE;
3105 BOOL valid = TRUE; 2777 BOOL valid = TRUE;
3106 perm = *(node->mPermissions); 2778 perm = *(node->mPermissions);
3107 for(node = getNextRootNode(); node != NULL; node = getNextRootNode()) 2779 for(node = mSelectedObjects->getNextRootNode(); node != NULL; node = mSelectedObjects->getNextRootNode())
3108 { 2780 {
3109 if(!node->mValid) 2781 if(!node->mValid)
3110 { 2782 {
@@ -3124,9 +2796,9 @@ void LLSelectMgr::selectDelete()
3124 BOOL locked_but_deleteable_object = FALSE; 2796 BOOL locked_but_deleteable_object = FALSE;
3125 BOOL no_copy_but_deleteable_object = FALSE; 2797 BOOL no_copy_but_deleteable_object = FALSE;
3126 BOOL all_owned_by_you = TRUE; 2798 BOOL all_owned_by_you = TRUE;
3127 for(LLViewerObject* obj = getFirstObject(); 2799 for(LLViewerObject* obj = mSelectedObjects->getFirstObject();
3128 obj != NULL; 2800 obj != NULL;
3129 obj = getNextObject()) 2801 obj = mSelectedObjects->getNextObject())
3130 { 2802 {
3131 if( obj->isAttachment() ) 2803 if( obj->isAttachment() )
3132 { 2804 {
@@ -3156,6 +2828,8 @@ void LLSelectMgr::selectDelete()
3156 return; 2828 return;
3157 } 2829 }
3158 2830
2831 LLObjectSelectionHandle* selection_handlep = new LLObjectSelectionHandle(getSelection());
2832
3159 if(locked_but_deleteable_object || 2833 if(locked_but_deleteable_object ||
3160 no_copy_but_deleteable_object || 2834 no_copy_but_deleteable_object ||
3161 !all_owned_by_you) 2835 !all_owned_by_you)
@@ -3172,49 +2846,49 @@ void LLSelectMgr::selectDelete()
3172 //Locked only 2846 //Locked only
3173 gViewerWindow->alertXml( "ConfirmObjectDeleteLock", 2847 gViewerWindow->alertXml( "ConfirmObjectDeleteLock",
3174 &LLSelectMgr::confirmDelete, 2848 &LLSelectMgr::confirmDelete,
3175 this); 2849 selection_handlep);
3176 } 2850 }
3177 else if(!locked_but_deleteable_object && no_copy_but_deleteable_object && all_owned_by_you) 2851 else if(!locked_but_deleteable_object && no_copy_but_deleteable_object && all_owned_by_you)
3178 { 2852 {
3179 //No Copy only 2853 //No Copy only
3180 gViewerWindow->alertXml( "ConfirmObjectDeleteNoCopy", 2854 gViewerWindow->alertXml( "ConfirmObjectDeleteNoCopy",
3181 &LLSelectMgr::confirmDelete, 2855 &LLSelectMgr::confirmDelete,
3182 this); 2856 selection_handlep);
3183 } 2857 }
3184 else if(!locked_but_deleteable_object && !no_copy_but_deleteable_object && !all_owned_by_you) 2858 else if(!locked_but_deleteable_object && !no_copy_but_deleteable_object && !all_owned_by_you)
3185 { 2859 {
3186 //not owned only 2860 //not owned only
3187 gViewerWindow->alertXml( "ConfirmObjectDeleteNoOwn", 2861 gViewerWindow->alertXml( "ConfirmObjectDeleteNoOwn",
3188 &LLSelectMgr::confirmDelete, 2862 &LLSelectMgr::confirmDelete,
3189 this); 2863 selection_handlep);
3190 } 2864 }
3191 else if(locked_but_deleteable_object && no_copy_but_deleteable_object && all_owned_by_you) 2865 else if(locked_but_deleteable_object && no_copy_but_deleteable_object && all_owned_by_you)
3192 { 2866 {
3193 //locked and no copy 2867 //locked and no copy
3194 gViewerWindow->alertXml( "ConfirmObjectDeleteLockNoCopy", 2868 gViewerWindow->alertXml( "ConfirmObjectDeleteLockNoCopy",
3195 &LLSelectMgr::confirmDelete, 2869 &LLSelectMgr::confirmDelete,
3196 this); 2870 selection_handlep);
3197 } 2871 }
3198 else if(locked_but_deleteable_object && !no_copy_but_deleteable_object && !all_owned_by_you) 2872 else if(locked_but_deleteable_object && !no_copy_but_deleteable_object && !all_owned_by_you)
3199 { 2873 {
3200 //locked and not owned 2874 //locked and not owned
3201 gViewerWindow->alertXml( "ConfirmObjectDeleteLockNoOwn", 2875 gViewerWindow->alertXml( "ConfirmObjectDeleteLockNoOwn",
3202 &LLSelectMgr::confirmDelete, 2876 &LLSelectMgr::confirmDelete,
3203 this); 2877 selection_handlep);
3204 } 2878 }
3205 else if(!locked_but_deleteable_object && no_copy_but_deleteable_object && !all_owned_by_you) 2879 else if(!locked_but_deleteable_object && no_copy_but_deleteable_object && !all_owned_by_you)
3206 { 2880 {
3207 //no copy and not owned 2881 //no copy and not owned
3208 gViewerWindow->alertXml( "ConfirmObjectDeleteNoCopyNoOwn", 2882 gViewerWindow->alertXml( "ConfirmObjectDeleteNoCopyNoOwn",
3209 &LLSelectMgr::confirmDelete, 2883 &LLSelectMgr::confirmDelete,
3210 this); 2884 selection_handlep);
3211 } 2885 }
3212 else 2886 else
3213 { 2887 {
3214 //locked, no copy and not owned 2888 //locked, no copy and not owned
3215 gViewerWindow->alertXml( "ConfirmObjectDeleteLockNoCopyNoOwn", 2889 gViewerWindow->alertXml( "ConfirmObjectDeleteLockNoCopyNoOwn",
3216 &LLSelectMgr::confirmDelete, 2890 &LLSelectMgr::confirmDelete,
3217 this); 2891 selection_handlep);
3218 } 2892 }
3219 2893
3220 2894
@@ -3222,15 +2896,22 @@ void LLSelectMgr::selectDelete()
3222 } 2896 }
3223 else 2897 else
3224 { 2898 {
3225 confirmDelete(0, (void*)this); 2899 confirmDelete(0, (void*)selection_handlep);
3226 } 2900 }
3227} 2901}
3228 2902
3229// static 2903// static
3230void LLSelectMgr::confirmDelete(S32 option, void* data) 2904void LLSelectMgr::confirmDelete(S32 option, void* data)
3231{ 2905{
3232 LLSelectMgr* self = (LLSelectMgr*)data; 2906 LLObjectSelectionHandle handle = *(LLObjectSelectionHandle*)data;
3233 if(!self) return; 2907 delete (LLObjectSelectionHandle*)data;
2908
2909 if (!handle->getObjectCount())
2910 {
2911 llwarns << "Nothing to delete!" << llendl;
2912 return;
2913 }
2914
3234 switch(option) 2915 switch(option)
3235 { 2916 {
3236 case 0: 2917 case 0:
@@ -3239,19 +2920,19 @@ void LLSelectMgr::confirmDelete(S32 option, void* data)
3239 LLUUID trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH); 2920 LLUUID trash_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_TRASH);
3240 // attempt to derez into the trash. 2921 // attempt to derez into the trash.
3241 LLDeRezInfo* info = new LLDeRezInfo(DRD_TRASH, trash_id); 2922 LLDeRezInfo* info = new LLDeRezInfo(DRD_TRASH, trash_id);
3242 self->sendListToRegions("DeRezObject", 2923 gSelectMgr->sendListToRegions("DeRezObject",
3243 packDeRezHeader, 2924 packDeRezHeader,
3244 packObjectLocalID, 2925 packObjectLocalID,
3245 (void*)info, 2926 (void*)info,
3246 SEND_ONLY_ROOTS); 2927 SEND_ONLY_ROOTS);
3247 // VEFFECT: Delete Object - one effect for all deletes 2928 // VEFFECT: Delete Object - one effect for all deletes
3248 if (self->mSelectType != SELECT_TYPE_HUD) 2929 if (gSelectMgr->mSelectedObjects->mSelectType != SELECT_TYPE_HUD)
3249 { 2930 {
3250 LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)gHUDManager->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINT, TRUE); 2931 LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)gHUDManager->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINT, TRUE);
3251 effectp->setPositionGlobal( self->getSelectionCenterGlobal() ); 2932 effectp->setPositionGlobal( gSelectMgr->getSelectionCenterGlobal() );
3252 effectp->setColor(LLColor4U(gAgent.getEffectColor())); 2933 effectp->setColor(LLColor4U(gAgent.getEffectColor()));
3253 F32 duration = 0.5f; 2934 F32 duration = 0.5f;
3254 duration += self->getObjectCount() / 64.f; 2935 duration += gSelectMgr->mSelectedObjects->getObjectCount() / 64.f;
3255 effectp->setDuration(duration); 2936 effectp->setDuration(duration);
3256 } 2937 }
3257 2938
@@ -3259,7 +2940,7 @@ void LLSelectMgr::confirmDelete(S32 option, void* data)
3259 2940
3260 // Keep track of how many objects have been deleted. 2941 // Keep track of how many objects have been deleted.
3261 F64 obj_delete_count = gViewerStats->getStat(LLViewerStats::ST_OBJECT_DELETE_COUNT); 2942 F64 obj_delete_count = gViewerStats->getStat(LLViewerStats::ST_OBJECT_DELETE_COUNT);
3262 obj_delete_count += self->getObjectCount(); 2943 obj_delete_count += gSelectMgr->mSelectedObjects->getObjectCount();
3263 gViewerStats->setStat(LLViewerStats::ST_OBJECT_DELETE_COUNT, obj_delete_count ); 2944 gViewerStats->setStat(LLViewerStats::ST_OBJECT_DELETE_COUNT, obj_delete_count );
3264 } 2945 }
3265 break; 2946 break;
@@ -3289,7 +2970,7 @@ BOOL LLSelectMgr::selectIsForSale(S32& price)
3289 price = 0; 2970 price = 0;
3290 2971
3291 LLSelectNode *node; 2972 LLSelectNode *node;
3292 for (node = getFirstRootNode(); node; node = getNextRootNode() ) 2973 for (node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode() )
3293 { 2974 {
3294 if (node->mSaleInfo.isForSale()) 2975 if (node->mSaleInfo.isForSale())
3295 { 2976 {
@@ -3306,12 +2987,12 @@ BOOL LLSelectMgr::selectIsForSale(S32& price)
3306// accumulated sale info. 2987// accumulated sale info.
3307BOOL LLSelectMgr::selectGetSaleInfo(LLSaleInfo& sale_info) 2988BOOL LLSelectMgr::selectGetSaleInfo(LLSaleInfo& sale_info)
3308{ 2989{
3309 LLSelectNode* node = getFirstRootNode(); 2990 LLSelectNode* node = mSelectedObjects->getFirstRootNode();
3310 if (!node) return FALSE; 2991 if (!node) return FALSE;
3311 if (!node->mValid) return FALSE; 2992 if (!node->mValid) return FALSE;
3312 BOOL valid = TRUE; 2993 BOOL valid = TRUE;
3313 sale_info = node->mSaleInfo; 2994 sale_info = node->mSaleInfo;
3314 for(node = getNextRootNode(); node != NULL; node = getNextRootNode()) 2995 for(node = mSelectedObjects->getNextRootNode(); node != NULL; node = mSelectedObjects->getNextRootNode())
3315 { 2996 {
3316 if(!node->mValid) 2997 if(!node->mValid)
3317 { 2998 {
@@ -3325,12 +3006,12 @@ BOOL LLSelectMgr::selectGetSaleInfo(LLSaleInfo& sale_info)
3325 3006
3326BOOL LLSelectMgr::selectGetAggregatePermissions(LLAggregatePermissions& ag_perm) 3007BOOL LLSelectMgr::selectGetAggregatePermissions(LLAggregatePermissions& ag_perm)
3327{ 3008{
3328 LLSelectNode* node = getFirstNode(); 3009 LLSelectNode* node = mSelectedObjects->getFirstNode();
3329 if (!node) return FALSE; 3010 if (!node) return FALSE;
3330 if (!node->mValid) return FALSE; 3011 if (!node->mValid) return FALSE;
3331 BOOL valid = TRUE; 3012 BOOL valid = TRUE;
3332 ag_perm = node->mAggregatePerm; 3013 ag_perm = node->mAggregatePerm;
3333 for(node = getNextNode(); node != NULL; node = getNextNode()) 3014 for(node = mSelectedObjects->getNextNode(); node != NULL; node = mSelectedObjects->getNextNode())
3334 { 3015 {
3335 if(!node->mValid) 3016 if(!node->mValid)
3336 { 3017 {
@@ -3344,12 +3025,12 @@ BOOL LLSelectMgr::selectGetAggregatePermissions(LLAggregatePermissions& ag_perm)
3344 3025
3345BOOL LLSelectMgr::selectGetAggregateTexturePermissions(LLAggregatePermissions& ag_perm) 3026BOOL LLSelectMgr::selectGetAggregateTexturePermissions(LLAggregatePermissions& ag_perm)
3346{ 3027{
3347 LLSelectNode* node = getFirstNode(); 3028 LLSelectNode* node = mSelectedObjects->getFirstNode();
3348 if (!node) return FALSE; 3029 if (!node) return FALSE;
3349 if (!node->mValid) return FALSE; 3030 if (!node->mValid) return FALSE;
3350 BOOL valid = TRUE; 3031 BOOL valid = TRUE;
3351 ag_perm = node->getObject()->permYouOwner() ? node->mAggregateTexturePermOwner : node->mAggregateTexturePerm; 3032 ag_perm = node->getObject()->permYouOwner() ? node->mAggregateTexturePermOwner : node->mAggregateTexturePerm;
3352 for(node = getNextNode(); node != NULL; node = getNextNode()) 3033 for(node = mSelectedObjects->getNextNode(); node != NULL; node = mSelectedObjects->getNextNode())
3353 { 3034 {
3354 if(!node->mValid) 3035 if(!node->mValid)
3355 { 3036 {
@@ -3362,12 +3043,6 @@ BOOL LLSelectMgr::selectGetAggregateTexturePermissions(LLAggregatePermissions& a
3362} 3043}
3363 3044
3364 3045
3365// returns TRUE is any node is currenly worn as an attachment
3366BOOL LLSelectMgr::selectionIsAttachment()
3367{
3368 return (mSelectType == SELECT_TYPE_ATTACHMENT || mSelectType == SELECT_TYPE_HUD);
3369}
3370
3371//-------------------------------------------------------------------- 3046//--------------------------------------------------------------------
3372// Duplicate objects 3047// Duplicate objects
3373//-------------------------------------------------------------------- 3048//--------------------------------------------------------------------
@@ -3383,7 +3058,7 @@ struct LLDuplicateData
3383 3058
3384void LLSelectMgr::selectDuplicate(const LLVector3& offset, BOOL select_copy) 3059void LLSelectMgr::selectDuplicate(const LLVector3& offset, BOOL select_copy)
3385{ 3060{
3386 if (selectionIsAttachment()) 3061 if (mSelectedObjects->isAttachment())
3387 { 3062 {
3388 //RN: do not duplicate attachments 3063 //RN: do not duplicate attachments
3389 make_ui_sound("UISndInvalidOp"); 3064 make_ui_sound("UISndInvalidOp");
@@ -3403,7 +3078,7 @@ void LLSelectMgr::selectDuplicate(const LLVector3& offset, BOOL select_copy)
3403 } 3078 }
3404 else 3079 else
3405 { 3080 {
3406 for (LLSelectNode* node = getFirstRootNode(); node; node = getNextRootNode()) 3081 for (LLSelectNode* node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode())
3407 { 3082 {
3408 node->mDuplicated = TRUE; 3083 node->mDuplicated = TRUE;
3409 node->mDuplicatePos = node->getObject()->getPositionGlobal(); 3084 node->mDuplicatePos = node->getObject()->getPositionGlobal();
@@ -3414,7 +3089,7 @@ void LLSelectMgr::selectDuplicate(const LLVector3& offset, BOOL select_copy)
3414 3089
3415void LLSelectMgr::repeatDuplicate() 3090void LLSelectMgr::repeatDuplicate()
3416{ 3091{
3417 if (selectionIsAttachment()) 3092 if (mSelectedObjects->isAttachment())
3418 { 3093 {
3419 //RN: do not duplicate attachments 3094 //RN: do not duplicate attachments
3420 make_ui_sound("UISndInvalidOp"); 3095 make_ui_sound("UISndInvalidOp");
@@ -3424,7 +3099,7 @@ void LLSelectMgr::repeatDuplicate()
3424 LLSelectNode* node; 3099 LLSelectNode* node;
3425 LLDynamicArray<LLViewerObject*> non_duplicated_objects; 3100 LLDynamicArray<LLViewerObject*> non_duplicated_objects;
3426 3101
3427 for (node = getFirstRootNode(); node; node = getNextRootNode()) 3102 for (node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode())
3428 { 3103 {
3429 if (!node->mDuplicated) 3104 if (!node->mDuplicated)
3430 { 3105 {
@@ -3447,7 +3122,7 @@ void LLSelectMgr::repeatDuplicate()
3447 sendListToRegions("ObjectDuplicate", packDuplicateHeader, packDuplicate, &data, SEND_ONLY_ROOTS); 3122 sendListToRegions("ObjectDuplicate", packDuplicateHeader, packDuplicate, &data, SEND_ONLY_ROOTS);
3448 3123
3449 // move current selection based on delta from duplication position and update duplication position 3124 // move current selection based on delta from duplication position and update duplication position
3450 for (node = getFirstRootNode(); node; node = getNextRootNode()) 3125 for (node = mSelectedObjects->getFirstRootNode(); node; node = mSelectedObjects->getNextRootNode())
3451 { 3126 {
3452 if (node->mDuplicated) 3127 if (node->mDuplicated)
3453 { 3128 {
@@ -3502,7 +3177,7 @@ void LLSelectMgr::selectDuplicateOnRay(const LLVector3 &ray_start_region,
3502 BOOL copy_rotates, 3177 BOOL copy_rotates,
3503 BOOL select_copy) 3178 BOOL select_copy)
3504{ 3179{
3505 if (selectionIsAttachment()) 3180 if (mSelectedObjects->isAttachment())
3506 { 3181 {
3507 // do not duplicate attachments 3182 // do not duplicate attachments
3508 make_ui_sound("UISndInvalidOp"); 3183 make_ui_sound("UISndInvalidOp");
@@ -3714,7 +3389,7 @@ struct LLPermData
3714}; 3389};
3715 3390
3716// TODO: Make this able to fail elegantly. 3391// TODO: Make this able to fail elegantly.
3717void LLSelectMgr::setObjectPermissions(U8 field, 3392void LLSelectMgr::selectionSetObjectPermissions(U8 field,
3718 BOOL set, 3393 BOOL set,
3719 U32 mask, 3394 U32 mask,
3720 BOOL override) 3395 BOOL override)
@@ -3751,7 +3426,7 @@ void LLSelectMgr::sendSelect()
3751 3426
3752void LLSelectMgr::deselectAll() 3427void LLSelectMgr::deselectAll()
3753{ 3428{
3754 if (!mSelectedObjects.getNumNodes()) 3429 if (!mSelectedObjects->getNumNodes())
3755 { 3430 {
3756 return; 3431 return;
3757 } 3432 }
@@ -3772,42 +3447,29 @@ void LLSelectMgr::deselectAll()
3772 updateSelectionCenter(); 3447 updateSelectionCenter();
3773} 3448}
3774 3449
3775void LLSelectMgr::deselectTransient() 3450void LLSelectMgr::deselectUnused()
3776{ 3451{
3777 std::set<LLViewerObject*> objects_to_deselect; 3452 // no more outstanding references to this selection
3778 LLSelectNode *nodep; 3453 if (mSelectedObjects->getNumRefs() == 1)
3779 for (nodep = mSelectedObjects.getFirstNode(); nodep; nodep = mSelectedObjects.getNextNode())
3780 {
3781 if (nodep->isTransient())
3782 {
3783 objects_to_deselect.insert(nodep->getObject());
3784 }
3785 }
3786
3787 std::set<LLViewerObject*>::iterator iter;
3788 for (iter = objects_to_deselect.begin();
3789 iter != objects_to_deselect.end();
3790 ++iter)
3791 { 3454 {
3792 deselectObjectOnly(*iter); 3455 deselectAll();
3793 } 3456 }
3794
3795 gHUDManager->clearJoints();
3796 updateSelectionCenter();
3797} 3457}
3798 3458
3799void LLSelectMgr::convertTransient() 3459void LLSelectMgr::convertTransient()
3800{ 3460{
3801 LLSelectNode *nodep; 3461 // use STL-style iteration to avoid recursive iteration problems
3802 for (nodep = mSelectedObjects.getFirstNode(); nodep; nodep = mSelectedObjects.getNextNode()) 3462 LLObjectSelection::iterator node_it;
3463 for (node_it = mSelectedObjects->begin(); node_it != mSelectedObjects->end(); ++node_it)
3803 { 3464 {
3465 LLSelectNode *nodep = *node_it;
3804 nodep->setTransient(FALSE); 3466 nodep->setTransient(FALSE);
3805 } 3467 }
3806} 3468}
3807 3469
3808void LLSelectMgr::deselectAllIfTooFar() 3470void LLSelectMgr::deselectAllIfTooFar()
3809{ 3471{
3810 if (isEmpty() || mSelectType == SELECT_TYPE_HUD) 3472 if (mSelectedObjects->isEmpty() || mSelectedObjects->mSelectType == SELECT_TYPE_HUD)
3811 { 3473 {
3812 return; 3474 return;
3813 } 3475 }
@@ -3844,10 +3506,10 @@ void LLSelectMgr::deselectAllIfTooFar()
3844} 3506}
3845 3507
3846 3508
3847void LLSelectMgr::setObjectName(const LLString& name) 3509void LLSelectMgr::selectionSetObjectName(const LLString& name)
3848{ 3510{
3849 // we only work correctly if 1 object is selected. 3511 // we only work correctly if 1 object is selected.
3850 if(getRootObjectCount() == 1) 3512 if(mSelectedObjects->getRootObjectCount() == 1)
3851 { 3513 {
3852 sendListToRegions("ObjectName", 3514 sendListToRegions("ObjectName",
3853 packAgentAndSessionID, 3515 packAgentAndSessionID,
@@ -3855,7 +3517,7 @@ void LLSelectMgr::setObjectName(const LLString& name)
3855 (void*)name.c_str(), 3517 (void*)name.c_str(),
3856 SEND_ONLY_ROOTS); 3518 SEND_ONLY_ROOTS);
3857 } 3519 }
3858 else if(getObjectCount() == 1) 3520 else if(mSelectedObjects->getObjectCount() == 1)
3859 { 3521 {
3860 sendListToRegions("ObjectName", 3522 sendListToRegions("ObjectName",
3861 packAgentAndSessionID, 3523 packAgentAndSessionID,
@@ -3865,10 +3527,10 @@ void LLSelectMgr::setObjectName(const LLString& name)
3865 } 3527 }
3866} 3528}
3867 3529
3868void LLSelectMgr::setObjectDescription(const LLString& desc) 3530void LLSelectMgr::selectionSetObjectDescription(const LLString& desc)
3869{ 3531{
3870 // we only work correctly if 1 object is selected. 3532 // we only work correctly if 1 object is selected.
3871 if(getRootObjectCount() == 1) 3533 if(mSelectedObjects->getRootObjectCount() == 1)
3872 { 3534 {
3873 sendListToRegions("ObjectDescription", 3535 sendListToRegions("ObjectDescription",
3874 packAgentAndSessionID, 3536 packAgentAndSessionID,
@@ -3876,7 +3538,7 @@ void LLSelectMgr::setObjectDescription(const LLString& desc)
3876 (void*)desc.c_str(), 3538 (void*)desc.c_str(),
3877 SEND_ONLY_ROOTS); 3539 SEND_ONLY_ROOTS);
3878 } 3540 }
3879 else if(getObjectCount() == 1) 3541 else if(mSelectedObjects->getObjectCount() == 1)
3880 { 3542 {
3881 sendListToRegions("ObjectDescription", 3543 sendListToRegions("ObjectDescription",
3882 packAgentAndSessionID, 3544 packAgentAndSessionID,
@@ -3886,11 +3548,11 @@ void LLSelectMgr::setObjectDescription(const LLString& desc)
3886 } 3548 }
3887} 3549}
3888 3550
3889void LLSelectMgr::setObjectCategory(const LLCategory& category) 3551void LLSelectMgr::selectionSetObjectCategory(const LLCategory& category)
3890{ 3552{
3891 // for now, we only want to be able to set one root category at 3553 // for now, we only want to be able to set one root category at
3892 // a time. 3554 // a time.
3893 if(getRootObjectCount() != 1) return; 3555 if(mSelectedObjects->getRootObjectCount() != 1) return;
3894 sendListToRegions("ObjectCategory", 3556 sendListToRegions("ObjectCategory",
3895 packAgentAndSessionID, 3557 packAgentAndSessionID,
3896 packObjectCategory, 3558 packObjectCategory,
@@ -3898,10 +3560,10 @@ void LLSelectMgr::setObjectCategory(const LLCategory& category)
3898 SEND_ONLY_ROOTS); 3560 SEND_ONLY_ROOTS);
3899} 3561}
3900 3562
3901void LLSelectMgr::setObjectSaleInfo(const LLSaleInfo& sale_info) 3563void LLSelectMgr::selectionSetObjectSaleInfo(const LLSaleInfo& sale_info)
3902{ 3564{
3903 // Only one sale info at a time for now 3565 // Only one sale info at a time for now
3904 if(getRootObjectCount() != 1) return; 3566 if(mSelectedObjects->getRootObjectCount() != 1) return;
3905 sendListToRegions("ObjectSaleInfo", 3567 sendListToRegions("ObjectSaleInfo",
3906 packAgentAndSessionID, 3568 packAgentAndSessionID,
3907 packObjectSaleInfo, 3569 packObjectSaleInfo,
@@ -3915,16 +3577,17 @@ void LLSelectMgr::setObjectSaleInfo(const LLSaleInfo& sale_info)
3915 3577
3916void LLSelectMgr::sendAttach(U8 attachment_point) 3578void LLSelectMgr::sendAttach(U8 attachment_point)
3917{ 3579{
3918 LLViewerObject* attach_object = mSelectedObjects.getFirstRootObject(); 3580 LLViewerObject* attach_object = mSelectedObjects->getFirstRootObject();
3919 3581
3920 if (!attach_object || !gAgent.getAvatarObject() || mSelectType != SELECT_TYPE_WORLD) 3582 if (!attach_object || !gAgent.getAvatarObject() || mSelectedObjects->mSelectType != SELECT_TYPE_WORLD)
3921 { 3583 {
3922 return; 3584 return;
3923 } 3585 }
3924 3586
3925 BOOL build_mode = gToolMgr->inEdit(); 3587 BOOL build_mode = gToolMgr->inEdit();
3926 // Special case: Attach to default location for this object. 3588 // Special case: Attach to default location for this object.
3927 if (0 == attachment_point) 3589 if (0 == attachment_point ||
3590 gAgent.getAvatarObject()->mAttachmentPoints.getIfThere(attachment_point))
3928 { 3591 {
3929 sendListToRegions( 3592 sendListToRegions(
3930 "ObjectAttach", 3593 "ObjectAttach",
@@ -3937,53 +3600,11 @@ void LLSelectMgr::sendAttach(U8 attachment_point)
3937 deselectAll(); 3600 deselectAll();
3938 } 3601 }
3939 } 3602 }
3940 else
3941 {
3942 LLViewerJointAttachment* attachment = gAgent.getAvatarObject()->mAttachmentPoints.getIfThere(attachment_point);
3943 if (attachment)
3944 {
3945 LLQuaternion object_world_rot = attach_object->getRenderRotation();
3946 LLQuaternion attachment_pt__world_rot = attachment->getWorldRotation();
3947 LLQuaternion local_rot = object_world_rot * ~attachment_pt__world_rot;
3948
3949 F32 x,y,z;
3950 local_rot.getEulerAngles(&x, &y, &z);
3951 // snap to nearest 90 degree rotation
3952 // make sure all euler angles are positive
3953 if (x < F_PI_BY_TWO) x += F_TWO_PI;
3954 if (y < F_PI_BY_TWO) y += F_TWO_PI;
3955 if (z < F_PI_BY_TWO) z += F_TWO_PI;
3956
3957 // add 45 degrees so that rounding down becomes rounding off
3958 x += F_PI_BY_TWO / 2.f;
3959 y += F_PI_BY_TWO / 2.f;
3960 z += F_PI_BY_TWO / 2.f;
3961 // round down to nearest multiple of 90 degrees
3962 x -= fmodf(x, F_PI_BY_TWO);
3963 y -= fmodf(y, F_PI_BY_TWO);
3964 z -= fmodf(z, F_PI_BY_TWO);
3965
3966 // pass the requested rotation on to the simulator
3967 local_rot.setQuat(x, y, z);
3968 attach_object->setRotation(local_rot);
3969
3970 sendListToRegions(
3971 "ObjectAttach",
3972 packAgentIDAndSessionAndAttachment,
3973 packObjectIDAndRotation,
3974 &attachment_point,
3975 SEND_ONLY_ROOTS );
3976 if (!build_mode)
3977 {
3978 deselectAll();
3979 }
3980 }
3981 }
3982} 3603}
3983 3604
3984void LLSelectMgr::sendDetach() 3605void LLSelectMgr::sendDetach()
3985{ 3606{
3986 if (!mSelectedObjects.getNumNodes() || mSelectType == SELECT_TYPE_WORLD) 3607 if (!mSelectedObjects->getNumNodes() || mSelectedObjects->mSelectType == SELECT_TYPE_WORLD)
3987 { 3608 {
3988 return; 3609 return;
3989 } 3610 }
@@ -3999,7 +3620,7 @@ void LLSelectMgr::sendDetach()
3999 3620
4000void LLSelectMgr::sendDropAttachment() 3621void LLSelectMgr::sendDropAttachment()
4001{ 3622{
4002 if (!mSelectedObjects.getNumNodes() || mSelectType == SELECT_TYPE_WORLD) 3623 if (!mSelectedObjects->getNumNodes() || mSelectedObjects->mSelectType == SELECT_TYPE_WORLD)
4003 { 3624 {
4004 return; 3625 return;
4005 } 3626 }
@@ -4018,7 +3639,7 @@ void LLSelectMgr::sendDropAttachment()
4018 3639
4019void LLSelectMgr::sendLink() 3640void LLSelectMgr::sendLink()
4020{ 3641{
4021 if (!mSelectedObjects.getNumNodes()) 3642 if (!mSelectedObjects->getNumNodes())
4022 { 3643 {
4023 return; 3644 return;
4024 } 3645 }
@@ -4033,7 +3654,7 @@ void LLSelectMgr::sendLink()
4033 3654
4034void LLSelectMgr::sendDelink() 3655void LLSelectMgr::sendDelink()
4035{ 3656{
4036 if (!mSelectedObjects.getNumNodes()) 3657 if (!mSelectedObjects->getNumNodes())
4037 { 3658 {
4038 return; 3659 return;
4039 } 3660 }
@@ -4055,7 +3676,7 @@ void LLSelectMgr::sendDelink()
4055 3676
4056void LLSelectMgr::sendHinge(U8 type) 3677void LLSelectMgr::sendHinge(U8 type)
4057{ 3678{
4058 if (!mSelectedObjects.getNumNodes()) 3679 if (!mSelectedObjects->getNumNodes())
4059 { 3680 {
4060 return; 3681 return;
4061 } 3682 }
@@ -4071,7 +3692,7 @@ void LLSelectMgr::sendHinge(U8 type)
4071 3692
4072void LLSelectMgr::sendDehinge() 3693void LLSelectMgr::sendDehinge()
4073{ 3694{
4074 if (!mSelectedObjects.getNumNodes()) 3695 if (!mSelectedObjects->getNumNodes())
4075 { 3696 {
4076 return; 3697 return;
4077 } 3698 }
@@ -4086,7 +3707,7 @@ void LLSelectMgr::sendDehinge()
4086 3707
4087void LLSelectMgr::sendSelect() 3708void LLSelectMgr::sendSelect()
4088{ 3709{
4089 if (!mSelectedObjects.getNumNodes()) 3710 if (!mSelectedObjects->getNumNodes())
4090 { 3711 {
4091 return; 3712 return;
4092 } 3713 }
@@ -4116,7 +3737,7 @@ void LLSelectMgr::selectionDump()
4116{ 3737{
4117 LLViewerObject *object; 3738 LLViewerObject *object;
4118 3739
4119 for (object = getFirstObject(); object; object = getNextObject() ) 3740 for (object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
4120 { 3741 {
4121 object->dump(); 3742 object->dump();
4122 } 3743 }
@@ -4125,7 +3746,7 @@ void LLSelectMgr::selectionDump()
4125void LLSelectMgr::saveSelectedObjectColors() 3746void LLSelectMgr::saveSelectedObjectColors()
4126{ 3747{
4127 LLSelectNode* selectNode; 3748 LLSelectNode* selectNode;
4128 for (selectNode = getFirstNode(); selectNode; selectNode = getNextNode() ) 3749 for (selectNode = mSelectedObjects->getFirstNode(); selectNode; selectNode = mSelectedObjects->getNextNode() )
4129 { 3750 {
4130 selectNode->saveColors(); 3751 selectNode->saveColors();
4131 } 3752 }
@@ -4136,7 +3757,7 @@ void LLSelectMgr::saveSelectedObjectTextures()
4136 LLSelectNode* selectNode; 3757 LLSelectNode* selectNode;
4137 3758
4138 // invalidate current selection so we update saved textures 3759 // invalidate current selection so we update saved textures
4139 for (selectNode = getFirstNode(); selectNode; selectNode = getNextNode() ) 3760 for (selectNode = mSelectedObjects->getFirstNode(); selectNode; selectNode = mSelectedObjects->getNextNode() )
4140 { 3761 {
4141 selectNode->mValid = FALSE; 3762 selectNode->mValid = FALSE;
4142 } 3763 }
@@ -4152,13 +3773,13 @@ void LLSelectMgr::saveSelectedObjectTransform(EActionType action_type)
4152{ 3773{
4153 LLSelectNode* selectNode; 3774 LLSelectNode* selectNode;
4154 3775
4155 if (isEmpty()) 3776 if (mSelectedObjects->isEmpty())
4156 { 3777 {
4157 // nothing selected, so nothing to save 3778 // nothing selected, so nothing to save
4158 return; 3779 return;
4159 } 3780 }
4160 3781
4161 for (selectNode = getFirstNode(); selectNode; selectNode = getNextNode() ) 3782 for (selectNode = mSelectedObjects->getFirstNode(); selectNode; selectNode = mSelectedObjects->getNextNode() )
4162 { 3783 {
4163 LLViewerObject* object; 3784 LLViewerObject* object;
4164 object = selectNode->getObject(); 3785 object = selectNode->getObject();
@@ -4168,7 +3789,10 @@ void LLSelectMgr::saveSelectedObjectTransform(EActionType action_type)
4168 if (object->isRootEdit()) 3789 if (object->isRootEdit())
4169 { 3790 {
4170 LLXform* parent_xform = object->mDrawable->getXform()->getParent(); 3791 LLXform* parent_xform = object->mDrawable->getXform()->getParent();
4171 selectNode->mSavedPositionGlobal = gAgent.getPosGlobalFromAgent((object->getPosition() * parent_xform->getWorldRotation()) + parent_xform->getWorldPosition()); 3792 if (parent_xform)
3793 {
3794 selectNode->mSavedPositionGlobal = gAgent.getPosGlobalFromAgent((object->getPosition() * parent_xform->getWorldRotation()) + parent_xform->getWorldPosition());
3795 }
4172 } 3796 }
4173 else 3797 else
4174 { 3798 {
@@ -4189,42 +3813,6 @@ void LLSelectMgr::saveSelectedObjectTransform(EActionType action_type)
4189 selectNode->mSavedScale = object->getScale(); 3813 selectNode->mSavedScale = object->getScale();
4190 selectNode->saveTextureScaleRatios(); 3814 selectNode->saveTextureScaleRatios();
4191 3815
4192 if (object->isAttachment() &&
4193 action_type != SELECT_ACTION_TYPE_PICK)
4194 {
4195 LLSelectAction* selectAction = new LLSelectAction();
4196 selectAction->mActionType = action_type;
4197 selectAction->mPosition = object->getPosition();
4198 selectAction->mRotation = object->getRotation();
4199 selectAction->mScale = object->getScale();
4200 selectAction->mObjectID = object->getID();
4201 selectAction->mIndividualSelection = selectNode->mIndividualSelection;
4202
4203 mUndoQueue.push_back(selectAction);
4204
4205 while ((mUndoQueue.size() > (U32)MAX_ACTION_QUEUE_SIZE))
4206 {
4207 LLSelectAction* action = mUndoQueue.front();
4208 mUndoQueue.pop_front();
4209 delete action;
4210 }
4211
4212 // remove this object from the redo queue
4213 std::deque<LLSelectAction*>::iterator it;
4214 for (it = mRedoQueue.begin(); it != mRedoQueue.end();)
4215 {
4216 if ((*it)->mObjectID == object->getID())
4217 {
4218 LLSelectAction* actionp = *it;
4219 it = mRedoQueue.erase(it);
4220 delete actionp;
4221 }
4222 else
4223 {
4224 ++it;
4225 }
4226 }
4227 }
4228 } 3816 }
4229 mSavedSelectionBBox = getBBoxOfSelection(); 3817 mSavedSelectionBBox = getBBoxOfSelection();
4230} 3818}
@@ -4233,7 +3821,7 @@ void LLSelectMgr::selectionUpdatePhysics(BOOL physics)
4233{ 3821{
4234 LLViewerObject *object; 3822 LLViewerObject *object;
4235 3823
4236 for (object = getFirstObject(); object; object = getNextObject() ) 3824 for (object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
4237 { 3825 {
4238 if ( !object->permModify() // preemptive permissions check 3826 if ( !object->permModify() // preemptive permissions check
4239 || !(object->isRoot() // don't send for child objects 3827 || !(object->isRoot() // don't send for child objects
@@ -4249,7 +3837,7 @@ void LLSelectMgr::selectionUpdateTemporary(BOOL is_temporary)
4249{ 3837{
4250 LLViewerObject *object; 3838 LLViewerObject *object;
4251 3839
4252 for (object = getFirstObject(); object; object = getNextObject() ) 3840 for (object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
4253 { 3841 {
4254 if ( !object->permModify() // preemptive permissions check 3842 if ( !object->permModify() // preemptive permissions check
4255 || !(object->isRoot() // don't send for child objects 3843 || !(object->isRoot() // don't send for child objects
@@ -4265,7 +3853,7 @@ void LLSelectMgr::selectionUpdatePhantom(BOOL is_phantom)
4265{ 3853{
4266 LLViewerObject *object; 3854 LLViewerObject *object;
4267 3855
4268 for (object = getFirstObject(); object; object = getNextObject() ) 3856 for (object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
4269 { 3857 {
4270 if ( !object->permModify() // preemptive permissions check 3858 if ( !object->permModify() // preemptive permissions check
4271 || !(object->isRoot() // don't send for child objects 3859 || !(object->isRoot() // don't send for child objects
@@ -4281,7 +3869,7 @@ void LLSelectMgr::selectionUpdateCastShadows(BOOL cast_shadows)
4281{ 3869{
4282 LLViewerObject *object; 3870 LLViewerObject *object;
4283 3871
4284 for (object = getFirstObject(); object; object = getNextObject() ) 3872 for (object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
4285 { 3873 {
4286 if ( !object->permModify() // preemptive permissions check 3874 if ( !object->permModify() // preemptive permissions check
4287 || object->isJointChild()) 3875 || object->isJointChild())
@@ -4505,70 +4093,81 @@ void LLSelectMgr::sendListToRegions(const LLString& message_name,
4505 S32 packets_sent = 0; 4093 S32 packets_sent = 0;
4506 S32 objects_in_this_packet = 0; 4094 S32 objects_in_this_packet = 0;
4507 4095
4096
4097 //clear update override data (allow next update through)
4098 for (node = mSelectedObjects->getFirstNode();
4099 node;
4100 node = mSelectedObjects->getNextNode())
4101 {
4102 node->mLastPositionLocal.setVec(0,0,0);
4103 node->mLastRotation = LLQuaternion();
4104 node->mLastScale.setVec(0,0,0);
4105 }
4106
4508 std::queue<LLSelectNode*> nodes_to_send; 4107 std::queue<LLSelectNode*> nodes_to_send;
4509 4108
4510 switch(send_type) 4109 switch(send_type)
4511 { 4110 {
4512 case SEND_ONLY_ROOTS: 4111 case SEND_ONLY_ROOTS:
4513 node = mSelectedObjects.getFirstRootNode(); 4112 node = mSelectedObjects->getFirstRootNode();
4514 while(node) 4113 while(node)
4515 { 4114 {
4516 nodes_to_send.push(node); 4115 nodes_to_send.push(node);
4517 node = mSelectedObjects.getNextRootNode(); 4116 node = mSelectedObjects->getNextRootNode();
4518 } 4117 }
4519 break; 4118 break;
4520 case SEND_INDIVIDUALS: 4119 case SEND_INDIVIDUALS:
4521 node = mSelectedObjects.getFirstNode(); 4120 node = mSelectedObjects->getFirstNode();
4522 while(node) 4121 while(node)
4523 { 4122 {
4524 nodes_to_send.push(node); 4123 nodes_to_send.push(node);
4525 node = mSelectedObjects.getNextNode(); 4124 node = mSelectedObjects->getNextNode();
4526 } 4125 }
4527 break; 4126 break;
4528 case SEND_ROOTS_FIRST: 4127 case SEND_ROOTS_FIRST:
4529 // first roots... 4128 // first roots...
4530 node = mSelectedObjects.getFirstNode(); 4129 node = mSelectedObjects->getFirstNode();
4531 while(node) 4130 while(node)
4532 { 4131 {
4533 if (node->getObject()->isRootEdit()) 4132 if (node->getObject()->isRootEdit())
4534 { 4133 {
4535 nodes_to_send.push(node); 4134 nodes_to_send.push(node);
4536 } 4135 }
4537 node = mSelectedObjects.getNextNode(); 4136 node = mSelectedObjects->getNextNode();
4538 } 4137 }
4539 4138
4540 // then children... 4139 // then children...
4541 node = mSelectedObjects.getFirstNode(); 4140 node = mSelectedObjects->getFirstNode();
4542 while(node) 4141 while(node)
4543 { 4142 {
4544 if (!node->getObject()->isRootEdit()) 4143 if (!node->getObject()->isRootEdit())
4545 { 4144 {
4546 nodes_to_send.push(node); 4145 nodes_to_send.push(node);
4547 } 4146 }
4548 node = mSelectedObjects.getNextNode(); 4147 node = mSelectedObjects->getNextNode();
4549 } 4148 }
4550 break; 4149 break;
4551 case SEND_CHILDREN_FIRST: 4150 case SEND_CHILDREN_FIRST:
4552 // first children... 4151 // first children...
4553 node = mSelectedObjects.getFirstNode(); 4152 node = mSelectedObjects->getFirstNode();
4554 while(node) 4153 while(node)
4555 { 4154 {
4556 if (!node->getObject()->isRootEdit()) 4155 if (!node->getObject()->isRootEdit())
4557 { 4156 {
4558 nodes_to_send.push(node); 4157 nodes_to_send.push(node);
4559 } 4158 }
4560 node = mSelectedObjects.getNextNode(); 4159 node = mSelectedObjects->getNextNode();
4561 } 4160 }
4562 4161
4563 // ...then roots 4162 // ...then roots
4564 node = mSelectedObjects.getFirstNode(); 4163 node = mSelectedObjects->getFirstNode();
4565 while(node) 4164 while(node)
4566 { 4165 {
4567 if (node->getObject()->isRootEdit()) 4166 if (node->getObject()->isRootEdit())
4568 { 4167 {
4569 nodes_to_send.push(node); 4168 nodes_to_send.push(node);
4570 } 4169 }
4571 node = mSelectedObjects.getNextNode(); 4170 node = mSelectedObjects->getNextNode();
4572 } 4171 }
4573 break; 4172 break;
4574 4173
@@ -4720,14 +4319,14 @@ void LLSelectMgr::processObjectProperties(LLMessageSystem* msg, void** user_data
4720 4319
4721 msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_LastOwnerID, last_owner_id, i); 4320 msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_LastOwnerID, last_owner_id, i);
4722 4321
4723 char name[DB_INV_ITEM_NAME_BUF_SIZE]; 4322 char name[DB_INV_ITEM_NAME_BUF_SIZE]; /* Flawfinder: ignore */
4724 msg->getStringFast(_PREHASH_ObjectData, _PREHASH_Name, DB_INV_ITEM_NAME_BUF_SIZE, name, i); 4323 msg->getStringFast(_PREHASH_ObjectData, _PREHASH_Name, DB_INV_ITEM_NAME_BUF_SIZE, name, i);
4725 char desc[DB_INV_ITEM_DESC_BUF_SIZE]; 4324 char desc[DB_INV_ITEM_DESC_BUF_SIZE]; /* Flawfinder: ignore */
4726 msg->getStringFast(_PREHASH_ObjectData, _PREHASH_Description, DB_INV_ITEM_DESC_BUF_SIZE, desc, i); 4325 msg->getStringFast(_PREHASH_ObjectData, _PREHASH_Description, DB_INV_ITEM_DESC_BUF_SIZE, desc, i);
4727 4326
4728 char touch_name[DB_INV_ITEM_NAME_BUF_SIZE]; 4327 char touch_name[DB_INV_ITEM_NAME_BUF_SIZE]; /* Flawfinder: ignore */
4729 msg->getStringFast(_PREHASH_ObjectData, _PREHASH_TouchName, DB_INV_ITEM_NAME_BUF_SIZE, touch_name, i); 4328 msg->getStringFast(_PREHASH_ObjectData, _PREHASH_TouchName, DB_INV_ITEM_NAME_BUF_SIZE, touch_name, i);
4730 char sit_name[DB_INV_ITEM_DESC_BUF_SIZE]; 4329 char sit_name[DB_INV_ITEM_DESC_BUF_SIZE]; /* Flawfinder: ignore */
4731 msg->getStringFast(_PREHASH_ObjectData, _PREHASH_SitName, DB_INV_ITEM_DESC_BUF_SIZE, sit_name, i); 4330 msg->getStringFast(_PREHASH_ObjectData, _PREHASH_SitName, DB_INV_ITEM_DESC_BUF_SIZE, sit_name, i);
4732 4331
4733 //unpack TE IDs 4332 //unpack TE IDs
@@ -4741,7 +4340,7 @@ void LLSelectMgr::processObjectProperties(LLMessageSystem* msg, void** user_data
4741 for (S32 buf_offset = 0; buf_offset < size; buf_offset += UUID_BYTES) 4340 for (S32 buf_offset = 0; buf_offset < size; buf_offset += UUID_BYTES)
4742 { 4341 {
4743 LLUUID id; 4342 LLUUID id;
4744 memcpy(id.mData, packed_buffer + buf_offset, UUID_BYTES); 4343 memcpy(id.mData, packed_buffer + buf_offset, UUID_BYTES); /* Flawfinder: ignore */
4745 texture_ids.push_back(id); 4344 texture_ids.push_back(id);
4746 } 4345 }
4747 } 4346 }
@@ -4750,9 +4349,9 @@ void LLSelectMgr::processObjectProperties(LLMessageSystem* msg, void** user_data
4750 // Iterate through nodes at end, since it can be on both the regular AND hover list 4349 // Iterate through nodes at end, since it can be on both the regular AND hover list
4751 BOOL found = FALSE; 4350 BOOL found = FALSE;
4752 LLSelectNode* node; 4351 LLSelectNode* node;
4753 for (node = gSelectMgr->mSelectedObjects.getFirstNode(); 4352 for (node = gSelectMgr->mSelectedObjects->getFirstNode();
4754 node; 4353 node;
4755 node = gSelectMgr->mSelectedObjects.getNextNode()) 4354 node = gSelectMgr->mSelectedObjects->getNextNode())
4756 { 4355 {
4757 if (node->getObject()->mID == id) 4356 if (node->getObject()->mID == id)
4758 { 4357 {
@@ -4874,10 +4473,10 @@ void LLSelectMgr::processObjectPropertiesFamily(LLMessageSystem* msg, void** use
4874 msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_LastOwnerID, last_owner_id ); 4473 msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_LastOwnerID, last_owner_id );
4875 4474
4876 // unpack name & desc 4475 // unpack name & desc
4877 char name[DB_INV_ITEM_NAME_BUF_SIZE]; 4476 char name[DB_INV_ITEM_NAME_BUF_SIZE]; /* Flawfinder: ignore */
4878 msg->getStringFast(_PREHASH_ObjectData, _PREHASH_Name, DB_INV_ITEM_NAME_BUF_SIZE, name); 4477 msg->getStringFast(_PREHASH_ObjectData, _PREHASH_Name, DB_INV_ITEM_NAME_BUF_SIZE, name);
4879 4478
4880 char desc[DB_INV_ITEM_DESC_BUF_SIZE]; 4479 char desc[DB_INV_ITEM_DESC_BUF_SIZE]; /* Flawfinder: ignore */
4881 msg->getStringFast(_PREHASH_ObjectData, _PREHASH_Description, DB_INV_ITEM_DESC_BUF_SIZE, desc); 4480 msg->getStringFast(_PREHASH_ObjectData, _PREHASH_Description, DB_INV_ITEM_DESC_BUF_SIZE, desc);
4882 4481
4883 // the reporter widget askes the server for info about picked objects 4482 // the reporter widget askes the server for info about picked objects
@@ -4887,8 +4486,8 @@ void LLSelectMgr::processObjectPropertiesFamily(LLMessageSystem* msg, void** use
4887 LLFloaterReporter *reporterp = LLFloaterReporter::getReporter(report_type); 4486 LLFloaterReporter *reporterp = LLFloaterReporter::getReporter(report_type);
4888 if (reporterp) 4487 if (reporterp)
4889 { 4488 {
4890 char first_name[DB_FIRST_NAME_BUF_SIZE]; 4489 char first_name[DB_FIRST_NAME_BUF_SIZE]; /* Flawfinder: ignore */
4891 char last_name[DB_LAST_NAME_BUF_SIZE]; 4490 char last_name[DB_LAST_NAME_BUF_SIZE]; /* Flawfinder: ignore */
4892 gCacheName->getName(owner_id, first_name, last_name); 4491 gCacheName->getName(owner_id, first_name, last_name);
4893 LLString fullname(first_name); 4492 LLString fullname(first_name);
4894 fullname.append(" "); 4493 fullname.append(" ");
@@ -4900,9 +4499,9 @@ void LLSelectMgr::processObjectPropertiesFamily(LLMessageSystem* msg, void** use
4900 // Now look through all of the hovered nodes 4499 // Now look through all of the hovered nodes
4901 BOOL found = FALSE; 4500 BOOL found = FALSE;
4902 LLSelectNode* node; 4501 LLSelectNode* node;
4903 for (node = gSelectMgr->mHoverObjects.getFirstNode(); 4502 for (node = gSelectMgr->mHoverObjects->getFirstNode();
4904 node; 4503 node;
4905 node = gSelectMgr->mHoverObjects.getNextNode()) 4504 node = gSelectMgr->mHoverObjects->getNextNode())
4906 { 4505 {
4907 if (node->getObject()->mID == id) 4506 if (node->getObject()->mID == id)
4908 { 4507 {
@@ -4985,7 +4584,7 @@ void LLSelectMgr::updateSilhouettes()
4985 4584
4986 if((cameraPos - mLastCameraPos).magVecSquared() > SILHOUETTE_UPDATE_THRESHOLD_SQUARED * currentCameraZoom * currentCameraZoom) 4585 if((cameraPos - mLastCameraPos).magVecSquared() > SILHOUETTE_UPDATE_THRESHOLD_SQUARED * currentCameraZoom * currentCameraZoom)
4987 { 4586 {
4988 for (node = mSelectedObjects.getFirstNode(); node; node = mSelectedObjects.getNextNode() ) 4587 for (node = mSelectedObjects->getFirstNode(); node; node = mSelectedObjects->getNextNode() )
4989 { 4588 {
4990 if (node->getObject()) 4589 if (node->getObject())
4991 { 4590 {
@@ -4998,7 +4597,7 @@ void LLSelectMgr::updateSilhouettes()
4998 4597
4999 LLDynamicArray<LLViewerObject*> changed_objects; 4598 LLDynamicArray<LLViewerObject*> changed_objects;
5000 4599
5001 if (mSelectedObjects.getNumNodes()) 4600 if (mSelectedObjects->getNumNodes())
5002 { 4601 {
5003 //gGLSPipelineSelection.set(); 4602 //gGLSPipelineSelection.set();
5004 4603
@@ -5007,7 +4606,7 @@ void LLSelectMgr::updateSilhouettes()
5007 4606
5008 for (S32 pass = 0; pass < 2; pass++) 4607 for (S32 pass = 0; pass < 2; pass++)
5009 { 4608 {
5010 for (node = mSelectedObjects.getFirstNode(); node; node = mSelectedObjects.getNextNode() ) 4609 for (node = mSelectedObjects->getFirstNode(); node; node = mSelectedObjects->getNextNode() )
5011 { 4610 {
5012 LLViewerObject* objectp = node->getObject(); 4611 LLViewerObject* objectp = node->getObject();
5013 4612
@@ -5023,7 +4622,7 @@ void LLSelectMgr::updateSilhouettes()
5023 || objectp->isChanged(LLXform::SILHOUETTE) 4622 || objectp->isChanged(LLXform::SILHOUETTE)
5024 || (objectp->getParent() && objectp->getParent()->isChanged(LLXform::SILHOUETTE))) 4623 || (objectp->getParent() && objectp->getParent()->isChanged(LLXform::SILHOUETTE)))
5025 { 4624 {
5026 if (num_sils_genned++ < MAX_SILS_PER_FRAME && objectp->mDrawable->isVisible()) 4625 if (num_sils_genned++ < MAX_SILS_PER_FRAME)// && objectp->mDrawable->isVisible())
5027 { 4626 {
5028 generateSilhouette(node, gCamera->getOrigin()); 4627 generateSilhouette(node, gCamera->getOrigin());
5029 changed_objects.put(objectp); 4628 changed_objects.put(objectp);
@@ -5077,7 +4676,7 @@ void LLSelectMgr::updateSilhouettes()
5077 // remove highlight nodes not in roots list 4676 // remove highlight nodes not in roots list
5078 LLDynamicArray<LLSelectNode*> remove_these_nodes; 4677 LLDynamicArray<LLSelectNode*> remove_these_nodes;
5079 LLDynamicArray<LLViewerObject*> remove_these_roots; 4678 LLDynamicArray<LLViewerObject*> remove_these_roots;
5080 for (LLSelectNode* nodep = mHighlightedObjects.getFirstNode(); nodep; nodep = mHighlightedObjects.getNextNode()) 4679 for (LLSelectNode* nodep = mHighlightedObjects->getFirstNode(); nodep; nodep = mHighlightedObjects->getNextNode())
5081 { 4680 {
5082 LLViewerObject* objectp = nodep->getObject(); 4681 LLViewerObject* objectp = nodep->getObject();
5083 if (objectp->isRoot() || !select_linked_set) 4682 if (objectp->isRoot() || !select_linked_set)
@@ -5106,7 +4705,7 @@ void LLSelectMgr::updateSilhouettes()
5106 S32 i; 4705 S32 i;
5107 for (i = 0; i < remove_these_nodes.count(); i++) 4706 for (i = 0; i < remove_these_nodes.count(); i++)
5108 { 4707 {
5109 mHighlightedObjects.removeNode(remove_these_nodes[i]); 4708 mHighlightedObjects->removeNode(remove_these_nodes[i]);
5110 } 4709 }
5111 4710
5112 // remove all root objects already being highlighted 4711 // remove all root objects already being highlighted
@@ -5128,7 +4727,7 @@ void LLSelectMgr::updateSilhouettes()
5128 continue; 4727 continue;
5129 } 4728 }
5130 4729
5131 mHighlightedObjects.addNode(rect_select_node); 4730 mHighlightedObjects->addNode(rect_select_node);
5132 4731
5133 if (!select_linked_set) 4732 if (!select_linked_set)
5134 { 4733 {
@@ -5147,7 +4746,7 @@ void LLSelectMgr::updateSilhouettes()
5147 4746
5148 rect_select_node = new LLSelectNode(objectp->mChildList[i], TRUE); 4747 rect_select_node = new LLSelectNode(objectp->mChildList[i], TRUE);
5149 rect_select_node->selectAllTEs(TRUE); 4748 rect_select_node->selectAllTEs(TRUE);
5150 mHighlightedObjects.addNode(rect_select_node); 4749 mHighlightedObjects->addNode(rect_select_node);
5151 } 4750 }
5152 } 4751 }
5153 } 4752 }
@@ -5158,7 +4757,7 @@ void LLSelectMgr::updateSilhouettes()
5158 //BOOL subtracting_from_selection = (gKeyboard->currentMask(TRUE) == MASK_CONTROL); 4757 //BOOL subtracting_from_selection = (gKeyboard->currentMask(TRUE) == MASK_CONTROL);
5159 for (S32 pass = 0; pass < 2; pass++) 4758 for (S32 pass = 0; pass < 2; pass++)
5160 { 4759 {
5161 for (node = mHighlightedObjects.getFirstNode(); node; node = mHighlightedObjects.getNextNode() ) 4760 for (node = mHighlightedObjects->getFirstNode(); node; node = mHighlightedObjects->getNextNode() )
5162 { 4761 {
5163 LLViewerObject* objectp = node->getObject(); 4762 LLViewerObject* objectp = node->getObject();
5164 4763
@@ -5207,7 +4806,7 @@ void LLSelectMgr::updateSilhouettes()
5207 } 4806 }
5208 else 4807 else
5209 { 4808 {
5210 mHighlightedObjects.deleteAllNodes(); 4809 mHighlightedObjects->deleteAllNodes();
5211 } 4810 }
5212 4811
5213 for (S32 i = 0; i < changed_objects.count(); i++) 4812 for (S32 i = 0; i < changed_objects.count(); i++)
@@ -5254,13 +4853,12 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)
5254 glTranslatef(-hud_bbox.getCenterLocal().mV[VX] + (depth *0.5f), 0.f, 0.f); 4853 glTranslatef(-hud_bbox.getCenterLocal().mV[VX] + (depth *0.5f), 0.f, 0.f);
5255 glScalef(cur_zoom, cur_zoom, cur_zoom); 4854 glScalef(cur_zoom, cur_zoom, cur_zoom);
5256 } 4855 }
5257 if (mSelectedObjects.getNumNodes()) 4856 if (mSelectedObjects->getNumNodes())
5258 { 4857 {
5259 glPushAttrib(GL_FOG_BIT);
5260 LLUUID inspect_item_id = LLFloaterInspect::getSelectedUUID(); 4858 LLUUID inspect_item_id = LLFloaterInspect::getSelectedUUID();
5261 for (S32 pass = 0; pass < 2; pass++) 4859 for (S32 pass = 0; pass < 2; pass++)
5262 { 4860 {
5263 for (node = mSelectedObjects.getFirstNode(); node; node = mSelectedObjects.getNextNode() ) 4861 for (node = mSelectedObjects->getFirstNode(); node; node = mSelectedObjects->getNextNode() )
5264 { 4862 {
5265 LLViewerObject* objectp = node->getObject(); 4863 LLViewerObject* objectp = node->getObject();
5266 if (objectp->isHUDAttachment() != for_hud) 4864 if (objectp->isHUDAttachment() != for_hud)
@@ -5288,16 +4886,15 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)
5288 } 4886 }
5289 } 4887 }
5290 } 4888 }
5291 glPopAttrib();
5292 } 4889 }
5293 4890
5294 if (mHighlightedObjects.getNumNodes()) 4891 if (mHighlightedObjects->getNumNodes())
5295 { 4892 {
5296 // render silhouettes for highlighted objects 4893 // render silhouettes for highlighted objects
5297 BOOL subtracting_from_selection = (gKeyboard->currentMask(TRUE) == MASK_CONTROL); 4894 BOOL subtracting_from_selection = (gKeyboard->currentMask(TRUE) == MASK_CONTROL);
5298 for (S32 pass = 0; pass < 2; pass++) 4895 for (S32 pass = 0; pass < 2; pass++)
5299 { 4896 {
5300 for (node = mHighlightedObjects.getFirstNode(); node; node = mHighlightedObjects.getNextNode() ) 4897 for (node = mHighlightedObjects->getFirstNode(); node; node = mHighlightedObjects->getNextNode() )
5301 { 4898 {
5302 LLViewerObject* objectp = node->getObject(); 4899 LLViewerObject* objectp = node->getObject();
5303 if (objectp->isHUDAttachment() != for_hud) 4900 if (objectp->isHUDAttachment() != for_hud)
@@ -5706,12 +5303,7 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)
5706 } 5303 }
5707 5304
5708 BOOL is_hud_object = objectp->isHUDAttachment(); 5305 BOOL is_hud_object = objectp->isHUDAttachment();
5709 5306
5710 if (!drawable->isVisible() && !is_hud_object)
5711 {
5712 return;
5713 }
5714
5715 if (mSilhouetteVertices.size() == 0 || mSilhouetteNormals.size() != mSilhouetteVertices.size()) 5307 if (mSilhouetteVertices.size() == 0 || mSilhouetteNormals.size() != mSilhouetteVertices.size())
5716 { 5308 {
5717 return; 5309 return;
@@ -5742,7 +5334,7 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)
5742 else 5334 else
5743 { 5335 {
5744 LLVector3 view_vector = gCamera->getOrigin() - objectp->getRenderPosition(); 5336 LLVector3 view_vector = gCamera->getOrigin() - objectp->getRenderPosition();
5745 silhouette_thickness = drawable->mDistanceWRTCamera * LLSelectMgr::sHighlightThickness * (gCamera->getView() / gCamera->getDefaultFOV()); 5337 silhouette_thickness = view_vector.magVec() * LLSelectMgr::sHighlightThickness * (gCamera->getView() / gCamera->getDefaultFOV());
5746 } 5338 }
5747 F32 animationTime = (F32)LLFrameTimer::getElapsedSeconds(); 5339 F32 animationTime = (F32)LLFrameTimer::getElapsedSeconds();
5748 5340
@@ -5768,7 +5360,6 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)
5768 S32 i = 0; 5360 S32 i = 0;
5769 for (S32 seg_num = 0; seg_num < (S32)mSilhouetteSegments.size(); seg_num++) 5361 for (S32 seg_num = 0; seg_num < (S32)mSilhouetteSegments.size(); seg_num++)
5770 { 5362 {
5771// S32 first_i = i;
5772 for(; i < mSilhouetteSegments[seg_num]; i++) 5363 for(; i < mSilhouetteSegments[seg_num]; i++)
5773 { 5364 {
5774 u_coord += u_divisor * LLSelectMgr::sHighlightUScale; 5365 u_coord += u_divisor * LLSelectMgr::sHighlightUScale;
@@ -5777,11 +5368,6 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)
5777 glTexCoord2f( u_coord, v_coord ); 5368 glTexCoord2f( u_coord, v_coord );
5778 glVertex3fv( mSilhouetteVertices[i].mV ); 5369 glVertex3fv( mSilhouetteVertices[i].mV );
5779 } 5370 }
5780
5781 /*u_coord += u_divisor * LLSelectMgr::sHighlightUScale;
5782 glColor4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.4f);
5783 glTexCoord2f( u_coord, v_coord );
5784 glVertex3fv( mSilhouetteVertices[first_i].mV );*/
5785 } 5371 }
5786 } 5372 }
5787 glEnd(); 5373 glEnd();
@@ -5789,7 +5375,6 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)
5789 } 5375 }
5790 5376
5791 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 5377 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
5792 //glAlphaFunc(GL_GREATER, LLSelectMgr::sHighlightAlphaTest);
5793 glBegin(GL_TRIANGLES); 5378 glBegin(GL_TRIANGLES);
5794 { 5379 {
5795 S32 i = 0; 5380 S32 i = 0;
@@ -5908,7 +5493,11 @@ void LLSelectMgr::updateSelectionCenter()
5908 const F32 MOVE_SELECTION_THRESHOLD = 1.f; // Movement threshold in meters for updating selection 5493 const F32 MOVE_SELECTION_THRESHOLD = 1.f; // Movement threshold in meters for updating selection
5909 // center (tractor beam) 5494 // center (tractor beam)
5910 5495
5911 LLViewerObject* object = mSelectedObjects.getFirstObject(); 5496 //override any object updates received
5497 //for selected objects
5498 gSelectMgr->overrideObjectUpdates();
5499
5500 LLViewerObject* object = mSelectedObjects->getFirstObject();
5912 if (!object) 5501 if (!object)
5913 { 5502 {
5914 // nothing selected, probably grabbing 5503 // nothing selected, probably grabbing
@@ -5925,9 +5514,9 @@ void LLSelectMgr::updateSelectionCenter()
5925 } 5514 }
5926 else 5515 else
5927 { 5516 {
5928 mSelectType = getSelectTypeForObject(object); 5517 mSelectedObjects->mSelectType = getSelectTypeForObject(object);
5929 5518
5930 if (mSelectType == SELECT_TYPE_ATTACHMENT && gAgent.getAvatarObject()) 5519 if (mSelectedObjects->mSelectType == SELECT_TYPE_ATTACHMENT && gAgent.getAvatarObject())
5931 { 5520 {
5932 mPauseRequest = gAgent.getAvatarObject()->requestPause(); 5521 mPauseRequest = gAgent.getAvatarObject()->requestPause();
5933 } 5522 }
@@ -5936,7 +5525,7 @@ void LLSelectMgr::updateSelectionCenter()
5936 mPauseRequest = NULL; 5525 mPauseRequest = NULL;
5937 } 5526 }
5938 5527
5939 if (mSelectType != SELECT_TYPE_HUD && gAgent.getAvatarObject()) 5528 if (mSelectedObjects->mSelectType != SELECT_TYPE_HUD && gAgent.getAvatarObject())
5940 { 5529 {
5941 // reset hud ZOOM 5530 // reset hud ZOOM
5942 gAgent.getAvatarObject()->mHUDTargetZoom = 1.f; 5531 gAgent.getAvatarObject()->mHUDTargetZoom = 1.f;
@@ -5952,11 +5541,11 @@ void LLSelectMgr::updateSelectionCenter()
5952 gHUDManager->clearJoints(); 5541 gHUDManager->clearJoints();
5953 LLDynamicArray < LLViewerObject *> jointed_objects; 5542 LLDynamicArray < LLViewerObject *> jointed_objects;
5954 5543
5955 for (object = mSelectedObjects.getFirstObject(); object; object = mSelectedObjects.getNextObject() ) 5544 for (object = mSelectedObjects->getFirstObject(); object; object = mSelectedObjects->getNextObject() )
5956 { 5545 {
5957 LLViewerObject *myAvatar = gAgent.getAvatarObject(); 5546 LLViewerObject *myAvatar = gAgent.getAvatarObject();
5958 LLViewerObject *root = object->getRootEdit(); 5547 LLViewerObject *root = object->getRootEdit();
5959 if (mSelectType == SELECT_TYPE_WORLD && // not an attachment 5548 if (mSelectedObjects->mSelectType == SELECT_TYPE_WORLD && // not an attachment
5960 !root->isChild(myAvatar) && // not the object you're sitting on 5549 !root->isChild(myAvatar) && // not the object you're sitting on
5961 !object->isAvatar()) // not another avatar 5550 !object->isAvatar()) // not another avatar
5962 { 5551 {
@@ -5981,9 +5570,9 @@ void LLSelectMgr::updateSelectionCenter()
5981 } 5570 }
5982 } 5571 }
5983 5572
5984 if ( !(gAgentID == LLUUID::null) ) 5573 if ( !(gAgentID == LLUUID::null) && gToolMgr)
5985 { 5574 {
5986 LLTool *tool = gToolMgr->getCurrentTool( gKeyboard->currentMask(TRUE) ); 5575 LLTool *tool = gToolMgr->getCurrentTool();
5987 if (mShowSelection) 5576 if (mShowSelection)
5988 { 5577 {
5989 LLVector3d select_center_global; 5578 LLVector3d select_center_global;
@@ -6010,7 +5599,7 @@ void LLSelectMgr::updateSelectionCenter()
6010 } 5599 }
6011 5600
6012 // give up edit menu if no objects selected 5601 // give up edit menu if no objects selected
6013 if (gEditMenuHandler == this && getObjectCount() == 0) 5602 if (gEditMenuHandler == this && mSelectedObjects->getObjectCount() == 0)
6014 { 5603 {
6015 gEditMenuHandler = NULL; 5604 gEditMenuHandler = NULL;
6016 } 5605 }
@@ -6020,7 +5609,7 @@ void LLSelectMgr::updatePointAt()
6020{ 5609{
6021 if (mShowSelection) 5610 if (mShowSelection)
6022 { 5611 {
6023 if (getObjectCount()) 5612 if (mSelectedObjects->getObjectCount())
6024 { 5613 {
6025 LLVector3 select_offset; 5614 LLVector3 select_offset;
6026 LLViewerObject *click_object = gObjectList.findObject(gLastHitObjectID); 5615 LLViewerObject *click_object = gObjectList.findObject(gLastHitObjectID);
@@ -6036,8 +5625,8 @@ void LLSelectMgr::updatePointAt()
6036 else 5625 else
6037 { 5626 {
6038 // didn't click on an object this time, revert to pointing at center of first object 5627 // didn't click on an object this time, revert to pointing at center of first object
6039 gAgent.setPointAt(POINTAT_TARGET_SELECT, getFirstObject()); 5628 gAgent.setPointAt(POINTAT_TARGET_SELECT, mSelectedObjects->getFirstObject());
6040 gAgent.setLookAt(LOOKAT_TARGET_SELECT, getFirstObject()); 5629 gAgent.setLookAt(LOOKAT_TARGET_SELECT, mSelectedObjects->getFirstObject());
6041 } 5630 }
6042 } 5631 }
6043 else 5632 else
@@ -6067,7 +5656,7 @@ LLBBox LLSelectMgr::getBBoxOfSelection() const
6067//----------------------------------------------------------------------------- 5656//-----------------------------------------------------------------------------
6068BOOL LLSelectMgr::canUndo() 5657BOOL LLSelectMgr::canUndo()
6069{ 5658{
6070 return getFirstEditableObject() != NULL; 5659 return mSelectedObjects->getFirstEditableObject() != NULL;
6071} 5660}
6072 5661
6073//----------------------------------------------------------------------------- 5662//-----------------------------------------------------------------------------
@@ -6085,7 +5674,7 @@ void LLSelectMgr::undo()
6085//----------------------------------------------------------------------------- 5674//-----------------------------------------------------------------------------
6086BOOL LLSelectMgr::canRedo() 5675BOOL LLSelectMgr::canRedo()
6087{ 5676{
6088 return getFirstEditableObject() != NULL; 5677 return mSelectedObjects->getFirstEditableObject() != NULL;
6089} 5678}
6090 5679
6091//----------------------------------------------------------------------------- 5680//-----------------------------------------------------------------------------
@@ -6103,7 +5692,7 @@ void LLSelectMgr::redo()
6103//----------------------------------------------------------------------------- 5692//-----------------------------------------------------------------------------
6104BOOL LLSelectMgr::canDoDelete() 5693BOOL LLSelectMgr::canDoDelete()
6105{ 5694{
6106 return getFirstDeleteableObject() != NULL; 5695 return mSelectedObjects->getFirstDeleteableObject() != NULL;
6107} 5696}
6108 5697
6109//----------------------------------------------------------------------------- 5698//-----------------------------------------------------------------------------
@@ -6119,7 +5708,7 @@ void LLSelectMgr::doDelete()
6119//----------------------------------------------------------------------------- 5708//-----------------------------------------------------------------------------
6120BOOL LLSelectMgr::canDeselect() 5709BOOL LLSelectMgr::canDeselect()
6121{ 5710{
6122 return !isEmpty(); 5711 return !mSelectedObjects->isEmpty();
6123} 5712}
6124 5713
6125//----------------------------------------------------------------------------- 5714//-----------------------------------------------------------------------------
@@ -6134,7 +5723,7 @@ void LLSelectMgr::deselect()
6134//----------------------------------------------------------------------------- 5723//-----------------------------------------------------------------------------
6135BOOL LLSelectMgr::canDuplicate() 5724BOOL LLSelectMgr::canDuplicate()
6136{ 5725{
6137 return getFirstCopyableObject() != NULL; 5726 return mSelectedObjects->getFirstCopyableObject() != NULL;
6138} 5727}
6139//----------------------------------------------------------------------------- 5728//-----------------------------------------------------------------------------
6140// duplicate() 5729// duplicate()
@@ -6144,125 +5733,6 @@ void LLSelectMgr::duplicate()
6144 LLVector3 offset(0.5f, 0.5f, 0.f); 5733 LLVector3 offset(0.5f, 0.5f, 0.f);
6145 selectDuplicate(offset, TRUE); 5734 selectDuplicate(offset, TRUE);
6146} 5735}
6147//-----------------------------------------------------------------------------
6148// undoRedo()
6149//-----------------------------------------------------------------------------
6150U32 LLSelectMgr::undoRedo(std::deque<LLSelectAction*> &queue_src, std::deque<LLSelectAction*> &queue_dst, const LLUUID &object_id)
6151{
6152 if (queue_src.size() == 0)
6153 {
6154 return 0;
6155 }
6156
6157 U32 update_type = 0;
6158 std::deque<LLSelectAction*> temp_queue;
6159 LLSelectAction* src_actionp = queue_src.back();
6160
6161 while (src_actionp->mObjectID != object_id)
6162 {
6163 temp_queue.push_back(src_actionp);
6164 queue_src.pop_back();
6165 if (!queue_src.size())
6166 {
6167 // put everything back
6168 LLSelectAction* actionp;
6169 while (temp_queue.size())
6170 {
6171 actionp = temp_queue.back();
6172 temp_queue.pop_back();
6173 queue_src.push_back(actionp);
6174 }
6175 return 0;
6176 }
6177 src_actionp = queue_src.back();
6178 }
6179
6180 if(src_actionp)
6181 {
6182 LLSelectAction* dst_actionp = new LLSelectAction();
6183 dst_actionp->mActionType = src_actionp->mActionType;
6184 dst_actionp->mObjectID = src_actionp->mObjectID;
6185 dst_actionp->mIndividualSelection = src_actionp->mIndividualSelection;
6186
6187 LLViewerObject* object = gObjectList.findObject(src_actionp->mObjectID);
6188 if (object && object->mDrawable.notNull())
6189 {
6190 LLVector3 old_position_local = object->getPosition();
6191
6192 switch(src_actionp->mActionType)
6193 {
6194 case SELECT_ACTION_TYPE_MOVE:
6195 dst_actionp->mPosition = object->mDrawable->getPosition();
6196 object->setPosition(src_actionp->mPosition, TRUE);
6197 if (object->isRootEdit() && src_actionp->mIndividualSelection)
6198 {
6199 // counter-translate children
6200 LLVector3 parent_offset = (src_actionp->mPosition - old_position_local) * ~object->getRotation();
6201
6202 // counter-translate child objects if we are moving the root as an individual
6203 for (U32 child_num = 0; child_num < object->mChildList.size(); child_num++)
6204 {
6205 LLViewerObject* childp = object->mChildList[child_num];
6206 childp->setPosition(childp->getPosition() - parent_offset);
6207 }
6208 }
6209 update_type |= UPD_POSITION;
6210 break;
6211 case SELECT_ACTION_TYPE_ROTATE:
6212 dst_actionp->mPosition = object->mDrawable->getPosition();
6213 dst_actionp->mRotation = object->mDrawable->getRotation();
6214 object->setRotation(src_actionp->mRotation, TRUE);
6215 object->setPosition(src_actionp->mPosition, TRUE);
6216 if (object->isRootEdit() && src_actionp->mIndividualSelection)
6217 {
6218 // counter-translate and rotate children
6219 LLVector3 parent_offset = (src_actionp->mPosition - old_position_local) * ~object->getRotation();
6220
6221 for (U32 child_num = 0; child_num < object->mChildList.size(); child_num++)
6222 {
6223 LLViewerObject* childp = object->mChildList[child_num];
6224 LLQuaternion delta_rot_inv = dst_actionp->mRotation * ~src_actionp->mRotation;
6225 childp->setPosition((childp->getPosition() * delta_rot_inv) - parent_offset);
6226 childp->setRotation(childp->getRotation() * delta_rot_inv );
6227 }
6228 }
6229 update_type |= UPD_ROTATION | UPD_POSITION;
6230 break;
6231 case SELECT_ACTION_TYPE_SCALE:
6232 dst_actionp->mPosition = object->mDrawable->getPosition();
6233 dst_actionp->mScale = object->getScale();
6234 object->setScale(src_actionp->mScale, TRUE);
6235 object->setPosition(src_actionp->mPosition, TRUE);
6236 update_type |= UPD_SCALE | UPD_POSITION;
6237 break;
6238 default:
6239 // do nothing
6240 break;
6241 }
6242 }
6243 queue_src.pop_back();
6244 delete src_actionp;
6245 queue_dst.push_back(dst_actionp);
6246 while (queue_dst.size() > (U32)MAX_ACTION_QUEUE_SIZE)
6247 {
6248 LLSelectAction* action = queue_dst.front();
6249 queue_dst.pop_front();
6250 delete action;
6251 }
6252
6253 }
6254
6255 // put everything back
6256 LLSelectAction* actionp;
6257 while (temp_queue.size())
6258 {
6259 actionp = temp_queue.back();
6260 temp_queue.pop_back();
6261 queue_src.push_back(actionp);
6262 }
6263
6264 return update_type;
6265}
6266 5736
6267ESelectType LLSelectMgr::getSelectTypeForObject(LLViewerObject* object) 5737ESelectType LLSelectMgr::getSelectTypeForObject(LLViewerObject* object)
6268{ 5738{
@@ -6287,7 +5757,7 @@ ESelectType LLSelectMgr::getSelectTypeForObject(LLViewerObject* object)
6287void LLSelectMgr::validateSelection() 5757void LLSelectMgr::validateSelection()
6288{ 5758{
6289 LLViewerObject* objectp; 5759 LLViewerObject* objectp;
6290 for (objectp = getFirstObject(); objectp; objectp = getNextObject()) 5760 for (objectp = mSelectedObjects->getFirstObject(); objectp; objectp = mSelectedObjects->getNextObject())
6291 { 5761 {
6292 if (!canSelectObject(objectp)) 5762 if (!canSelectObject(objectp))
6293 { 5763 {
@@ -6323,64 +5793,71 @@ BOOL LLSelectMgr::canSelectObject(LLViewerObject* object)
6323 if (object->getPCode() == LLViewerObject::LL_VO_SURFACE_PATCH) return FALSE; 5793 if (object->getPCode() == LLViewerObject::LL_VO_SURFACE_PATCH) return FALSE;
6324 5794
6325 ESelectType selection_type = getSelectTypeForObject(object); 5795 ESelectType selection_type = getSelectTypeForObject(object);
6326 if (getObjectCount() > 0 && mSelectType != selection_type) return FALSE; 5796 if (mSelectedObjects->getObjectCount() > 0 && mSelectedObjects->mSelectType != selection_type) return FALSE;
6327 5797
6328 return TRUE; 5798 return TRUE;
6329} 5799}
6330 5800
6331LLSelectNodeList::LLSelectNodeList() : std::list<LLSelectNode*>() 5801LLObjectSelection::LLObjectSelection() :
5802 std::list<LLSelectNode*>(),
5803 LLRefCount(),
5804 mCurrentNode(end()),
5805 mCurrentTE(-1),
5806 mSelectType(SELECT_TYPE_WORLD)
6332{ 5807{
6333 mCurrentTE = -1;
6334 mCurrentNode = end();
6335} 5808}
6336 5809
6337LLSelectNodeList::~LLSelectNodeList() 5810LLObjectSelection::~LLObjectSelection()
6338{ 5811{
6339 std::for_each(begin(), end(), DeletePointer()); 5812 std::for_each(begin(), end(), DeletePointer());
6340} 5813}
6341 5814
6342void LLSelectNodeList::updateEffects() 5815void LLObjectSelection::updateEffects()
6343{ 5816{
6344} 5817}
6345 5818
6346S32 LLSelectNodeList::getNumNodes() 5819S32 LLObjectSelection::getNumNodes()
6347{ 5820{
6348 return size(); 5821 return size();
6349} 5822}
6350 5823
6351void LLSelectNodeList::addNode(LLSelectNode *nodep) 5824void LLObjectSelection::addNode(LLSelectNode *nodep)
6352{ 5825{
6353 push_front(nodep); 5826 push_front(nodep);
6354 mSelectNodeMap[nodep->getObject()] = nodep; 5827 mSelectNodeMap[nodep->getObject()] = nodep;
6355} 5828}
6356 5829
6357void LLSelectNodeList::addNodeAtEnd(LLSelectNode *nodep) 5830void LLObjectSelection::addNodeAtEnd(LLSelectNode *nodep)
6358{ 5831{
6359 push_back(nodep); 5832 push_back(nodep);
6360 mSelectNodeMap[nodep->getObject()] = nodep; 5833 mSelectNodeMap[nodep->getObject()] = nodep;
6361} 5834}
6362 5835
6363void LLSelectNodeList::removeNode(LLSelectNode *nodep) 5836void LLObjectSelection::removeNode(LLSelectNode *nodep)
6364{ 5837{
6365 std::list<LLSelectNode*>::iterator iter; 5838 std::list<LLSelectNode*>::iterator iter = begin();
6366 for (iter = begin(); iter != end(); ++iter) 5839 while(iter != end())
6367 { 5840 {
6368 if ((*iter) == nodep) 5841 if ((*iter) == nodep)
6369 { 5842 {
6370 mSelectNodeMap.erase(nodep->getObject()); 5843 mSelectNodeMap.erase(nodep->getObject());
6371 erase(iter++); 5844 iter = erase(iter);
5845 }
5846 else
5847 {
5848 ++iter;
6372 } 5849 }
6373 } 5850 }
6374} 5851}
6375 5852
6376void LLSelectNodeList::deleteAllNodes() 5853void LLObjectSelection::deleteAllNodes()
6377{ 5854{
6378 std::for_each(begin(), end(), DeletePointer()); 5855 std::for_each(begin(), end(), DeletePointer());
6379 clear(); 5856 clear();
6380 mSelectNodeMap.clear(); 5857 mSelectNodeMap.clear();
6381} 5858}
6382 5859
6383LLSelectNode* LLSelectNodeList::findNode(LLViewerObject* objectp) 5860LLSelectNode* LLObjectSelection::findNode(LLViewerObject* objectp)
6384{ 5861{
6385 std::map<LLViewerObject*, LLSelectNode*>::iterator found_it = mSelectNodeMap.find(objectp); 5862 std::map<LLViewerObject*, LLSelectNode*>::iterator found_it = mSelectNodeMap.find(objectp);
6386 if (found_it != mSelectNodeMap.end()) 5863 if (found_it != mSelectNodeMap.end())
@@ -6393,7 +5870,7 @@ LLSelectNode* LLSelectNodeList::findNode(LLViewerObject* objectp)
6393//----------------------------------------------------------------------------- 5870//-----------------------------------------------------------------------------
6394// getFirstNode() 5871// getFirstNode()
6395//----------------------------------------------------------------------------- 5872//-----------------------------------------------------------------------------
6396LLSelectNode *LLSelectNodeList::getFirstNode() 5873LLSelectNode *LLObjectSelection::getFirstNode()
6397{ 5874{
6398 mCurrentNode = begin();//getFirstData(); 5875 mCurrentNode = begin();//getFirstData();
6399 5876
@@ -6414,7 +5891,7 @@ LLSelectNode *LLSelectNodeList::getFirstNode()
6414//----------------------------------------------------------------------------- 5891//-----------------------------------------------------------------------------
6415// getCurrentNode() 5892// getCurrentNode()
6416//----------------------------------------------------------------------------- 5893//-----------------------------------------------------------------------------
6417LLSelectNode *LLSelectNodeList::getCurrentNode() 5894LLSelectNode *LLObjectSelection::getCurrentNode()
6418{ 5895{
6419 while (mCurrentNode != end() && !(*mCurrentNode)->getObject()) 5896 while (mCurrentNode != end() && !(*mCurrentNode)->getObject())
6420 { 5897 {
@@ -6432,7 +5909,7 @@ LLSelectNode *LLSelectNodeList::getCurrentNode()
6432//----------------------------------------------------------------------------- 5909//-----------------------------------------------------------------------------
6433// getNextNode() 5910// getNextNode()
6434//----------------------------------------------------------------------------- 5911//-----------------------------------------------------------------------------
6435LLSelectNode *LLSelectNodeList::getNextNode() 5912LLSelectNode *LLObjectSelection::getNextNode()
6436{ 5913{
6437 ++mCurrentNode; 5914 ++mCurrentNode;
6438 5915
@@ -6454,7 +5931,7 @@ LLSelectNode *LLSelectNodeList::getNextNode()
6454//----------------------------------------------------------------------------- 5931//-----------------------------------------------------------------------------
6455// getFirstObject() 5932// getFirstObject()
6456//----------------------------------------------------------------------------- 5933//-----------------------------------------------------------------------------
6457LLViewerObject* LLSelectNodeList::getFirstObject() 5934LLViewerObject* LLObjectSelection::getFirstObject()
6458{ 5935{
6459 mCurrentNode = begin(); 5936 mCurrentNode = begin();
6460 5937
@@ -6476,7 +5953,7 @@ LLViewerObject* LLSelectNodeList::getFirstObject()
6476//----------------------------------------------------------------------------- 5953//-----------------------------------------------------------------------------
6477// getNextObject() 5954// getNextObject()
6478//----------------------------------------------------------------------------- 5955//-----------------------------------------------------------------------------
6479LLViewerObject* LLSelectNodeList::getNextObject() 5956LLViewerObject* LLObjectSelection::getNextObject()
6480{ 5957{
6481 ++mCurrentNode;// = getNextData(); 5958 ++mCurrentNode;// = getNextData();
6482 5959
@@ -6499,7 +5976,7 @@ LLViewerObject* LLSelectNodeList::getNextObject()
6499//----------------------------------------------------------------------------- 5976//-----------------------------------------------------------------------------
6500// getPrimaryTE() 5977// getPrimaryTE()
6501//----------------------------------------------------------------------------- 5978//-----------------------------------------------------------------------------
6502void LLSelectNodeList::getPrimaryTE(LLViewerObject* *object, S32 *te) 5979void LLObjectSelection::getPrimaryTE(LLViewerObject* *object, S32 *te)
6503{ 5980{
6504 // initialize object and te 5981 // initialize object and te
6505 *te = 0; 5982 *te = 0;
@@ -6554,7 +6031,7 @@ void LLSelectNodeList::getPrimaryTE(LLViewerObject* *object, S32 *te)
6554//----------------------------------------------------------------------------- 6031//-----------------------------------------------------------------------------
6555// getFirstTE() 6032// getFirstTE()
6556//----------------------------------------------------------------------------- 6033//-----------------------------------------------------------------------------
6557void LLSelectNodeList::getFirstTE(LLViewerObject* *object, S32 *te) 6034void LLObjectSelection::getFirstTE(LLViewerObject* *object, S32 *te)
6558{ 6035{
6559 // start with first face 6036 // start with first face
6560 mCurrentTE = 0; 6037 mCurrentTE = 0;
@@ -6608,7 +6085,7 @@ void LLSelectNodeList::getFirstTE(LLViewerObject* *object, S32 *te)
6608//----------------------------------------------------------------------------- 6085//-----------------------------------------------------------------------------
6609// getNextFace() 6086// getNextFace()
6610//----------------------------------------------------------------------------- 6087//-----------------------------------------------------------------------------
6611void LLSelectNodeList::getNextTE(LLViewerObject* *object, S32 *te) 6088void LLObjectSelection::getNextTE(LLViewerObject* *object, S32 *te)
6612{ 6089{
6613 // try next face 6090 // try next face
6614 mCurrentTE++; 6091 mCurrentTE++;
@@ -6651,7 +6128,7 @@ void LLSelectNodeList::getNextTE(LLViewerObject* *object, S32 *te)
6651 return; 6128 return;
6652} 6129}
6653 6130
6654void LLSelectNodeList::getCurrentTE(LLViewerObject* *object, S32 *te) 6131void LLObjectSelection::getCurrentTE(LLViewerObject* *object, S32 *te)
6655{ 6132{
6656 if (mCurrentNode != end()) 6133 if (mCurrentNode != end())
6657 { 6134 {
@@ -6667,7 +6144,7 @@ void LLSelectNodeList::getCurrentTE(LLViewerObject* *object, S32 *te)
6667//----------------------------------------------------------------------------- 6144//-----------------------------------------------------------------------------
6668// getFirstRootNode() 6145// getFirstRootNode()
6669//----------------------------------------------------------------------------- 6146//-----------------------------------------------------------------------------
6670LLSelectNode *LLSelectNodeList::getFirstRootNode() 6147LLSelectNode *LLObjectSelection::getFirstRootNode()
6671{ 6148{
6672 LLSelectNode *cur_node = getFirstNode(); 6149 LLSelectNode *cur_node = getFirstNode();
6673 6150
@@ -6686,7 +6163,7 @@ LLSelectNode *LLSelectNodeList::getFirstRootNode()
6686//----------------------------------------------------------------------------- 6163//-----------------------------------------------------------------------------
6687// getNextRootNode() 6164// getNextRootNode()
6688//----------------------------------------------------------------------------- 6165//-----------------------------------------------------------------------------
6689LLSelectNode *LLSelectNodeList::getNextRootNode() 6166LLSelectNode *LLObjectSelection::getNextRootNode()
6690{ 6167{
6691 LLSelectNode *cur_node = getNextNode(); 6168 LLSelectNode *cur_node = getNextNode();
6692 6169
@@ -6704,7 +6181,7 @@ LLSelectNode *LLSelectNodeList::getNextRootNode()
6704//----------------------------------------------------------------------------- 6181//-----------------------------------------------------------------------------
6705// getFirstRootObject() 6182// getFirstRootObject()
6706//----------------------------------------------------------------------------- 6183//-----------------------------------------------------------------------------
6707LLViewerObject *LLSelectNodeList::getFirstRootObject() 6184LLViewerObject *LLObjectSelection::getFirstRootObject()
6708{ 6185{
6709 LLSelectNode *node = getFirstRootNode(); 6186 LLSelectNode *node = getFirstRootNode();
6710 6187
@@ -6722,7 +6199,7 @@ LLViewerObject *LLSelectNodeList::getFirstRootObject()
6722//----------------------------------------------------------------------------- 6199//-----------------------------------------------------------------------------
6723// getNextRootObject() 6200// getNextRootObject()
6724//----------------------------------------------------------------------------- 6201//-----------------------------------------------------------------------------
6725LLViewerObject *LLSelectNodeList::getNextRootObject() 6202LLViewerObject *LLObjectSelection::getNextRootObject()
6726{ 6203{
6727 LLSelectNode *node = getNextRootNode(); 6204 LLSelectNode *node = getNextRootNode();
6728 6205
@@ -6739,7 +6216,7 @@ LLViewerObject *LLSelectNodeList::getNextRootObject()
6739//----------------------------------------------------------------------------- 6216//-----------------------------------------------------------------------------
6740// isEmpty() 6217// isEmpty()
6741//----------------------------------------------------------------------------- 6218//-----------------------------------------------------------------------------
6742BOOL LLSelectNodeList::isEmpty() 6219BOOL LLObjectSelection::isEmpty()
6743{ 6220{
6744 return (size() == 0); 6221 return (size() == 0);
6745} 6222}
@@ -6747,7 +6224,7 @@ BOOL LLSelectNodeList::isEmpty()
6747//----------------------------------------------------------------------------- 6224//-----------------------------------------------------------------------------
6748// getOwnershipCost() 6225// getOwnershipCost()
6749//----------------------------------------------------------------------------- 6226//-----------------------------------------------------------------------------
6750BOOL LLSelectNodeList::getOwnershipCost(S32 &cost) 6227BOOL LLObjectSelection::getOwnershipCost(S32 &cost)
6751{ 6228{
6752 S32 count = 0; 6229 S32 count = 0;
6753 for( LLSelectNode* nodep = getFirstNode(); nodep; nodep = getNextNode() ) 6230 for( LLSelectNode* nodep = getFirstNode(); nodep; nodep = getNextNode() )
@@ -6759,3 +6236,341 @@ BOOL LLSelectNodeList::getOwnershipCost(S32 &cost)
6759 6236
6760 return (count > 0); 6237 return (count > 0);
6761} 6238}
6239
6240
6241
6242//-----------------------------------------------------------------------------
6243// getObjectCount()
6244//-----------------------------------------------------------------------------
6245S32 LLObjectSelection::getObjectCount()
6246{
6247 return getNumNodes();
6248}
6249
6250
6251//-----------------------------------------------------------------------------
6252// getTECount()
6253//-----------------------------------------------------------------------------
6254S32 LLObjectSelection::getTECount()
6255{
6256 S32 count = 0;
6257
6258 LLSelectNode* nodep;
6259 for (nodep = getFirstNode(); nodep; nodep = getNextNode() )
6260 {
6261 if (nodep->getObject())
6262 {
6263 S32 num_tes = nodep->getObject()->getNumTEs();
6264 for (S32 te = 0; te < num_tes; te++)
6265 {
6266 if (nodep->isTESelected(te))
6267 {
6268 count++;
6269 }
6270 }
6271 }
6272 }
6273
6274 return count;
6275}
6276
6277//-----------------------------------------------------------------------------
6278// getRootObjectCount()
6279//-----------------------------------------------------------------------------
6280S32 LLObjectSelection::getRootObjectCount()
6281{
6282 LLSelectNode *nodep;
6283
6284 S32 count = 0;
6285 for(nodep = getFirstRootNode(); nodep; nodep = getNextRootNode())
6286 {
6287 ++count;
6288 }
6289 return count;
6290}
6291
6292bool LLObjectSelection::applyToObjects(LLSelectedObjectFunctor* func)
6293{
6294 bool result = true;
6295 LLViewerObject* object;
6296 for (object = getFirstObject(); object != NULL; object = getNextObject())
6297 {
6298 result = result && func->apply(object);
6299 }
6300 return result;
6301}
6302
6303bool LLObjectSelection::applyToRootObjects(LLSelectedObjectFunctor* func)
6304{
6305 bool result = true;
6306 LLViewerObject* object;
6307 for (object = getFirstRootObject();
6308 object != NULL;
6309 object = getNextRootObject())
6310 {
6311 result = result && func->apply(object);
6312 }
6313 return result;
6314}
6315
6316bool LLObjectSelection::applyToNodes(LLSelectedNodeFunctor *func)
6317{
6318 bool result = true;
6319 LLSelectNode* node;
6320 for (node = getFirstNode(); node != NULL; node = getNextNode())
6321 {
6322 result = result && func->apply(node);
6323 }
6324 return result;
6325}
6326
6327//-----------------------------------------------------------------------------
6328// contains()
6329//-----------------------------------------------------------------------------
6330BOOL LLObjectSelection::contains(LLViewerObject* object)
6331{
6332 return findNode(object) != NULL;
6333}
6334
6335
6336//-----------------------------------------------------------------------------
6337// contains()
6338//-----------------------------------------------------------------------------
6339BOOL LLObjectSelection::contains(LLViewerObject* object, S32 te)
6340{
6341 LLSelectNode *nodep;
6342 if (te == SELECT_ALL_TES)
6343 {
6344 // ...all faces
6345 for (nodep = getFirstNode(); nodep; nodep = getNextNode() )
6346 {
6347 if (nodep->getObject() == object)
6348 {
6349 BOOL all_selected = TRUE;
6350 for (S32 i = 0; i < SELECT_MAX_TES; i++)
6351 {
6352 all_selected = all_selected && nodep->isTESelected(i);
6353 }
6354 return all_selected;
6355 }
6356 }
6357 return FALSE;
6358 }
6359 else
6360 {
6361 // ...one face
6362 for (nodep = getFirstNode(); nodep; nodep = getNextNode() )
6363 {
6364 if (nodep->getObject() == object && nodep->isTESelected(te))
6365 {
6366 return TRUE;
6367 }
6368 }
6369 return FALSE;
6370 }
6371}
6372
6373// returns TRUE is any node is currenly worn as an attachment
6374BOOL LLObjectSelection::isAttachment()
6375{
6376 return (mSelectType == SELECT_TYPE_ATTACHMENT || mSelectType == SELECT_TYPE_HUD);
6377}
6378
6379//-----------------------------------------------------------------------------
6380// getFirstMoveableNode()
6381//-----------------------------------------------------------------------------
6382LLSelectNode* LLObjectSelection::getFirstMoveableNode(BOOL get_root)
6383{
6384 LLSelectNode* selectNode = NULL;
6385
6386 if (get_root)
6387 {
6388 for(selectNode = getFirstRootNode(); selectNode; selectNode = getNextRootNode())
6389 {
6390 if( selectNode->getObject()->permMove() )
6391 {
6392 return selectNode;
6393 break;
6394 }
6395 }
6396 }
6397 for(selectNode = getFirstNode(); selectNode; selectNode = getNextNode())
6398 {
6399 if( selectNode->getObject()->permMove() )
6400 {
6401 return selectNode;
6402 break;
6403 }
6404 }
6405
6406 return NULL;
6407}
6408
6409//-----------------------------------------------------------------------------
6410// getFirstCopyableObject()
6411//-----------------------------------------------------------------------------
6412LLViewerObject* LLObjectSelection::getFirstCopyableObject(BOOL get_root)
6413{
6414 LLViewerObject* object = NULL;
6415 for(LLViewerObject* cur = getFirstObject(); cur; cur = getNextObject())
6416 {
6417 if( cur->permCopy() && !cur->isAttachment())
6418 {
6419 object = cur;
6420 break;
6421 }
6422 }
6423
6424 if (get_root && object)
6425 {
6426 LLViewerObject *parent;
6427 while ((parent = (LLViewerObject*)object->getParent()))
6428 {
6429 if (parent->isSelected())
6430 {
6431 object = parent;
6432 }
6433 else
6434 {
6435 break;
6436 }
6437 }
6438 }
6439
6440 return object;
6441}
6442
6443
6444//-----------------------------------------------------------------------------
6445// getFirstDeleteableObject()
6446//-----------------------------------------------------------------------------
6447LLViewerObject* LLObjectSelection::getFirstDeleteableObject(BOOL get_root)
6448{
6449 //RN: don't currently support deletion of child objects, as that requires separating them first
6450 // then derezzing to trash
6451 get_root = TRUE;
6452
6453 LLViewerObject* object = NULL;
6454 if (get_root)
6455 {
6456 for(LLViewerObject* current = getFirstRootObject();
6457 current != NULL;
6458 current = getNextRootObject())
6459 {
6460 // you can delete an object if permissions allow it, you are
6461 // the owner, you are an officer in the group that owns the
6462 // object, or you are not the owner but it is on land you own
6463 // or land owned by your group. (whew!)
6464 if( (current->permModify())
6465 || (current->permYouOwner())
6466 || (!current->permAnyOwner()) // public
6467 || (current->isOverAgentOwnedLand())
6468 || (current->isOverGroupOwnedLand())
6469 )
6470 {
6471
6472 if( !current->isAttachment() )
6473 {
6474 object = current;
6475 break;
6476 }
6477 }
6478 }
6479 }
6480 else
6481 {
6482 for(LLViewerObject* current = getFirstObject();
6483 current != NULL;
6484 current = getNextObject())
6485 {
6486 // you can delete an object if permissions allow it, you are
6487 // the owner, you are an officer in the group that owns the
6488 // object, or you are not the owner but it is on land you own
6489 // or land owned by your group. (whew!)
6490 if( (current->permModify())
6491 || (current->permYouOwner())
6492 || (!current->permAnyOwner()) // public
6493 || (current->isOverAgentOwnedLand())
6494 || (current->isOverGroupOwnedLand())
6495 )
6496 {
6497 if( !current->isAttachment() )
6498 {
6499 object = current;
6500 break;
6501 }
6502 }
6503 }
6504 }
6505
6506 return object;
6507}
6508
6509
6510//-----------------------------------------------------------------------------
6511// getFirstEditableObject()
6512//-----------------------------------------------------------------------------
6513LLViewerObject* LLObjectSelection::getFirstEditableObject(BOOL get_root)
6514{
6515 LLViewerObject* object = NULL;
6516 for(LLViewerObject* cur = getFirstObject(); cur; cur = getNextObject())
6517 {
6518 if( cur->permModify() )
6519 {
6520 object = cur;
6521 break;
6522 }
6523 }
6524
6525 if (get_root && object)
6526 {
6527 LLViewerObject *parent;
6528 while ((parent = (LLViewerObject*)object->getParent()))
6529 {
6530 if (parent->isSelected())
6531 {
6532 object = parent;
6533 }
6534 else
6535 {
6536 break;
6537 }
6538 }
6539 }
6540
6541 return object;
6542}
6543
6544//-----------------------------------------------------------------------------
6545// getFirstMoveableObject()
6546//-----------------------------------------------------------------------------
6547LLViewerObject* LLObjectSelection::getFirstMoveableObject(BOOL get_root)
6548{
6549 LLViewerObject* object = NULL;
6550 for(LLViewerObject* cur = getFirstObject(); cur; cur = getNextObject())
6551 {
6552 if( cur->permMove() )
6553 {
6554 object = cur;
6555 break;
6556 }
6557 }
6558
6559 if (get_root && object && !object->isJointChild())
6560 {
6561 LLViewerObject *parent;
6562 while ((parent = (LLViewerObject*)object->getParent()))
6563 {
6564 if (parent->isSelected())
6565 {
6566 object = parent;
6567 }
6568 else
6569 {
6570 break;
6571 }
6572 }
6573 }
6574
6575 return object;
6576}