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

游戏引擎

开发平台:

C++ Builder

  1. gMessageSystem->addUUIDFast(_PREHASH_OwnerID, data->owner_id);
  2. gMessageSystem->addUUIDFast(_PREHASH_GroupID, data->group_id);
  3. }
  4. //------------------------------------------------------------------------
  5. // Group
  6. //------------------------------------------------------------------------
  7. void LLSelectMgr::sendGroup(const LLUUID& group_id)
  8. {
  9. LLUUID local_group_id(group_id);
  10. sendListToRegions("ObjectGroup", packAgentAndSessionAndGroupID, packObjectLocalID, &local_group_id, SEND_ONLY_ROOTS);
  11. }
  12. //------------------------------------------------------------------------
  13. // Buy
  14. //------------------------------------------------------------------------
  15. struct LLBuyData
  16. {
  17. std::vector<LLViewerObject*> mObjectsSent;
  18. LLUUID mCategoryID;
  19. LLSaleInfo mSaleInfo;
  20. };
  21. // *NOTE: does not work for multiple object buy, which UI does not
  22. // currently support sale info is used for verification only, if it
  23. // doesn't match region info then sale is canceled Need to get sale
  24. // info -as displayed in the UI- for every item.
  25. void LLSelectMgr::sendBuy(const LLUUID& buyer_id, const LLUUID& category_id, const LLSaleInfo sale_info)
  26. {
  27. LLBuyData buy;
  28. buy.mCategoryID = category_id;
  29. buy.mSaleInfo = sale_info;
  30. sendListToRegions("ObjectBuy", packAgentGroupAndCatID, packBuyObjectIDs, &buy, SEND_ONLY_ROOTS);
  31. }
  32. // static
  33. void LLSelectMgr::packBuyObjectIDs(LLSelectNode* node, void* data)
  34. {
  35. LLBuyData* buy = (LLBuyData*)data;
  36. LLViewerObject* object = node->getObject();
  37. if (std::find(buy->mObjectsSent.begin(), buy->mObjectsSent.end(), object) == buy->mObjectsSent.end())
  38. {
  39. buy->mObjectsSent.push_back(object);
  40. gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
  41. gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, object->getLocalID() );
  42. gMessageSystem->addU8Fast(_PREHASH_SaleType, buy->mSaleInfo.getSaleType());
  43. gMessageSystem->addS32Fast(_PREHASH_SalePrice, buy->mSaleInfo.getSalePrice());
  44. }
  45. }
  46. //------------------------------------------------------------------------
  47. // Permissions
  48. //------------------------------------------------------------------------
  49. struct LLPermData
  50. {
  51. U8 mField;
  52. BOOL mSet;
  53. U32 mMask;
  54. BOOL mOverride;
  55. };
  56. // TODO: Make this able to fail elegantly.
  57. void LLSelectMgr::selectionSetObjectPermissions(U8 field,
  58.    BOOL set,
  59.    U32 mask,
  60.    BOOL override)
  61. {
  62. LLPermData data;
  63. data.mField = field;
  64. data.mSet = set;
  65. data.mMask = mask;
  66. data.mOverride = override;
  67. sendListToRegions("ObjectPermissions", packPermissionsHead, packPermissions, &data, SEND_ONLY_ROOTS);
  68. }
  69. void LLSelectMgr::packPermissionsHead(void* user_data)
  70. {
  71. LLPermData* data = (LLPermData*)user_data;
  72. gMessageSystem->nextBlockFast(_PREHASH_AgentData);
  73. gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
  74. gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  75. gMessageSystem->nextBlockFast(_PREHASH_HeaderData);
  76. gMessageSystem->addBOOLFast(_PREHASH_Override, data->mOverride);
  77. }
  78. // Now that you've added a bunch of objects, send a select message
  79. // on the entire list for efficiency.
  80. /*
  81. void LLSelectMgr::sendSelect()
  82. {
  83. llerrs << "Not implemented" << llendl;
  84. }
  85. */
  86. void LLSelectMgr::deselectAll()
  87. {
  88. if (!mSelectedObjects->getNumNodes())
  89. {
  90. return;
  91. }
  92. // Zap the angular velocity, as the sim will set it to zero
  93. for (LLObjectSelection::iterator iter = mSelectedObjects->begin();
  94.  iter != mSelectedObjects->end(); iter++ )
  95. {
  96. LLViewerObject *objectp = (*iter)->getObject();
  97. objectp->setAngularVelocity( 0,0,0 );
  98. objectp->setVelocity( 0,0,0 );
  99. }
  100. sendListToRegions(
  101. "ObjectDeselect",
  102. packAgentAndSessionID,
  103. packObjectLocalID,
  104. NULL,
  105. SEND_INDIVIDUALS);
  106. removeAll();
  107. mLastSentSelectionCenterGlobal.clearVec();
  108. updatePointAt();
  109. }
  110. void LLSelectMgr::deselectAllForStandingUp()
  111. {
  112. /*
  113. This function is similar deselectAll() except for the first if statement
  114. which was removed. This is needed as a workaround for DEV-2854
  115. */
  116. // Zap the angular velocity, as the sim will set it to zero
  117. for (LLObjectSelection::iterator iter = mSelectedObjects->begin();
  118.  iter != mSelectedObjects->end(); iter++ )
  119. {
  120. LLViewerObject *objectp = (*iter)->getObject();
  121. objectp->setAngularVelocity( 0,0,0 );
  122. objectp->setVelocity( 0,0,0 );
  123. }
  124. sendListToRegions(
  125. "ObjectDeselect",
  126. packAgentAndSessionID,
  127. packObjectLocalID,
  128. NULL,
  129. SEND_INDIVIDUALS);
  130. removeAll();
  131. mLastSentSelectionCenterGlobal.clearVec();
  132. updatePointAt();
  133. }
  134. void LLSelectMgr::deselectUnused()
  135. {
  136. // no more outstanding references to this selection
  137. if (mSelectedObjects->getNumRefs() == 1)
  138. {
  139. deselectAll();
  140. }
  141. }
  142. void LLSelectMgr::convertTransient()
  143. {
  144. LLObjectSelection::iterator node_it;
  145. for (node_it = mSelectedObjects->begin(); node_it != mSelectedObjects->end(); ++node_it)
  146. {
  147. LLSelectNode *nodep = *node_it;
  148. nodep->setTransient(FALSE);
  149. }
  150. }
  151. void LLSelectMgr::deselectAllIfTooFar()
  152. {
  153. if (mSelectedObjects->isEmpty() || mSelectedObjects->mSelectType == SELECT_TYPE_HUD)
  154. {
  155. return;
  156. }
  157. // HACK: Don't deselect when we're navigating to rate an object's
  158. // owner or creator.  JC
  159. if (gMenuObject->getVisible())
  160. {
  161. return;
  162. }
  163. LLVector3d selectionCenter = getSelectionCenterGlobal();
  164. if (gSavedSettings.getBOOL("LimitSelectDistance")
  165. && (!mSelectedObjects->getPrimaryObject() || !mSelectedObjects->getPrimaryObject()->isAvatar())
  166. && (mSelectedObjects->getPrimaryObject() != LLViewerMediaFocus::getInstance()->getFocusedObject())
  167. && !mSelectedObjects->isAttachment()
  168. && !selectionCenter.isExactlyZero())
  169. {
  170. F32 deselect_dist = gSavedSettings.getF32("MaxSelectDistance");
  171. F32 deselect_dist_sq = deselect_dist * deselect_dist;
  172. LLVector3d select_delta = gAgent.getPositionGlobal() - selectionCenter;
  173. F32 select_dist_sq = (F32) select_delta.magVecSquared();
  174. if (select_dist_sq > deselect_dist_sq)
  175. {
  176. if (mDebugSelectMgr)
  177. {
  178. llinfos << "Selection manager: auto-deselecting, select_dist = " << fsqrtf(select_dist_sq) << llendl;
  179. llinfos << "agent pos global = " << gAgent.getPositionGlobal() << llendl;
  180. llinfos << "selection pos global = " << selectionCenter << llendl;
  181. }
  182. deselectAll();
  183. }
  184. }
  185. }
  186. void LLSelectMgr::selectionSetObjectName(const std::string& name)
  187. {
  188. // we only work correctly if 1 object is selected.
  189. if(mSelectedObjects->getRootObjectCount() == 1)
  190. {
  191. sendListToRegions("ObjectName",
  192.   packAgentAndSessionID,
  193.   packObjectName,
  194.   (void*)(new std::string(name)),
  195.   SEND_ONLY_ROOTS);
  196. }
  197. else if(mSelectedObjects->getObjectCount() == 1)
  198. {
  199. sendListToRegions("ObjectName",
  200.   packAgentAndSessionID,
  201.   packObjectName,
  202.   (void*)(new std::string(name)),
  203.   SEND_INDIVIDUALS);
  204. }
  205. }
  206. void LLSelectMgr::selectionSetObjectDescription(const std::string& desc)
  207. {
  208. // we only work correctly if 1 object is selected.
  209. if(mSelectedObjects->getRootObjectCount() == 1)
  210. {
  211. sendListToRegions("ObjectDescription",
  212.   packAgentAndSessionID,
  213.   packObjectDescription,
  214.   (void*)(new std::string(desc)),
  215.   SEND_ONLY_ROOTS);
  216. }
  217. else if(mSelectedObjects->getObjectCount() == 1)
  218. {
  219. sendListToRegions("ObjectDescription",
  220.   packAgentAndSessionID,
  221.   packObjectDescription,
  222.   (void*)(new std::string(desc)),
  223.   SEND_INDIVIDUALS);
  224. }
  225. }
  226. void LLSelectMgr::selectionSetObjectCategory(const LLCategory& category)
  227. {
  228. // for now, we only want to be able to set one root category at
  229. // a time.
  230. if(mSelectedObjects->getRootObjectCount() != 1) return;
  231. sendListToRegions("ObjectCategory",
  232.   packAgentAndSessionID,
  233.   packObjectCategory,
  234.   (void*)(&category),
  235.   SEND_ONLY_ROOTS);
  236. }
  237. void LLSelectMgr::selectionSetObjectSaleInfo(const LLSaleInfo& sale_info)
  238. {
  239. sendListToRegions("ObjectSaleInfo",
  240.   packAgentAndSessionID,
  241.   packObjectSaleInfo,
  242.   (void*)(&sale_info),
  243.   SEND_ONLY_ROOTS);
  244. }
  245. //----------------------------------------------------------------------
  246. // Attachments
  247. //----------------------------------------------------------------------
  248. void LLSelectMgr::sendAttach(U8 attachment_point)
  249. {
  250. LLViewerObject* attach_object = mSelectedObjects->getFirstRootObject();
  251. if (!attach_object || !gAgent.getAvatarObject() || mSelectedObjects->mSelectType != SELECT_TYPE_WORLD)
  252. {
  253. return;
  254. }
  255. #if ENABLE_MULTIATTACHMENTS
  256. attachment_point |= ATTACHMENT_ADD;
  257. #endif
  258. BOOL build_mode = LLToolMgr::getInstance()->inEdit();
  259. // Special case: Attach to default location for this object.
  260. if (0 == attachment_point ||
  261. get_if_there(gAgent.getAvatarObject()->mAttachmentPoints, (S32)attachment_point, (LLViewerJointAttachment*)NULL))
  262. {
  263. sendListToRegions(
  264. "ObjectAttach",
  265. packAgentIDAndSessionAndAttachment, 
  266. packObjectIDAndRotation, 
  267. &attachment_point, 
  268. SEND_ONLY_ROOTS );
  269. if (!build_mode)
  270. {
  271. deselectAll();
  272. }
  273. }
  274. }
  275. void LLSelectMgr::sendDetach()
  276. {
  277. if (!mSelectedObjects->getNumNodes() || mSelectedObjects->mSelectType == SELECT_TYPE_WORLD)
  278. {
  279. return;
  280. }
  281. sendListToRegions(
  282. "ObjectDetach",
  283. packAgentAndSessionID,
  284. packObjectLocalID,
  285. NULL,
  286. SEND_ONLY_ROOTS );
  287. }
  288. void LLSelectMgr::sendDropAttachment()
  289. {
  290. if (!mSelectedObjects->getNumNodes() || mSelectedObjects->mSelectType == SELECT_TYPE_WORLD)
  291. {
  292. return;
  293. }
  294. sendListToRegions(
  295. "ObjectDrop",
  296. packAgentAndSessionID,
  297. packObjectLocalID,
  298. NULL,
  299. SEND_ONLY_ROOTS);
  300. }
  301. //----------------------------------------------------------------------
  302. // Links
  303. //----------------------------------------------------------------------
  304. void LLSelectMgr::sendLink()
  305. {
  306. if (!mSelectedObjects->getNumNodes())
  307. {
  308. return;
  309. }
  310. sendListToRegions(
  311. "ObjectLink",
  312. packAgentAndSessionID,
  313. packObjectLocalID,
  314. NULL,
  315. SEND_ONLY_ROOTS);
  316. }
  317. void LLSelectMgr::sendDelink()
  318. {
  319. if (!mSelectedObjects->getNumNodes())
  320. {
  321. return;
  322. }
  323. // Delink needs to send individuals so you can unlink a single object from
  324. // a linked set.
  325. sendListToRegions(
  326. "ObjectDelink",
  327. packAgentAndSessionID,
  328. packObjectLocalID,
  329. NULL,
  330. SEND_INDIVIDUALS);
  331. }
  332. //----------------------------------------------------------------------
  333. // Hinges
  334. //----------------------------------------------------------------------
  335. /*
  336. void LLSelectMgr::sendHinge(U8 type)
  337. {
  338. if (!mSelectedObjects->getNumNodes())
  339. {
  340. return;
  341. }
  342. sendListToRegions(
  343. "ObjectHinge",
  344. packHingeHead,
  345. packObjectLocalID,
  346. &type,
  347. SEND_ONLY_ROOTS);
  348. }
  349. void LLSelectMgr::sendDehinge()
  350. {
  351. if (!mSelectedObjects->getNumNodes())
  352. {
  353. return;
  354. }
  355. sendListToRegions(
  356. "ObjectDehinge",
  357. packAgentAndSessionID,
  358. packObjectLocalID,
  359. NULL,
  360. SEND_ONLY_ROOTS);
  361. }*/
  362. void LLSelectMgr::sendSelect()
  363. {
  364. if (!mSelectedObjects->getNumNodes())
  365. {
  366. return;
  367. }
  368. sendListToRegions(
  369. "ObjectSelect",
  370. packAgentAndSessionID,
  371. packObjectLocalID,
  372. NULL,
  373. SEND_INDIVIDUALS);
  374. }
  375. // static
  376. void LLSelectMgr::packHingeHead(void *user_data)
  377. {
  378. U8 *type = (U8 *)user_data;
  379. gMessageSystem->nextBlockFast(_PREHASH_AgentData);
  380. gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
  381. gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() );
  382. gMessageSystem->nextBlockFast(_PREHASH_JointType);
  383. gMessageSystem->addU8Fast(_PREHASH_Type, *type );
  384. }
  385. void LLSelectMgr::selectionDump()
  386. {
  387. struct f : public LLSelectedObjectFunctor
  388. {
  389. virtual bool apply(LLViewerObject* object)
  390. {
  391. object->dump();
  392. return true;
  393. }
  394. } func;
  395. getSelection()->applyToObjects(&func);
  396. }
  397. void LLSelectMgr::saveSelectedObjectColors()
  398. {
  399. struct f : public LLSelectedNodeFunctor
  400. {
  401. virtual bool apply(LLSelectNode* node)
  402. {
  403. node->saveColors();
  404. return true;
  405. }
  406. } func;
  407. getSelection()->applyToNodes(&func);
  408. }
  409. void LLSelectMgr::saveSelectedObjectTextures()
  410. {
  411. // invalidate current selection so we update saved textures
  412. struct f : public LLSelectedNodeFunctor
  413. {
  414. virtual bool apply(LLSelectNode* node)
  415. {
  416. node->mValid = FALSE;
  417. return true;
  418. }
  419. } func;
  420. getSelection()->applyToNodes(&func);
  421. // request object properties message to get updated permissions data
  422. sendSelect();
  423. }
  424. // This routine should be called whenever a drag is initiated.
  425. // also need to know to which simulator to send update message
  426. void LLSelectMgr::saveSelectedObjectTransform(EActionType action_type)
  427. {
  428. if (mSelectedObjects->isEmpty())
  429. {
  430. // nothing selected, so nothing to save
  431. return;
  432. }
  433. struct f : public LLSelectedNodeFunctor
  434. {
  435. EActionType mActionType;
  436. f(EActionType a) : mActionType(a) {}
  437. virtual bool apply(LLSelectNode* selectNode)
  438. {
  439. LLViewerObject* object = selectNode->getObject();
  440. if (!object)
  441. {
  442. return true; // skip
  443. }
  444. selectNode->mSavedPositionLocal = object->getPosition();
  445. if (object->isAttachment())
  446. {
  447. if (object->isRootEdit())
  448. {
  449. LLXform* parent_xform = object->mDrawable->getXform()->getParent();
  450. if (parent_xform)
  451. {
  452. selectNode->mSavedPositionGlobal = gAgent.getPosGlobalFromAgent((object->getPosition() * parent_xform->getWorldRotation()) + parent_xform->getWorldPosition());
  453. }
  454. else
  455. {
  456. selectNode->mSavedPositionGlobal = object->getPositionGlobal();
  457. }
  458. }
  459. else
  460. {
  461. LLViewerObject* attachment_root = (LLViewerObject*)object->getParent();
  462. LLXform* parent_xform = attachment_root ? attachment_root->mDrawable->getXform()->getParent() : NULL;
  463. if (parent_xform)
  464. {
  465. LLVector3 root_pos = (attachment_root->getPosition() * parent_xform->getWorldRotation()) + parent_xform->getWorldPosition();
  466. LLQuaternion root_rot = (attachment_root->getRotation() * parent_xform->getWorldRotation());
  467. selectNode->mSavedPositionGlobal = gAgent.getPosGlobalFromAgent((object->getPosition() * root_rot) + root_pos);
  468. }
  469. else
  470. {
  471. selectNode->mSavedPositionGlobal = object->getPositionGlobal();
  472. }
  473. }
  474. selectNode->mSavedRotation = object->getRenderRotation();
  475. }
  476. else
  477. {
  478. selectNode->mSavedPositionGlobal = object->getPositionGlobal();
  479. selectNode->mSavedRotation = object->getRotationRegion();
  480. }
  481. selectNode->mSavedScale = object->getScale();
  482. selectNode->saveTextureScaleRatios();
  483. return true;
  484. }
  485. } func(action_type);
  486. getSelection()->applyToNodes(&func);
  487. mSavedSelectionBBox = getBBoxOfSelection();
  488. }
  489. struct LLSelectMgrApplyFlags : public LLSelectedObjectFunctor
  490. {
  491. LLSelectMgrApplyFlags(U32 flags, BOOL state) : mFlags(flags), mState(state) {}
  492. U32 mFlags;
  493. BOOL mState;
  494. virtual bool apply(LLViewerObject* object)
  495. {
  496. if ( object->permModify() && // preemptive permissions check
  497.  object->isRoot() && // don't send for child objects
  498.  !object->isJointChild())
  499. {
  500. object->setFlags( mFlags, mState);
  501. }
  502. return true;
  503. }
  504. };
  505. void LLSelectMgr::selectionUpdatePhysics(BOOL physics)
  506. {
  507. LLSelectMgrApplyFlags func( FLAGS_USE_PHYSICS, physics);
  508. getSelection()->applyToObjects(&func);
  509. }
  510. void LLSelectMgr::selectionUpdateTemporary(BOOL is_temporary)
  511. {
  512. LLSelectMgrApplyFlags func( FLAGS_TEMPORARY_ON_REZ, is_temporary);
  513. getSelection()->applyToObjects(&func);
  514. }
  515. void LLSelectMgr::selectionUpdatePhantom(BOOL is_phantom)
  516. {
  517. LLSelectMgrApplyFlags func( FLAGS_PHANTOM, is_phantom);
  518. getSelection()->applyToObjects(&func);
  519. }
  520. void LLSelectMgr::selectionUpdateCastShadows(BOOL cast_shadows)
  521. {
  522. LLSelectMgrApplyFlags func( FLAGS_CAST_SHADOWS, cast_shadows);
  523. getSelection()->applyToObjects(&func);
  524. }
  525. //----------------------------------------------------------------------
  526. // Helpful packing functions for sendObjectMessage()
  527. //----------------------------------------------------------------------
  528. // static 
  529. void LLSelectMgr::packAgentIDAndSessionAndAttachment( void *user_data)
  530. {
  531. U8 *attachment_point = (U8*)user_data;
  532. gMessageSystem->nextBlockFast(_PREHASH_AgentData);
  533. gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
  534. gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  535. gMessageSystem->addU8Fast(_PREHASH_AttachmentPoint, *attachment_point);
  536. }
  537. // static
  538. void LLSelectMgr::packAgentID( void *user_data)
  539. {
  540. gMessageSystem->nextBlockFast(_PREHASH_AgentData);
  541. gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
  542. }
  543. // static
  544. void LLSelectMgr::packAgentAndSessionID(void* user_data)
  545. {
  546. gMessageSystem->nextBlockFast(_PREHASH_AgentData);
  547. gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
  548. gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  549. }
  550. // static
  551. void LLSelectMgr::packAgentAndGroupID(void* user_data)
  552. {
  553. LLOwnerData *data = (LLOwnerData *)user_data;
  554. gMessageSystem->nextBlockFast(_PREHASH_AgentData);
  555. gMessageSystem->addUUIDFast(_PREHASH_AgentID, data->owner_id );
  556. gMessageSystem->addUUIDFast(_PREHASH_GroupID, data->group_id );
  557. }
  558. // static
  559. void LLSelectMgr::packAgentAndSessionAndGroupID(void* user_data)
  560. {
  561. LLUUID* group_idp = (LLUUID*) user_data;
  562. gMessageSystem->nextBlockFast(_PREHASH_AgentData);
  563. gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
  564. gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  565. gMessageSystem->addUUIDFast(_PREHASH_GroupID, *group_idp);
  566. }
  567. // static
  568. void LLSelectMgr::packDuplicateHeader(void* data)
  569. {
  570. LLUUID group_id(gAgent.getGroupID());
  571. packAgentAndSessionAndGroupID(&group_id);
  572. LLDuplicateData* dup_data = (LLDuplicateData*) data;
  573. gMessageSystem->nextBlockFast(_PREHASH_SharedData);
  574. gMessageSystem->addVector3Fast(_PREHASH_Offset, dup_data->offset);
  575. gMessageSystem->addU32Fast(_PREHASH_DuplicateFlags, dup_data->flags);
  576. }
  577. // static
  578. void LLSelectMgr::packDeleteHeader(void* userdata)
  579. {
  580. BOOL force = (BOOL)(intptr_t)userdata;
  581. gMessageSystem->nextBlockFast(_PREHASH_AgentData);
  582. gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
  583. gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  584. gMessageSystem->addBOOLFast(_PREHASH_Force, force);
  585. }
  586. // static
  587. void LLSelectMgr::packAgentGroupAndCatID(void* user_data)
  588. {
  589. LLBuyData* buy = (LLBuyData*)user_data;
  590. gMessageSystem->nextBlockFast(_PREHASH_AgentData);
  591. gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
  592. gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  593. gMessageSystem->addUUIDFast(_PREHASH_GroupID, gAgent.getGroupID());
  594. gMessageSystem->addUUIDFast(_PREHASH_CategoryID, buy->mCategoryID);
  595. }
  596. //static
  597. void LLSelectMgr::packDeRezHeader(void* user_data)
  598. {
  599. LLDeRezInfo* info = (LLDeRezInfo*)user_data;
  600. gMessageSystem->nextBlockFast(_PREHASH_AgentData);
  601. gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
  602. gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  603. gMessageSystem->nextBlockFast(_PREHASH_AgentBlock);
  604. gMessageSystem->addUUIDFast(_PREHASH_GroupID, gAgent.getGroupID());
  605. gMessageSystem->addU8Fast(_PREHASH_Destination, (U8)info->mDestination);
  606. gMessageSystem->addUUIDFast(_PREHASH_DestinationID, info->mDestinationID);
  607. LLUUID tid;
  608. tid.generate();
  609. gMessageSystem->addUUIDFast(_PREHASH_TransactionID, tid);
  610. const U8 PACKET = 1;
  611. gMessageSystem->addU8Fast(_PREHASH_PacketCount, PACKET);
  612. gMessageSystem->addU8Fast(_PREHASH_PacketNumber, PACKET);
  613. }
  614. // static 
  615. void LLSelectMgr::packObjectID(LLSelectNode* node, void *user_data)
  616. {
  617. gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
  618. gMessageSystem->addUUIDFast(_PREHASH_ObjectID, node->getObject()->mID );
  619. }
  620. void LLSelectMgr::packObjectIDAndRotation(LLSelectNode* node, void *user_data)
  621. {
  622. gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
  623. gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, node->getObject()->getLocalID() );
  624. gMessageSystem->addQuatFast(_PREHASH_Rotation, node->getObject()->getRotation());
  625. }
  626. void LLSelectMgr::packObjectClickAction(LLSelectNode* node, void *user_data)
  627. {
  628. gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
  629. gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, node->getObject()->getLocalID() );
  630. gMessageSystem->addU8("ClickAction", node->getObject()->getClickAction());
  631. }
  632. void LLSelectMgr::packObjectIncludeInSearch(LLSelectNode* node, void *user_data)
  633. {
  634. gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
  635. gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, node->getObject()->getLocalID() );
  636. gMessageSystem->addBOOL("IncludeInSearch", node->getObject()->getIncludeInSearch());
  637. }
  638. // static
  639. void LLSelectMgr::packObjectLocalID(LLSelectNode* node, void *)
  640. {
  641. gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
  642. gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, node->getObject()->getLocalID());
  643. }
  644. // static
  645. void LLSelectMgr::packObjectName(LLSelectNode* node, void* user_data)
  646. {
  647. const std::string* name = (const std::string*)user_data;
  648. if(!name->empty())
  649. {
  650. gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
  651. gMessageSystem->addU32Fast(_PREHASH_LocalID, node->getObject()->getLocalID());
  652. gMessageSystem->addStringFast(_PREHASH_Name, *name);
  653. }
  654. delete name;
  655. }
  656. // static
  657. void LLSelectMgr::packObjectDescription(LLSelectNode* node, void* user_data)
  658. {
  659. const std::string* desc = (const std::string*)user_data;
  660. if(!desc->empty())
  661. {
  662. gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
  663. gMessageSystem->addU32Fast(_PREHASH_LocalID, node->getObject()->getLocalID());
  664. gMessageSystem->addStringFast(_PREHASH_Description, *desc);
  665. }
  666. }
  667. // static
  668. void LLSelectMgr::packObjectCategory(LLSelectNode* node, void* user_data)
  669. {
  670. LLCategory* category = (LLCategory*)user_data;
  671. if(!category) return;
  672. gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
  673. gMessageSystem->addU32Fast(_PREHASH_LocalID, node->getObject()->getLocalID());
  674. category->packMessage(gMessageSystem);
  675. }
  676. // static
  677. void LLSelectMgr::packObjectSaleInfo(LLSelectNode* node, void* user_data)
  678. {
  679. LLSaleInfo* sale_info = (LLSaleInfo*)user_data;
  680. if(!sale_info) return;
  681. gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
  682. gMessageSystem->addU32Fast(_PREHASH_LocalID, node->getObject()->getLocalID());
  683. sale_info->packMessage(gMessageSystem);
  684. }
  685. // static
  686. void LLSelectMgr::packPhysics(LLSelectNode* node, void *user_data)
  687. {
  688. }
  689. // static
  690. void LLSelectMgr::packShape(LLSelectNode* node, void *user_data)
  691. {
  692. }
  693. // static 
  694. void LLSelectMgr::packPermissions(LLSelectNode* node, void *user_data)
  695. {
  696. LLPermData *data = (LLPermData *)user_data;
  697. gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
  698. gMessageSystem->addU32Fast(_PREHASH_ObjectLocalID, node->getObject()->getLocalID());
  699. gMessageSystem->addU8Fast(_PREHASH_Field, data->mField);
  700. gMessageSystem->addBOOLFast(_PREHASH_Set, data->mSet);
  701. gMessageSystem->addU32Fast(_PREHASH_Mask, data->mMask);
  702. }
  703. // Utility function to send some information to every region containing
  704. // an object on the selection list.  We want to do this to reduce the total
  705. // number of packets sent by the viewer.
  706. void LLSelectMgr::sendListToRegions(const std::string& message_name,
  707. void (*pack_header)(void *user_data), 
  708. void (*pack_body)(LLSelectNode* node, void *user_data), 
  709. void *user_data,
  710. ESendType send_type)
  711. {
  712. LLSelectNode* node;
  713. LLViewerRegion* last_region;
  714. LLViewerRegion* current_region;
  715. S32 objects_sent = 0;
  716. S32 packets_sent = 0;
  717. S32 objects_in_this_packet = 0;
  718. //clear update override data (allow next update through)
  719. struct f : public LLSelectedNodeFunctor
  720. {
  721. virtual bool apply(LLSelectNode* node)
  722. {
  723. node->mLastPositionLocal.setVec(0,0,0);
  724. node->mLastRotation = LLQuaternion();
  725. node->mLastScale.setVec(0,0,0);
  726. return true;
  727. }
  728. } func;
  729. getSelection()->applyToNodes(&func);
  730. std::queue<LLSelectNode*> nodes_to_send;
  731. struct push_all : public LLSelectedNodeFunctor
  732. {
  733. std::queue<LLSelectNode*>& nodes_to_send;
  734. push_all(std::queue<LLSelectNode*>& n) : nodes_to_send(n) {}
  735. virtual bool apply(LLSelectNode* node)
  736. {
  737. if (node->getObject())
  738. {
  739. nodes_to_send.push(node);
  740. }
  741. return true;
  742. }
  743. };
  744. struct push_some : public LLSelectedNodeFunctor
  745. {
  746. std::queue<LLSelectNode*>& nodes_to_send;
  747. bool mRoots;
  748. push_some(std::queue<LLSelectNode*>& n, bool roots) : nodes_to_send(n), mRoots(roots) {}
  749. virtual bool apply(LLSelectNode* node)
  750. {
  751. if (node->getObject())
  752. {
  753. BOOL is_root = node->getObject()->isRootEdit();
  754. if ((mRoots && is_root) || (!mRoots && !is_root))
  755. {
  756. nodes_to_send.push(node);
  757. }
  758. }
  759. return true;
  760. }
  761. };
  762. struct push_all  pushall(nodes_to_send);
  763. struct push_some pushroots(nodes_to_send, TRUE);
  764. struct push_some pushnonroots(nodes_to_send, FALSE);
  765. switch(send_type)
  766. {
  767.   case SEND_ONLY_ROOTS:
  768.   if(message_name == "ObjectBuy")
  769. getSelection()->applyToRootNodes(&pushroots);
  770.   else
  771. getSelection()->applyToRootNodes(&pushall);
  772.   
  773. break;
  774.   case SEND_INDIVIDUALS:
  775. getSelection()->applyToNodes(&pushall);
  776. break;
  777.   case SEND_ROOTS_FIRST:
  778. // first roots...
  779. getSelection()->applyToNodes(&pushroots);
  780. // then children...
  781. getSelection()->applyToNodes(&pushnonroots);
  782. break;
  783.   case SEND_CHILDREN_FIRST:
  784. // first children...
  785. getSelection()->applyToNodes(&pushnonroots);
  786. // then roots...
  787. getSelection()->applyToNodes(&pushroots);
  788. break;
  789. default:
  790. llerrs << "Bad send type " << send_type << " passed to SendListToRegions()" << llendl;
  791. }
  792. // bail if nothing selected
  793. if (nodes_to_send.empty())
  794. {
  795. return;
  796. }
  797. node = nodes_to_send.front();
  798. nodes_to_send.pop();
  799. // cache last region information
  800. current_region = node->getObject()->getRegion();
  801. // Start duplicate message
  802. // CRO: this isn't 
  803. gMessageSystem->newMessage(message_name.c_str());
  804. (*pack_header)(user_data);
  805. // For each object
  806. while (node != NULL)
  807. {
  808. // remember the last region, look up the current one
  809. last_region = current_region;
  810. current_region = node->getObject()->getRegion();
  811. // if to same simulator and message not too big
  812. if ((current_region == last_region)
  813. && (! gMessageSystem->isSendFull(NULL))
  814. && (objects_in_this_packet < MAX_OBJECTS_PER_PACKET))
  815. {
  816. // add another instance of the body of the data
  817. (*pack_body)(node, user_data);
  818. ++objects_sent;
  819. ++objects_in_this_packet;
  820. // and on to the next object
  821. if(nodes_to_send.empty())
  822. {
  823. node = NULL;
  824. }
  825. else
  826. {
  827. node = nodes_to_send.front();
  828. nodes_to_send.pop();
  829. }
  830. }
  831. else
  832. {
  833. // otherwise send current message and start new one
  834. gMessageSystem->sendReliable( last_region->getHost());
  835. packets_sent++;
  836. objects_in_this_packet = 0;
  837. gMessageSystem->newMessage(message_name.c_str());
  838. (*pack_header)(user_data);
  839. // don't move to the next object, we still need to add the
  840. // body data. 
  841. }
  842. }
  843. // flush messages
  844. if (gMessageSystem->getCurrentSendTotal() > 0)
  845. {
  846. gMessageSystem->sendReliable( current_region->getHost());
  847. packets_sent++;
  848. }
  849. else
  850. {
  851. gMessageSystem->clearMessage();
  852. }
  853. // llinfos << "sendListToRegions " << message_name << " obj " << objects_sent << " pkt " << packets_sent << llendl;
  854. }
  855. //
  856. // Network communications
  857. //
  858. void LLSelectMgr::requestObjectPropertiesFamily(LLViewerObject* object)
  859. {
  860. LLMessageSystem* msg = gMessageSystem;
  861. msg->newMessageFast(_PREHASH_RequestObjectPropertiesFamily);
  862. msg->nextBlockFast(_PREHASH_AgentData);
  863. msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
  864. msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  865. msg->nextBlockFast(_PREHASH_ObjectData);
  866. msg->addU32Fast(_PREHASH_RequestFlags, 0x0 );
  867. msg->addUUIDFast(_PREHASH_ObjectID, object->mID );
  868. LLViewerRegion* regionp = object->getRegion();
  869. msg->sendReliable( regionp->getHost() );
  870. }
  871. // static
  872. void LLSelectMgr::processObjectProperties(LLMessageSystem* msg, void** user_data)
  873. {
  874. S32 i;
  875. S32 count = msg->getNumberOfBlocksFast(_PREHASH_ObjectData);
  876. for (i = 0; i < count; i++)
  877. {
  878. LLUUID id;
  879. msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_ObjectID, id, i);
  880. LLUUID creator_id;
  881. LLUUID owner_id;
  882. LLUUID group_id;
  883. LLUUID last_owner_id;
  884. U64 creation_date;
  885. LLUUID extra_id;
  886. U32 base_mask, owner_mask, group_mask, everyone_mask, next_owner_mask;
  887. LLSaleInfo sale_info;
  888. LLCategory category;
  889. LLAggregatePermissions ag_perms;
  890. LLAggregatePermissions ag_texture_perms;
  891. LLAggregatePermissions ag_texture_perms_owner;
  892. msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_CreatorID, creator_id, i);
  893. msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_OwnerID, owner_id, i);
  894. msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_GroupID, group_id, i);
  895. msg->getU64Fast(_PREHASH_ObjectData, _PREHASH_CreationDate, creation_date, i);
  896. msg->getU32Fast(_PREHASH_ObjectData, _PREHASH_BaseMask, base_mask, i);
  897. msg->getU32Fast(_PREHASH_ObjectData, _PREHASH_OwnerMask, owner_mask, i);
  898. msg->getU32Fast(_PREHASH_ObjectData, _PREHASH_GroupMask, group_mask, i);
  899. msg->getU32Fast(_PREHASH_ObjectData, _PREHASH_EveryoneMask, everyone_mask, i);
  900. msg->getU32Fast(_PREHASH_ObjectData, _PREHASH_NextOwnerMask, next_owner_mask, i);
  901. sale_info.unpackMultiMessage(msg, _PREHASH_ObjectData, i);
  902. ag_perms.unpackMessage(msg, _PREHASH_ObjectData, _PREHASH_AggregatePerms, i);
  903. ag_texture_perms.unpackMessage(msg, _PREHASH_ObjectData, _PREHASH_AggregatePermTextures, i);
  904. ag_texture_perms_owner.unpackMessage(msg, _PREHASH_ObjectData, _PREHASH_AggregatePermTexturesOwner, i);
  905. category.unpackMultiMessage(msg, _PREHASH_ObjectData, i);
  906. S16 inv_serial = 0;
  907. msg->getS16Fast(_PREHASH_ObjectData, _PREHASH_InventorySerial, inv_serial, i);
  908. LLUUID item_id;
  909. msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_ItemID, item_id, i);
  910. LLUUID folder_id;
  911. msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_FolderID, folder_id, i);
  912. LLUUID from_task_id;
  913. msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_FromTaskID, from_task_id, i);
  914. msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_LastOwnerID, last_owner_id, i);
  915. std::string name;
  916. msg->getStringFast(_PREHASH_ObjectData, _PREHASH_Name, name, i);
  917. std::string desc;
  918. msg->getStringFast(_PREHASH_ObjectData, _PREHASH_Description, desc, i);
  919. std::string touch_name;
  920. msg->getStringFast(_PREHASH_ObjectData, _PREHASH_TouchName, touch_name, i);
  921. std::string sit_name;
  922. msg->getStringFast(_PREHASH_ObjectData, _PREHASH_SitName, sit_name, i);
  923. //unpack TE IDs
  924. std::vector<LLUUID> texture_ids;
  925. S32 size = msg->getSizeFast(_PREHASH_ObjectData, i, _PREHASH_TextureID);
  926. if (size > 0)
  927. {
  928. S8 packed_buffer[SELECT_MAX_TES * UUID_BYTES];
  929. msg->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_TextureID, packed_buffer, 0, i, SELECT_MAX_TES * UUID_BYTES);
  930. for (S32 buf_offset = 0; buf_offset < size; buf_offset += UUID_BYTES)
  931. {
  932. LLUUID tid;
  933. memcpy(tid.mData, packed_buffer + buf_offset, UUID_BYTES); /* Flawfinder: ignore */
  934. texture_ids.push_back(tid);
  935. }
  936. }
  937. // Iterate through nodes at end, since it can be on both the regular AND hover list
  938. struct f : public LLSelectedNodeFunctor
  939. {
  940. LLUUID mID;
  941. f(const LLUUID& id) : mID(id) {}
  942. virtual bool apply(LLSelectNode* node)
  943. {
  944. return (node->getObject() && node->getObject()->mID == mID);
  945. }
  946. } func(id);
  947. LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstNode(&func);
  948. if (node)
  949. {
  950. if (node->mInventorySerial != inv_serial)
  951. {
  952. node->getObject()->dirtyInventory();
  953. }
  954. // save texture data as soon as we get texture perms first time
  955. if (!node->mValid)
  956. {
  957. BOOL can_copy = FALSE;
  958. BOOL can_transfer = FALSE;
  959. LLAggregatePermissions::EValue value = LLAggregatePermissions::AP_NONE;
  960. if(node->getObject()->permYouOwner())
  961. {
  962. value = ag_texture_perms_owner.getValue(PERM_COPY);
  963. if (value == LLAggregatePermissions::AP_EMPTY || value == LLAggregatePermissions::AP_ALL)
  964. {
  965. can_copy = TRUE;
  966. }
  967. value = ag_texture_perms_owner.getValue(PERM_TRANSFER);
  968. if (value == LLAggregatePermissions::AP_EMPTY || value == LLAggregatePermissions::AP_ALL)
  969. {
  970. can_transfer = TRUE;
  971. }
  972. }
  973. else
  974. {
  975. value = ag_texture_perms.getValue(PERM_COPY);
  976. if (value == LLAggregatePermissions::AP_EMPTY || value == LLAggregatePermissions::AP_ALL)
  977. {
  978. can_copy = TRUE;
  979. }
  980. value = ag_texture_perms.getValue(PERM_TRANSFER);
  981. if (value == LLAggregatePermissions::AP_EMPTY || value == LLAggregatePermissions::AP_ALL)
  982. {
  983. can_transfer = TRUE;
  984. }
  985. }
  986. if (can_copy && can_transfer)
  987. {
  988. // this should be the only place that saved textures is called
  989. node->saveTextures(texture_ids);
  990. }
  991. }
  992. node->mValid = TRUE;
  993. node->mPermissions->init(creator_id, owner_id,
  994.  last_owner_id, group_id);
  995. node->mPermissions->initMasks(base_mask, owner_mask, everyone_mask, group_mask, next_owner_mask);
  996. node->mCreationDate = creation_date;
  997. node->mItemID = item_id;
  998. node->mFolderID = folder_id;
  999. node->mFromTaskID = from_task_id;
  1000. node->mName.assign(name);
  1001. node->mDescription.assign(desc);
  1002. node->mSaleInfo = sale_info;
  1003. node->mAggregatePerm = ag_perms;
  1004. node->mAggregateTexturePerm = ag_texture_perms;
  1005. node->mAggregateTexturePermOwner = ag_texture_perms_owner;
  1006. node->mCategory = category;
  1007. node->mInventorySerial = inv_serial;
  1008. node->mSitName.assign(sit_name);
  1009. node->mTouchName.assign(touch_name);
  1010. }
  1011. }
  1012. dialog_refresh_all();
  1013. // silly hack to allow 'save into inventory' 
  1014. if(gPopupMenuView->getVisible())
  1015. {
  1016. gPopupMenuView->setItemEnabled(SAVE_INTO_INVENTORY,
  1017.    enable_save_into_inventory(NULL));
  1018. }
  1019. // hack for left-click buy object
  1020. LLToolPie::selectionPropertiesReceived();
  1021. }
  1022. // static
  1023. void LLSelectMgr::processObjectPropertiesFamily(LLMessageSystem* msg, void** user_data)
  1024. {
  1025. LLUUID id;
  1026. U32 request_flags;
  1027. LLUUID creator_id;
  1028. LLUUID owner_id;
  1029. LLUUID group_id;
  1030. LLUUID extra_id;
  1031. U32 base_mask, owner_mask, group_mask, everyone_mask, next_owner_mask;
  1032. LLSaleInfo sale_info;
  1033. LLCategory category;
  1034. msg->getU32Fast(_PREHASH_ObjectData, _PREHASH_RequestFlags, request_flags );
  1035. msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_ObjectID, id );
  1036. msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_OwnerID, owner_id );
  1037. msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_GroupID, group_id );
  1038. msg->getU32Fast(_PREHASH_ObjectData, _PREHASH_BaseMask, base_mask );
  1039. msg->getU32Fast(_PREHASH_ObjectData, _PREHASH_OwnerMask, owner_mask );
  1040. msg->getU32Fast(_PREHASH_ObjectData,_PREHASH_GroupMask, group_mask );
  1041. msg->getU32Fast(_PREHASH_ObjectData, _PREHASH_EveryoneMask, everyone_mask );
  1042. msg->getU32Fast(_PREHASH_ObjectData, _PREHASH_NextOwnerMask, next_owner_mask);
  1043. sale_info.unpackMessage(msg, _PREHASH_ObjectData);
  1044. category.unpackMessage(msg, _PREHASH_ObjectData);
  1045. LLUUID last_owner_id;
  1046. msg->getUUIDFast(_PREHASH_ObjectData, _PREHASH_LastOwnerID, last_owner_id );
  1047. // unpack name & desc
  1048. std::string name;
  1049. msg->getStringFast(_PREHASH_ObjectData, _PREHASH_Name, name);
  1050. std::string desc;
  1051. msg->getStringFast(_PREHASH_ObjectData, _PREHASH_Description, desc);
  1052. // the reporter widget askes the server for info about picked objects
  1053. if (request_flags & COMPLAINT_REPORT_REQUEST )
  1054. {
  1055. LLFloaterReporter *reporterp = LLFloaterReg::findTypedInstance<LLFloaterReporter>("reporter");
  1056. if (reporterp)
  1057. {
  1058. std::string fullname;
  1059. gCacheName->getFullName(owner_id, fullname);
  1060. reporterp->setPickedObjectProperties(name, fullname, owner_id);
  1061. }
  1062. }
  1063. else if (request_flags & OBJECT_PAY_REQUEST)
  1064. {
  1065. // check if the owner of the paid object is muted
  1066. LLMuteList::getInstance()->autoRemove(owner_id, LLMuteList::AR_MONEY);
  1067. }
  1068. // Now look through all of the hovered nodes
  1069. struct f : public LLSelectedNodeFunctor
  1070. {
  1071. LLUUID mID;
  1072. f(const LLUUID& id) : mID(id) {}
  1073. virtual bool apply(LLSelectNode* node)
  1074. {
  1075. return (node->getObject() && node->getObject()->mID == mID);
  1076. }
  1077. } func(id);
  1078. LLSelectNode* node = LLSelectMgr::getInstance()->mHoverObjects->getFirstNode(&func);
  1079. if (node)
  1080. {
  1081. node->mValid = TRUE;
  1082. node->mPermissions->init(LLUUID::null, owner_id,
  1083.  last_owner_id, group_id);
  1084. node->mPermissions->initMasks(base_mask, owner_mask, everyone_mask, group_mask, next_owner_mask);
  1085. node->mSaleInfo = sale_info;
  1086. node->mCategory = category;
  1087. node->mName.assign(name);
  1088. node->mDescription.assign(desc);
  1089. }
  1090. dialog_refresh_all();
  1091. }
  1092. // static
  1093. void LLSelectMgr::processForceObjectSelect(LLMessageSystem* msg, void**)
  1094. {
  1095. BOOL reset_list;
  1096. msg->getBOOL("Header", "ResetList", reset_list);
  1097. if (reset_list)
  1098. {
  1099. LLSelectMgr::getInstance()->deselectAll();
  1100. }
  1101. LLUUID full_id;
  1102. S32 local_id;
  1103. LLViewerObject* object;
  1104. std::vector<LLViewerObject*> objects;
  1105. S32 i;
  1106. S32 block_count = msg->getNumberOfBlocks("Data");
  1107. for (i = 0; i < block_count; i++)
  1108. {
  1109. msg->getS32("Data", "LocalID", local_id, i);
  1110. gObjectList.getUUIDFromLocal(full_id, 
  1111.  local_id, 
  1112.  msg->getSenderIP(),
  1113.  msg->getSenderPort());
  1114. object = gObjectList.findObject(full_id);
  1115. if (object)
  1116. {
  1117. objects.push_back(object);
  1118. }
  1119. }
  1120. // Don't select, just highlight
  1121. LLSelectMgr::getInstance()->highlightObjectAndFamily(objects);
  1122. }
  1123. extern LLGLdouble gGLModelView[16];
  1124. void LLSelectMgr::updateSilhouettes()
  1125. {
  1126. S32 num_sils_genned = 0;
  1127. LLVector3d cameraPos = gAgent.getCameraPositionGlobal();
  1128. F32 currentCameraZoom = gAgent.getCurrentCameraBuildOffset();
  1129. if (!mSilhouetteImagep)
  1130. {
  1131. mSilhouetteImagep = LLViewerTextureManager::getFetchedTextureFromFile("silhouette.j2c", TRUE, LLViewerTexture::BOOST_UI);
  1132. }
  1133. mHighlightedObjects->cleanupNodes();
  1134. if((cameraPos - mLastCameraPos).magVecSquared() > SILHOUETTE_UPDATE_THRESHOLD_SQUARED * currentCameraZoom * currentCameraZoom)
  1135. {
  1136. struct f : public LLSelectedObjectFunctor
  1137. {
  1138. virtual bool apply(LLViewerObject* object)
  1139. {
  1140. object->setChanged(LLXform::SILHOUETTE);
  1141. return true;
  1142. }
  1143. } func;
  1144. getSelection()->applyToObjects(&func);
  1145. mLastCameraPos = gAgent.getCameraPositionGlobal();
  1146. }
  1147. std::vector<LLViewerObject*> changed_objects;
  1148. updateSelectionSilhouette(mSelectedObjects, num_sils_genned, changed_objects);
  1149. if (mRectSelectedObjects.size() > 0)
  1150. {
  1151. //gGLSPipelineSelection.set();
  1152. //mSilhouetteImagep->bindTexture();
  1153. //glAlphaFunc(GL_GREATER, sHighlightAlphaTest);
  1154. std::set<LLViewerObject*> roots;
  1155. // sync mHighlightedObjects with mRectSelectedObjects since the latter is rebuilt every frame and former
  1156. // persists from frame to frame to avoid regenerating object silhouettes
  1157. // mHighlightedObjects includes all siblings of rect selected objects
  1158. BOOL select_linked_set = !gSavedSettings.getBOOL("EditLinkedParts");
  1159. // generate list of roots from current object selection
  1160. for (std::set<LLPointer<LLViewerObject> >::iterator iter = mRectSelectedObjects.begin();
  1161.  iter != mRectSelectedObjects.end(); iter++)
  1162. {
  1163. LLViewerObject *objectp = *iter;
  1164. if (select_linked_set)
  1165. {
  1166. LLViewerObject *rootp = (LLViewerObject*)objectp->getRoot();
  1167. roots.insert(rootp);
  1168. }
  1169. else
  1170. {
  1171. roots.insert(objectp);
  1172. }
  1173. }
  1174. // remove highlight nodes not in roots list
  1175. std::vector<LLSelectNode*> remove_these_nodes;
  1176. std::vector<LLViewerObject*> remove_these_roots;
  1177. for (LLObjectSelection::iterator iter = mHighlightedObjects->begin();
  1178.  iter != mHighlightedObjects->end(); iter++)
  1179. {
  1180. LLSelectNode* node = *iter;
  1181. LLViewerObject* objectp = node->getObject();
  1182. if (!objectp)
  1183. continue;
  1184. if (objectp->isRoot() || !select_linked_set)
  1185. {
  1186. if (roots.count(objectp) == 0)
  1187. {
  1188. remove_these_nodes.push_back(node);
  1189. }
  1190. else
  1191. {
  1192. remove_these_roots.push_back(objectp);
  1193. }
  1194. }
  1195. else
  1196. {
  1197. LLViewerObject* rootp = (LLViewerObject*)objectp->getRoot();
  1198. if (roots.count(rootp) == 0)
  1199. {
  1200. remove_these_nodes.push_back(node);
  1201. }
  1202. }
  1203. }
  1204. // remove all highlight nodes no longer in rectangle selection
  1205. for (std::vector<LLSelectNode*>::iterator iter = remove_these_nodes.begin();
  1206.  iter != remove_these_nodes.end(); ++iter)
  1207. {
  1208. LLSelectNode* nodep = *iter;
  1209. mHighlightedObjects->removeNode(nodep);
  1210. }
  1211. // remove all root objects already being highlighted
  1212. for (std::vector<LLViewerObject*>::iterator iter = remove_these_roots.begin();
  1213.  iter != remove_these_roots.end(); ++iter)
  1214. {
  1215. LLViewerObject* objectp = *iter;
  1216. roots.erase(objectp);
  1217. }
  1218. // add all new objects in rectangle selection
  1219. for (std::set<LLViewerObject*>::iterator iter = roots.begin();
  1220.  iter != roots.end(); iter++)
  1221. {
  1222. LLViewerObject* objectp = *iter;
  1223. if (!canSelectObject(objectp))
  1224. {
  1225. continue;
  1226. }
  1227. LLSelectNode* rect_select_root_node = new LLSelectNode(objectp, TRUE);
  1228. rect_select_root_node->selectAllTEs(TRUE);
  1229. if (!select_linked_set)
  1230. {
  1231. rect_select_root_node->mIndividualSelection = TRUE;
  1232. }
  1233. else
  1234. {
  1235. LLViewerObject::const_child_list_t& child_list = objectp->getChildren();
  1236. for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
  1237.  iter != child_list.end(); iter++)
  1238. {
  1239. LLViewerObject* child_objectp = *iter;
  1240. if (!canSelectObject(child_objectp))
  1241. {
  1242. continue;
  1243. }
  1244. LLSelectNode* rect_select_node = new LLSelectNode(child_objectp, TRUE);
  1245. rect_select_node->selectAllTEs(TRUE);
  1246. mHighlightedObjects->addNodeAtEnd(rect_select_node);
  1247. }
  1248. }
  1249. // Add the root last, to preserve order for link operations.
  1250. mHighlightedObjects->addNodeAtEnd(rect_select_root_node);
  1251. }
  1252. num_sils_genned = 0;
  1253. // render silhouettes for highlighted objects
  1254. //BOOL subtracting_from_selection = (gKeyboard->currentMask(TRUE) == MASK_CONTROL);
  1255. for (S32 pass = 0; pass < 2; pass++)
  1256. {
  1257. for (LLObjectSelection::iterator iter = mHighlightedObjects->begin();
  1258.  iter != mHighlightedObjects->end(); iter++)
  1259. {
  1260. LLSelectNode* node = *iter;
  1261. LLViewerObject* objectp = node->getObject();
  1262. if (!objectp)
  1263. continue;
  1264. // do roots first, then children so that root flags are cleared ASAP
  1265. BOOL roots_only = (pass == 0);
  1266. BOOL is_root = objectp->isRootEdit();
  1267. if (roots_only != is_root)
  1268. {
  1269. continue;
  1270. }
  1271. if (!node->mSilhouetteExists 
  1272. || objectp->isChanged(LLXform::SILHOUETTE)
  1273. || (objectp->getParent() && objectp->getParent()->isChanged(LLXform::SILHOUETTE)))
  1274. {
  1275. if (num_sils_genned++ < MAX_SILS_PER_FRAME)
  1276. {
  1277. generateSilhouette(node, LLViewerCamera::getInstance()->getOrigin());
  1278. changed_objects.push_back(objectp);
  1279. }
  1280. else if (objectp->isAttachment() && objectp->getRootEdit()->mDrawable.notNull())
  1281. {
  1282. //RN: hack for orthogonal projection of HUD attachments
  1283. LLViewerJointAttachment* attachment_pt = (LLViewerJointAttachment*)objectp->getRootEdit()->mDrawable->getParent();
  1284. if (attachment_pt && attachment_pt->getIsHUDAttachment())
  1285. {
  1286. LLVector3 camera_pos = LLVector3(-10000.f, 0.f, 0.f);
  1287. generateSilhouette(node, camera_pos);
  1288. }
  1289. }
  1290. }
  1291. //LLColor4 highlight_color;
  1292. //
  1293. //if (subtracting_from_selection)
  1294. //{
  1295. // node->renderOneSilhouette(LLColor4::red);
  1296. //}
  1297. //else if (!objectp->isSelected())
  1298. //{
  1299. // highlight_color = objectp->isRoot() ? sHighlightParentColor : sHighlightChildColor;
  1300. // node->renderOneSilhouette(highlight_color);
  1301. //}
  1302. }
  1303. }
  1304. //mSilhouetteImagep->unbindTexture(0, GL_TEXTURE_2D);
  1305. }
  1306. else
  1307. {
  1308. mHighlightedObjects->deleteAllNodes();
  1309. }
  1310. for (std::vector<LLViewerObject*>::iterator iter = changed_objects.begin();
  1311.  iter != changed_objects.end(); ++iter)
  1312. {
  1313. // clear flags after traversing node list (as child objects need to refer to parent flags, etc)
  1314. LLViewerObject* objectp = *iter;
  1315. objectp->clearChanged(LLXform::MOVED | LLXform::SILHOUETTE);
  1316. }
  1317. //gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
  1318. }
  1319. void LLSelectMgr::updateSelectionSilhouette(LLObjectSelectionHandle object_handle, S32& num_sils_genned, std::vector<LLViewerObject*>& changed_objects)
  1320. {
  1321. if (object_handle->getNumNodes())
  1322. {
  1323. //gGLSPipelineSelection.set();
  1324. //mSilhouetteImagep->bindTexture();
  1325. //glAlphaFunc(GL_GREATER, sHighlightAlphaTest);
  1326. for (S32 pass = 0; pass < 2; pass++)
  1327. {
  1328. for (LLObjectSelection::iterator iter = object_handle->begin();
  1329. iter != object_handle->end(); iter++)
  1330. {
  1331. LLSelectNode* node = *iter;
  1332. LLViewerObject* objectp = node->getObject();
  1333. if (!objectp)
  1334. continue;
  1335. // do roots first, then children so that root flags are cleared ASAP
  1336. BOOL roots_only = (pass == 0);
  1337. BOOL is_root = (objectp->isRootEdit());
  1338. if (roots_only != is_root || objectp->mDrawable.isNull())
  1339. {
  1340. continue;
  1341. }
  1342. if (!node->mSilhouetteExists 
  1343. || objectp->isChanged(LLXform::SILHOUETTE)
  1344. || (objectp->getParent() && objectp->getParent()->isChanged(LLXform::SILHOUETTE)))
  1345. {
  1346. if (num_sils_genned++ < MAX_SILS_PER_FRAME)// && objectp->mDrawable->isVisible())
  1347. {
  1348. generateSilhouette(node, LLViewerCamera::getInstance()->getOrigin());
  1349. changed_objects.push_back(objectp);
  1350. }
  1351. else if (objectp->isAttachment())
  1352. {
  1353. //RN: hack for orthogonal projection of HUD attachments
  1354. LLViewerJointAttachment* attachment_pt = (LLViewerJointAttachment*)objectp->getRootEdit()->mDrawable->getParent();
  1355. if (attachment_pt && attachment_pt->getIsHUDAttachment())
  1356. {
  1357. LLVector3 camera_pos = LLVector3(-10000.f, 0.f, 0.f);
  1358. generateSilhouette(node, camera_pos);
  1359. }
  1360. }
  1361. }
  1362. }
  1363. }
  1364. }
  1365. }
  1366. void LLSelectMgr::renderSilhouettes(BOOL for_hud)
  1367. {
  1368. if (!mRenderSilhouettes)
  1369. {
  1370. return;
  1371. }
  1372. gGL.getTexUnit(0)->bind(mSilhouetteImagep);
  1373. LLGLSPipelineSelection gls_select;
  1374. gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.f);
  1375. LLGLEnable blend(GL_BLEND);
  1376. LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
  1377. LLVOAvatar* avatar = gAgent.getAvatarObject();
  1378. if (for_hud && avatar)
  1379. {
  1380. LLBBox hud_bbox = avatar->getHUDBBox();
  1381. F32 cur_zoom = gAgent.mHUDCurZoom;
  1382. // set up transform to encompass bounding box of HUD
  1383. glMatrixMode(GL_PROJECTION);
  1384. glPushMatrix();
  1385. glLoadIdentity();
  1386. F32 depth = llmax(1.f, hud_bbox.getExtentLocal().mV[VX] * 1.1f);
  1387. glOrtho(-0.5f * LLViewerCamera::getInstance()->getAspect(), 0.5f * LLViewerCamera::getInstance()->getAspect(), -0.5f, 0.5f, 0.f, depth);
  1388. glMatrixMode(GL_MODELVIEW);
  1389. glPushMatrix();
  1390. glLoadIdentity();
  1391. glLoadMatrixf(OGL_TO_CFR_ROTATION); // Load Cory's favorite reference frame
  1392. glTranslatef(-hud_bbox.getCenterLocal().mV[VX] + (depth *0.5f), 0.f, 0.f);
  1393. glScalef(cur_zoom, cur_zoom, cur_zoom);
  1394. }
  1395. if (mSelectedObjects->getNumNodes())
  1396. {
  1397. LLUUID inspect_item_id= LLUUID::null;
  1398. #if 0
  1399. LLFloaterInspect* inspect_instance = LLFloaterReg::getTypedInstance<LLFloaterInspect>("inspect");
  1400. if(inspect_instance)
  1401. {
  1402. inspect_item_id = inspect_instance->getSelectedUUID();
  1403. }
  1404. #endif
  1405. LLSidepanelTaskInfo *panel_task_info = LLSidepanelTaskInfo::getActivePanel();
  1406. if (panel_task_info)
  1407. {
  1408. inspect_item_id = panel_task_info->getSelectedUUID();
  1409. }
  1410. LLUUID focus_item_id = LLViewerMediaFocus::getInstance()->getFocusedObjectID();
  1411. for (S32 pass = 0; pass < 2; pass++)
  1412. {
  1413. for (LLObjectSelection::iterator iter = mSelectedObjects->begin();
  1414.  iter != mSelectedObjects->end(); iter++)
  1415. {
  1416. LLSelectNode* node = *iter;
  1417. LLViewerObject* objectp = node->getObject();
  1418. if (!objectp)
  1419. continue;
  1420. if (objectp->isHUDAttachment() != for_hud)
  1421. {
  1422. continue;
  1423. }
  1424. if (objectp->getID() == focus_item_id)
  1425. {
  1426. node->renderOneSilhouette(gFocusMgr.getFocusColor());
  1427. }
  1428. else if(objectp->getID() == inspect_item_id)
  1429. {
  1430. node->renderOneSilhouette(sHighlightInspectColor);
  1431. }
  1432. else if (node->isTransient())
  1433. {
  1434. BOOL oldHidden = LLSelectMgr::sRenderHiddenSelections;
  1435. LLSelectMgr::sRenderHiddenSelections = FALSE;
  1436. node->renderOneSilhouette(sContextSilhouetteColor);
  1437. LLSelectMgr::sRenderHiddenSelections = oldHidden;
  1438. }
  1439. else if (objectp->isRootEdit())
  1440. {
  1441. node->renderOneSilhouette(sSilhouetteParentColor);
  1442. }
  1443. else
  1444. {
  1445. node->renderOneSilhouette(sSilhouetteChildColor);
  1446. }
  1447. }
  1448. }
  1449. }
  1450. if (mHighlightedObjects->getNumNodes())
  1451. {
  1452. // render silhouettes for highlighted objects
  1453. BOOL subtracting_from_selection = (gKeyboard->currentMask(TRUE) == MASK_CONTROL);
  1454. for (S32 pass = 0; pass < 2; pass++)
  1455. {
  1456. for (LLObjectSelection::iterator iter = mHighlightedObjects->begin();
  1457.  iter != mHighlightedObjects->end(); iter++)
  1458. {
  1459. LLSelectNode* node = *iter;
  1460. LLViewerObject* objectp = node->getObject();
  1461. if (!objectp)
  1462. continue;
  1463. if (objectp->isHUDAttachment() != for_hud)
  1464. {
  1465. continue;
  1466. }
  1467. if (subtracting_from_selection)
  1468. {
  1469. node->renderOneSilhouette(LLColor4::red);
  1470. }
  1471. else if (!objectp->isSelected())
  1472. {
  1473. LLColor4 highlight_color = objectp->isRoot() ? sHighlightParentColor : sHighlightChildColor;
  1474. node->renderOneSilhouette(highlight_color);
  1475. }
  1476. }
  1477. }
  1478. }
  1479. if (for_hud && avatar)
  1480. {
  1481. glMatrixMode(GL_PROJECTION);
  1482. glPopMatrix();
  1483. glMatrixMode(GL_MODELVIEW);
  1484. glPopMatrix();
  1485. stop_glerror();
  1486. }
  1487. gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
  1488. gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
  1489. }
  1490. void LLSelectMgr::generateSilhouette(LLSelectNode* nodep, const LLVector3& view_point)
  1491. {
  1492. LLViewerObject* objectp = nodep->getObject();
  1493. if (objectp && objectp->getPCode() == LL_PCODE_VOLUME)
  1494. {
  1495. ((LLVOVolume*)objectp)->generateSilhouette(nodep, view_point);
  1496. }
  1497. }
  1498. //
  1499. // Utility classes
  1500. //
  1501. LLSelectNode::LLSelectNode(LLViewerObject* object, BOOL glow)
  1502. : mObject(object),
  1503. mIndividualSelection(FALSE),
  1504. mTransient(FALSE),
  1505. mValid(FALSE),
  1506. mPermissions(new LLPermissions()),
  1507. mInventorySerial(0),
  1508. mSilhouetteExists(FALSE),
  1509. mDuplicated(FALSE),
  1510. mTESelectMask(0),
  1511. mLastTESelected(0)
  1512. {
  1513. mObject = object;
  1514. selectAllTEs(FALSE);
  1515. mIndividualSelection = FALSE;
  1516. mTransient = FALSE;
  1517. mValid = FALSE;
  1518. mPermissions = new LLPermissions();
  1519. mInventorySerial = 0;
  1520. mName = LLStringUtil::null;
  1521. mDescription = LLStringUtil::null;
  1522. mTouchName = LLStringUtil::null;
  1523. mSitName = LLStringUtil::null;
  1524. mSilhouetteExists = FALSE;
  1525. mDuplicated = FALSE;
  1526. mCreationDate = 0;
  1527. saveColors();
  1528. }
  1529. LLSelectNode::LLSelectNode(const LLSelectNode& nodep)
  1530. {
  1531. mTESelectMask = nodep.mTESelectMask;
  1532. mLastTESelected = nodep.mLastTESelected;
  1533. mIndividualSelection = nodep.mIndividualSelection;
  1534. mValid = nodep.mValid;
  1535. mTransient = nodep.mTransient;
  1536. mPermissions = new LLPermissions(*nodep.mPermissions);
  1537. mSaleInfo = nodep.mSaleInfo;;
  1538. mAggregatePerm = nodep.mAggregatePerm;
  1539. mAggregateTexturePerm = nodep.mAggregateTexturePerm;
  1540. mAggregateTexturePermOwner = nodep.mAggregateTexturePermOwner;
  1541. mName = nodep.mName;
  1542. mDescription = nodep.mDescription;
  1543. mCategory = nodep.mCategory;
  1544. mInventorySerial = 0;
  1545. mSavedPositionLocal = nodep.mSavedPositionLocal;
  1546. mSavedPositionGlobal = nodep.mSavedPositionGlobal;
  1547. mSavedScale = nodep.mSavedScale;
  1548. mSavedRotation = nodep.mSavedRotation;
  1549. mDuplicated = nodep.mDuplicated;
  1550. mDuplicatePos = nodep.mDuplicatePos;
  1551. mDuplicateRot = nodep.mDuplicateRot;
  1552. mItemID = nodep.mItemID;
  1553. mFolderID = nodep.mFolderID;
  1554. mFromTaskID = nodep.mFromTaskID;
  1555. mTouchName = nodep.mTouchName;
  1556. mSitName = nodep.mSitName;
  1557. mCreationDate = nodep.mCreationDate;
  1558. mSilhouetteVertices = nodep.mSilhouetteVertices;
  1559. mSilhouetteNormals = nodep.mSilhouetteNormals;
  1560. mSilhouetteSegments = nodep.mSilhouetteSegments;
  1561. mSilhouetteExists = nodep.mSilhouetteExists;
  1562. mObject = nodep.mObject;
  1563. std::vector<LLColor4>::const_iterator color_iter;
  1564. mSavedColors.clear();
  1565. for (color_iter = nodep.mSavedColors.begin(); color_iter != nodep.mSavedColors.end(); ++color_iter)
  1566. {
  1567. mSavedColors.push_back(*color_iter);
  1568. }
  1569. saveTextures(nodep.mSavedTextures);
  1570. }
  1571. LLSelectNode::~LLSelectNode()
  1572. {
  1573. delete mPermissions;
  1574. mPermissions = NULL;
  1575. }
  1576. void LLSelectNode::selectAllTEs(BOOL b)
  1577. {
  1578. mTESelectMask = b ? TE_SELECT_MASK_ALL : 0x0;
  1579. mLastTESelected = 0;
  1580. }
  1581. void LLSelectNode::selectTE(S32 te_index, BOOL selected)
  1582. {
  1583. if (te_index < 0 || te_index >= SELECT_MAX_TES)
  1584. {
  1585. return;
  1586. }
  1587. S32 mask = 0x1 << te_index;
  1588. if(selected)
  1589. {
  1590. mTESelectMask |= mask;
  1591. }
  1592. else
  1593. {
  1594. mTESelectMask &= ~mask;
  1595. }
  1596. mLastTESelected = te_index;
  1597. }
  1598. BOOL LLSelectNode::isTESelected(S32 te_index)
  1599. {
  1600. if (te_index < 0 || te_index >= mObject->getNumTEs())
  1601. {
  1602. return FALSE;
  1603. }
  1604. return (mTESelectMask & (0x1 << te_index)) != 0;
  1605. }
  1606. S32 LLSelectNode::getLastSelectedTE()
  1607. {
  1608. if (!isTESelected(mLastTESelected))
  1609. {
  1610. return -1;
  1611. }
  1612. return mLastTESelected;
  1613. }
  1614. LLViewerObject* LLSelectNode::getObject()
  1615. {
  1616. if (!mObject)
  1617. {
  1618. return NULL;
  1619. }
  1620. else if (mObject->isDead())
  1621. {
  1622. mObject = NULL;
  1623. }
  1624. return mObject;
  1625. }
  1626. void LLSelectNode::setObject(LLViewerObject* object)
  1627. {
  1628. mObject = object;
  1629. }
  1630. void LLSelectNode::saveColors()
  1631. {
  1632. if (mObject.notNull())
  1633. {
  1634. mSavedColors.clear();
  1635. for (S32 i = 0; i < mObject->getNumTEs(); i++)
  1636. {
  1637. const LLTextureEntry* tep = mObject->getTE(i);
  1638. mSavedColors.push_back(tep->getColor());
  1639. }
  1640. }
  1641. }
  1642. void LLSelectNode::saveTextures(const std::vector<LLUUID>& textures)
  1643. {
  1644. if (mObject.notNull())
  1645. {
  1646. mSavedTextures.clear();
  1647. for (std::vector<LLUUID>::const_iterator texture_it = textures.begin();
  1648.  texture_it != textures.end(); ++texture_it)
  1649. {
  1650. mSavedTextures.push_back(*texture_it);
  1651. }
  1652. }
  1653. }
  1654. void LLSelectNode::saveTextureScaleRatios()
  1655. {
  1656. mTextureScaleRatios.clear();
  1657. if (mObject.notNull())
  1658. {
  1659. for (U8 i = 0; i < mObject->getNumTEs(); i++)
  1660. {
  1661. F32 s,t;
  1662. const LLTextureEntry* tep = mObject->getTE(i);
  1663. tep->getScale(&s,&t);
  1664. U32 s_axis = 0;
  1665. U32 t_axis = 0;
  1666. LLPrimitive::getTESTAxes(i, &s_axis, &t_axis);
  1667. LLVector3 v;
  1668. LLVector3 scale = mObject->getScale();
  1669. if (tep->getTexGen() == LLTextureEntry::TEX_GEN_PLANAR)
  1670. {
  1671. v.mV[s_axis] = s*scale.mV[s_axis];
  1672. v.mV[t_axis] = t*scale.mV[t_axis];
  1673. }
  1674. else
  1675. {
  1676. v.mV[s_axis] = s/scale.mV[s_axis];
  1677. v.mV[t_axis] = t/scale.mV[t_axis];
  1678. }
  1679. mTextureScaleRatios.push_back(v);
  1680. }
  1681. }
  1682. }
  1683. // This implementation should be similar to LLTask::allowOperationOnTask
  1684. BOOL LLSelectNode::allowOperationOnNode(PermissionBit op, U64 group_proxy_power) const
  1685. {
  1686. // Extract ownership.
  1687. BOOL object_is_group_owned = FALSE;
  1688. LLUUID object_owner_id;
  1689. mPermissions->getOwnership(object_owner_id, object_is_group_owned);
  1690. // Operations on invalid or public objects is not allowed.
  1691. if (!mObject || (mObject->isDead()) || !mPermissions->isOwned())
  1692. {
  1693. return FALSE;
  1694. }
  1695. // The transfer permissions can never be given through proxy.
  1696. if (PERM_TRANSFER == op)
  1697. {
  1698. // The owner of an agent-owned object can transfer to themselves.
  1699. if ( !object_is_group_owned 
  1700. && (gAgent.getID() == object_owner_id) )
  1701. {
  1702. return TRUE;
  1703. }
  1704. else
  1705. {
  1706. // Otherwise check aggregate permissions.
  1707. return mObject->permTransfer();
  1708. }
  1709. }
  1710. if (PERM_MOVE == op
  1711. || PERM_MODIFY == op)
  1712. {
  1713. // only owners can move or modify their attachments
  1714. // no proxy allowed.
  1715. if (mObject->isAttachment() && object_owner_id != gAgent.getID())
  1716. {
  1717. return FALSE;
  1718. }
  1719. }
  1720. // Calculate proxy_agent_id and group_id to use for permissions checks.
  1721. // proxy_agent_id may be set to the object owner through group powers.
  1722. // group_id can only be set to the object's group, if the agent is in that group.
  1723. LLUUID group_id = LLUUID::null;
  1724. LLUUID proxy_agent_id = gAgent.getID();
  1725. // Gods can always operate.
  1726. if (gAgent.isGodlike())
  1727. {
  1728. return TRUE;
  1729. }
  1730. // Check if the agent is in the same group as the object.
  1731. LLUUID object_group_id = mPermissions->getGroup();
  1732. if (object_group_id.notNull() &&
  1733. gAgent.isInGroup(object_group_id))
  1734. {
  1735. // Assume the object's group during this operation.
  1736. group_id = object_group_id;
  1737. }
  1738. // Only allow proxy powers for PERM_COPY if the actual agent can
  1739. // receive the item (ie has PERM_TRANSFER permissions).
  1740. // NOTE: op == PERM_TRANSFER has already been handled, but if
  1741. // that ever changes we need to BLOCK proxy powers for PERM_TRANSFER.  DK 03/28/06
  1742. if (PERM_COPY != op || mPermissions->allowTransferTo(gAgent.getID()))
  1743. {
  1744. // Check if the agent can assume ownership through group proxy or agent-granted proxy.
  1745. if (   ( object_is_group_owned 
  1746. && gAgent.hasPowerInGroup(object_owner_id, group_proxy_power))
  1747. // Only allow proxy for move, modify, and copy.
  1748. || ( (PERM_MOVE == op || PERM_MODIFY == op || PERM_COPY == op)
  1749. && (!object_is_group_owned
  1750. && gAgent.isGrantedProxy(*mPermissions))))
  1751. {
  1752. // This agent is able to assume the ownership role for this operation.
  1753. proxy_agent_id = object_owner_id;
  1754. }
  1755. }
  1756. // We now have max ownership information.
  1757. if (PERM_OWNER == op)
  1758. {
  1759. // This this was just a check for ownership, we can now return the answer.
  1760. return (proxy_agent_id == object_owner_id ? TRUE : FALSE);
  1761. }
  1762. // check permissions to see if the agent can operate
  1763. return (mPermissions->allowOperationBy(op, proxy_agent_id, group_id));
  1764. }
  1765. //-----------------------------------------------------------------------------
  1766. // renderOneSilhouette()
  1767. //-----------------------------------------------------------------------------
  1768. void LLSelectNode::renderOneSilhouette(const LLColor4 &color)
  1769. {
  1770. LLViewerObject* objectp = getObject();
  1771. if (!objectp)
  1772. {
  1773. return;
  1774. }
  1775. LLDrawable* drawable = objectp->mDrawable;
  1776. if(!drawable)
  1777. {
  1778. return;
  1779. }
  1780. if (!mSilhouetteExists)
  1781. {
  1782. return;
  1783. }
  1784. BOOL is_hud_object = objectp->isHUDAttachment();
  1785. if (mSilhouetteVertices.size() == 0 || mSilhouetteNormals.size() != mSilhouetteVertices.size())
  1786. {
  1787. return;
  1788. }
  1789. glMatrixMode(GL_MODELVIEW);
  1790. glPushMatrix();
  1791. if (!is_hud_object)
  1792. {
  1793. glLoadIdentity();
  1794. glMultMatrixd(gGLModelView);
  1795. }
  1796. if (drawable->isActive())
  1797. {
  1798. glMultMatrixf((F32*) objectp->getRenderMatrix().mMatrix);
  1799. }
  1800. LLVolume *volume = objectp->getVolume();
  1801. if (volume)
  1802. {
  1803. F32 silhouette_thickness;
  1804. if (is_hud_object && gAgent.getAvatarObject())
  1805. {
  1806. silhouette_thickness = LLSelectMgr::sHighlightThickness / gAgent.mHUDCurZoom;
  1807. }
  1808. else
  1809. {
  1810. LLVector3 view_vector = LLViewerCamera::getInstance()->getOrigin() - objectp->getRenderPosition();
  1811. silhouette_thickness = view_vector.magVec() * LLSelectMgr::sHighlightThickness * (LLViewerCamera::getInstance()->getView() / LLViewerCamera::getInstance()->getDefaultFOV());
  1812. }
  1813. F32 animationTime = (F32)LLFrameTimer::getElapsedSeconds();
  1814. F32 u_coord = fmod(animationTime * LLSelectMgr::sHighlightUAnim, 1.f);
  1815. F32 v_coord = 1.f - fmod(animationTime * LLSelectMgr::sHighlightVAnim, 1.f);
  1816. F32 u_divisor = 1.f / ((F32)(mSilhouetteVertices.size() - 1));
  1817. if (LLSelectMgr::sRenderHiddenSelections) // && gFloaterTools && gFloaterTools->getVisible())
  1818. {
  1819. gGL.flush();
  1820. gGL.blendFunc(LLRender::BF_SOURCE_COLOR, LLRender::BF_ONE);
  1821. LLGLEnable fog(GL_FOG);
  1822. glFogi(GL_FOG_MODE, GL_LINEAR);
  1823. float d = (LLViewerCamera::getInstance()->getPointOfInterest()-LLViewerCamera::getInstance()->getOrigin()).magVec();
  1824. LLColor4 fogCol = color * (F32)llclamp((LLSelectMgr::getInstance()->getSelectionCenterGlobal()-gAgent.getCameraPositionGlobal()).magVec()/(LLSelectMgr::getInstance()->getBBoxOfSelection().getExtentLocal().magVec()*4), 0.0, 1.0);
  1825. glFogf(GL_FOG_START, d);
  1826. glFogf(GL_FOG_END, d*(1 + (LLViewerCamera::getInstance()->getView() / LLViewerCamera::getInstance()->getDefaultFOV())));
  1827. glFogfv(GL_FOG_COLOR, fogCol.mV);
  1828. LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE, GL_GEQUAL);
  1829. gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
  1830. gGL.begin(LLRender::LINES);
  1831. {
  1832. S32 i = 0;
  1833. for (S32 seg_num = 0; seg_num < (S32)mSilhouetteSegments.size(); seg_num++)
  1834. {
  1835. for(; i < mSilhouetteSegments[seg_num]; i++)
  1836. {
  1837. u_coord += u_divisor * LLSelectMgr::sHighlightUScale;
  1838. gGL.color4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.4f);
  1839. gGL.texCoord2f( u_coord, v_coord );
  1840. gGL.vertex3fv( mSilhouetteVertices[i].mV );
  1841. }
  1842. }
  1843. }
  1844.             gGL.end();
  1845. u_coord = fmod(animationTime * LLSelectMgr::sHighlightUAnim, 1.f);
  1846. }
  1847. gGL.flush();
  1848. gGL.setSceneBlendType(LLRender::BT_ALPHA);
  1849. gGL.begin(LLRender::TRIANGLES);
  1850. {
  1851. S32 i = 0;
  1852. for (S32 seg_num = 0; seg_num < (S32)mSilhouetteSegments.size(); seg_num++)
  1853. {
  1854. S32 first_i = i;
  1855. LLVector3 v;
  1856. LLVector2 t;
  1857. for(; i < mSilhouetteSegments[seg_num]; i++)
  1858. {
  1859. if (i == first_i) {
  1860.     LLVector3 vert = (mSilhouetteNormals[i]) * silhouette_thickness;
  1861. vert += mSilhouetteVertices[i];
  1862. gGL.color4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.0f); //LLSelectMgr::sHighlightAlpha);
  1863. gGL.texCoord2f( u_coord, v_coord + LLSelectMgr::sHighlightVScale );
  1864. gGL.vertex3fv( vert.mV ); 
  1865. u_coord += u_divisor * LLSelectMgr::sHighlightUScale;
  1866. gGL.color4f(color.mV[VRED]*2, color.mV[VGREEN]*2, color.mV[VBLUE]*2, LLSelectMgr::sHighlightAlpha*2);
  1867. gGL.texCoord2f( u_coord, v_coord );
  1868. gGL.vertex3fv( mSilhouetteVertices[i].mV );
  1869. v = mSilhouetteVertices[i];
  1870. t = LLVector2(u_coord, v_coord);
  1871. }
  1872. else {
  1873.                         LLVector3 vert = (mSilhouetteNormals[i]) * silhouette_thickness;
  1874. vert += mSilhouetteVertices[i];
  1875. gGL.color4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.0f); //LLSelectMgr::sHighlightAlpha);
  1876. gGL.texCoord2f( u_coord, v_coord + LLSelectMgr::sHighlightVScale );
  1877. gGL.vertex3fv( vert.mV ); 
  1878. gGL.vertex3fv( vert.mV ); 
  1879. gGL.texCoord2fv(t.mV);
  1880. u_coord += u_divisor * LLSelectMgr::sHighlightUScale;
  1881. gGL.color4f(color.mV[VRED]*2, color.mV[VGREEN]*2, color.mV[VBLUE]*2, LLSelectMgr::sHighlightAlpha*2);
  1882. gGL.vertex3fv(v.mV);
  1883. gGL.texCoord2f( u_coord, v_coord );
  1884. gGL.vertex3fv( mSilhouetteVertices[i].mV );
  1885. }
  1886. }
  1887. }
  1888. }
  1889. gGL.end();
  1890. gGL.flush();
  1891. }
  1892. glPopMatrix();
  1893. }
  1894. //
  1895. // Utility Functions
  1896. //
  1897. // *DEPRECATED: See header comment.
  1898. void dialog_refresh_all()
  1899. {
  1900. // This is the easiest place to fire the update signal, as it will
  1901. // make cleaning up the functions below easier.  Also, sometimes entities
  1902. // outside the selection manager change properties of selected objects
  1903. // and call into this function.  Yuck.
  1904. LLSelectMgr::getInstance()->mUpdateSignal();
  1905. // *TODO: Eliminate all calls into outside classes below, make those
  1906. // objects register with the update signal.
  1907. gFloaterTools->dirty();
  1908. gMenuObject->needsArrange();
  1909. if( gMenuAttachmentSelf->getVisible() )
  1910. {
  1911. gMenuAttachmentSelf->arrange();
  1912. }
  1913. if( gMenuAttachmentOther->getVisible() )
  1914. {
  1915. gMenuAttachmentOther->arrange();
  1916. }
  1917. LLFloaterProperties::dirtyAll();
  1918. #if 0
  1919. LLFloaterInspect* inspect_instance = LLFloaterReg::getTypedInstance<LLFloaterInspect>("inspect");
  1920. if(inspect_instance)
  1921. {
  1922. inspect_instance->dirty();
  1923. }
  1924. #endif
  1925. LLSidepanelTaskInfo *panel_task_info = LLSidepanelTaskInfo::getActivePanel();
  1926. if (panel_task_info)
  1927. {
  1928. panel_task_info->dirty();
  1929. }
  1930. }
  1931. S32 get_family_count(LLViewerObject *parent)
  1932. {
  1933. if (!parent)
  1934. {
  1935. llwarns << "Trying to get_family_count on null parent!" << llendl;
  1936. }
  1937. S32 count = 1; // for this object
  1938. LLViewerObject::const_child_list_t& child_list = parent->getChildren();
  1939. for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
  1940.  iter != child_list.end(); iter++)
  1941. {
  1942. LLViewerObject* child = *iter;
  1943. if (!child)
  1944. {
  1945. llwarns << "Family object has NULL child!  Show Doug." << llendl;
  1946. }
  1947. else if (child->isDead())
  1948. {
  1949. llwarns << "Family object has dead child object.  Show Doug." << llendl;
  1950. }
  1951. else
  1952. {
  1953. if (LLSelectMgr::getInstance()->canSelectObject(child))
  1954. {
  1955. count += get_family_count( child );
  1956. }
  1957. }
  1958. }
  1959. return count;
  1960. }
  1961. //-----------------------------------------------------------------------------
  1962. // updateSelectionCenter
  1963. //-----------------------------------------------------------------------------
  1964. void LLSelectMgr::updateSelectionCenter()
  1965. {
  1966. const F32 MOVE_SELECTION_THRESHOLD = 1.f; //  Movement threshold in meters for updating selection
  1967. //  center (tractor beam)
  1968. //override any object updates received
  1969. //for selected objects
  1970. overrideObjectUpdates();
  1971. LLViewerObject* object = mSelectedObjects->getFirstObject();
  1972. if (!object)
  1973. {
  1974. // nothing selected, probably grabbing
  1975. // Ignore by setting to avatar origin.
  1976. mSelectionCenterGlobal.clearVec();
  1977. mShowSelection = FALSE;
  1978. mSelectionBBox = LLBBox(); 
  1979. mPauseRequest = NULL;
  1980. resetAgentHUDZoom();
  1981. }
  1982. else
  1983. {
  1984. mSelectedObjects->mSelectType = getSelectTypeForObject(object);
  1985. if (mSelectedObjects->mSelectType == SELECT_TYPE_ATTACHMENT && gAgent.getAvatarObject())
  1986. {
  1987. mPauseRequest = gAgent.getAvatarObject()->requestPause();
  1988. }
  1989. else
  1990. {
  1991. mPauseRequest = NULL;
  1992. }
  1993. if (mSelectedObjects->mSelectType != SELECT_TYPE_HUD && gAgent.getAvatarObject())
  1994. {
  1995. // reset hud ZOOM
  1996. gAgent.mHUDTargetZoom = 1.f;
  1997. gAgent.mHUDCurZoom = 1.f;
  1998. }
  1999. mShowSelection = FALSE;
  2000. LLBBox bbox;
  2001. // have stuff selected
  2002. LLVector3d select_center;
  2003. // keep a list of jointed objects for showing the joint HUDEffects
  2004. std::vector < LLViewerObject *> jointed_objects;
  2005. for (LLObjectSelection::iterator iter = mSelectedObjects->begin();
  2006.  iter != mSelectedObjects->end(); iter++)
  2007. {
  2008. LLSelectNode* node = *iter;
  2009. LLViewerObject* object = node->getObject();
  2010. if (!object)
  2011. continue;
  2012. LLViewerObject *myAvatar = gAgent.getAvatarObject();
  2013. LLViewerObject *root = object->getRootEdit();
  2014. if (mSelectedObjects->mSelectType == SELECT_TYPE_WORLD && // not an attachment
  2015. !root->isChild(myAvatar) && // not the object you're sitting on
  2016. !object->isAvatar()) // not another avatar
  2017. {
  2018. mShowSelection = TRUE;
  2019. }
  2020. bbox.addBBoxAgent( object->getBoundingBoxAgent() );
  2021. if (object->isJointChild())
  2022. {
  2023. jointed_objects.push_back(object);
  2024. }
  2025. }
  2026. LLVector3 bbox_center_agent = bbox.getCenterAgent();
  2027. mSelectionCenterGlobal = gAgent.getPosGlobalFromAgent(bbox_center_agent);
  2028. mSelectionBBox = bbox;
  2029. }
  2030. if ( !(gAgentID == LLUUID::null)) 
  2031. {
  2032. LLTool *tool = LLToolMgr::getInstance()->getCurrentTool();
  2033. if (mShowSelection)
  2034. {
  2035. LLVector3d select_center_global;
  2036. if( tool->isEditing() )
  2037. {
  2038. select_center_global = tool->getEditingPointGlobal();
  2039. }
  2040. else
  2041. {
  2042. select_center_global = mSelectionCenterGlobal;
  2043. }
  2044. // Send selection center if moved beyond threshold (used to animate tractor beam)
  2045. LLVector3d diff;
  2046. diff = select_center_global - mLastSentSelectionCenterGlobal;
  2047. if ( diff.magVecSquared() > MOVE_SELECTION_THRESHOLD*MOVE_SELECTION_THRESHOLD )
  2048. {
  2049. //  Transmit updated selection center 
  2050. mLastSentSelectionCenterGlobal = select_center_global;
  2051. }
  2052. }
  2053. }
  2054. // give up edit menu if no objects selected
  2055. if (gEditMenuHandler == this && mSelectedObjects->getObjectCount() == 0)
  2056. {
  2057. gEditMenuHandler = NULL;
  2058. }
  2059. }
  2060. void LLSelectMgr::updatePointAt()
  2061. {
  2062. if (mShowSelection)
  2063. {
  2064. if (mSelectedObjects->getObjectCount())
  2065. {
  2066. LLVector3 select_offset;
  2067. const LLPickInfo& pick = gViewerWindow->getLastPick();
  2068. LLViewerObject *click_object = pick.getObject();
  2069. if (click_object && click_object->isSelected())
  2070. {
  2071. // clicked on another object in our selection group, use that as target
  2072. select_offset.setVec(pick.mObjectOffset);
  2073. select_offset.rotVec(~click_object->getRenderRotation());
  2074. gAgent.setPointAt(POINTAT_TARGET_SELECT, click_object, select_offset);
  2075. gAgent.setLookAt(LOOKAT_TARGET_SELECT, click_object, select_offset);
  2076. }
  2077. else
  2078. {
  2079. // didn't click on an object this time, revert to pointing at center of first object
  2080. gAgent.setPointAt(POINTAT_TARGET_SELECT, mSelectedObjects->getFirstObject());
  2081. gAgent.setLookAt(LOOKAT_TARGET_SELECT, mSelectedObjects->getFirstObject());
  2082. }
  2083. }
  2084. else
  2085. {
  2086. gAgent.setPointAt(POINTAT_TARGET_CLEAR);
  2087. gAgent.setLookAt(LOOKAT_TARGET_CLEAR);
  2088. }
  2089. }
  2090. else
  2091. {
  2092. gAgent.setPointAt(POINTAT_TARGET_CLEAR);
  2093. gAgent.setLookAt(LOOKAT_TARGET_CLEAR);
  2094. }
  2095. }
  2096. //-----------------------------------------------------------------------------
  2097. // getBBoxOfSelection()
  2098. //-----------------------------------------------------------------------------
  2099. LLBBox LLSelectMgr::getBBoxOfSelection() const
  2100. {
  2101. return mSelectionBBox;
  2102. }
  2103. //-----------------------------------------------------------------------------
  2104. // canUndo()
  2105. //-----------------------------------------------------------------------------
  2106. BOOL LLSelectMgr::canUndo() const
  2107. {
  2108. return const_cast<LLSelectMgr*>(this)->mSelectedObjects->getFirstEditableObject() != NULL; // HACK: casting away constness - MG
  2109. }
  2110. //-----------------------------------------------------------------------------
  2111. // undo()
  2112. //-----------------------------------------------------------------------------
  2113. void LLSelectMgr::undo()
  2114. {
  2115. BOOL select_linked_set = !gSavedSettings.getBOOL("EditLinkedParts");
  2116. LLUUID group_id(gAgent.getGroupID());
  2117. sendListToRegions("Undo", packAgentAndSessionAndGroupID, packObjectID, &group_id, select_linked_set ? SEND_ONLY_ROOTS : SEND_CHILDREN_FIRST);
  2118. }
  2119. //-----------------------------------------------------------------------------
  2120. // canRedo()
  2121. //-----------------------------------------------------------------------------
  2122. BOOL LLSelectMgr::canRedo() const
  2123. {
  2124. return const_cast<LLSelectMgr*>(this)->mSelectedObjects->getFirstEditableObject() != NULL; // HACK: casting away constness - MG
  2125. }
  2126. //-----------------------------------------------------------------------------
  2127. // redo()
  2128. //-----------------------------------------------------------------------------
  2129. void LLSelectMgr::redo()
  2130. {
  2131. BOOL select_linked_set = !gSavedSettings.getBOOL("EditLinkedParts");
  2132. LLUUID group_id(gAgent.getGroupID());
  2133. sendListToRegions("Redo", packAgentAndSessionAndGroupID, packObjectID, &group_id, select_linked_set ? SEND_ONLY_ROOTS : SEND_CHILDREN_FIRST);
  2134. }
  2135. //-----------------------------------------------------------------------------
  2136. // canDoDelete()
  2137. //-----------------------------------------------------------------------------
  2138. BOOL LLSelectMgr::canDoDelete() const
  2139. {
  2140. bool can_delete = false;
  2141. // This function is "logically const" - it does not change state in
  2142. // a way visible outside the selection manager.
  2143. LLSelectMgr* self = const_cast<LLSelectMgr*>(this);
  2144. LLViewerObject* obj = self->mSelectedObjects->getFirstDeleteableObject();
  2145. // Note: Can only delete root objects (see getFirstDeleteableObject() for more info)
  2146. if (obj!= NULL)
  2147. {
  2148. // all the faces needs to be selected
  2149. if(self->mSelectedObjects->contains(obj,SELECT_ALL_TES ))
  2150. {
  2151. can_delete = true;
  2152. }
  2153. }
  2154. return can_delete;
  2155. }
  2156. //-----------------------------------------------------------------------------
  2157. // doDelete()
  2158. //-----------------------------------------------------------------------------
  2159. void LLSelectMgr::doDelete()
  2160. {
  2161. selectDelete();
  2162. }
  2163. //-----------------------------------------------------------------------------
  2164. // canDeselect()
  2165. //-----------------------------------------------------------------------------
  2166. BOOL LLSelectMgr::canDeselect() const
  2167. {
  2168. return !mSelectedObjects->isEmpty();
  2169. }
  2170. //-----------------------------------------------------------------------------
  2171. // deselect()
  2172. //-----------------------------------------------------------------------------
  2173. void LLSelectMgr::deselect()
  2174. {
  2175. deselectAll();
  2176. }
  2177. //-----------------------------------------------------------------------------
  2178. // canDuplicate()
  2179. //-----------------------------------------------------------------------------
  2180. BOOL LLSelectMgr::canDuplicate() const
  2181. {
  2182. return const_cast<LLSelectMgr*>(this)->mSelectedObjects->getFirstCopyableObject() != NULL; // HACK: casting away constness - MG
  2183. }
  2184. //-----------------------------------------------------------------------------
  2185. // duplicate()
  2186. //-----------------------------------------------------------------------------
  2187. void LLSelectMgr::duplicate()
  2188. {
  2189. LLVector3 offset(0.5f, 0.5f, 0.f);
  2190. selectDuplicate(offset, TRUE);
  2191. }
  2192. ESelectType LLSelectMgr::getSelectTypeForObject(LLViewerObject* object)
  2193. {
  2194. if (!object)
  2195. {
  2196. return SELECT_TYPE_WORLD;
  2197. }
  2198. if (object->isHUDAttachment())
  2199. {
  2200. return SELECT_TYPE_HUD;
  2201. }
  2202. else if (object->isAttachment())
  2203. {
  2204. return SELECT_TYPE_ATTACHMENT;
  2205. }
  2206. else
  2207. {
  2208. return SELECT_TYPE_WORLD;
  2209. }
  2210. }
  2211. void LLSelectMgr::validateSelection()
  2212. {
  2213. struct f : public LLSelectedObjectFunctor
  2214. {
  2215. virtual bool apply(LLViewerObject* object)
  2216. {
  2217. if (!LLSelectMgr::getInstance()->canSelectObject(object))
  2218. {
  2219. LLSelectMgr::getInstance()->deselectObjectOnly(object);
  2220. }
  2221. return true;
  2222. }
  2223. } func;
  2224. getSelection()->applyToObjects(&func);
  2225. }
  2226. BOOL LLSelectMgr::canSelectObject(LLViewerObject* object)
  2227. {
  2228. // Never select dead objects
  2229. if (!object || object->isDead())
  2230. {
  2231. return FALSE;
  2232. }
  2233. if (mForceSelection)
  2234. {
  2235. return TRUE;
  2236. }
  2237. if ((gSavedSettings.getBOOL("SelectOwnedOnly") && !object->permYouOwner()) ||
  2238. (gSavedSettings.getBOOL("SelectMovableOnly") && !object->permMove()))
  2239. {
  2240. // only select my own objects
  2241. return FALSE;
  2242. }
  2243. // Can't select orphans
  2244. if (object->isOrphaned()) return FALSE;
  2245. // Can't select avatars
  2246. if (object->isAvatar()) return FALSE;
  2247. // Can't select land
  2248. if (object->getPCode() == LLViewerObject::LL_VO_SURFACE_PATCH) return FALSE;
  2249. ESelectType selection_type = getSelectTypeForObject(object);
  2250. if (mSelectedObjects->getObjectCount() > 0 && mSelectedObjects->mSelectType != selection_type) return FALSE;
  2251. return TRUE;
  2252. }
  2253. BOOL LLSelectMgr::setForceSelection(BOOL force) 
  2254. std::swap(mForceSelection,force); 
  2255. return force; 
  2256. }
  2257. void LLSelectMgr::resetAgentHUDZoom()
  2258. {
  2259. gAgent.mHUDTargetZoom = 1.f;
  2260. gAgent.mHUDCurZoom = 1.f;
  2261. }
  2262. void LLSelectMgr::getAgentHUDZoom(F32 &target_zoom, F32 &current_zoom) const
  2263. {
  2264. target_zoom = gAgent.mHUDTargetZoom;
  2265. current_zoom = gAgent.mHUDCurZoom;
  2266. }
  2267. void LLSelectMgr::setAgentHUDZoom(F32 target_zoom, F32 current_zoom)
  2268. {
  2269. gAgent.mHUDTargetZoom = target_zoom;
  2270. gAgent.mHUDCurZoom = current_zoom;
  2271. }
  2272. /////////////////////////////////////////////////////////////////////////////
  2273. // Object selection iterator helpers
  2274. /////////////////////////////////////////////////////////////////////////////
  2275. bool LLObjectSelection::is_root::operator()(LLSelectNode *node)
  2276. {
  2277. LLViewerObject* object = node->getObject();
  2278. return (object != NULL) && !node->mIndividualSelection && (object->isRootEdit() || object->isJointChild());
  2279. }
  2280. bool LLObjectSelection::is_valid_root::operator()(LLSelectNode *node)
  2281. {
  2282. LLViewerObject* object = node->getObject();
  2283. return (object != NULL) && node->mValid && !node->mIndividualSelection && (object->isRootEdit() || object->isJointChild());
  2284. }
  2285. bool LLObjectSelection::is_root_object::operator()(LLSelectNode *node)
  2286. {
  2287. LLViewerObject* object = node->getObject();
  2288. return (object != NULL) && (object->isRootEdit() || object->isJointChild());
  2289. }
  2290. LLObjectSelection::LLObjectSelection() : 
  2291. LLRefCount(),
  2292. mSelectType(SELECT_TYPE_WORLD)
  2293. {
  2294. }
  2295. LLObjectSelection::~LLObjectSelection()
  2296. {
  2297. deleteAllNodes();
  2298. }
  2299. void LLObjectSelection::cleanupNodes()
  2300. {
  2301. for (list_t::iterator iter = mList.begin(); iter != mList.end(); )
  2302. {
  2303. list_t::iterator curiter = iter++;
  2304. LLSelectNode* node = *curiter;
  2305. if (node->getObject() == NULL || node->getObject()->isDead())
  2306. {
  2307. mList.erase(curiter);
  2308. delete node;
  2309. }
  2310. }
  2311. }
  2312. void LLObjectSelection::updateEffects()
  2313. {
  2314. }
  2315. S32 LLObjectSelection::getNumNodes()
  2316. {
  2317. return mList.size();
  2318. }
  2319. void LLObjectSelection::addNode(LLSelectNode *nodep)
  2320. {
  2321. llassert_always(nodep->getObject() && !nodep->getObject()->isDead());
  2322. mList.push_front(nodep);
  2323. mSelectNodeMap[nodep->getObject()] = nodep;
  2324. }
  2325. void LLObjectSelection::addNodeAtEnd(LLSelectNode *nodep)
  2326. {
  2327. llassert_always(nodep->getObject() && !nodep->getObject()->isDead());
  2328. mList.push_back(nodep);
  2329. mSelectNodeMap[nodep->getObject()] = nodep;
  2330. }
  2331. void LLObjectSelection::moveNodeToFront(LLSelectNode *nodep)
  2332. {
  2333. mList.remove(nodep);
  2334. mList.push_front(nodep);
  2335. }
  2336. void LLObjectSelection::removeNode(LLSelectNode *nodep)
  2337. {
  2338. mSelectNodeMap.erase(nodep->getObject());
  2339. if (nodep->getObject() == mPrimaryObject)
  2340. {
  2341. mPrimaryObject = NULL;
  2342. }
  2343. nodep->setObject(NULL); // Will get erased in cleanupNodes()
  2344. mList.remove(nodep);
  2345. }
  2346. void LLObjectSelection::deleteAllNodes()
  2347. {
  2348. std::for_each(mList.begin(), mList.end(), DeletePointer());
  2349. mList.clear();
  2350. mSelectNodeMap.clear();
  2351. mPrimaryObject = NULL;
  2352. }
  2353. LLSelectNode* LLObjectSelection::findNode(LLViewerObject* objectp)
  2354. {
  2355. std::map<LLPointer<LLViewerObject>, LLSelectNode*>::iterator found_it = mSelectNodeMap.find(objectp);
  2356. if (found_it != mSelectNodeMap.end())
  2357. {
  2358. return found_it->second;
  2359. }
  2360. return NULL;
  2361. }
  2362. //-----------------------------------------------------------------------------
  2363. // isEmpty()
  2364. //-----------------------------------------------------------------------------
  2365. BOOL LLObjectSelection::isEmpty() const
  2366. {
  2367. return (mList.size() == 0);
  2368. }
  2369. //-----------------------------------------------------------------------------
  2370. // getObjectCount() - returns number of non null objects
  2371. //-----------------------------------------------------------------------------
  2372. S32 LLObjectSelection::getObjectCount()
  2373. {
  2374. cleanupNodes();
  2375. S32 count = mList.size();
  2376. return count;
  2377. }
  2378. //-----------------------------------------------------------------------------
  2379. // getTECount()
  2380. //-----------------------------------------------------------------------------
  2381. S32 LLObjectSelection::getTECount()
  2382. {
  2383. S32 count = 0;
  2384. for (LLObjectSelection::iterator iter = begin(); iter != end(); iter++)
  2385. {
  2386. LLSelectNode* node = *iter;
  2387. LLViewerObject* object = node->getObject();
  2388. if (!object)
  2389. continue;
  2390. S32 num_tes = object->getNumTEs();
  2391. for (S32 te = 0; te < num_tes; te++)
  2392. {
  2393. if (node->isTESelected(te))
  2394. {
  2395. ++count;
  2396. }
  2397. }
  2398. }
  2399. return count;
  2400. }
  2401. //-----------------------------------------------------------------------------
  2402. // getRootObjectCount()
  2403. //-----------------------------------------------------------------------------
  2404. S32 LLObjectSelection::getRootObjectCount()
  2405. {
  2406. S32 count = 0;
  2407. for (LLObjectSelection::root_iterator iter = root_begin(); iter != root_end(); iter++)
  2408. {
  2409. ++count;
  2410. }
  2411. return count;
  2412. }
  2413. bool LLObjectSelection::applyToObjects(LLSelectedObjectFunctor* func)
  2414. {
  2415. bool result = true;
  2416. for (iterator iter = begin(); iter != end(); )
  2417. {
  2418. iterator nextiter = iter++;
  2419. LLViewerObject* object = (*nextiter)->getObject();
  2420. if (!object)
  2421. continue;
  2422. bool r = func->apply(object);
  2423. result = result && r;
  2424. }
  2425. return result;
  2426. }
  2427. bool LLObjectSelection::applyToRootObjects(LLSelectedObjectFunctor* func, bool firstonly)
  2428. {
  2429. bool result = firstonly ? false : true;
  2430. for (root_iterator iter = root_begin(); iter != root_end(); )
  2431. {
  2432. root_iterator nextiter = iter++;
  2433. LLViewerObject* object = (*nextiter)->getObject();
  2434. if (!object)
  2435. continue;
  2436. bool r = func->apply(object);
  2437. if (firstonly && r)
  2438. return true;
  2439. else
  2440. result = result && r;
  2441. }
  2442. return result;
  2443. }
  2444. bool LLObjectSelection::applyToTEs(LLSelectedTEFunctor* func, bool firstonly)
  2445. {
  2446. bool result = firstonly ? false : true;
  2447. for (iterator iter = begin(); iter != end(); )
  2448. {
  2449. iterator nextiter = iter++;
  2450. LLSelectNode* node = *nextiter;
  2451. LLViewerObject* object = (*nextiter)->getObject();
  2452. if (!object)
  2453. continue;
  2454. S32 num_tes = llmin((S32)object->getNumTEs(), (S32)object->getNumFaces()); // avatars have TEs but no faces
  2455. for (S32 te = 0; te < num_tes; ++te)
  2456. {
  2457. if (node->isTESelected(te))
  2458. {
  2459. bool r = func->apply(object, te);
  2460. if (firstonly && r)
  2461. return true;
  2462. else
  2463. result = result && r;
  2464. }
  2465. }
  2466. }
  2467. return result;
  2468. }
  2469. bool LLObjectSelection::applyToNodes(LLSelectedNodeFunctor *func, bool firstonly)
  2470. {
  2471. bool result = firstonly ? false : true;
  2472. for (iterator iter = begin(); iter != end(); )
  2473. {
  2474. iterator nextiter = iter++;
  2475. LLSelectNode* node = *nextiter;
  2476. bool r = func->apply(node);
  2477. if (firstonly && r)
  2478. return true;
  2479. else
  2480. result = result && r;
  2481. }
  2482. return result;
  2483. }
  2484. bool LLObjectSelection::applyToRootNodes(LLSelectedNodeFunctor *func, bool firstonly)
  2485. {
  2486. bool result = firstonly ? false : true;
  2487. for (root_iterator iter = root_begin(); iter != root_end(); )
  2488. {
  2489. root_iterator nextiter = iter++;
  2490. LLSelectNode* node = *nextiter;
  2491. bool r = func->apply(node);
  2492. if (firstonly && r)
  2493. return true;
  2494. else
  2495. result = result && r;
  2496. }
  2497. return result;
  2498. }
  2499. BOOL LLObjectSelection::isMultipleTESelected()
  2500. {
  2501. BOOL te_selected = FALSE;
  2502. // ...all faces
  2503. for (LLObjectSelection::iterator iter = begin();
  2504.  iter != end(); iter++)
  2505. {
  2506. LLSelectNode* nodep = *iter;
  2507. for (S32 i = 0; i < SELECT_MAX_TES; i++)
  2508. {
  2509. if(nodep->isTESelected(i))
  2510. {
  2511. if(te_selected)
  2512. {
  2513. return TRUE;
  2514. }
  2515. te_selected = TRUE;
  2516. }
  2517. }
  2518. }
  2519. return FALSE;
  2520. }
  2521. //-----------------------------------------------------------------------------
  2522. // contains()
  2523. //-----------------------------------------------------------------------------
  2524. BOOL LLObjectSelection::contains(LLViewerObject* object)
  2525. {
  2526. return findNode(object) != NULL;
  2527. }
  2528. //-----------------------------------------------------------------------------
  2529. // contains()
  2530. //-----------------------------------------------------------------------------
  2531. BOOL LLObjectSelection::contains(LLViewerObject* object, S32 te)
  2532. {
  2533. if (te == SELECT_ALL_TES)
  2534. {
  2535. // ...all faces
  2536. for (LLObjectSelection::iterator iter = begin();
  2537.  iter != end(); iter++)
  2538. {
  2539. LLSelectNode* nodep = *iter;
  2540. if (nodep->getObject() == object)
  2541. {
  2542. // Optimization
  2543. if (nodep->getTESelectMask() == TE_SELECT_MASK_ALL)
  2544. {
  2545. return TRUE;
  2546. }
  2547. BOOL all_selected = TRUE;
  2548. for (S32 i = 0; i < object->getNumTEs(); i++)
  2549. {
  2550. all_selected = all_selected && nodep->isTESelected(i);
  2551. }
  2552. return all_selected;
  2553. }
  2554. }
  2555. return FALSE;
  2556. }
  2557. else
  2558. {
  2559. // ...one face
  2560. for (LLObjectSelection::iterator iter = begin(); iter != end(); iter++)
  2561. {
  2562. LLSelectNode* nodep = *iter;
  2563. if (nodep->getObject() == object && nodep->isTESelected(te))
  2564. {
  2565. return TRUE;
  2566. }
  2567. }
  2568. return FALSE;
  2569. }
  2570. }
  2571. // returns TRUE is any node is currenly worn as an attachment
  2572. BOOL LLObjectSelection::isAttachment()
  2573. {
  2574. return (mSelectType == SELECT_TYPE_ATTACHMENT || mSelectType == SELECT_TYPE_HUD);
  2575. }
  2576. //-----------------------------------------------------------------------------
  2577. // getSelectedParentObject()
  2578. //-----------------------------------------------------------------------------
  2579. LLViewerObject* getSelectedParentObject(LLViewerObject *object)
  2580. {
  2581. LLViewerObject *parent;
  2582. while (object && (parent = (LLViewerObject*)object->getParent()))
  2583. {
  2584. if (parent->isSelected())
  2585. {
  2586. object = parent;
  2587. }
  2588. else
  2589. {
  2590. break;
  2591. }
  2592. }
  2593. return object;
  2594. }
  2595. //-----------------------------------------------------------------------------
  2596. // getFirstNode
  2597. //-----------------------------------------------------------------------------
  2598. LLSelectNode* LLObjectSelection::getFirstNode(LLSelectedNodeFunctor* func)
  2599. {
  2600. for (iterator iter = begin(); iter != end(); ++iter)
  2601. {
  2602. LLSelectNode* node = *iter;
  2603. if (func == NULL || func->apply(node))
  2604. {
  2605. return node;
  2606. }
  2607. }
  2608. return NULL;
  2609. }
  2610. LLSelectNode* LLObjectSelection::getFirstRootNode(LLSelectedNodeFunctor* func, BOOL non_root_ok)
  2611. {
  2612. for (root_iterator iter = root_begin(); iter != root_end(); ++iter)
  2613. {
  2614. LLSelectNode* node = *iter;
  2615. if (func == NULL || func->apply(node))
  2616. {
  2617. return node;
  2618. }
  2619. }
  2620. if (non_root_ok)
  2621. {
  2622. // Get non root
  2623. return getFirstNode(func);
  2624. }
  2625. return NULL;
  2626. }
  2627. //-----------------------------------------------------------------------------
  2628. // getFirstSelectedObject
  2629. //-----------------------------------------------------------------------------
  2630. LLViewerObject* LLObjectSelection::getFirstSelectedObject(LLSelectedNodeFunctor* func, BOOL get_parent)
  2631. {
  2632. LLSelectNode* res = getFirstNode(func);
  2633. if (res && get_parent)
  2634. {
  2635. return getSelectedParentObject(res->getObject());
  2636. }
  2637. else if (res)
  2638. {
  2639. return res->getObject();
  2640. }
  2641. return NULL;
  2642. }
  2643. //-----------------------------------------------------------------------------
  2644. // getFirstObject()
  2645. //-----------------------------------------------------------------------------
  2646. LLViewerObject* LLObjectSelection::getFirstObject()
  2647. {
  2648. LLSelectNode* res = getFirstNode(NULL);
  2649. return res ? res->getObject() : NULL;
  2650. }
  2651. //-----------------------------------------------------------------------------
  2652. // getFirstRootObject()
  2653. //-----------------------------------------------------------------------------
  2654. LLViewerObject* LLObjectSelection::getFirstRootObject(BOOL non_root_ok)
  2655. {
  2656. LLSelectNode* res = getFirstRootNode(NULL, non_root_ok);
  2657. return res ? res->getObject() : NULL;
  2658. }
  2659. //-----------------------------------------------------------------------------
  2660. // getFirstMoveableNode()
  2661. //-----------------------------------------------------------------------------
  2662. LLSelectNode* LLObjectSelection::getFirstMoveableNode(BOOL get_root_first)
  2663. {
  2664. struct f : public LLSelectedNodeFunctor
  2665. {
  2666. bool apply(LLSelectNode* node)
  2667. {
  2668. LLViewerObject* obj = node->getObject();
  2669. return obj && obj->permMove();
  2670. }
  2671. } func;
  2672. LLSelectNode* res = get_root_first ? getFirstRootNode(&func, TRUE) : getFirstNode(&func);
  2673. return res;
  2674. }
  2675. //-----------------------------------------------------------------------------
  2676. // getFirstCopyableObject()
  2677. //-----------------------------------------------------------------------------
  2678. LLViewerObject* LLObjectSelection::getFirstCopyableObject(BOOL get_parent)
  2679. {
  2680. struct f : public LLSelectedNodeFunctor
  2681. {
  2682. bool apply(LLSelectNode* node)
  2683. {
  2684. LLViewerObject* obj = node->getObject();
  2685. return obj && obj->permCopy() && !obj->isAttachment();
  2686. }
  2687. } func;
  2688. return getFirstSelectedObject(&func, get_parent);
  2689. }
  2690. //-----------------------------------------------------------------------------
  2691. // getFirstDeleteableObject()
  2692. //-----------------------------------------------------------------------------
  2693. LLViewerObject* LLObjectSelection::getFirstDeleteableObject()
  2694. {
  2695. //RN: don't currently support deletion of child objects, as that requires separating them first
  2696. // then derezzing to trash
  2697. struct f : public LLSelectedNodeFunctor
  2698. {
  2699. bool apply(LLSelectNode* node)
  2700. {
  2701. LLViewerObject* obj = node->getObject();
  2702. // you can delete an object if you are the owner
  2703. // or you have permission to modify it.
  2704. if( obj && ( (obj->permModify()) ||
  2705.  (obj->permYouOwner()) ||
  2706.  (!obj->permAnyOwner()) )) // public
  2707. {
  2708. if( !obj->isAttachment() )
  2709. {
  2710. return true;
  2711. }
  2712. }
  2713. return false;
  2714. }
  2715. } func;
  2716. LLSelectNode* node = getFirstNode(&func);
  2717. return node ? node->getObject() : NULL;
  2718. }
  2719. //-----------------------------------------------------------------------------
  2720. // getFirstEditableObject()
  2721. //-----------------------------------------------------------------------------
  2722. LLViewerObject* LLObjectSelection::getFirstEditableObject(BOOL get_parent)
  2723. {
  2724. struct f : public LLSelectedNodeFunctor
  2725. {
  2726. bool apply(LLSelectNode* node)
  2727. {
  2728. LLViewerObject* obj = node->getObject();
  2729. return obj && obj->permModify();
  2730. }
  2731. } func;
  2732. return getFirstSelectedObject(&func, get_parent);
  2733. }
  2734. //-----------------------------------------------------------------------------
  2735. // getFirstMoveableObject()
  2736. //-----------------------------------------------------------------------------
  2737. LLViewerObject* LLObjectSelection::getFirstMoveableObject(BOOL get_parent)
  2738. {
  2739. struct f : public LLSelectedNodeFunctor
  2740. {
  2741. bool apply(LLSelectNode* node)
  2742. {
  2743. LLViewerObject* obj = node->getObject();
  2744. return obj && obj->permMove();
  2745. }
  2746. } func;
  2747. return getFirstSelectedObject(&func, get_parent);
  2748. }
  2749. //-----------------------------------------------------------------------------
  2750. // Position + Rotation update methods called from LLViewerJoystick
  2751. //-----------------------------------------------------------------------------
  2752. bool LLSelectMgr::selectionMove(const LLVector3& displ,
  2753.                                   F32 roll, F32 pitch, F32 yaw, U32 update_type)
  2754. {
  2755. if (update_type == UPD_NONE)
  2756. {
  2757. return false;
  2758. }
  2759. LLVector3 displ_global;
  2760. bool update_success = true;
  2761. bool update_position = update_type & UPD_POSITION;
  2762. bool update_rotation = update_type & UPD_ROTATION;
  2763. const bool noedit_linked_parts = !gSavedSettings.getBOOL("EditLinkedParts");
  2764. if (update_position)
  2765. {
  2766. // calculate the distance of the object closest to the camera origin
  2767. F32 min_dist = 1e+30f;
  2768. LLVector3 obj_pos;
  2769. for (LLObjectSelection::root_iterator it = getSelection()->root_begin();
  2770.  it != getSelection()->root_end(); ++it)
  2771. {
  2772. obj_pos = (*it)->getObject()->getPositionEdit();
  2773. F32 obj_dist = dist_vec(obj_pos, LLViewerCamera::getInstance()->getOrigin());
  2774. if (obj_dist < min_dist)
  2775. {
  2776. min_dist = obj_dist;
  2777. }
  2778. }
  2779. // factor the distance inside the displacement vector. This will get us
  2780. // equally visible movements for both close and far away selections.
  2781. min_dist = sqrt(min_dist) / 2;
  2782. displ_global.setVec(displ.mV[0]*min_dist, 
  2783. displ.mV[1]*min_dist, 
  2784. displ.mV[2]*min_dist);
  2785. // equates to: Displ_global = Displ * M_cam_axes_in_global_frame
  2786. displ_global = LLViewerCamera::getInstance()->rotateToAbsolute(displ_global);
  2787. }
  2788. LLQuaternion new_rot;
  2789. if (update_rotation)
  2790. {
  2791. // let's calculate the rotation around each camera axes 
  2792. LLQuaternion qx(roll, LLViewerCamera::getInstance()->getAtAxis());
  2793. LLQuaternion qy(pitch, LLViewerCamera::getInstance()->getLeftAxis());
  2794. LLQuaternion qz(yaw, LLViewerCamera::getInstance()->getUpAxis());
  2795. new_rot.setQuat(qx * qy * qz);
  2796. }
  2797. LLViewerObject *obj;
  2798. S32 obj_count = getSelection()->getObjectCount();
  2799. for (LLObjectSelection::root_iterator it = getSelection()->root_begin();
  2800.  it != getSelection()->root_end(); ++it )
  2801. {
  2802. obj = (*it)->getObject();
  2803. bool enable_pos = false, enable_rot = false;
  2804. bool perm_move = obj->permMove();
  2805. bool perm_mod = obj->permModify();
  2806. LLVector3d sel_center(getSelectionCenterGlobal());
  2807. if (update_rotation)
  2808. {
  2809. enable_rot = perm_move 
  2810. && ((perm_mod && !obj->isAttachment()) || noedit_linked_parts);
  2811. if (enable_rot)
  2812. {
  2813. int children_count = obj->getChildren().size();
  2814. if (obj_count > 1 && children_count > 0)
  2815. {
  2816. // for linked sets, rotate around the group center
  2817. const LLVector3 t(obj->getPositionGlobal() - sel_center);
  2818. // Ra = T x R x T^-1
  2819. LLMatrix4 mt; mt.setTranslation(t);
  2820. const LLMatrix4 mnew_rot(new_rot);
  2821. LLMatrix4 mt_1; mt_1.setTranslation(-t);
  2822. mt *= mnew_rot;
  2823. mt *= mt_1;
  2824. // Rfin = Rcur * Ra
  2825. obj->setRotation(obj->getRotationEdit() * mt.quaternion());
  2826. displ_global += mt.getTranslation();
  2827. }
  2828. else
  2829. {
  2830. obj->setRotation(obj->getRotationEdit() * new_rot);
  2831. }
  2832. }
  2833. else
  2834. {
  2835. update_success = false;
  2836. }
  2837. }
  2838. if (update_position)
  2839. {
  2840. // establish if object can be moved or not
  2841. enable_pos = perm_move && !obj->isAttachment() 
  2842. && (perm_mod || noedit_linked_parts);
  2843. if (enable_pos)
  2844. {
  2845. obj->setPosition(obj->getPositionEdit() + displ_global);
  2846. }
  2847. else
  2848. {
  2849. update_success = false;
  2850. }
  2851. }
  2852. if (enable_pos && enable_rot && obj->mDrawable.notNull())
  2853. {
  2854. gPipeline.markMoved(obj->mDrawable, TRUE);
  2855. }
  2856. }
  2857. if (update_position && update_success && obj_count > 1)
  2858. {
  2859. updateSelectionCenter();
  2860. }
  2861. return update_success;
  2862. }
  2863. void LLSelectMgr::sendSelectionMove()
  2864. {
  2865. LLSelectNode *node = mSelectedObjects->getFirstRootNode();
  2866. if (node == NULL)
  2867. {
  2868. return;
  2869. }
  2870. //saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK);
  2871. U32 update_type = UPD_POSITION | UPD_ROTATION;
  2872. LLViewerRegion *last_region, *curr_region = node->getObject()->getRegion();
  2873. S32 objects_in_this_packet = 0;
  2874. // apply to linked objects if unable to select their individual parts 
  2875. if (!gSavedSettings.getBOOL("EditLinkedParts") && !getTEMode())
  2876. {
  2877. // tell simulator to apply to whole linked sets
  2878. update_type |= UPD_LINKED_SETS;
  2879. }
  2880. // prepare first bulk message
  2881. gMessageSystem->newMessage("MultipleObjectUpdate");
  2882. packAgentAndSessionID(&update_type);
  2883. LLViewerObject *obj = NULL;
  2884. for (LLObjectSelection::root_iterator it = getSelection()->root_begin();
  2885.  it != getSelection()->root_end(); ++it)
  2886. {
  2887. obj = (*it)->getObject();
  2888. // note: following code adapted from sendListToRegions() (@3924)
  2889. last_region = curr_region;
  2890. curr_region = obj->getRegion();
  2891. // if not simulator or message too big
  2892. if (curr_region != last_region
  2893. || gMessageSystem->isSendFull(NULL)
  2894. || objects_in_this_packet >= MAX_OBJECTS_PER_PACKET)
  2895. {
  2896. // send sim the current message and start new one
  2897. gMessageSystem->sendReliable(last_region->getHost());
  2898. objects_in_this_packet = 0;
  2899. gMessageSystem->newMessage("MultipleObjectUpdate");
  2900. packAgentAndSessionID(&update_type);
  2901. }
  2902. // add another instance of the body of data
  2903. packMultipleUpdate(*it, &update_type);
  2904. ++objects_in_this_packet;
  2905. }
  2906. // flush remaining messages
  2907. if (gMessageSystem->getCurrentSendTotal() > 0)
  2908. {
  2909. gMessageSystem->sendReliable(curr_region->getHost());
  2910. }
  2911. else
  2912. {
  2913. gMessageSystem->clearMessage();
  2914. }
  2915. //saveSelectedObjectTransform(SELECT_ACTION_TYPE_PICK);
  2916. }