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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llselectmgr.cpp
  3.  * @brief A manager for selected objects and faces.
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #include "llviewerprecompiledheaders.h"
  33. // file include
  34. #define LLSELECTMGR_CPP
  35. #include "llselectmgr.h"
  36. // library includes
  37. #include "llcachename.h"
  38. #include "lldbstrings.h"
  39. #include "lleconomy.h"
  40. #include "llgl.h"
  41. #include "llmediaentry.h"
  42. #include "llrender.h"
  43. #include "llnotifications.h"
  44. #include "llpermissions.h"
  45. #include "llpermissionsflags.h"
  46. #include "lltrans.h"
  47. #include "llundo.h"
  48. #include "lluuid.h"
  49. #include "llvolume.h"
  50. #include "message.h"
  51. #include "object_flags.h"
  52. #include "llquaternion.h"
  53. // viewer includes
  54. #include "llagent.h"
  55. #include "llviewerwindow.h"
  56. #include "lldrawable.h"
  57. #include "llfloaterinspect.h"
  58. #include "llfloaterproperties.h"
  59. #include "llfloaterreporter.h"
  60. #include "llfloaterreg.h"
  61. #include "llfloatertools.h"
  62. #include "llframetimer.h"
  63. #include "llfocusmgr.h"
  64. #include "llhudeffecttrail.h"
  65. #include "llhudmanager.h"
  66. #include "llinventorymodel.h"
  67. #include "llmenugl.h"
  68. #include "llmutelist.h"
  69. #include "llsidepaneltaskinfo.h"
  70. #include "llslurl.h"
  71. #include "llstatusbar.h"
  72. #include "llsurface.h"
  73. #include "lltool.h"
  74. #include "lltooldraganddrop.h"
  75. #include "lltoolmgr.h"
  76. #include "lltoolpie.h"
  77. #include "llui.h"
  78. #include "llviewercamera.h"
  79. #include "llviewercontrol.h"
  80. #include "llviewertexturelist.h"
  81. #include "llviewermedia.h"
  82. #include "llviewermediafocus.h"
  83. #include "llviewermenu.h"
  84. #include "llviewerobject.h"
  85. #include "llviewerobjectlist.h"
  86. #include "llviewerregion.h"
  87. #include "llviewerstats.h"
  88. #include "llvoavatarself.h"
  89. #include "llvovolume.h"
  90. #include "pipeline.h"
  91. #include "llglheaders.h"
  92. LLViewerObject* getSelectedParentObject(LLViewerObject *object) ;
  93. //
  94. // Consts
  95. //
  96. const S32 NUM_SELECTION_UNDO_ENTRIES = 200;
  97. const F32 SILHOUETTE_UPDATE_THRESHOLD_SQUARED = 0.02f;
  98. const S32 MAX_ACTION_QUEUE_SIZE = 20;
  99. const S32 MAX_SILS_PER_FRAME = 50;
  100. const S32 MAX_OBJECTS_PER_PACKET = 254;
  101. const S32 TE_SELECT_MASK_ALL = 0xFFFFFFFF;
  102. //
  103. // Globals
  104. //
  105. //BOOL gDebugSelectMgr = FALSE;
  106. //BOOL gHideSelectedObjects = FALSE;
  107. //BOOL gAllowSelectAvatar = FALSE;
  108. BOOL LLSelectMgr::sRectSelectInclusive = TRUE;
  109. BOOL LLSelectMgr::sRenderHiddenSelections = TRUE;
  110. BOOL LLSelectMgr::sRenderLightRadius = FALSE;
  111. F32 LLSelectMgr::sHighlightThickness = 0.f;
  112. F32 LLSelectMgr::sHighlightUScale = 0.f;
  113. F32 LLSelectMgr::sHighlightVScale = 0.f;
  114. F32 LLSelectMgr::sHighlightAlpha = 0.f;
  115. F32 LLSelectMgr::sHighlightAlphaTest = 0.f;
  116. F32 LLSelectMgr::sHighlightUAnim = 0.f;
  117. F32 LLSelectMgr::sHighlightVAnim = 0.f;
  118. LLColor4 LLSelectMgr::sSilhouetteParentColor;
  119. LLColor4 LLSelectMgr::sSilhouetteChildColor;
  120. LLColor4 LLSelectMgr::sHighlightInspectColor;
  121. LLColor4 LLSelectMgr::sHighlightParentColor;
  122. LLColor4 LLSelectMgr::sHighlightChildColor;
  123. LLColor4 LLSelectMgr::sContextSilhouetteColor;
  124. static LLObjectSelection *get_null_object_selection();
  125. template<> 
  126. const LLSafeHandle<LLObjectSelection>::NullFunc 
  127. LLSafeHandle<LLObjectSelection>::sNullFunc = get_null_object_selection;
  128. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  129. // struct LLDeRezInfo
  130. //
  131. // Used to keep track of important derez info. 
  132. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  133. struct LLDeRezInfo
  134. {
  135. EDeRezDestination mDestination;
  136. LLUUID mDestinationID;
  137. LLDeRezInfo(EDeRezDestination dest, const LLUUID& dest_id) :
  138. mDestination(dest), mDestinationID(dest_id) {}
  139. };
  140. //
  141. // Imports
  142. //
  143. static LLPointer<LLObjectSelection> sNullSelection;
  144. //
  145. // Functions
  146. //
  147. void LLSelectMgr::cleanupGlobals()
  148. {
  149. sNullSelection = NULL;
  150. LLSelectMgr::getInstance()->clearSelections();
  151. }
  152. LLObjectSelection *get_null_object_selection()
  153. {
  154. if (sNullSelection.isNull())
  155. {
  156. sNullSelection = new LLObjectSelection;
  157. }
  158. return sNullSelection;
  159. }
  160. // Build time optimization, generate this function once here
  161. template class LLSelectMgr* LLSingleton<class LLSelectMgr>::getInstance();
  162. //-----------------------------------------------------------------------------
  163. // LLSelectMgr()
  164. //-----------------------------------------------------------------------------
  165. LLSelectMgr::LLSelectMgr()
  166.  : mHideSelectedObjects(LLCachedControl<bool>(gSavedSettings, "HideSelectedObjects", FALSE)),
  167.    mAllowSelectAvatar( LLCachedControl<bool>(gSavedSettings, "AllowSelectAvatar", FALSE)),
  168.    mDebugSelectMgr(LLCachedControl<bool>(gSavedSettings, "DebugSelectMgr", FALSE))
  169. {
  170. mTEMode = FALSE;
  171. mLastCameraPos.clearVec();
  172. sHighlightThickness = gSavedSettings.getF32("SelectionHighlightThickness");
  173. sHighlightUScale = gSavedSettings.getF32("SelectionHighlightUScale");
  174. sHighlightVScale = gSavedSettings.getF32("SelectionHighlightVScale");
  175. sHighlightAlpha = gSavedSettings.getF32("SelectionHighlightAlpha");
  176. sHighlightAlphaTest = gSavedSettings.getF32("SelectionHighlightAlphaTest");
  177. sHighlightUAnim = gSavedSettings.getF32("SelectionHighlightUAnim");
  178. sHighlightVAnim = gSavedSettings.getF32("SelectionHighlightVAnim");
  179. sSilhouetteParentColor =LLUIColorTable::instance().getColor("SilhouetteParentColor");
  180. sSilhouetteChildColor = LLUIColorTable::instance().getColor("SilhouetteChildColor");
  181. sHighlightParentColor = LLUIColorTable::instance().getColor("HighlightParentColor");
  182. sHighlightChildColor = LLUIColorTable::instance().getColor("HighlightChildColor");
  183. sHighlightInspectColor = LLUIColorTable::instance().getColor("HighlightInspectColor");
  184. sContextSilhouetteColor = LLUIColorTable::instance().getColor("ContextSilhouetteColor")*0.5f;
  185. sRenderLightRadius = gSavedSettings.getBOOL("RenderLightRadius");
  186. mRenderSilhouettes = TRUE;
  187. mGridMode = GRID_MODE_WORLD;
  188. gSavedSettings.setS32("GridMode", (S32)GRID_MODE_WORLD);
  189. mGridValid = FALSE;
  190. mSelectedObjects = new LLObjectSelection();
  191. mHoverObjects = new LLObjectSelection();
  192. mHighlightedObjects = new LLObjectSelection();
  193. mForceSelection = FALSE;
  194. mShowSelection = FALSE;
  195. }
  196. //-----------------------------------------------------------------------------
  197. // ~LLSelectMgr()
  198. //-----------------------------------------------------------------------------
  199. LLSelectMgr::~LLSelectMgr()
  200. {
  201. clearSelections();
  202. }
  203. void LLSelectMgr::clearSelections()
  204. {
  205. mHoverObjects->deleteAllNodes();
  206. mSelectedObjects->deleteAllNodes();
  207. mHighlightedObjects->deleteAllNodes();
  208. mRectSelectedObjects.clear();
  209. mGridObjects.deleteAllNodes();
  210. }
  211. void LLSelectMgr::update()
  212. {
  213. mSelectedObjects->cleanupNodes();
  214. }
  215. void LLSelectMgr::updateEffects()
  216. {
  217. //keep reference grid objects active
  218. struct f : public LLSelectedObjectFunctor
  219. {
  220. virtual bool apply(LLViewerObject* object)
  221. {
  222. LLDrawable* drawable = object->mDrawable;
  223. if (drawable)
  224. {
  225. gPipeline.markMoved(drawable);
  226. }
  227. return true;
  228. }
  229. } func;
  230. mGridObjects.applyToObjects(&func);
  231. if (mEffectsTimer.getElapsedTimeF32() > 1.f)
  232. {
  233. mSelectedObjects->updateEffects();
  234. mEffectsTimer.reset();
  235. }
  236. }
  237. void LLSelectMgr::overrideObjectUpdates()
  238. {
  239. //override any position updates from simulator on objects being edited
  240. struct f : public LLSelectedNodeFunctor
  241. {
  242. virtual bool apply(LLSelectNode* selectNode)
  243. {
  244. LLViewerObject* object = selectNode->getObject();
  245. if (object && object->permMove())
  246. {
  247. if (!selectNode->mLastPositionLocal.isExactlyZero())
  248. {
  249. object->setPosition(selectNode->mLastPositionLocal);
  250. }
  251. if (selectNode->mLastRotation != LLQuaternion())
  252. {
  253. object->setRotation(selectNode->mLastRotation);
  254. }
  255. if (!selectNode->mLastScale.isExactlyZero())
  256. {
  257. object->setScale(selectNode->mLastScale);
  258. }
  259. }
  260. return true;
  261. }
  262. } func;
  263. getSelection()->applyToNodes(&func);
  264. }
  265. //-----------------------------------------------------------------------------
  266. // Select just the object, not any other group members.
  267. //-----------------------------------------------------------------------------
  268. LLObjectSelectionHandle LLSelectMgr::selectObjectOnly(LLViewerObject* object, S32 face)
  269. {
  270. llassert( object );
  271. //remember primary object
  272. mSelectedObjects->mPrimaryObject = object;
  273. // Don't add an object that is already in the list
  274. if (object->isSelected() ) {
  275. // make sure point at position is updated
  276. updatePointAt();
  277. gEditMenuHandler = this;
  278. return NULL;
  279. }
  280. if (!canSelectObject(object))
  281. {
  282. //make_ui_sound("UISndInvalidOp");
  283. return NULL;
  284. }
  285. // llinfos << "Adding object to selected object list" << llendl;
  286. // Place it in the list and tag it.
  287. // This will refresh dialogs.
  288. addAsIndividual(object, face);
  289. // Stop the object from moving (this anticipates changes on the
  290. // simulator in LLTask::userSelect)
  291. // *FIX: shouldn't zero out these either
  292. object->setVelocity(LLVector3::zero);
  293. object->setAcceleration(LLVector3::zero);
  294. //object->setAngularVelocity(LLVector3::zero);
  295. object->resetRot();
  296. // Always send to simulator, so you get a copy of the 
  297. // permissions structure back.
  298. gMessageSystem->newMessageFast(_PREHASH_ObjectSelect);
  299. gMessageSystem->nextBlockFast(_PREHASH_AgentData);
  300. gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
  301. gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  302. gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
  303. gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, object->getLocalID() );
  304. LLViewerRegion* regionp = object->getRegion();
  305. gMessageSystem->sendReliable( regionp->getHost());
  306. updatePointAt();
  307. updateSelectionCenter();
  308. saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK);
  309. // have selection manager handle edit menu immediately after 
  310. // user selects an object
  311. if (mSelectedObjects->getObjectCount())
  312. {
  313. gEditMenuHandler = this;
  314. }
  315. return mSelectedObjects;
  316. }
  317. //-----------------------------------------------------------------------------
  318. // Select the object, parents and children.
  319. //-----------------------------------------------------------------------------
  320. LLObjectSelectionHandle LLSelectMgr::selectObjectAndFamily(LLViewerObject* obj, BOOL add_to_end)
  321. {
  322. llassert( obj );
  323. //remember primary object
  324. mSelectedObjects->mPrimaryObject = obj;
  325. // This may be incorrect if things weren't family selected before... - djs 07/08/02
  326. // Don't add an object that is already in the list
  327. if (obj->isSelected() ) 
  328. {
  329. // make sure pointat position is updated
  330. updatePointAt();
  331. gEditMenuHandler = this;
  332. return NULL;
  333. }
  334. if (!canSelectObject(obj))
  335. {
  336. //make_ui_sound("UISndInvalidOp");
  337. return NULL;
  338. }
  339. // Since we're selecting a family, start at the root, but
  340. // don't include an avatar.
  341. LLViewerObject* root = obj;
  342. while(!root->isAvatar() && root->getParent() && !root->isJointChild())
  343. {
  344. LLViewerObject* parent = (LLViewerObject*)root->getParent();
  345. if (parent->isAvatar())
  346. {
  347. break;
  348. }
  349. root = parent;
  350. }
  351. // Collect all of the objects
  352. std::vector<LLViewerObject*> objects;
  353. root->addThisAndNonJointChildren(objects);
  354. addAsFamily(objects, add_to_end);
  355. updateSelectionCenter();
  356. saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK);
  357. updatePointAt();
  358. dialog_refresh_all();
  359. // Always send to simulator, so you get a copy of the permissions
  360. // structure back.
  361. sendSelect();
  362. // Stop the object from moving (this anticipates changes on the
  363. // simulator in LLTask::userSelect)
  364. root->setVelocity(LLVector3::zero);
  365. root->setAcceleration(LLVector3::zero);
  366. //root->setAngularVelocity(LLVector3::zero);
  367. root->resetRot();
  368. // leave component mode
  369. if (gSavedSettings.getBOOL("EditLinkedParts"))
  370. {
  371. gSavedSettings.setBOOL("EditLinkedParts", FALSE);
  372. promoteSelectionToRoot();
  373. }
  374. // have selection manager handle edit menu immediately after 
  375. // user selects an object
  376. if (mSelectedObjects->getObjectCount())
  377. {
  378. gEditMenuHandler = this;
  379. }
  380. return mSelectedObjects;
  381. }
  382. //-----------------------------------------------------------------------------
  383. // Select the object, parents and children.
  384. //-----------------------------------------------------------------------------
  385. LLObjectSelectionHandle LLSelectMgr::selectObjectAndFamily(const std::vector<LLViewerObject*>& object_list,
  386.    BOOL send_to_sim)
  387. {
  388. // Collect all of the objects, children included
  389. std::vector<LLViewerObject*> objects;
  390. //clear primary object (no primary object)
  391. mSelectedObjects->mPrimaryObject = NULL;
  392. if (object_list.size() < 1)
  393. {
  394. return NULL;
  395. }
  396. // NOTE -- we add the objects in REVERSE ORDER 
  397. // to preserve the order in the mSelectedObjects list
  398. for (std::vector<LLViewerObject*>::const_reverse_iterator riter = object_list.rbegin();
  399.  riter != object_list.rend(); ++riter)
  400. {
  401. LLViewerObject *object = *riter;
  402. llassert( object );
  403. if (!canSelectObject(object)) continue;
  404. object->addThisAndNonJointChildren(objects);
  405. addAsFamily(objects);
  406. // Stop the object from moving (this anticipates changes on the
  407. // simulator in LLTask::userSelect)
  408. object->setVelocity(LLVector3::zero);
  409. object->setAcceleration(LLVector3::zero);
  410. //object->setAngularVelocity(LLVector3::zero);
  411. object->resetRot();
  412. }
  413. updateSelectionCenter();
  414. saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK);
  415. updatePointAt();
  416. dialog_refresh_all();
  417. // Almost always send to simulator, so you get a copy of the permissions
  418. // structure back.
  419. // JC: The one case where you don't want to do this is if you're selecting
  420. // all the objects on a sim.
  421. if (send_to_sim)
  422. {
  423. sendSelect();
  424. }
  425. // leave component mode
  426. if (gSavedSettings.getBOOL("EditLinkedParts"))
  427. {
  428. gSavedSettings.setBOOL("EditLinkedParts", FALSE);
  429. promoteSelectionToRoot();
  430. }
  431. // have selection manager handle edit menu immediately after 
  432. // user selects an object
  433. if (mSelectedObjects->getObjectCount())
  434. {
  435. gEditMenuHandler = this;
  436. }
  437. return mSelectedObjects;
  438. }
  439. // Use for when the simulator kills an object.  This version also
  440. // handles informing the current tool of the object's deletion.
  441. //
  442. // Caller needs to call dialog_refresh_all if necessary.
  443. BOOL LLSelectMgr::removeObjectFromSelections(const LLUUID &id)
  444. {
  445. BOOL object_found = FALSE;
  446. LLTool *tool = NULL;
  447. if (!gNoRender)
  448. {
  449. tool = LLToolMgr::getInstance()->getCurrentTool();
  450. // It's possible that the tool is editing an object that is not selected
  451. LLViewerObject* tool_editing_object = tool->getEditingObject();
  452. if( tool_editing_object && tool_editing_object->mID == id)
  453. {
  454. tool->stopEditing();
  455. object_found = TRUE;
  456. }
  457. }
  458. // Iterate through selected objects list and kill the object
  459. if( !object_found )
  460. {
  461. for (LLObjectSelection::iterator iter = getSelection()->begin();
  462.  iter != getSelection()->end(); )
  463. {
  464. LLObjectSelection::iterator curiter = iter++;
  465. LLViewerObject* object = (*curiter)->getObject();
  466. if (object->mID == id)
  467. {
  468. if (tool)
  469. {
  470. tool->stopEditing();
  471. }
  472. // lose the selection, don't tell simulator, it knows
  473. deselectObjectAndFamily(object, FALSE);
  474. object_found = TRUE;
  475. break; // must break here, may have removed multiple objects from list
  476. }
  477. else if (object->isAvatar() && object->getParent() && ((LLViewerObject*)object->getParent())->mID == id)
  478. {
  479. // It's possible the item being removed has an avatar sitting on it
  480. // So remove the avatar that is sitting on the object.
  481. deselectObjectAndFamily(object, FALSE);
  482. break; // must break here, may have removed multiple objects from list
  483. }
  484. }
  485. }
  486. return object_found;
  487. }
  488. void LLSelectMgr::deselectObjectAndFamily(LLViewerObject* object, BOOL send_to_sim, BOOL include_entire_object)
  489. {
  490. // bail if nothing selected or if object wasn't selected in the first place
  491. if(!object) return;
  492. if(!object->isSelected()) return;
  493. // Collect all of the objects, and remove them
  494. std::vector<LLViewerObject*> objects;
  495. if (include_entire_object)
  496. {
  497. // Since we're selecting a family, start at the root, but
  498. // don't include an avatar.
  499. LLViewerObject* root = object;
  500. while(!root->isAvatar() && root->getParent() && !root->isJointChild())
  501. {
  502. LLViewerObject* parent = (LLViewerObject*)root->getParent();
  503. if (parent->isAvatar())
  504. {
  505. break;
  506. }
  507. root = parent;
  508. }
  509. object = root;
  510. }
  511. else
  512. {
  513. object = (LLViewerObject*)object->getRoot();
  514. }
  515. object->addThisAndAllChildren(objects);
  516. remove(objects);
  517. if (!send_to_sim) return;
  518. //-----------------------------------------------------------
  519. // Inform simulator of deselection
  520. //-----------------------------------------------------------
  521. LLViewerRegion* regionp = object->getRegion();
  522. BOOL start_new_message = TRUE;
  523. S32 select_count = 0;
  524. LLMessageSystem* msg = gMessageSystem;
  525. for (U32 i = 0; i < objects.size(); i++)
  526. {
  527. if (start_new_message)
  528. {
  529. msg->newMessageFast(_PREHASH_ObjectDeselect);
  530. msg->nextBlockFast(_PREHASH_AgentData);
  531. msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
  532. msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  533. select_count++;
  534. start_new_message = FALSE;
  535. }
  536. msg->nextBlockFast(_PREHASH_ObjectData);
  537. msg->addU32Fast(_PREHASH_ObjectLocalID, (objects[i])->getLocalID());
  538. select_count++;
  539. // Zap the angular velocity, as the sim will set it to zero
  540. objects[i]->setAngularVelocity( 0,0,0 );
  541. objects[i]->setVelocity( 0,0,0 );
  542. if(msg->isSendFull(NULL) || select_count >= MAX_OBJECTS_PER_PACKET)
  543. {
  544. msg->sendReliable(regionp->getHost() );
  545. select_count = 0;
  546. start_new_message = TRUE;
  547. }
  548. }
  549. if (!start_new_message)
  550. {
  551. msg->sendReliable(regionp->getHost() );
  552. }
  553. updatePointAt();
  554. updateSelectionCenter();
  555. }
  556. void LLSelectMgr::deselectObjectOnly(LLViewerObject* object, BOOL send_to_sim)
  557. {
  558. // bail if nothing selected or if object wasn't selected in the first place
  559. if (!object) return;
  560. if (!object->isSelected() ) return;
  561. // Zap the angular velocity, as the sim will set it to zero
  562. object->setAngularVelocity( 0,0,0 );
  563. object->setVelocity( 0,0,0 );
  564. if (send_to_sim)
  565. {
  566. LLViewerRegion* region = object->getRegion();
  567. gMessageSystem->newMessageFast(_PREHASH_ObjectDeselect);
  568. gMessageSystem->nextBlockFast(_PREHASH_AgentData);
  569. gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
  570. gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  571. gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
  572. gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, object->getLocalID() );
  573. gMessageSystem->sendReliable(region->getHost());
  574. }
  575. // This will refresh dialogs.
  576. remove( object );
  577. updatePointAt();
  578. updateSelectionCenter();
  579. }
  580. //-----------------------------------------------------------------------------
  581. // addAsFamily
  582. //-----------------------------------------------------------------------------
  583. void LLSelectMgr::addAsFamily(std::vector<LLViewerObject*>& objects, BOOL add_to_end)
  584. {
  585. for (std::vector<LLViewerObject*>::iterator iter = objects.begin();
  586.  iter != objects.end(); ++iter)
  587. {
  588. LLViewerObject* objectp = *iter;
  589. // Can't select yourself
  590. if (objectp->mID == gAgentID
  591. && !LLSelectMgr::getInstance()->mAllowSelectAvatar)
  592. {
  593. continue;
  594. }
  595. if (!objectp->isSelected())
  596. {
  597. LLSelectNode *nodep = new LLSelectNode(objectp, TRUE);
  598. if (add_to_end)
  599. {
  600. mSelectedObjects->addNodeAtEnd(nodep);
  601. }
  602. else
  603. {
  604. mSelectedObjects->addNode(nodep);
  605. }
  606. objectp->setSelected(TRUE);
  607. if (objectp->getNumTEs() > 0)
  608. {
  609. nodep->selectAllTEs(TRUE);
  610. }
  611. else
  612. {
  613. // object has no faces, so don't mess with faces
  614. }
  615. }
  616. else
  617. {
  618. // we want this object to be selected for real
  619. // so clear transient flag
  620. LLSelectNode* select_node = mSelectedObjects->findNode(objectp);
  621. if (select_node)
  622. {
  623. select_node->setTransient(FALSE);
  624. }
  625. }
  626. }
  627. saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK);
  628. }
  629. //-----------------------------------------------------------------------------
  630. // addAsIndividual() - a single object, face, etc
  631. //-----------------------------------------------------------------------------
  632. void LLSelectMgr::addAsIndividual(LLViewerObject *objectp, S32 face, BOOL undoable)
  633. {
  634. // check to see if object is already in list
  635. LLSelectNode *nodep = mSelectedObjects->findNode(objectp);
  636. // if not in list, add it
  637. if (!nodep)
  638. {
  639. nodep = new LLSelectNode(objectp, TRUE);
  640. mSelectedObjects->addNode(nodep);
  641. llassert_always(nodep->getObject());
  642. }
  643. else
  644. {
  645. // make this a full-fledged selection
  646. nodep->setTransient(FALSE);
  647. // Move it to the front of the list
  648. mSelectedObjects->moveNodeToFront(nodep);
  649. }
  650. // Make sure the object is tagged as selected
  651. objectp->setSelected( TRUE );
  652. // And make sure we don't consider it as part of a family
  653. nodep->mIndividualSelection = TRUE;
  654. // Handle face selection
  655. if (objectp->getNumTEs() <= 0)
  656. {
  657. // object has no faces, so don't do anything
  658. }
  659. else if (face == SELECT_ALL_TES)
  660. {
  661. nodep->selectAllTEs(TRUE);
  662. }
  663. else if (0 <= face && face < SELECT_MAX_TES)
  664. {
  665. nodep->selectTE(face, TRUE);
  666. }
  667. else
  668. {
  669. llerrs << "LLSelectMgr::add face " << face << " out-of-range" << llendl;
  670. return;
  671. }
  672. saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK);
  673. updateSelectionCenter();
  674. dialog_refresh_all();
  675. }
  676. LLObjectSelectionHandle LLSelectMgr::setHoverObject(LLViewerObject *objectp, S32 face)
  677. {
  678. if (!objectp)
  679. {
  680. mHoverObjects->deleteAllNodes();
  681. return NULL;
  682. }
  683. // Can't select yourself
  684. if (objectp->mID == gAgentID)
  685. {
  686. mHoverObjects->deleteAllNodes();
  687. return NULL;
  688. }
  689. // Can't select land
  690. if (objectp->getPCode() == LLViewerObject::LL_VO_SURFACE_PATCH)
  691. {
  692. mHoverObjects->deleteAllNodes();
  693. return NULL;
  694. }
  695. mHoverObjects->mPrimaryObject = objectp; 
  696. objectp = objectp->getRootEdit();
  697. // is the requested object the same as the existing hover object root?
  698. // NOTE: there is only ever one linked set in mHoverObjects
  699. if (mHoverObjects->getFirstRootObject() != objectp) 
  700. {
  701. // Collect all of the objects
  702. std::vector<LLViewerObject*> objects;
  703. objectp = objectp->getRootEdit();
  704. objectp->addThisAndNonJointChildren(objects);
  705. mHoverObjects->deleteAllNodes();
  706. for (std::vector<LLViewerObject*>::iterator iter = objects.begin();
  707.  iter != objects.end(); ++iter)
  708. {
  709. LLViewerObject* cur_objectp = *iter;
  710. LLSelectNode* nodep = new LLSelectNode(cur_objectp, FALSE);
  711. nodep->selectTE(face, TRUE);
  712. mHoverObjects->addNodeAtEnd(nodep);
  713. }
  714. requestObjectPropertiesFamily(objectp);
  715. }
  716. return mHoverObjects;
  717. }
  718. LLSelectNode *LLSelectMgr::getHoverNode()
  719. {
  720. return mHoverObjects->getFirstRootNode();
  721. }
  722. LLSelectNode *LLSelectMgr::getPrimaryHoverNode()
  723. {
  724. return mHoverObjects->mSelectNodeMap[mHoverObjects->mPrimaryObject];
  725. }
  726. void LLSelectMgr::highlightObjectOnly(LLViewerObject* objectp)
  727. {
  728. if (!objectp)
  729. {
  730. return;
  731. }
  732. if (objectp->getPCode() != LL_PCODE_VOLUME)
  733. {
  734. return;
  735. }
  736. if ((gSavedSettings.getBOOL("SelectOwnedOnly") && !objectp->permYouOwner()) 
  737. || (gSavedSettings.getBOOL("SelectMovableOnly") && !objectp->permMove()))
  738. {
  739. // only select my own objects
  740. return;
  741. }
  742. mRectSelectedObjects.insert(objectp);
  743. }
  744. void LLSelectMgr::highlightObjectAndFamily(LLViewerObject* objectp)
  745. {
  746. if (!objectp)
  747. {
  748. return;
  749. }
  750. LLViewerObject* root_obj = (LLViewerObject*)objectp->getRoot();
  751. highlightObjectOnly(root_obj);
  752. LLViewerObject::const_child_list_t& child_list = root_obj->getChildren();
  753. for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
  754.  iter != child_list.end(); iter++)
  755. {
  756. LLViewerObject* child = *iter;
  757. highlightObjectOnly(child);
  758. }
  759. }
  760. // Note that this ignores the "select owned only" flag
  761. // It's also more efficient than calling the single-object version over and over.
  762. void LLSelectMgr::highlightObjectAndFamily(const std::vector<LLViewerObject*>& objects)
  763. {
  764. for (std::vector<LLViewerObject*>::const_iterator iter1 = objects.begin();
  765.  iter1 != objects.end(); ++iter1)
  766. {
  767. LLViewerObject* object = *iter1;
  768. if (!object)
  769. {
  770. continue;
  771. }
  772. if (object->getPCode() != LL_PCODE_VOLUME)
  773. {
  774. continue;
  775. }
  776. LLViewerObject* root = (LLViewerObject*)object->getRoot();
  777. mRectSelectedObjects.insert(root);
  778. LLViewerObject::const_child_list_t& child_list = root->getChildren();
  779. for (LLViewerObject::child_list_t::const_iterator iter2 = child_list.begin();
  780.  iter2 != child_list.end(); iter2++)
  781. {
  782. LLViewerObject* child = *iter2;
  783. mRectSelectedObjects.insert(child);
  784. }
  785. }
  786. }
  787. void LLSelectMgr::unhighlightObjectOnly(LLViewerObject* objectp)
  788. {
  789. if (!objectp || (objectp->getPCode() != LL_PCODE_VOLUME))
  790. {
  791. return;
  792. }
  793. mRectSelectedObjects.erase(objectp);
  794. }
  795. void LLSelectMgr::unhighlightObjectAndFamily(LLViewerObject* objectp)
  796. {
  797. if (!objectp)
  798. {
  799. return;
  800. }
  801. LLViewerObject* root_obj = (LLViewerObject*)objectp->getRoot();
  802. unhighlightObjectOnly(root_obj);
  803. LLViewerObject::const_child_list_t& child_list = root_obj->getChildren();
  804. for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
  805.  iter != child_list.end(); iter++)
  806. {
  807. LLViewerObject* child = *iter;
  808. unhighlightObjectOnly(child);
  809. }
  810. }
  811. void LLSelectMgr::unhighlightAll()
  812. {
  813. mRectSelectedObjects.clear();
  814. mHighlightedObjects->deleteAllNodes();
  815. }
  816. LLObjectSelectionHandle LLSelectMgr::selectHighlightedObjects()
  817. {
  818. if (!mHighlightedObjects->getNumNodes())
  819. {
  820. return NULL;
  821. }
  822. //clear primary object
  823. mSelectedObjects->mPrimaryObject = NULL;
  824. for (LLObjectSelection::iterator iter = getHighlightedObjects()->begin();
  825.  iter != getHighlightedObjects()->end(); )
  826. {
  827. LLObjectSelection::iterator curiter = iter++;
  828. LLSelectNode *nodep = *curiter;
  829. LLViewerObject* objectp = nodep->getObject();
  830. if (!canSelectObject(objectp))
  831. {
  832. continue;
  833. }
  834. // already selected
  835. if (objectp->isSelected())
  836. {
  837. continue;
  838. }
  839. LLSelectNode* new_nodep = new LLSelectNode(*nodep);
  840. mSelectedObjects->addNode(new_nodep);
  841. // flag this object as selected
  842. objectp->setSelected(TRUE);
  843. mSelectedObjects->mSelectType = getSelectTypeForObject(objectp);
  844. // request properties on root objects
  845. if (objectp->isRootEdit())
  846. {
  847. requestObjectPropertiesFamily(objectp);
  848. }
  849. }
  850. // pack up messages to let sim know these objects are selected
  851. sendSelect();
  852. unhighlightAll();
  853. updateSelectionCenter();
  854. saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK);
  855. updatePointAt();
  856. if (mSelectedObjects->getObjectCount())
  857. {
  858. gEditMenuHandler = this;
  859. }
  860. return mSelectedObjects;
  861. }
  862. void LLSelectMgr::deselectHighlightedObjects()
  863. {
  864. BOOL select_linked_set = !gSavedSettings.getBOOL("EditLinkedParts");
  865. for (std::set<LLPointer<LLViewerObject> >::iterator iter = mRectSelectedObjects.begin();
  866.  iter != mRectSelectedObjects.end(); iter++)
  867. {
  868. LLViewerObject *objectp = *iter;
  869. if (!select_linked_set)
  870. {
  871. deselectObjectOnly(objectp);
  872. }
  873. else
  874. {
  875. LLViewerObject* root_object = (LLViewerObject*)objectp->getRoot();
  876. if (root_object->isSelected())
  877. {
  878. deselectObjectAndFamily(root_object);
  879. }
  880. }
  881. }
  882. unhighlightAll();
  883. }
  884. void LLSelectMgr::addGridObject(LLViewerObject* objectp)
  885. {
  886. LLSelectNode* nodep = new LLSelectNode(objectp, FALSE);
  887. mGridObjects.addNodeAtEnd(nodep);
  888. LLViewerObject::const_child_list_t& child_list = objectp->getChildren();
  889. for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
  890.  iter != child_list.end(); iter++)
  891. {
  892. LLViewerObject* child = *iter;
  893. nodep = new LLSelectNode(child, FALSE);
  894. mGridObjects.addNodeAtEnd(nodep);
  895. }
  896. }
  897. void LLSelectMgr::clearGridObjects()
  898. {
  899. mGridObjects.deleteAllNodes();
  900. }
  901. void LLSelectMgr::setGridMode(EGridMode mode)
  902. {
  903. mGridMode = mode;
  904. gSavedSettings.setS32("GridMode", mode);
  905. updateSelectionCenter();
  906. mGridValid = FALSE;
  907. }
  908. void LLSelectMgr::getGrid(LLVector3& origin, LLQuaternion &rotation, LLVector3 &scale)
  909. {
  910. mGridObjects.cleanupNodes();
  911. LLViewerObject* first_grid_object = mGridObjects.getFirstObject();
  912. if (mGridMode == GRID_MODE_LOCAL && mSelectedObjects->getObjectCount())
  913. {
  914. //LLViewerObject* root = getSelectedParentObject(mSelectedObjects->getFirstObject());
  915. LLBBox bbox = mSavedSelectionBBox;
  916. mGridOrigin = mSavedSelectionBBox.getCenterAgent();
  917. mGridScale = mSavedSelectionBBox.getExtentLocal() * 0.5f;
  918. // DEV-12570 Just taking the saved selection box rotation prevents
  919. // wild rotations of linked sets while in local grid mode
  920. //if(mSelectedObjects->getObjectCount() < 2 || !root || root->mDrawable.isNull())
  921. {
  922. mGridRotation = mSavedSelectionBBox.getRotation();
  923. }
  924. /*else //set to the root object
  925. {
  926. mGridRotation = root->getRenderRotation();
  927. }*/
  928. }
  929. else if (mGridMode == GRID_MODE_REF_OBJECT && first_grid_object && first_grid_object->mDrawable.notNull())
  930. {
  931. mGridRotation = first_grid_object->getRenderRotation();
  932. LLVector3 first_grid_obj_pos = first_grid_object->getRenderPosition();
  933. LLVector3 min_extents(F32_MAX, F32_MAX, F32_MAX);
  934. LLVector3 max_extents(-F32_MAX, -F32_MAX, -F32_MAX);
  935. BOOL grid_changed = FALSE;
  936. for (LLObjectSelection::iterator iter = mGridObjects.begin();
  937.  iter != mGridObjects.end(); ++iter)
  938. {
  939. LLViewerObject* object = (*iter)->getObject();
  940. LLDrawable* drawable = object->mDrawable;
  941. if (drawable)
  942. {
  943. const LLVector3* ext = drawable->getSpatialExtents();
  944. update_min_max(min_extents, max_extents, ext[0]);
  945. update_min_max(min_extents, max_extents, ext[1]);
  946. grid_changed = TRUE;
  947. }
  948. }
  949. if (grid_changed)
  950. {
  951. mGridOrigin = lerp(min_extents, max_extents, 0.5f);
  952. LLDrawable* drawable = first_grid_object->mDrawable;
  953. if (drawable && drawable->isActive())
  954. {
  955. mGridOrigin = mGridOrigin * first_grid_object->getRenderMatrix();
  956. }
  957. mGridScale = (max_extents - min_extents) * 0.5f;
  958. }
  959. }
  960. else // GRID_MODE_WORLD or just plain default
  961. {
  962. const BOOL non_root_ok = TRUE;
  963. LLViewerObject* first_object = mSelectedObjects->getFirstRootObject(non_root_ok);
  964. mGridOrigin.clearVec();
  965. mGridRotation.loadIdentity();
  966. mSelectedObjects->mSelectType = getSelectTypeForObject( first_object );
  967. switch (mSelectedObjects->mSelectType)
  968. {
  969. case SELECT_TYPE_ATTACHMENT:
  970. if (first_object && first_object->getRootEdit()->mDrawable.notNull())
  971. {
  972. // this means this object *has* to be an attachment
  973. LLXform* attachment_point_xform = first_object->getRootEdit()->mDrawable->mXform.getParent();
  974. mGridOrigin = attachment_point_xform->getWorldPosition();
  975. mGridRotation = attachment_point_xform->getWorldRotation();
  976. mGridScale = LLVector3(1.f, 1.f, 1.f) * gSavedSettings.getF32("GridResolution");
  977. }
  978. break;
  979. case SELECT_TYPE_HUD:
  980. // use HUD-scaled grid
  981. mGridScale = LLVector3(0.25f, 0.25f, 0.25f);
  982. break;
  983. case SELECT_TYPE_WORLD:
  984. mGridScale = LLVector3(1.f, 1.f, 1.f) * gSavedSettings.getF32("GridResolution");
  985. break;
  986. }
  987. }
  988. llassert(mGridOrigin.isFinite());
  989. origin = mGridOrigin;
  990. rotation = mGridRotation;
  991. scale = mGridScale;
  992. mGridValid = TRUE;
  993. }
  994. //-----------------------------------------------------------------------------
  995. // remove() - an array of objects
  996. //-----------------------------------------------------------------------------
  997. void LLSelectMgr::remove(std::vector<LLViewerObject*>& objects)
  998. {
  999. for (std::vector<LLViewerObject*>::iterator iter = objects.begin();
  1000.  iter != objects.end(); ++iter)
  1001. {
  1002. LLViewerObject* objectp = *iter;
  1003. LLSelectNode* nodep = mSelectedObjects->findNode(objectp);
  1004. if (nodep)
  1005. {
  1006. objectp->setSelected(FALSE);
  1007. mSelectedObjects->removeNode(nodep);
  1008. nodep = NULL;
  1009. }
  1010. }
  1011. updateSelectionCenter();
  1012. dialog_refresh_all();
  1013. }
  1014. //-----------------------------------------------------------------------------
  1015. // remove() - a single object
  1016. //-----------------------------------------------------------------------------
  1017. void LLSelectMgr::remove(LLViewerObject *objectp, S32 te, BOOL undoable)
  1018. {
  1019. // get object node (and verify it is in the selected list)
  1020. LLSelectNode *nodep = mSelectedObjects->findNode(objectp);
  1021. if (!nodep)
  1022. {
  1023. return;
  1024. }
  1025. // if face = all, remove object from list
  1026. if ((objectp->getNumTEs() <= 0) || (te == SELECT_ALL_TES))
  1027. {
  1028. // Remove all faces (or the object doesn't have faces) so remove the node
  1029. mSelectedObjects->removeNode(nodep);
  1030. nodep = NULL;
  1031. objectp->setSelected( FALSE );
  1032. }
  1033. else if (0 <= te && te < SELECT_MAX_TES)
  1034. {
  1035. // ...valid face, check to see if it was on
  1036. if (nodep->isTESelected(te))
  1037. {
  1038. nodep->selectTE(te, FALSE);
  1039. }
  1040. else
  1041. {
  1042. llerrs << "LLSelectMgr::remove - tried to remove TE " << te << " that wasn't selected" << llendl;
  1043. return;
  1044. }
  1045. // ...check to see if this operation turned off all faces
  1046. BOOL found = FALSE;
  1047. for (S32 i = 0; i < nodep->getObject()->getNumTEs(); i++)
  1048. {
  1049. found = found || nodep->isTESelected(i);
  1050. }
  1051. // ...all faces now turned off, so remove
  1052. if (!found)
  1053. {
  1054. mSelectedObjects->removeNode(nodep);
  1055. nodep = NULL;
  1056. objectp->setSelected( FALSE );
  1057. // *FIXME: Doesn't update simulator that object is no longer selected
  1058. }
  1059. }
  1060. else
  1061. {
  1062. // ...out of range face
  1063. llerrs << "LLSelectMgr::remove - TE " << te << " out of range" << llendl;
  1064. }
  1065. updateSelectionCenter();
  1066. dialog_refresh_all();
  1067. }
  1068. //-----------------------------------------------------------------------------
  1069. // removeAll()
  1070. //-----------------------------------------------------------------------------
  1071. void LLSelectMgr::removeAll()
  1072. {
  1073. for (LLObjectSelection::iterator iter = mSelectedObjects->begin();
  1074.  iter != mSelectedObjects->end(); iter++ )
  1075. {
  1076. LLViewerObject *objectp = (*iter)->getObject();
  1077. objectp->setSelected( FALSE );
  1078. }
  1079. mSelectedObjects->deleteAllNodes();
  1080. updateSelectionCenter();
  1081. dialog_refresh_all();
  1082. }
  1083. //-----------------------------------------------------------------------------
  1084. // promoteSelectionToRoot()
  1085. //-----------------------------------------------------------------------------
  1086. void LLSelectMgr::promoteSelectionToRoot()
  1087. {
  1088. std::set<LLViewerObject*> selection_set;
  1089. BOOL selection_changed = FALSE;
  1090. for (LLObjectSelection::iterator iter = getSelection()->begin();
  1091.  iter != getSelection()->end(); )
  1092. {
  1093. LLObjectSelection::iterator curiter = iter++;
  1094. LLSelectNode* nodep = *curiter;
  1095. LLViewerObject* object = nodep->getObject();
  1096. if (nodep->mIndividualSelection)
  1097. {
  1098. selection_changed = TRUE;
  1099. }
  1100. LLViewerObject* parentp = object;
  1101. while(parentp->getParent() && !(parentp->isRootEdit() || parentp->isJointChild()))
  1102. {
  1103. parentp = (LLViewerObject*)parentp->getParent();
  1104. }
  1105. selection_set.insert(parentp);
  1106. }
  1107. if (selection_changed)
  1108. {
  1109. deselectAll();
  1110. std::set<LLViewerObject*>::iterator set_iter;
  1111. for (set_iter = selection_set.begin(); set_iter != selection_set.end(); ++set_iter)
  1112. {
  1113. selectObjectAndFamily(*set_iter);
  1114. }
  1115. }
  1116. }
  1117. //-----------------------------------------------------------------------------
  1118. // demoteSelectionToIndividuals()
  1119. //-----------------------------------------------------------------------------
  1120. void LLSelectMgr::demoteSelectionToIndividuals()
  1121. {
  1122. std::vector<LLViewerObject*> objects;
  1123. for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
  1124.  iter != getSelection()->root_end(); iter++)
  1125. {
  1126. LLViewerObject* object = (*iter)->getObject();
  1127. object->addThisAndNonJointChildren(objects);
  1128. }
  1129. if (!objects.empty())
  1130. {
  1131. deselectAll();
  1132. for (std::vector<LLViewerObject*>::iterator iter = objects.begin();
  1133.  iter != objects.end(); ++iter)
  1134. {
  1135. LLViewerObject* objectp = *iter;
  1136. selectObjectOnly(objectp);
  1137. }
  1138. }
  1139. }
  1140. //-----------------------------------------------------------------------------
  1141. // dump()
  1142. //-----------------------------------------------------------------------------
  1143. void LLSelectMgr::dump()
  1144. {
  1145. llinfos << "Selection Manager: " << mSelectedObjects->getNumNodes() << " items" << llendl;
  1146. llinfos << "TE mode " << mTEMode << llendl;
  1147. S32 count = 0;
  1148. for (LLObjectSelection::iterator iter = getSelection()->begin();
  1149.  iter != getSelection()->end(); iter++ )
  1150. {
  1151. LLViewerObject* objectp = (*iter)->getObject();
  1152. llinfos << "Object " << count << " type " << LLPrimitive::pCodeToString(objectp->getPCode()) << llendl;
  1153. llinfos << "  hasLSL " << objectp->flagScripted() << llendl;
  1154. llinfos << "  hasTouch " << objectp->flagHandleTouch() << llendl;
  1155. llinfos << "  hasMoney " << objectp->flagTakesMoney() << llendl;
  1156. llinfos << "  getposition " << objectp->getPosition() << llendl;
  1157. llinfos << "  getpositionAgent " << objectp->getPositionAgent() << llendl;
  1158. llinfos << "  getpositionRegion " << objectp->getPositionRegion() << llendl;
  1159. llinfos << "  getpositionGlobal " << objectp->getPositionGlobal() << llendl;
  1160. LLDrawable* drawablep = objectp->mDrawable;
  1161. llinfos << "  " << (drawablep&& drawablep->isVisible() ? "visible" : "invisible") << llendl;
  1162. llinfos << "  " << (drawablep&& drawablep->isState(LLDrawable::FORCE_INVISIBLE) ? "force_invisible" : "") << llendl;
  1163. count++;
  1164. }
  1165. // Face iterator
  1166. for (LLObjectSelection::iterator iter = getSelection()->begin();
  1167.  iter != getSelection()->end(); iter++ )
  1168. {
  1169. LLSelectNode* node = *iter;
  1170. LLViewerObject* objectp = node->getObject();
  1171. if (!objectp)
  1172. continue;
  1173. for (S32 te = 0; te < objectp->getNumTEs(); ++te )
  1174. {
  1175. if (node->isTESelected(te))
  1176. {
  1177. llinfos << "Object " << objectp << " te " << te << llendl;
  1178. }
  1179. }
  1180. }
  1181. llinfos << mHighlightedObjects->getNumNodes() << " objects currently highlighted." << llendl;
  1182. llinfos << "Center global " << mSelectionCenterGlobal << llendl;
  1183. }
  1184. //-----------------------------------------------------------------------------
  1185. // cleanup()
  1186. //-----------------------------------------------------------------------------
  1187. void LLSelectMgr::cleanup()
  1188. {
  1189. mSilhouetteImagep = NULL;
  1190. }
  1191. //---------------------------------------------------------------------------
  1192. // Manipulate properties of selected objects
  1193. //---------------------------------------------------------------------------
  1194. struct LLSelectMgrSendFunctor : public LLSelectedObjectFunctor
  1195. {
  1196. virtual bool apply(LLViewerObject* object)
  1197. {
  1198. if (object->permModify())
  1199. {
  1200. object->sendTEUpdate();
  1201. }
  1202. return true;
  1203. }
  1204. };
  1205. //-----------------------------------------------------------------------------
  1206. // selectionSetImage()
  1207. //-----------------------------------------------------------------------------
  1208. // *TODO: re-arch texture applying out of lltooldraganddrop
  1209. void LLSelectMgr::selectionSetImage(const LLUUID& imageid)
  1210. {
  1211. // First for (no copy) textures and multiple object selection
  1212. LLViewerInventoryItem* item = gInventory.getItem(imageid);
  1213. if(item 
  1214. && !item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID())
  1215. && (mSelectedObjects->getNumNodes() > 1) )
  1216. {
  1217. llwarns << "Attempted to apply no-copy texture to multiple objects"
  1218. << llendl;
  1219. return;
  1220. }
  1221. struct f : public LLSelectedTEFunctor
  1222. {
  1223. LLViewerInventoryItem* mItem;
  1224. LLUUID mImageID;
  1225. f(LLViewerInventoryItem* item, const LLUUID& id) : mItem(item), mImageID(id) {}
  1226. bool apply(LLViewerObject* objectp, S32 te)
  1227. {
  1228. if (mItem)
  1229. {
  1230. if (te == -1) // all faces
  1231. {
  1232. LLToolDragAndDrop::dropTextureAllFaces(objectp,
  1233.    mItem,
  1234.    LLToolDragAndDrop::SOURCE_AGENT,
  1235.    LLUUID::null);
  1236. }
  1237. else // one face
  1238. {
  1239. LLToolDragAndDrop::dropTextureOneFace(objectp,
  1240.   te,
  1241.   mItem,
  1242.   LLToolDragAndDrop::SOURCE_AGENT,
  1243.   LLUUID::null);
  1244. }
  1245. }
  1246. else // not an inventory item
  1247. {
  1248. // Texture picker defaults aren't inventory items
  1249. // * Don't need to worry about permissions for them
  1250. // * Can just apply the texture and be done with it.
  1251. objectp->setTEImage(te, LLViewerTextureManager::getFetchedTexture(mImageID, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE));
  1252. }
  1253. return true;
  1254. }
  1255. } setfunc(item, imageid);
  1256. getSelection()->applyToTEs(&setfunc);
  1257. struct g : public LLSelectedObjectFunctor
  1258. {
  1259. LLViewerInventoryItem* mItem;
  1260. g(LLViewerInventoryItem* item) : mItem(item) {}
  1261. virtual bool apply(LLViewerObject* object)
  1262. {
  1263. if (!mItem)
  1264. {
  1265. object->sendTEUpdate();
  1266. // 1 particle effect per object
  1267. LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE);
  1268. effectp->setSourceObject(gAgent.getAvatarObject());
  1269. effectp->setTargetObject(object);
  1270. effectp->setDuration(LL_HUD_DUR_SHORT);
  1271. effectp->setColor(LLColor4U(gAgent.getEffectColor()));
  1272. }
  1273. return true;
  1274. }
  1275. } sendfunc(item);
  1276. getSelection()->applyToObjects(&sendfunc);
  1277. }
  1278. //-----------------------------------------------------------------------------
  1279. // selectionSetColor()
  1280. //-----------------------------------------------------------------------------
  1281. void LLSelectMgr::selectionSetColor(const LLColor4 &color)
  1282. {
  1283. struct f : public LLSelectedTEFunctor
  1284. {
  1285. LLColor4 mColor;
  1286. f(const LLColor4& c) : mColor(c) {}
  1287. bool apply(LLViewerObject* object, S32 te)
  1288. {
  1289. if (object->permModify())
  1290. {
  1291. object->setTEColor(te, mColor);
  1292. }
  1293. return true;
  1294. }
  1295. } setfunc(color);
  1296. getSelection()->applyToTEs(&setfunc);
  1297. LLSelectMgrSendFunctor sendfunc;
  1298. getSelection()->applyToObjects(&sendfunc);
  1299. }
  1300. //-----------------------------------------------------------------------------
  1301. // selectionSetColorOnly()
  1302. //-----------------------------------------------------------------------------
  1303. void LLSelectMgr::selectionSetColorOnly(const LLColor4 &color)
  1304. {
  1305. struct f : public LLSelectedTEFunctor
  1306. {
  1307. LLColor4 mColor;
  1308. f(const LLColor4& c) : mColor(c) {}
  1309. bool apply(LLViewerObject* object, S32 te)
  1310. {
  1311. if (object->permModify())
  1312. {
  1313. LLColor4 prev_color = object->getTE(te)->getColor();
  1314. mColor.mV[VALPHA] = prev_color.mV[VALPHA];
  1315. // update viewer side color in anticipation of update from simulator
  1316. object->setTEColor(te, mColor);
  1317. }
  1318. return true;
  1319. }
  1320. } setfunc(color);
  1321. getSelection()->applyToTEs(&setfunc);
  1322. LLSelectMgrSendFunctor sendfunc;
  1323. getSelection()->applyToObjects(&sendfunc);
  1324. }
  1325. //-----------------------------------------------------------------------------
  1326. // selectionSetAlphaOnly()
  1327. //-----------------------------------------------------------------------------
  1328. void LLSelectMgr::selectionSetAlphaOnly(const F32 alpha)
  1329. {
  1330. struct f : public LLSelectedTEFunctor
  1331. {
  1332. F32 mAlpha;
  1333. f(const F32& a) : mAlpha(a) {}
  1334. bool apply(LLViewerObject* object, S32 te)
  1335. {
  1336. if (object->permModify())
  1337. {
  1338. LLColor4 prev_color = object->getTE(te)->getColor();
  1339. prev_color.mV[VALPHA] = mAlpha;
  1340. // update viewer side color in anticipation of update from simulator
  1341. object->setTEColor(te, prev_color);
  1342. }
  1343. return true;
  1344. }
  1345. } setfunc(alpha);
  1346. getSelection()->applyToTEs(&setfunc);
  1347. LLSelectMgrSendFunctor sendfunc;
  1348. getSelection()->applyToObjects(&sendfunc);
  1349. }
  1350. void LLSelectMgr::selectionRevertColors()
  1351. {
  1352. struct f : public LLSelectedTEFunctor
  1353. {
  1354. LLObjectSelectionHandle mSelectedObjects;
  1355. f(LLObjectSelectionHandle sel) : mSelectedObjects(sel) {}
  1356. bool apply(LLViewerObject* object, S32 te)
  1357. {
  1358. if (object->permModify())
  1359. {
  1360. LLSelectNode* nodep = mSelectedObjects->findNode(object);
  1361. if (nodep && te < (S32)nodep->mSavedColors.size())
  1362. {
  1363. LLColor4 color = nodep->mSavedColors[te];
  1364. // update viewer side color in anticipation of update from simulator
  1365. object->setTEColor(te, color);
  1366. }
  1367. }
  1368. return true;
  1369. }
  1370. } setfunc(mSelectedObjects);
  1371. getSelection()->applyToTEs(&setfunc);
  1372. LLSelectMgrSendFunctor sendfunc;
  1373. getSelection()->applyToObjects(&sendfunc);
  1374. }
  1375. BOOL LLSelectMgr::selectionRevertTextures()
  1376. {
  1377. struct f : public LLSelectedTEFunctor
  1378. {
  1379. LLObjectSelectionHandle mSelectedObjects;
  1380. f(LLObjectSelectionHandle sel) : mSelectedObjects(sel) {}
  1381. bool apply(LLViewerObject* object, S32 te)
  1382. {
  1383. if (object->permModify())
  1384. {
  1385. LLSelectNode* nodep = mSelectedObjects->findNode(object);
  1386. if (nodep && te < (S32)nodep->mSavedTextures.size())
  1387. {
  1388. LLUUID id = nodep->mSavedTextures[te];
  1389. // update textures on viewer side
  1390. if (id.isNull())
  1391. {
  1392. // this was probably a no-copy texture, leave image as-is
  1393. return FALSE;
  1394. }
  1395. else
  1396. {
  1397. object->setTEImage(te, LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE));
  1398. }
  1399. }
  1400. }
  1401. return true;
  1402. }
  1403. } setfunc(mSelectedObjects);
  1404. BOOL revert_successful = getSelection()->applyToTEs(&setfunc);
  1405. LLSelectMgrSendFunctor sendfunc;
  1406. getSelection()->applyToObjects(&sendfunc);
  1407. return revert_successful;
  1408. }
  1409. void LLSelectMgr::selectionSetBumpmap(U8 bumpmap)
  1410. {
  1411. struct f : public LLSelectedTEFunctor
  1412. {
  1413. U8 mBump;
  1414. f(const U8& b) : mBump(b) {}
  1415. bool apply(LLViewerObject* object, S32 te)
  1416. {
  1417. if (object->permModify())
  1418. {
  1419. // update viewer side color in anticipation of update from simulator
  1420. object->setTEBumpmap(te, mBump);
  1421. }
  1422. return true;
  1423. }
  1424. } setfunc(bumpmap);
  1425. getSelection()->applyToTEs(&setfunc);
  1426. LLSelectMgrSendFunctor sendfunc;
  1427. getSelection()->applyToObjects(&sendfunc);
  1428. }
  1429. void LLSelectMgr::selectionSetTexGen(U8 texgen)
  1430. {
  1431. struct f : public LLSelectedTEFunctor
  1432. {
  1433. U8 mTexgen;
  1434. f(const U8& t) : mTexgen(t) {}
  1435. bool apply(LLViewerObject* object, S32 te)
  1436. {
  1437. if (object->permModify())
  1438. {
  1439. // update viewer side color in anticipation of update from simulator
  1440. object->setTETexGen(te, mTexgen);
  1441. }
  1442. return true;
  1443. }
  1444. } setfunc(texgen);
  1445. getSelection()->applyToTEs(&setfunc);
  1446. LLSelectMgrSendFunctor sendfunc;
  1447. getSelection()->applyToObjects(&sendfunc);
  1448. }
  1449. void LLSelectMgr::selectionSetShiny(U8 shiny)
  1450. {
  1451. struct f : public LLSelectedTEFunctor
  1452. {
  1453. U8 mShiny;
  1454. f(const U8& t) : mShiny(t) {}
  1455. bool apply(LLViewerObject* object, S32 te)
  1456. {
  1457. if (object->permModify())
  1458. {
  1459. // update viewer side color in anticipation of update from simulator
  1460. object->setTEShiny(te, mShiny);
  1461. }
  1462. return true;
  1463. }
  1464. } setfunc(shiny);
  1465. getSelection()->applyToTEs(&setfunc);
  1466. LLSelectMgrSendFunctor sendfunc;
  1467. getSelection()->applyToObjects(&sendfunc);
  1468. }
  1469. void LLSelectMgr::selectionSetFullbright(U8 fullbright)
  1470. {
  1471. struct f : public LLSelectedTEFunctor
  1472. {
  1473. U8 mFullbright;
  1474. f(const U8& t) : mFullbright(t) {}
  1475. bool apply(LLViewerObject* object, S32 te)
  1476. {
  1477. if (object->permModify())
  1478. {
  1479. // update viewer side color in anticipation of update from simulator
  1480. object->setTEFullbright(te, mFullbright);
  1481. }
  1482. return true;
  1483. }
  1484. } setfunc(fullbright);
  1485. getSelection()->applyToTEs(&setfunc);
  1486. struct g : public LLSelectedObjectFunctor
  1487. {
  1488. U8 mFullbright;
  1489. g(const U8& t) : mFullbright(t) {}
  1490. virtual bool apply(LLViewerObject* object)
  1491. {
  1492. if (object->permModify())
  1493. {
  1494. object->sendTEUpdate();
  1495. if (mFullbright)
  1496. {
  1497. U8 material = object->getMaterial();
  1498. U8 mcode = material & LL_MCODE_MASK;
  1499. if (mcode == LL_MCODE_LIGHT)
  1500. {
  1501. mcode = LL_MCODE_GLASS;
  1502. material = (material & ~LL_MCODE_MASK) | mcode;
  1503. object->setMaterial(material);
  1504. object->sendMaterialUpdate();
  1505. }
  1506. }
  1507. }
  1508. return true;
  1509. }
  1510. } sendfunc(fullbright);
  1511. getSelection()->applyToObjects(&sendfunc);
  1512. }
  1513. // This function expects media_data to be a map containing relevant
  1514. // media data name/value pairs (e.g. home_url, etc.)
  1515. void LLSelectMgr::selectionSetMedia(U8 media_type, const LLSD &media_data)
  1516. {
  1517. struct f : public LLSelectedTEFunctor
  1518. {
  1519. U8 mMediaFlags;
  1520. const LLSD &mMediaData;
  1521. f(const U8& t, const LLSD& d) : mMediaFlags(t), mMediaData(d) {}
  1522. bool apply(LLViewerObject* object, S32 te)
  1523. {
  1524. if (object->permModify())
  1525. {
  1526. // If we are adding media, then check the current state of the
  1527. // media data on this face.  
  1528. //  - If it does not have media, AND we are NOT setting the HOME URL, then do NOT add media to this
  1529. // face.
  1530. //  - If it does not have media, and we ARE setting the HOME URL, add media to this face.
  1531. //  - If it does already have media, add/update media to/on this face
  1532. // If we are removing media, just do it (ignore the passed-in LLSD).
  1533. if (mMediaFlags & LLTextureEntry::MF_HAS_MEDIA)
  1534. {
  1535. llassert(mMediaData.isMap());
  1536. const LLTextureEntry *texture_entry = object->getTE(te);
  1537. if (!mMediaData.isMap() ||
  1538. (NULL != texture_entry) && !texture_entry->hasMedia() && !mMediaData.has(LLMediaEntry::HOME_URL_KEY))
  1539. {
  1540. // skip adding/updating media
  1541. }
  1542. else {
  1543. // Add/update media
  1544. object->setTEMediaFlags(te, mMediaFlags);
  1545. LLVOVolume *vo = dynamic_cast<LLVOVolume*>(object);
  1546. llassert(NULL != vo);
  1547. if (NULL != vo) 
  1548. {
  1549. vo->syncMediaData(te, mMediaData, true/*merge*/, true/*ignore_agent*/);
  1550. }
  1551. }
  1552. }
  1553. else
  1554. {
  1555. // delete media (or just set the flags)
  1556. object->setTEMediaFlags(te, mMediaFlags);
  1557. }
  1558. }
  1559. return true;
  1560. }
  1561. } setfunc(media_type, media_data);
  1562. getSelection()->applyToTEs(&setfunc);
  1563. struct f2 : public LLSelectedObjectFunctor
  1564. {
  1565. virtual bool apply(LLViewerObject* object)
  1566. {
  1567. if (object->permModify())
  1568. {
  1569. object->sendTEUpdate();
  1570. LLVOVolume *vo = dynamic_cast<LLVOVolume*>(object);
  1571. llassert(NULL != vo);
  1572. // It's okay to skip this object if hasMedia() is false...
  1573. // the sendTEUpdate() above would remove all media data if it were
  1574. // there.
  1575.                 if (NULL != vo && vo->hasMedia())
  1576.                 {
  1577.                     // Send updated media data FOR THE ENTIRE OBJECT
  1578.                     vo->sendMediaDataUpdate();
  1579.                 }
  1580. }
  1581. return true;
  1582. }
  1583. } func2;
  1584. mSelectedObjects->applyToObjects( &func2 );
  1585. }
  1586. void LLSelectMgr::selectionSetGlow(F32 glow)
  1587. {
  1588. struct f1 : public LLSelectedTEFunctor
  1589. {
  1590. F32 mGlow;
  1591. f1(F32 glow) : mGlow(glow) {};
  1592. bool apply(LLViewerObject* object, S32 face)
  1593. {
  1594. if (object->permModify())
  1595. {
  1596. // update viewer side color in anticipation of update from simulator
  1597. object->setTEGlow(face, mGlow);
  1598. }
  1599. return true;
  1600. }
  1601. } func1(glow);
  1602. mSelectedObjects->applyToTEs( &func1 );
  1603. struct f2 : public LLSelectedObjectFunctor
  1604. {
  1605. virtual bool apply(LLViewerObject* object)
  1606. {
  1607. if (object->permModify())
  1608. {
  1609. object->sendTEUpdate();
  1610. }
  1611. return true;
  1612. }
  1613. } func2;
  1614. mSelectedObjects->applyToObjects( &func2 );
  1615. }
  1616. //-----------------------------------------------------------------------------
  1617. // findObjectPermissions()
  1618. //-----------------------------------------------------------------------------
  1619. LLPermissions* LLSelectMgr::findObjectPermissions(const LLViewerObject* object)
  1620. {
  1621. for (LLObjectSelection::valid_iterator iter = getSelection()->valid_begin();
  1622.  iter != getSelection()->valid_end(); iter++ )
  1623. {
  1624. LLSelectNode* nodep = *iter;
  1625. if (nodep->getObject() == object)
  1626. {
  1627. return nodep->mPermissions;
  1628. }
  1629. }
  1630. return NULL;
  1631. }
  1632. //-----------------------------------------------------------------------------
  1633. // selectionGetGlow()
  1634. //-----------------------------------------------------------------------------
  1635. BOOL LLSelectMgr::selectionGetGlow(F32 *glow)
  1636. {
  1637. BOOL identical;
  1638. F32 lglow = 0.f;
  1639. struct f1 : public LLSelectedTEGetFunctor<F32>
  1640. {
  1641. F32 get(LLViewerObject* object, S32 face)
  1642. {
  1643. return object->getTE(face)->getGlow();
  1644. }
  1645. } func;
  1646. identical = mSelectedObjects->getSelectedTEValue( &func, lglow );
  1647. *glow = lglow;
  1648. return identical;
  1649. }
  1650. //-----------------------------------------------------------------------------
  1651. // selectionSetMaterial()
  1652. //-----------------------------------------------------------------------------
  1653. void LLSelectMgr::selectionSetMaterial(U8 material)
  1654. {
  1655. struct f : public LLSelectedObjectFunctor
  1656. {
  1657. U8 mMaterial;
  1658. f(const U8& t) : mMaterial(t) {}
  1659. virtual bool apply(LLViewerObject* object)
  1660. {
  1661. if (object->permModify())
  1662. {
  1663. U8 cur_material = object->getMaterial();
  1664. U8 material = mMaterial | (cur_material & ~LL_MCODE_MASK);
  1665. object->setMaterial(material);
  1666. object->sendMaterialUpdate();
  1667. }
  1668. return true;
  1669. }
  1670. } sendfunc(material);
  1671. getSelection()->applyToObjects(&sendfunc);
  1672. }
  1673. // TRUE if all selected objects have this PCode
  1674. BOOL LLSelectMgr::selectionAllPCode(LLPCode code)
  1675. {
  1676. struct f : public LLSelectedObjectFunctor
  1677. {
  1678. LLPCode mCode;
  1679. f(const LLPCode& t) : mCode(t) {}
  1680. virtual bool apply(LLViewerObject* object)
  1681. {
  1682. if (object->getPCode() != mCode)
  1683. {
  1684. return FALSE;
  1685. }
  1686. return true;
  1687. }
  1688. } func(code);
  1689. BOOL res = getSelection()->applyToObjects(&func);
  1690. return res;
  1691. }
  1692. bool LLSelectMgr::selectionGetIncludeInSearch(bool* include_in_search_out)
  1693. {
  1694. LLViewerObject *object = mSelectedObjects->getFirstRootObject();
  1695. if (!object) return FALSE;
  1696. bool include_in_search = object->getIncludeInSearch();
  1697. bool identical = true;
  1698. for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
  1699.  iter != getSelection()->root_end(); iter++)
  1700. {
  1701. LLViewerObject* object = (*iter)->getObject();
  1702. if ( include_in_search != object->getIncludeInSearch())
  1703. {
  1704. identical = false;
  1705. break;
  1706. }
  1707. }
  1708. *include_in_search_out = include_in_search;
  1709. return identical;
  1710. }
  1711. void LLSelectMgr::selectionSetIncludeInSearch(bool include_in_search)
  1712. {
  1713. LLViewerObject* object = NULL;
  1714. for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
  1715.  iter != getSelection()->root_end(); iter++)
  1716. {
  1717. object = (*iter)->getObject();
  1718. object->setIncludeInSearch(include_in_search);
  1719. }
  1720. sendListToRegions(
  1721. "ObjectIncludeInSearch",
  1722. packAgentAndSessionID,
  1723. packObjectIncludeInSearch, 
  1724. &include_in_search,
  1725. SEND_ONLY_ROOTS);
  1726. }
  1727. BOOL LLSelectMgr::selectionGetClickAction(U8 *out_action)
  1728. {
  1729. LLViewerObject *object = mSelectedObjects->getFirstObject();
  1730. if (!object)
  1731. {
  1732. return FALSE;
  1733. }
  1734. U8 action = object->getClickAction();
  1735. *out_action = action;
  1736. struct f : public LLSelectedObjectFunctor
  1737. {
  1738. U8 mAction;
  1739. f(const U8& t) : mAction(t) {}
  1740. virtual bool apply(LLViewerObject* object)
  1741. {
  1742. if ( mAction != object->getClickAction())
  1743. {
  1744. return false;
  1745. }
  1746. return true;
  1747. }
  1748. } func(action);
  1749. BOOL res = getSelection()->applyToObjects(&func);
  1750. return res;
  1751. }
  1752. void LLSelectMgr::selectionSetClickAction(U8 action)
  1753. {
  1754. struct f : public LLSelectedObjectFunctor
  1755. {
  1756. U8 mAction;
  1757. f(const U8& t) : mAction(t) {}
  1758. virtual bool apply(LLViewerObject* object)
  1759. {
  1760. object->setClickAction(mAction);
  1761. return true;
  1762. }
  1763. } func(action);
  1764. getSelection()->applyToObjects(&func);
  1765. sendListToRegions("ObjectClickAction",
  1766.   packAgentAndSessionID,
  1767.   packObjectClickAction, 
  1768.   &action,
  1769.   SEND_INDIVIDUALS);
  1770. }
  1771. //-----------------------------------------------------------------------------
  1772. // godlike requests
  1773. //-----------------------------------------------------------------------------
  1774. typedef std::pair<const std::string, const std::string> godlike_request_t;
  1775. void LLSelectMgr::sendGodlikeRequest(const std::string& request, const std::string& param)
  1776. {
  1777. // If the agent is neither godlike nor an estate owner, the server
  1778. // will reject the request.
  1779. std::string message_type;
  1780. if (gAgent.isGodlike())
  1781. {
  1782. message_type = "GodlikeMessage";
  1783. }
  1784. else
  1785. {
  1786. message_type = "EstateOwnerMessage";
  1787. }
  1788. godlike_request_t data(request, param);
  1789. if(!mSelectedObjects->getRootObjectCount())
  1790. {
  1791. LLMessageSystem* msg = gMessageSystem;
  1792. msg->newMessage(message_type.c_str());
  1793. LLSelectMgr::packGodlikeHead(&data);
  1794. gAgent.sendReliableMessage();
  1795. }
  1796. else
  1797. {
  1798. sendListToRegions(message_type, packGodlikeHead, packObjectIDAsParam, &data, SEND_ONLY_ROOTS);
  1799. }
  1800. }
  1801. void LLSelectMgr::packGodlikeHead(void* user_data)
  1802. {
  1803. LLMessageSystem* msg = gMessageSystem;
  1804. msg->nextBlockFast(_PREHASH_AgentData);
  1805. msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
  1806. msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  1807. msg->addUUID("TransactionID", LLUUID::null);
  1808. godlike_request_t* data = (godlike_request_t*)user_data;
  1809. msg->nextBlock("MethodData");
  1810. msg->addString("Method", data->first);
  1811. msg->addUUID("Invoice", LLUUID::null);
  1812. // The parameters used to be restricted to either string or
  1813. // integer. This mimics that behavior under the new 'string-only'
  1814. // parameter list by not packing a string if there wasn't one
  1815. // specified. The object ids will be packed in the
  1816. // packObjectIDAsParam() method.
  1817. if(data->second.size() > 0)
  1818. {
  1819. msg->nextBlock("ParamList");
  1820. msg->addString("Parameter", data->second);
  1821. }
  1822. }
  1823. // static
  1824. void LLSelectMgr::packObjectIDAsParam(LLSelectNode* node, void *)
  1825. {
  1826. std::string buf = llformat("%u", node->getObject()->getLocalID());
  1827. gMessageSystem->nextBlock("ParamList");
  1828. gMessageSystem->addString("Parameter", buf);
  1829. }
  1830. //-----------------------------------------------------------------------------
  1831. // Rotation options
  1832. //-----------------------------------------------------------------------------
  1833. void LLSelectMgr::selectionResetRotation()
  1834. {
  1835. struct f : public LLSelectedObjectFunctor
  1836. {
  1837. virtual bool apply(LLViewerObject* object)
  1838. {
  1839. LLQuaternion identity(0.f, 0.f, 0.f, 1.f);
  1840. object->setRotation(identity);
  1841. if (object->mDrawable.notNull())
  1842. {
  1843. gPipeline.markMoved(object->mDrawable, TRUE);
  1844. }
  1845. object->sendRotationUpdate();
  1846. return true;
  1847. }
  1848. } func;
  1849. getSelection()->applyToRootObjects(&func);
  1850. }
  1851. void LLSelectMgr::selectionRotateAroundZ(F32 degrees)
  1852. {
  1853. LLQuaternion rot( degrees * DEG_TO_RAD, LLVector3(0,0,1) );
  1854. struct f : public LLSelectedObjectFunctor
  1855. {
  1856. LLQuaternion mRot;
  1857. f(const LLQuaternion& rot) : mRot(rot) {}
  1858. virtual bool apply(LLViewerObject* object)
  1859. {
  1860. object->setRotation( object->getRotationEdit() * mRot );
  1861. if (object->mDrawable.notNull())
  1862. {
  1863. gPipeline.markMoved(object->mDrawable, TRUE);
  1864. }
  1865. object->sendRotationUpdate();
  1866. return true;
  1867. }
  1868. } func(rot);
  1869. getSelection()->applyToRootObjects(&func);
  1870. }
  1871. //-----------------------------------------------------------------------------
  1872. // selectionTexScaleAutofit()
  1873. //-----------------------------------------------------------------------------
  1874. void LLSelectMgr::selectionTexScaleAutofit(F32 repeats_per_meter)
  1875. {
  1876. struct f : public LLSelectedTEFunctor
  1877. {
  1878. F32 mRepeatsPerMeter;
  1879. f(const F32& t) : mRepeatsPerMeter(t) {}
  1880. bool apply(LLViewerObject* object, S32 te)
  1881. {
  1882. if (object->permModify())
  1883. {
  1884. // Compute S,T to axis mapping
  1885. U32 s_axis, t_axis;
  1886. if (!LLPrimitive::getTESTAxes(te, &s_axis, &t_axis))
  1887. {
  1888. return TRUE;
  1889. }
  1890. F32 new_s = object->getScale().mV[s_axis] * mRepeatsPerMeter;
  1891. F32 new_t = object->getScale().mV[t_axis] * mRepeatsPerMeter;
  1892. object->setTEScale(te, new_s, new_t);
  1893. }
  1894. return true;
  1895. }
  1896. } setfunc(repeats_per_meter);
  1897. getSelection()->applyToTEs(&setfunc);
  1898. LLSelectMgrSendFunctor sendfunc;
  1899. getSelection()->applyToObjects(&sendfunc);
  1900. }
  1901. // Called at the end of a scale operation, this adjusts the textures to attempt to
  1902. // maintain a constant repeats per meter.
  1903. // BUG: Only works for flex boxes.
  1904. //-----------------------------------------------------------------------------
  1905. // adjustTexturesByScale()
  1906. //-----------------------------------------------------------------------------
  1907. void LLSelectMgr::adjustTexturesByScale(BOOL send_to_sim, BOOL stretch)
  1908. {
  1909. for (LLObjectSelection::iterator iter = getSelection()->begin();
  1910.  iter != getSelection()->end(); iter++)
  1911. {
  1912. LLSelectNode* selectNode = *iter;
  1913. LLViewerObject* object = selectNode->getObject();
  1914. if (!object)
  1915. {
  1916. continue;
  1917. }
  1918. if (!object->permModify())
  1919. {
  1920. continue;
  1921. }
  1922. if (object->getNumTEs() == 0)
  1923. {
  1924. continue;
  1925. }
  1926. BOOL send = FALSE;
  1927. for (U8 te_num = 0; te_num < object->getNumTEs(); te_num++)
  1928. {
  1929. const LLTextureEntry* tep = object->getTE(te_num);
  1930. BOOL planar = tep->getTexGen() == LLTextureEntry::TEX_GEN_PLANAR;
  1931. if (planar == stretch)
  1932. {
  1933. // Figure out how S,T changed with scale operation
  1934. U32 s_axis, t_axis;
  1935. if (!LLPrimitive::getTESTAxes(te_num, &s_axis, &t_axis))
  1936. {
  1937. continue;
  1938. }
  1939. LLVector3 scale_ratio = selectNode->mTextureScaleRatios[te_num]; 
  1940. LLVector3 object_scale = object->getScale();
  1941. // Apply new scale to face
  1942. if (planar)
  1943. {
  1944. object->setTEScale(te_num, 1.f/object_scale.mV[s_axis]*scale_ratio.mV[s_axis],
  1945. 1.f/object_scale.mV[t_axis]*scale_ratio.mV[t_axis]);
  1946. }
  1947. else
  1948. {
  1949. object->setTEScale(te_num, scale_ratio.mV[s_axis]*object_scale.mV[s_axis],
  1950. scale_ratio.mV[t_axis]*object_scale.mV[t_axis]);
  1951. }
  1952. send = send_to_sim;
  1953. }
  1954. }
  1955. if (send)
  1956. {
  1957. object->sendTEUpdate();
  1958. }
  1959. }
  1960. }
  1961. //-----------------------------------------------------------------------------
  1962. // selectGetAllRootsValid()
  1963. // Returns TRUE if the viewer has information on all selected objects
  1964. //-----------------------------------------------------------------------------
  1965. BOOL LLSelectMgr::selectGetAllRootsValid()
  1966. {
  1967. for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
  1968.  iter != getSelection()->root_end(); ++iter )
  1969. {
  1970. LLSelectNode* node = *iter;
  1971. if( !node->mValid )
  1972. {
  1973. return FALSE;
  1974. }
  1975. }
  1976. return TRUE;
  1977. }
  1978. //-----------------------------------------------------------------------------
  1979. // selectGetAllValid()
  1980. // Returns TRUE if the viewer has information on all selected objects
  1981. //-----------------------------------------------------------------------------
  1982. BOOL LLSelectMgr::selectGetAllValid()
  1983. {
  1984. for (LLObjectSelection::iterator iter = getSelection()->begin();
  1985.  iter != getSelection()->end(); ++iter )
  1986. {
  1987. LLSelectNode* node = *iter;
  1988. if( !node->mValid )
  1989. {
  1990. return FALSE;
  1991. }
  1992. }
  1993. return TRUE;
  1994. }
  1995. //-----------------------------------------------------------------------------
  1996. // selectGetAllValidAndObjectsFound() - return TRUE if selections are
  1997. // valid and objects are found.
  1998. //
  1999. // For EXT-3114 - same as selectGetModify() without the modify check.
  2000. //-----------------------------------------------------------------------------
  2001. BOOL LLSelectMgr::selectGetAllValidAndObjectsFound()
  2002. {
  2003. for (LLObjectSelection::iterator iter = getSelection()->begin();
  2004.  iter != getSelection()->end(); iter++ )
  2005. {
  2006. LLSelectNode* node = *iter;
  2007. LLViewerObject* object = node->getObject();
  2008. if( !object || !node->mValid )
  2009. {
  2010. return FALSE;
  2011. }
  2012. }
  2013. return TRUE;
  2014. }
  2015. //-----------------------------------------------------------------------------
  2016. // selectGetModify() - return TRUE if current agent can modify all
  2017. // selected objects.
  2018. //-----------------------------------------------------------------------------
  2019. BOOL LLSelectMgr::selectGetModify()
  2020. {
  2021. for (LLObjectSelection::iterator iter = getSelection()->begin();
  2022.  iter != getSelection()->end(); iter++ )
  2023. {
  2024. LLSelectNode* node = *iter;
  2025. LLViewerObject* object = node->getObject();
  2026. if( !object || !node->mValid )
  2027. {
  2028. return FALSE;
  2029. }
  2030. if( !object->permModify() )
  2031. {
  2032. return FALSE;
  2033. }
  2034. }
  2035. return TRUE;
  2036. }
  2037. //-----------------------------------------------------------------------------
  2038. // selectGetRootsModify() - return TRUE if current agent can modify all
  2039. // selected root objects.
  2040. //-----------------------------------------------------------------------------
  2041. BOOL LLSelectMgr::selectGetRootsModify()
  2042. {
  2043. for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
  2044.  iter != getSelection()->root_end(); iter++ )
  2045. {
  2046. LLSelectNode* node = *iter;
  2047. LLViewerObject* object = node->getObject();
  2048. if( !node->mValid )
  2049. {
  2050. return FALSE;
  2051. }
  2052. if( !object->permModify() )
  2053. {
  2054. return FALSE;
  2055. }
  2056. }
  2057. return TRUE;
  2058. }
  2059. //-----------------------------------------------------------------------------
  2060. // selectGetRootsTransfer() - return TRUE if current agent can transfer all
  2061. // selected root objects.
  2062. //-----------------------------------------------------------------------------
  2063. BOOL LLSelectMgr::selectGetRootsTransfer()
  2064. {
  2065. for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
  2066.  iter != getSelection()->root_end(); iter++ )
  2067. {
  2068. LLSelectNode* node = *iter;
  2069. LLViewerObject* object = node->getObject();
  2070. if( !node->mValid )
  2071. {
  2072. return FALSE;
  2073. }
  2074. if(!object->permTransfer())
  2075. {
  2076. return FALSE;
  2077. }
  2078. }
  2079. return TRUE;
  2080. }
  2081. //-----------------------------------------------------------------------------
  2082. // selectGetRootsCopy() - return TRUE if current agent can copy all
  2083. // selected root objects.
  2084. //-----------------------------------------------------------------------------
  2085. BOOL LLSelectMgr::selectGetRootsCopy()
  2086. {
  2087. for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
  2088.  iter != getSelection()->root_end(); iter++ )
  2089. {
  2090. LLSelectNode* node = *iter;
  2091. LLViewerObject* object = node->getObject();
  2092. if( !node->mValid )
  2093. {
  2094. return FALSE;
  2095. }
  2096. if(!object->permCopy())
  2097. {
  2098. return FALSE;
  2099. }
  2100. }
  2101. return TRUE;
  2102. }
  2103. //-----------------------------------------------------------------------------
  2104. // selectGetCreator()
  2105. // Creator information only applies to root objects.
  2106. //-----------------------------------------------------------------------------
  2107. BOOL LLSelectMgr::selectGetCreator(LLUUID& result_id, std::string& name)
  2108. {
  2109. BOOL identical = TRUE;
  2110. BOOL first = TRUE;
  2111. LLUUID first_id;
  2112. for (LLObjectSelection::root_object_iterator iter = getSelection()->root_object_begin();
  2113.  iter != getSelection()->root_object_end(); iter++ )
  2114. {
  2115. LLSelectNode* node = *iter;
  2116. if (!node->mValid)
  2117. {
  2118. return FALSE;
  2119. }
  2120. if (first)
  2121. {
  2122. first_id = node->mPermissions->getCreator();
  2123. first = FALSE;
  2124. }
  2125. else
  2126. {
  2127. if ( !(first_id == node->mPermissions->getCreator() ) )
  2128. {
  2129. identical = FALSE;
  2130. break;
  2131. }
  2132. }
  2133. }
  2134. if (first_id.isNull())
  2135. {
  2136. name = LLTrans::getString("AvatarNameNobody");
  2137. return FALSE;
  2138. }
  2139. result_id = first_id;
  2140. if (identical)
  2141. {
  2142. name = LLSLURL::buildCommand("agent", first_id, "inspect");
  2143. }
  2144. else
  2145. {
  2146. name = LLTrans::getString("AvatarNameMultiple");
  2147. }
  2148. return identical;
  2149. }
  2150. //-----------------------------------------------------------------------------
  2151. // selectGetOwner()
  2152. // Owner information only applies to roots.
  2153. //-----------------------------------------------------------------------------
  2154. BOOL LLSelectMgr::selectGetOwner(LLUUID& result_id, std::string& name)
  2155. {
  2156. BOOL identical = TRUE;
  2157. BOOL first = TRUE;
  2158. BOOL first_group_owned = FALSE;
  2159. LLUUID first_id;
  2160. for (LLObjectSelection::root_object_iterator iter = getSelection()->root_object_begin();
  2161.  iter != getSelection()->root_object_end(); iter++ )
  2162. {
  2163. LLSelectNode* node = *iter;
  2164. if (!node->mValid)
  2165. {
  2166. return FALSE;
  2167. }
  2168. if (first)
  2169. {
  2170. node->mPermissions->getOwnership(first_id, first_group_owned);
  2171. first = FALSE;
  2172. }
  2173. else
  2174. {
  2175. LLUUID owner_id;
  2176. BOOL is_group_owned = FALSE;
  2177. if (!(node->mPermissions->getOwnership(owner_id, is_group_owned))
  2178. || owner_id != first_id || is_group_owned != first_group_owned)
  2179. {
  2180. identical = FALSE;
  2181. break;
  2182. }
  2183. }
  2184. }
  2185. if (first_id.isNull())
  2186. {
  2187. return FALSE;
  2188. }
  2189. result_id = first_id;
  2190. if (identical)
  2191. {
  2192. BOOL public_owner = (first_id.isNull() && !first_group_owned);
  2193. if (first_group_owned)
  2194. {
  2195. name = LLSLURL::buildCommand("group", first_id, "inspect");
  2196. }
  2197. else if(!public_owner)
  2198. {
  2199. name = LLSLURL::buildCommand("agent", first_id, "inspect");
  2200. }
  2201. else
  2202. {
  2203. name = LLTrans::getString("AvatarNameNobody");
  2204. }
  2205. }
  2206. else
  2207. {
  2208. name = LLTrans::getString("AvatarNameMultiple");
  2209. }
  2210. return identical;
  2211. }
  2212. //-----------------------------------------------------------------------------
  2213. // selectGetLastOwner()
  2214. // Owner information only applies to roots.
  2215. //-----------------------------------------------------------------------------
  2216. BOOL LLSelectMgr::selectGetLastOwner(LLUUID& result_id, std::string& name)
  2217. {
  2218. BOOL identical = TRUE;
  2219. BOOL first = TRUE;
  2220. LLUUID first_id;
  2221. for (LLObjectSelection::root_object_iterator iter = getSelection()->root_object_begin();
  2222.  iter != getSelection()->root_object_end(); iter++ )
  2223. {
  2224. LLSelectNode* node = *iter;
  2225. if (!node->mValid)
  2226. {
  2227. return FALSE;
  2228. }
  2229. if (first)
  2230. {
  2231. first_id = node->mPermissions->getLastOwner();
  2232. first = FALSE;
  2233. }
  2234. else
  2235. {
  2236. if ( !(first_id == node->mPermissions->getLastOwner() ) )
  2237. {
  2238. identical = FALSE;
  2239. break;
  2240. }
  2241. }
  2242. }
  2243. if (first_id.isNull())
  2244. {
  2245. return FALSE;
  2246. }
  2247. result_id = first_id;
  2248. if (identical)
  2249. {
  2250. BOOL public_owner = (first_id.isNull());
  2251. if(!public_owner)
  2252. {
  2253. name = LLSLURL::buildCommand("agent", first_id, "inspect");
  2254. }
  2255. else
  2256. {
  2257. name.assign("Public or Group");
  2258. }
  2259. }
  2260. else
  2261. {
  2262. name.assign( "" );
  2263. }
  2264. return identical;
  2265. }
  2266. //-----------------------------------------------------------------------------
  2267. // selectGetGroup()
  2268. // Group information only applies to roots.
  2269. //-----------------------------------------------------------------------------
  2270. BOOL LLSelectMgr::selectGetGroup(LLUUID& result_id)
  2271. {
  2272. BOOL identical = TRUE;
  2273. BOOL first = TRUE;
  2274. LLUUID first_id;
  2275. for (LLObjectSelection::root_object_iterator iter = getSelection()->root_object_begin();
  2276.  iter != getSelection()->root_object_end(); iter++ )
  2277. {
  2278. LLSelectNode* node = *iter;
  2279. if (!node->mValid)
  2280. {
  2281. return FALSE;
  2282. }
  2283. if (first)
  2284. {
  2285. first_id = node->mPermissions->getGroup();
  2286. first = FALSE;
  2287. }
  2288. else
  2289. {
  2290. if ( !(first_id == node->mPermissions->getGroup() ) )
  2291. {
  2292. identical = FALSE;
  2293. break;
  2294. }
  2295. }
  2296. }
  2297. result_id = first_id;
  2298. return identical;
  2299. }
  2300. //-----------------------------------------------------------------------------
  2301. // selectIsGroupOwned()
  2302. // Only operates on root nodes.  
  2303. // Returns TRUE if all have valid data and they are all group owned.
  2304. //-----------------------------------------------------------------------------
  2305. BOOL LLSelectMgr::selectIsGroupOwned()
  2306. {
  2307. BOOL found_one = FALSE;
  2308. for (LLObjectSelection::root_object_iterator iter = getSelection()->root_object_begin();
  2309.  iter != getSelection()->root_object_end(); iter++ )
  2310. {
  2311. LLSelectNode* node = *iter;
  2312. if (!node->mValid)
  2313. {
  2314. return FALSE;
  2315. }
  2316. found_one = TRUE;
  2317. if (!node->mPermissions->isGroupOwned())
  2318. {
  2319. return FALSE;
  2320. }
  2321. }
  2322. return found_one ? TRUE : FALSE;
  2323. }
  2324. //-----------------------------------------------------------------------------
  2325. // selectGetPerm()
  2326. // Only operates on root nodes.
  2327. // Returns TRUE if all have valid data.
  2328. // mask_on has bits set to TRUE where all permissions are TRUE
  2329. // mask_off has bits set to TRUE where all permissions are FALSE
  2330. // if a bit is off both in mask_on and mask_off, the values differ within
  2331. // the selection.
  2332. //-----------------------------------------------------------------------------
  2333. BOOL LLSelectMgr::selectGetPerm(U8 which_perm, U32* mask_on, U32* mask_off)
  2334. {
  2335. U32 mask;
  2336. U32 mask_and = 0xffffffff;
  2337. U32 mask_or = 0x00000000;
  2338. BOOL all_valid = FALSE;
  2339. for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
  2340.  iter != getSelection()->root_end(); iter++)
  2341. {
  2342. LLSelectNode* node = *iter;
  2343. if (!node->mValid)
  2344. {
  2345. all_valid = FALSE;
  2346. break;
  2347. }
  2348. all_valid = TRUE;
  2349. switch( which_perm )
  2350. {
  2351. case PERM_BASE:
  2352. mask = node->mPermissions->getMaskBase();
  2353. break;
  2354. case PERM_OWNER:
  2355. mask = node->mPermissions->getMaskOwner();
  2356. break;
  2357. case PERM_GROUP:
  2358. mask = node->mPermissions->getMaskGroup();
  2359. break;
  2360. case PERM_EVERYONE:
  2361. mask = node->mPermissions->getMaskEveryone();
  2362. break;
  2363. case PERM_NEXT_OWNER:
  2364. mask = node->mPermissions->getMaskNextOwner();
  2365. break;
  2366. default:
  2367. mask = 0x0;
  2368. break;
  2369. }
  2370. mask_and &= mask;
  2371. mask_or  |= mask;
  2372. }
  2373. if (all_valid)
  2374. {
  2375. // ...TRUE through all ANDs means all TRUE
  2376. *mask_on  = mask_and;
  2377. // ...FALSE through all ORs means all FALSE
  2378. *mask_off = ~mask_or;
  2379. return TRUE;
  2380. }
  2381. else
  2382. {
  2383. *mask_on  = 0;
  2384. *mask_off = 0;
  2385. return FALSE;
  2386. }
  2387. }
  2388. BOOL LLSelectMgr::selectGetPermissions(LLPermissions& result_perm)
  2389. {
  2390. BOOL first = TRUE;
  2391. LLPermissions perm;
  2392. for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
  2393.  iter != getSelection()->root_end(); iter++ )
  2394. {
  2395. LLSelectNode* node = *iter;
  2396. if (!node->mValid)
  2397. {
  2398. return FALSE;
  2399. }
  2400. if (first)
  2401. {
  2402. perm = *(node->mPermissions);
  2403. first = FALSE;
  2404. }
  2405. else
  2406. {
  2407. perm.accumulate(*(node->mPermissions));
  2408. }
  2409. }
  2410. result_perm = perm;
  2411. return TRUE;
  2412. }
  2413. void LLSelectMgr::selectDelete()
  2414. {
  2415. S32 deleteable_count = 0;
  2416. BOOL locked_but_deleteable_object = FALSE;
  2417. BOOL no_copy_but_deleteable_object = FALSE;
  2418. BOOL all_owned_by_you = TRUE;
  2419. for (LLObjectSelection::iterator iter = getSelection()->begin();
  2420.  iter != getSelection()->end(); iter++)
  2421. {
  2422. LLViewerObject* obj = (*iter)->getObject();
  2423. if( obj->isAttachment() )
  2424. {
  2425. continue;
  2426. }
  2427. deleteable_count++;
  2428. // Check to see if you can delete objects which are locked.
  2429. if(!obj->permMove())
  2430. {
  2431. locked_but_deleteable_object = TRUE;
  2432. }
  2433. if(!obj->permCopy())
  2434. {
  2435. no_copy_but_deleteable_object = TRUE;
  2436. }
  2437. if(!obj->permYouOwner())
  2438. {
  2439. all_owned_by_you = FALSE;
  2440. }
  2441. }
  2442. if( 0 == deleteable_count )
  2443. {
  2444. make_ui_sound("UISndInvalidOp");
  2445. return;
  2446. }
  2447. LLNotification::Params params("ConfirmObjectDeleteLock");
  2448. params.functor.function(boost::bind(&LLSelectMgr::confirmDelete, _1, _2, getSelection()));
  2449. if(locked_but_deleteable_object ||
  2450.    no_copy_but_deleteable_object ||
  2451.    !all_owned_by_you)
  2452. {
  2453. // convert any transient pie-menu selections to full selection so this operation
  2454. // has some context
  2455. // NOTE: if user cancels delete operation, this will potentially leave objects selected outside of build mode
  2456. // but this is ok, if not ideal
  2457. convertTransient();
  2458. //This is messy, but needed to get all english our of the UI.
  2459. if(locked_but_deleteable_object && !no_copy_but_deleteable_object && all_owned_by_you)
  2460. {
  2461. //Locked only
  2462. params.name("ConfirmObjectDeleteLock");
  2463. }
  2464. else if(!locked_but_deleteable_object && no_copy_but_deleteable_object && all_owned_by_you)
  2465. {
  2466. //No Copy only
  2467. params.name("ConfirmObjectDeleteNoCopy");
  2468. }
  2469. else if(!locked_but_deleteable_object && !no_copy_but_deleteable_object && !all_owned_by_you)
  2470. {
  2471. //not owned only
  2472. params.name("ConfirmObjectDeleteNoOwn");
  2473. }
  2474. else if(locked_but_deleteable_object && no_copy_but_deleteable_object && all_owned_by_you)
  2475. {
  2476. //locked and no copy
  2477. params.name("ConfirmObjectDeleteLockNoCopy");
  2478. }
  2479. else if(locked_but_deleteable_object && !no_copy_but_deleteable_object && !all_owned_by_you)
  2480. {
  2481. //locked and not owned
  2482. params.name("ConfirmObjectDeleteLockNoOwn");
  2483. }
  2484. else if(!locked_but_deleteable_object && no_copy_but_deleteable_object && !all_owned_by_you)
  2485. {
  2486. //no copy and not owned
  2487. params.name("ConfirmObjectDeleteNoCopyNoOwn");
  2488. }
  2489. else
  2490. {
  2491. //locked, no copy and not owned
  2492. params.name("ConfirmObjectDeleteLockNoCopyNoOwn");
  2493. }
  2494. LLNotifications::instance().add(params);
  2495. }
  2496. else
  2497. {
  2498. LLNotifications::instance().forceResponse(params, 0);
  2499. }
  2500. }
  2501. // static
  2502. bool LLSelectMgr::confirmDelete(const LLSD& notification, const LLSD& response, LLObjectSelectionHandle handle)
  2503. {
  2504. S32 option = LLNotification::getSelectedOption(notification, response);
  2505. if (!handle->getObjectCount())
  2506. {
  2507. llwarns << "Nothing to delete!" << llendl;
  2508. return false;
  2509. }
  2510. switch(option)
  2511. {
  2512. case 0:
  2513. {
  2514. // TODO: Make sure you have delete permissions on all of them.
  2515. const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
  2516. // attempt to derez into the trash.
  2517. LLDeRezInfo* info = new LLDeRezInfo(DRD_TRASH, trash_id);
  2518. LLSelectMgr::getInstance()->sendListToRegions("DeRezObject",
  2519.   packDeRezHeader,
  2520.   packObjectLocalID,
  2521.   (void*)info,
  2522.   SEND_ONLY_ROOTS);
  2523. // VEFFECT: Delete Object - one effect for all deletes
  2524. if (LLSelectMgr::getInstance()->mSelectedObjects->mSelectType != SELECT_TYPE_HUD)
  2525. {
  2526. LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINT, TRUE);
  2527. effectp->setPositionGlobal( LLSelectMgr::getInstance()->getSelectionCenterGlobal() );
  2528. effectp->setColor(LLColor4U(gAgent.getEffectColor()));
  2529. F32 duration = 0.5f;
  2530. duration += LLSelectMgr::getInstance()->mSelectedObjects->getObjectCount() / 64.f;
  2531. effectp->setDuration(duration);
  2532. }
  2533. gAgent.setLookAt(LOOKAT_TARGET_CLEAR);
  2534. // Keep track of how many objects have been deleted.
  2535. F64 obj_delete_count = LLViewerStats::getInstance()->getStat(LLViewerStats::ST_OBJECT_DELETE_COUNT);
  2536. obj_delete_count += LLSelectMgr::getInstance()->mSelectedObjects->getObjectCount();
  2537. LLViewerStats::getInstance()->setStat(LLViewerStats::ST_OBJECT_DELETE_COUNT, obj_delete_count );
  2538. }
  2539. break;
  2540. case 1:
  2541. default:
  2542. break;
  2543. }
  2544. return false;
  2545. }
  2546. void LLSelectMgr::selectForceDelete()
  2547. {
  2548. sendListToRegions(
  2549. "ObjectDelete",
  2550. packDeleteHeader,
  2551. packObjectLocalID,
  2552. (void*)TRUE,
  2553. SEND_ONLY_ROOTS);
  2554. }
  2555. void LLSelectMgr::selectGetAggregateSaleInfo(U32 &num_for_sale,
  2556.  BOOL &is_for_sale_mixed, 
  2557.  BOOL &is_sale_price_mixed,
  2558.  S32 &total_sale_price,
  2559.  S32 &individual_sale_price)
  2560. {
  2561. num_for_sale = 0;
  2562. is_for_sale_mixed = FALSE;
  2563. is_sale_price_mixed = FALSE;
  2564. total_sale_price = 0;
  2565. individual_sale_price = 0;
  2566. // Empty set.
  2567. if (getSelection()->root_begin() == getSelection()->root_end())
  2568. return;
  2569. LLSelectNode *node = *(getSelection()->root_begin());
  2570. const BOOL first_node_for_sale = node->mSaleInfo.isForSale();
  2571. const S32 first_node_sale_price = node->mSaleInfo.getSalePrice();
  2572. for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
  2573.  iter != getSelection()->root_end(); iter++)
  2574. {
  2575. LLSelectNode* node = *iter;
  2576. const BOOL node_for_sale = node->mSaleInfo.isForSale();
  2577. const S32 node_sale_price = node->mSaleInfo.getSalePrice();
  2578. // Set mixed if the fields don't match the first node's fields.
  2579. if (node_for_sale != first_node_for_sale) 
  2580. is_for_sale_mixed = TRUE;
  2581. if (node_sale_price != first_node_sale_price)
  2582. is_sale_price_mixed = TRUE;
  2583. if (node_for_sale)
  2584. {
  2585. total_sale_price += node_sale_price;
  2586. num_for_sale ++;
  2587. }
  2588. }
  2589. individual_sale_price = first_node_sale_price;
  2590. if (is_for_sale_mixed)
  2591. {
  2592. is_sale_price_mixed = TRUE;
  2593. individual_sale_price = 0;
  2594. }
  2595. }
  2596. // returns TRUE if all nodes are valid. method also stores an
  2597. // accumulated sale info.
  2598. BOOL LLSelectMgr::selectGetSaleInfo(LLSaleInfo& result_sale_info)
  2599. {
  2600. BOOL first = TRUE;
  2601. LLSaleInfo sale_info;
  2602. for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
  2603.  iter != getSelection()->root_end(); iter++ )
  2604. {
  2605. LLSelectNode* node = *iter;
  2606. if (!node->mValid)
  2607. {
  2608. return FALSE;
  2609. }
  2610. if (first)
  2611. {
  2612. sale_info = node->mSaleInfo;
  2613. first = FALSE;
  2614. }
  2615. else
  2616. {
  2617. sale_info.accumulate(node->mSaleInfo);
  2618. }
  2619. }
  2620. result_sale_info = sale_info;
  2621. return TRUE;
  2622. }
  2623. BOOL LLSelectMgr::selectGetAggregatePermissions(LLAggregatePermissions& result_perm)
  2624. {
  2625. BOOL first = TRUE;
  2626. LLAggregatePermissions perm;
  2627. for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
  2628.  iter != getSelection()->root_end(); iter++ )
  2629. {
  2630. LLSelectNode* node = *iter;
  2631. if (!node->mValid)
  2632. {
  2633. return FALSE;
  2634. }
  2635. if (first)
  2636. {
  2637. perm = node->mAggregatePerm;
  2638. first = FALSE;
  2639. }
  2640. else
  2641. {
  2642. perm.aggregate(node->mAggregatePerm);
  2643. }
  2644. }
  2645. result_perm = perm;
  2646. return TRUE;
  2647. }
  2648. BOOL LLSelectMgr::selectGetAggregateTexturePermissions(LLAggregatePermissions& result_perm)
  2649. {
  2650. BOOL first = TRUE;
  2651. LLAggregatePermissions perm;
  2652. for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
  2653.  iter != getSelection()->root_end(); iter++ )
  2654. {
  2655. LLSelectNode* node = *iter;
  2656. if (!node->mValid)
  2657. {
  2658. return FALSE;
  2659. }
  2660. LLAggregatePermissions t_perm = node->getObject()->permYouOwner() ? node->mAggregateTexturePermOwner : node->mAggregateTexturePerm;
  2661. if (first)
  2662. {
  2663. perm = t_perm;
  2664. first = FALSE;
  2665. }
  2666. else
  2667. {
  2668. perm.aggregate(t_perm);
  2669. }
  2670. }
  2671. result_perm = perm;
  2672. return TRUE;
  2673. }
  2674. //--------------------------------------------------------------------
  2675. // Duplicate objects
  2676. //--------------------------------------------------------------------
  2677. // JC - If this doesn't work right, duplicate the selection list
  2678. // before doing anything, do a deselect, then send the duplicate
  2679. // messages.
  2680. struct LLDuplicateData
  2681. {
  2682. LLVector3 offset;
  2683. U32 flags;
  2684. };
  2685. void LLSelectMgr::selectDuplicate(const LLVector3& offset, BOOL select_copy)
  2686. {
  2687. if (mSelectedObjects->isAttachment())
  2688. {
  2689. //RN: do not duplicate attachments
  2690. make_ui_sound("UISndInvalidOp");
  2691. return;
  2692. }
  2693. LLDuplicateData data;
  2694. data.offset = offset;
  2695. data.flags = (select_copy ? FLAGS_CREATE_SELECTED : 0x0);
  2696. sendListToRegions("ObjectDuplicate", packDuplicateHeader, packDuplicate, &data, SEND_ONLY_ROOTS);
  2697. if (select_copy)
  2698. {
  2699. // the new copy will be coming in selected
  2700. deselectAll();
  2701. }
  2702. else
  2703. {
  2704. for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
  2705.  iter != getSelection()->root_end(); iter++ )
  2706. {
  2707. LLSelectNode* node = *iter;
  2708. node->mDuplicated = TRUE;
  2709. node->mDuplicatePos = node->getObject()->getPositionGlobal();
  2710. node->mDuplicateRot = node->getObject()->getRotation();
  2711. }
  2712. }
  2713. }
  2714. void LLSelectMgr::repeatDuplicate()
  2715. {
  2716. if (mSelectedObjects->isAttachment())
  2717. {
  2718. //RN: do not duplicate attachments
  2719. make_ui_sound("UISndInvalidOp");
  2720. return;
  2721. }
  2722. std::vector<LLViewerObject*> non_duplicated_objects;
  2723. for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
  2724.  iter != getSelection()->root_end(); iter++ )
  2725. {
  2726. LLSelectNode* node = *iter;
  2727. if (!node->mDuplicated)
  2728. {
  2729. non_duplicated_objects.push_back(node->getObject());
  2730. }
  2731. }
  2732. // make sure only previously duplicated objects are selected
  2733. for (std::vector<LLViewerObject*>::iterator iter = non_duplicated_objects.begin();
  2734.  iter != non_duplicated_objects.end(); ++iter)
  2735. {
  2736. LLViewerObject* objectp = *iter;
  2737. deselectObjectAndFamily(objectp);
  2738. }
  2739. // duplicate objects in place
  2740. LLDuplicateData data;
  2741. data.offset = LLVector3::zero;
  2742. data.flags = 0x0;
  2743. sendListToRegions("ObjectDuplicate", packDuplicateHeader, packDuplicate, &data, SEND_ONLY_ROOTS);
  2744. // move current selection based on delta from duplication position and update duplication position
  2745. for (LLObjectSelection::root_iterator iter = getSelection()->root_begin();
  2746.  iter != getSelection()->root_end(); iter++ )
  2747. {
  2748. LLSelectNode* node = *iter;
  2749. if (node->mDuplicated)
  2750. {
  2751. LLQuaternion cur_rot = node->getObject()->getRotation();
  2752. LLQuaternion rot_delta = (~node->mDuplicateRot * cur_rot);
  2753. LLQuaternion new_rot = cur_rot * rot_delta;
  2754. LLVector3d cur_pos = node->getObject()->getPositionGlobal();
  2755. LLVector3d new_pos = cur_pos + ((cur_pos - node->mDuplicatePos) * rot_delta);
  2756. node->mDuplicatePos = node->getObject()->getPositionGlobal();
  2757. node->mDuplicateRot = node->getObject()->getRotation();
  2758. node->getObject()->setPositionGlobal(new_pos);
  2759. node->getObject()->setRotation(new_rot);
  2760. }
  2761. }
  2762. sendMultipleUpdate(UPD_ROTATION | UPD_POSITION);
  2763. }
  2764. // static 
  2765. void LLSelectMgr::packDuplicate( LLSelectNode* node, void *duplicate_data )
  2766. {
  2767. gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
  2768. gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, node->getObject()->getLocalID());
  2769. }
  2770. //--------------------------------------------------------------------
  2771. // Duplicate On Ray
  2772. //--------------------------------------------------------------------
  2773. // Duplicates the selected objects, but places the copy along a cast
  2774. // ray.
  2775. struct LLDuplicateOnRayData
  2776. {
  2777. LLVector3 mRayStartRegion;
  2778. LLVector3 mRayEndRegion;
  2779. BOOL mBypassRaycast;
  2780. BOOL mRayEndIsIntersection;
  2781. LLUUID mRayTargetID;
  2782. BOOL mCopyCenters;
  2783. BOOL mCopyRotates;
  2784. U32 mFlags;
  2785. };
  2786. void LLSelectMgr::selectDuplicateOnRay(const LLVector3 &ray_start_region,
  2787.    const LLVector3 &ray_end_region,
  2788.    BOOL bypass_raycast,
  2789.    BOOL ray_end_is_intersection,
  2790.    const LLUUID &ray_target_id,
  2791.    BOOL copy_centers,
  2792.    BOOL copy_rotates,
  2793.    BOOL select_copy)
  2794. {
  2795. if (mSelectedObjects->isAttachment())
  2796. {
  2797. // do not duplicate attachments
  2798. make_ui_sound("UISndInvalidOp");
  2799. return;
  2800. }
  2801. LLDuplicateOnRayData data;
  2802. data.mRayStartRegion = ray_start_region;
  2803. data.mRayEndRegion = ray_end_region;
  2804. data.mBypassRaycast = bypass_raycast;
  2805. data.mRayEndIsIntersection = ray_end_is_intersection;
  2806. data.mRayTargetID = ray_target_id;
  2807. data.mCopyCenters = copy_centers;
  2808. data.mCopyRotates = copy_rotates;
  2809. data.mFlags = (select_copy ? FLAGS_CREATE_SELECTED : 0x0);
  2810. sendListToRegions("ObjectDuplicateOnRay", 
  2811. packDuplicateOnRayHead, packObjectLocalID, &data, SEND_ONLY_ROOTS);
  2812. if (select_copy)
  2813. {
  2814. // the new copy will be coming in selected
  2815. deselectAll();
  2816. }
  2817. }
  2818. // static
  2819. void LLSelectMgr::packDuplicateOnRayHead(void *user_data)
  2820. {
  2821. LLMessageSystem *msg = gMessageSystem;
  2822. LLDuplicateOnRayData *data = (LLDuplicateOnRayData *)user_data;
  2823. msg->nextBlockFast(_PREHASH_AgentData);
  2824. msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
  2825. msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() );
  2826. msg->addUUIDFast(_PREHASH_GroupID, gAgent.getGroupID() );
  2827. msg->addVector3Fast(_PREHASH_RayStart, data->mRayStartRegion );
  2828. msg->addVector3Fast(_PREHASH_RayEnd, data->mRayEndRegion );
  2829. msg->addBOOLFast(_PREHASH_BypassRaycast, data->mBypassRaycast );
  2830. msg->addBOOLFast(_PREHASH_RayEndIsIntersection, data->mRayEndIsIntersection );
  2831. msg->addBOOLFast(_PREHASH_CopyCenters, data->mCopyCenters );
  2832. msg->addBOOLFast(_PREHASH_CopyRotates, data->mCopyRotates );
  2833. msg->addUUIDFast(_PREHASH_RayTargetID, data->mRayTargetID );
  2834. msg->addU32Fast(_PREHASH_DuplicateFlags, data->mFlags );
  2835. }
  2836. //------------------------------------------------------------------------
  2837. // Object position, scale, rotation update, all-in-one
  2838. //------------------------------------------------------------------------
  2839. void LLSelectMgr::sendMultipleUpdate(U32 type)
  2840. {
  2841. if (type == UPD_NONE) return;
  2842. // send individual updates when selecting textures or individual objects
  2843. ESendType send_type = (!gSavedSettings.getBOOL("EditLinkedParts") && !getTEMode()) ? SEND_ONLY_ROOTS : SEND_ROOTS_FIRST;
  2844. if (send_type == SEND_ONLY_ROOTS)
  2845. {
  2846. // tell simulator to apply to whole linked sets
  2847. type |= UPD_LINKED_SETS;
  2848. }
  2849. sendListToRegions(
  2850. "MultipleObjectUpdate",
  2851. packAgentAndSessionID,
  2852. packMultipleUpdate,
  2853. &type,
  2854. send_type);
  2855. }
  2856. // static
  2857. void LLSelectMgr::packMultipleUpdate(LLSelectNode* node, void *user_data)
  2858. {
  2859. LLViewerObject* object = node->getObject();
  2860. U32 *type32 = (U32 *)user_data;
  2861. U8 type = (U8)*type32;
  2862. U8 data[256];
  2863. gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
  2864. gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, object->getLocalID() );
  2865. gMessageSystem->addU8Fast(_PREHASH_Type, type );
  2866. S32 offset = 0;
  2867. // JC: You MUST pack the data in this order.  The receiving
  2868. // routine process_multiple_update_message on simulator will
  2869. // extract them in this order.
  2870. if (type & UPD_POSITION)
  2871. {
  2872. htonmemcpy(&data[offset], &(object->getPosition().mV), MVT_LLVector3, 12); 
  2873. offset += 12;
  2874. }
  2875. if (type & UPD_ROTATION)
  2876. {
  2877. LLQuaternion quat = object->getRotation();
  2878. LLVector3 vec = quat.packToVector3();
  2879. htonmemcpy(&data[offset], &(vec.mV), MVT_LLQuaternion, 12); 
  2880. offset += 12;
  2881. }
  2882. if (type & UPD_SCALE)
  2883. {
  2884. //llinfos << "Sending object scale " << object->getScale() << llendl;
  2885. htonmemcpy(&data[offset], &(object->getScale().mV), MVT_LLVector3, 12); 
  2886. offset += 12;
  2887. }
  2888. gMessageSystem->addBinaryDataFast(_PREHASH_Data, data, offset);
  2889. }
  2890. //------------------------------------------------------------------------
  2891. // Ownership
  2892. //------------------------------------------------------------------------
  2893. struct LLOwnerData
  2894. {
  2895. LLUUID owner_id;
  2896. LLUUID group_id;
  2897. BOOL override;
  2898. };
  2899. void LLSelectMgr::sendOwner(const LLUUID& owner_id,
  2900. const LLUUID& group_id,
  2901. BOOL override)
  2902. {
  2903. LLOwnerData data;
  2904. data.owner_id = owner_id;
  2905. data.group_id = group_id;
  2906. data.override = override;
  2907. sendListToRegions("ObjectOwner", packOwnerHead, packObjectLocalID, &data, SEND_ONLY_ROOTS);
  2908. }
  2909. // static
  2910. void LLSelectMgr::packOwnerHead(void *user_data)
  2911. {
  2912. LLOwnerData *data = (LLOwnerData *)user_data;
  2913. gMessageSystem->nextBlockFast(_PREHASH_AgentData);
  2914. gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
  2915. gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() );
  2916. gMessageSystem->nextBlockFast(_PREHASH_HeaderData);
  2917. gMessageSystem->addBOOLFast(_PREHASH_Override, data->override);