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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llselectmgr.h
  3.  * @brief A manager for selected objects and TEs.
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #ifndef LL_LLSELECTMGR_H
  33. #define LL_LLSELECTMGR_H
  34. #include "llcharacter.h"
  35. #include "lleditmenuhandler.h"
  36. #include "llundo.h"
  37. #include "lluuid.h"
  38. #include "llpointer.h"
  39. #include "llsafehandle.h"
  40. #include "llsaleinfo.h"
  41. #include "llcategory.h"
  42. #include "v3dmath.h"
  43. #include "llquaternion.h"
  44. #include "llcoord.h"
  45. #include "llframetimer.h"
  46. #include "llbbox.h"
  47. #include "llpermissions.h"
  48. #include "llcontrol.h"
  49. #include "llviewerobject.h" // LLObjectSelection::getSelectedTEValue template
  50. #include <deque>
  51. #include <boost/iterator/filter_iterator.hpp>
  52. #include <boost/signals2.hpp>
  53. class LLMessageSystem;
  54. class LLViewerTexture;
  55. class LLColor4;
  56. class LLVector3;
  57. class LLSelectNode;
  58. const S32 SELECT_ALL_TES = -1;
  59. const S32 SELECT_MAX_TES = 32;
  60. // Do something to all objects in the selection manager.
  61. // The BOOL return value can be used to indicate if all
  62. // objects are identical (gathering information) or if
  63. // the operation was successful.
  64. struct LLSelectedObjectFunctor
  65. {
  66. virtual ~LLSelectedObjectFunctor() {};
  67. virtual bool apply(LLViewerObject* object) = 0;
  68. };
  69. // Do something to all select nodes in the selection manager.
  70. // The BOOL return value can be used to indicate if all
  71. // objects are identical (gathering information) or if
  72. // the operation was successful.
  73. struct LLSelectedNodeFunctor
  74. {
  75. virtual ~LLSelectedNodeFunctor() {};
  76. virtual bool apply(LLSelectNode* node) = 0;
  77. };
  78. struct LLSelectedTEFunctor
  79. {
  80. virtual ~LLSelectedTEFunctor() {};
  81. virtual bool apply(LLViewerObject* object, S32 face) = 0;
  82. };
  83. template <typename T> struct LLSelectedTEGetFunctor
  84. {
  85. virtual ~LLSelectedTEGetFunctor() {};
  86. virtual T get(LLViewerObject* object, S32 te) = 0;
  87. };
  88. typedef enum e_send_type
  89. {
  90. SEND_ONLY_ROOTS,
  91. SEND_INDIVIDUALS,
  92. SEND_ROOTS_FIRST, // useful for serial undos on linked sets
  93. SEND_CHILDREN_FIRST // useful for serial transforms of linked sets
  94. } ESendType;
  95. typedef enum e_grid_mode
  96. {
  97. GRID_MODE_WORLD,
  98. GRID_MODE_LOCAL,
  99. GRID_MODE_REF_OBJECT
  100. } EGridMode;
  101. typedef enum e_action_type
  102. {
  103. SELECT_ACTION_TYPE_BEGIN,
  104. SELECT_ACTION_TYPE_PICK,
  105. SELECT_ACTION_TYPE_MOVE,
  106. SELECT_ACTION_TYPE_ROTATE,
  107. SELECT_ACTION_TYPE_SCALE,
  108. NUM_ACTION_TYPES
  109. }EActionType;
  110. typedef enum e_selection_type
  111. {
  112. SELECT_TYPE_WORLD,
  113. SELECT_TYPE_ATTACHMENT,
  114. SELECT_TYPE_HUD
  115. }ESelectType;
  116. // Contains information about a selected object, particularly which TEs are selected.
  117. class LLSelectNode
  118. {
  119. public:
  120. LLSelectNode(LLViewerObject* object, BOOL do_glow);
  121. LLSelectNode(const LLSelectNode& nodep);
  122. ~LLSelectNode();
  123. void selectAllTEs(BOOL b);
  124. void selectTE(S32 te_index, BOOL selected);
  125. BOOL isTESelected(S32 te_index);
  126. S32 getLastSelectedTE();
  127. S32 getTESelectMask() { return mTESelectMask; }
  128. void renderOneSilhouette(const LLColor4 &color);
  129. void setTransient(BOOL transient) { mTransient = transient; }
  130. BOOL isTransient() { return mTransient; }
  131. LLViewerObject* getObject();
  132. void setObject(LLViewerObject* object);
  133. // *NOTE: invalidate stored textures and colors when # faces change
  134. void saveColors();
  135. void saveTextures(const std::vector<LLUUID>& textures);
  136. void saveTextureScaleRatios();
  137. BOOL allowOperationOnNode(PermissionBit op, U64 group_proxy_power) const;
  138. public:
  139. BOOL mIndividualSelection; // For root objects and objects individually selected
  140. BOOL mTransient;
  141. BOOL mValid; // is extra information valid?
  142. LLPermissions* mPermissions;
  143. LLSaleInfo mSaleInfo;
  144. LLAggregatePermissions mAggregatePerm;
  145. LLAggregatePermissions mAggregateTexturePerm;
  146. LLAggregatePermissions mAggregateTexturePermOwner;
  147. std::string mName;
  148. std::string mDescription;
  149. LLCategory mCategory;
  150. S16 mInventorySerial;
  151. LLVector3 mSavedPositionLocal; // for interactively modifying object position
  152. LLVector3 mLastPositionLocal;
  153. LLVector3d mSavedPositionGlobal; // for interactively modifying object position
  154. LLVector3 mSavedScale; // for interactively modifying object scale
  155. LLVector3 mLastScale;
  156. LLQuaternion mSavedRotation; // for interactively modifying object rotation
  157. LLQuaternion mLastRotation;
  158. BOOL mDuplicated;
  159. LLVector3d mDuplicatePos;
  160. LLQuaternion mDuplicateRot;
  161. LLUUID mItemID;
  162. LLUUID mFolderID;
  163. LLUUID mFromTaskID;
  164. std::string mTouchName;
  165. std::string mSitName;
  166. U64 mCreationDate;
  167. std::vector<LLColor4> mSavedColors;
  168. std::vector<LLUUID> mSavedTextures;
  169. std::vector<LLVector3>  mTextureScaleRatios;
  170. std::vector<LLVector3> mSilhouetteVertices; // array of vertices to render silhouette of object
  171. std::vector<LLVector3> mSilhouetteNormals; // array of normals to render silhouette of object
  172. std::vector<S32> mSilhouetteSegments; // array of normals to render silhouette of object
  173. BOOL mSilhouetteExists; // need to generate silhouette?
  174. protected:
  175. LLPointer<LLViewerObject> mObject;
  176. S32 mTESelectMask;
  177. S32 mLastTESelected;
  178. };
  179. class LLObjectSelection : public LLRefCount
  180. {
  181. friend class LLSelectMgr;
  182. protected:
  183. ~LLObjectSelection();
  184. public:
  185. typedef std::list<LLSelectNode*> list_t;
  186. // Iterators
  187. struct is_non_null
  188. {
  189. bool operator()(LLSelectNode* node)
  190. {
  191. return (node->getObject() != NULL);
  192. }
  193. };
  194. typedef boost::filter_iterator<is_non_null, list_t::iterator > iterator;
  195. iterator begin() { return iterator(mList.begin(), mList.end()); }
  196. iterator end() { return iterator(mList.end(), mList.end()); }
  197. struct is_valid
  198. {
  199. bool operator()(LLSelectNode* node)
  200. {
  201. return (node->getObject() != NULL) && node->mValid;
  202. }
  203. };
  204. typedef boost::filter_iterator<is_valid, list_t::iterator > valid_iterator;
  205. valid_iterator valid_begin() { return valid_iterator(mList.begin(), mList.end()); }
  206. valid_iterator valid_end() { return valid_iterator(mList.end(), mList.end()); }
  207. struct is_root
  208. {
  209. bool operator()(LLSelectNode* node);
  210. };
  211. typedef boost::filter_iterator<is_root, list_t::iterator > root_iterator;
  212. root_iterator root_begin() { return root_iterator(mList.begin(), mList.end()); }
  213. root_iterator root_end() { return root_iterator(mList.end(), mList.end()); }
  214. struct is_valid_root
  215. {
  216. bool operator()(LLSelectNode* node);
  217. };
  218. typedef boost::filter_iterator<is_root, list_t::iterator > valid_root_iterator;
  219. valid_root_iterator valid_root_begin() { return valid_root_iterator(mList.begin(), mList.end()); }
  220. valid_root_iterator valid_root_end() { return valid_root_iterator(mList.end(), mList.end()); }
  221. struct is_root_object
  222. {
  223. bool operator()(LLSelectNode* node);
  224. };
  225. typedef boost::filter_iterator<is_root_object, list_t::iterator > root_object_iterator;
  226. root_object_iterator root_object_begin() { return root_object_iterator(mList.begin(), mList.end()); }
  227. root_object_iterator root_object_end() { return root_object_iterator(mList.end(), mList.end()); }
  228. public:
  229. LLObjectSelection();
  230. void updateEffects();
  231. void cleanupNodes();
  232. BOOL isEmpty() const;
  233. LLSelectNode* getFirstNode(LLSelectedNodeFunctor* func = NULL);
  234. LLSelectNode* getFirstRootNode(LLSelectedNodeFunctor* func = NULL, BOOL non_root_ok = FALSE);
  235. LLViewerObject* getFirstSelectedObject(LLSelectedNodeFunctor* func, BOOL get_parent = FALSE);
  236. LLViewerObject* getFirstObject();
  237. LLViewerObject* getFirstRootObject(BOOL non_root_ok = FALSE);
  238. LLSelectNode* getFirstMoveableNode(BOOL get_root_first = FALSE);
  239. LLViewerObject* getFirstEditableObject(BOOL get_parent = FALSE);
  240. LLViewerObject* getFirstCopyableObject(BOOL get_parent = FALSE);
  241. LLViewerObject* getFirstDeleteableObject();
  242. LLViewerObject* getFirstMoveableObject(BOOL get_parent = FALSE);
  243. /// Return the object that lead to this selection, possible a child
  244. LLViewerObject* getPrimaryObject() { return mPrimaryObject; }
  245. // iterate through texture entries
  246. template <typename T> bool getSelectedTEValue(LLSelectedTEGetFunctor<T>* func, T& res);
  247. template <typename T> bool isMultipleTEValue(LLSelectedTEGetFunctor<T>* func, const T& ignore_value);
  248. void addNode(LLSelectNode *nodep);
  249. void addNodeAtEnd(LLSelectNode *nodep);
  250. void moveNodeToFront(LLSelectNode *nodep);
  251. void removeNode(LLSelectNode *nodep);
  252. void deleteAllNodes(); // Delete all nodes
  253. S32 getNumNodes();
  254. LLSelectNode* findNode(LLViewerObject* objectp);
  255. // count members
  256. S32 getObjectCount();
  257. S32 getTECount();
  258. S32 getRootObjectCount();
  259. BOOL isMultipleTESelected();
  260. BOOL contains(LLViewerObject* object);
  261. BOOL contains(LLViewerObject* object, S32 te);
  262. // returns TRUE is any node is currenly worn as an attachment
  263. BOOL isAttachment();
  264. // Apply functors to various subsets of the selected objects
  265. // If firstonly is FALSE, returns the AND of all apply() calls.
  266. // Else returns TRUE immediately if any apply() call succeeds (i.e. OR with early exit)
  267. bool applyToRootObjects(LLSelectedObjectFunctor* func, bool firstonly = false);
  268. bool applyToObjects(LLSelectedObjectFunctor* func);
  269. bool applyToTEs(LLSelectedTEFunctor* func, bool firstonly = false);
  270. bool applyToRootNodes(LLSelectedNodeFunctor* func, bool firstonly = false);
  271. bool applyToNodes(LLSelectedNodeFunctor* func, bool firstonly = false);
  272. ESelectType getSelectType() const { return mSelectType; }
  273. private:
  274. list_t mList;
  275. const LLObjectSelection &operator=(const LLObjectSelection &);
  276. LLPointer<LLViewerObject> mPrimaryObject;
  277. std::map<LLPointer<LLViewerObject>, LLSelectNode*> mSelectNodeMap;
  278. ESelectType mSelectType;
  279. };
  280. typedef LLSafeHandle<LLObjectSelection> LLObjectSelectionHandle;
  281. // Build time optimization, generate this once in .cpp file
  282. #ifndef LLSELECTMGR_CPP
  283. extern template class LLSelectMgr* LLSingleton<class LLSelectMgr>::getInstance();
  284. #endif
  285. class LLSelectMgr : public LLEditMenuHandler, public LLSingleton<LLSelectMgr>
  286. {
  287. public:
  288. static BOOL sRectSelectInclusive; // do we need to surround an object to pick it?
  289. static BOOL sRenderHiddenSelections; // do we show selection silhouettes that are occluded?
  290. static BOOL sRenderLightRadius; // do we show the radius of selected lights?
  291. static F32 sHighlightThickness;
  292. static F32 sHighlightUScale;
  293. static F32 sHighlightVScale;
  294. static F32 sHighlightAlpha;
  295. static F32 sHighlightAlphaTest;
  296. static F32 sHighlightUAnim;
  297. static F32 sHighlightVAnim;
  298. static LLColor4 sSilhouetteParentColor;
  299. static LLColor4 sSilhouetteChildColor;
  300. static LLColor4 sHighlightParentColor;
  301. static LLColor4 sHighlightChildColor;
  302. static LLColor4 sHighlightInspectColor;
  303. static LLColor4 sContextSilhouetteColor;
  304. LLCachedControl<bool> mHideSelectedObjects;
  305. LLCachedControl<bool> mAllowSelectAvatar;
  306. LLCachedControl<bool> mDebugSelectMgr;
  307. public:
  308. LLSelectMgr();
  309. ~LLSelectMgr();
  310. static void cleanupGlobals();
  311. // LLEditMenuHandler interface
  312. virtual BOOL canUndo() const;
  313. virtual void undo();
  314. virtual BOOL canRedo() const;
  315. virtual void redo();
  316. virtual BOOL canDoDelete() const;
  317. virtual void doDelete();
  318. virtual void deselect();
  319. virtual BOOL canDeselect() const;
  320. virtual void duplicate();
  321. virtual BOOL canDuplicate() const;
  322. void clearSelections();
  323. void update();
  324. void updateEffects(); // Update HUD effects
  325. void overrideObjectUpdates();
  326. // Returns the previous value of mForceSelection
  327. BOOL setForceSelection(BOOL force);
  328. ////////////////////////////////////////////////////////////////
  329. // Selection methods
  330. ////////////////////////////////////////////////////////////////
  331. ////////////////////////////////////////////////////////////////
  332. // Add
  333. ////////////////////////////////////////////////////////////////
  334. // This method is meant to select an object, and then select all
  335. // of the ancestors and descendants. This should be the normal behavior.
  336. //
  337. // *NOTE: You must hold on to the object selection handle, otherwise
  338. // the objects will be automatically deselected in 1 frame.
  339. LLObjectSelectionHandle selectObjectAndFamily(LLViewerObject* object, BOOL add_to_end = FALSE);
  340. // For when you want just a child object.
  341. LLObjectSelectionHandle selectObjectOnly(LLViewerObject* object, S32 face = SELECT_ALL_TES);
  342. // Same as above, but takes a list of objects.  Used by rectangle select.
  343. LLObjectSelectionHandle selectObjectAndFamily(const std::vector<LLViewerObject*>& object_list, BOOL send_to_sim = TRUE);
  344. // converts all objects currently highlighted to a selection, and returns it
  345. LLObjectSelectionHandle selectHighlightedObjects();
  346. LLObjectSelectionHandle setHoverObject(LLViewerObject *objectp, S32 face = -1);
  347. LLSelectNode *getHoverNode();
  348. LLSelectNode *getPrimaryHoverNode();
  349. void highlightObjectOnly(LLViewerObject *objectp);
  350. void highlightObjectAndFamily(LLViewerObject *objectp);
  351. void highlightObjectAndFamily(const std::vector<LLViewerObject*>& list);
  352. ////////////////////////////////////////////////////////////////
  353. // Remove
  354. ////////////////////////////////////////////////////////////////
  355. void deselectObjectOnly(LLViewerObject* object, BOOL send_to_sim = TRUE);
  356. void deselectObjectAndFamily(LLViewerObject* object, BOOL send_to_sim = TRUE, BOOL include_entire_object = FALSE);
  357. // Send deselect messages to simulator, then clear the list
  358. void deselectAll();
  359. void deselectAllForStandingUp();
  360. // deselect only if nothing else currently referencing the selection
  361. void deselectUnused();
  362. // Deselect if the selection center is too far away from the agent.
  363. void deselectAllIfTooFar();
  364. // Removes all highlighted objects from current selection
  365. void deselectHighlightedObjects();
  366. void unhighlightObjectOnly(LLViewerObject *objectp);
  367. void unhighlightObjectAndFamily(LLViewerObject *objectp);
  368. void unhighlightAll();
  369. BOOL removeObjectFromSelections(const LLUUID &id);
  370. ////////////////////////////////////////////////////////////////
  371. // Selection accessors
  372. ////////////////////////////////////////////////////////////////
  373. LLObjectSelectionHandle getSelection() { return mSelectedObjects; }
  374. // right now this just renders the selection with root/child colors instead of a single color
  375. LLObjectSelectionHandle getEditSelection() { convertTransient(); return mSelectedObjects; }
  376. LLObjectSelectionHandle getHighlightedObjects() { return mHighlightedObjects; }
  377. ////////////////////////////////////////////////////////////////
  378. // Grid manipulation
  379. ////////////////////////////////////////////////////////////////
  380. void addGridObject(LLViewerObject* objectp);
  381. void clearGridObjects();
  382. void setGridMode(EGridMode mode);
  383. EGridMode getGridMode() { return mGridMode; }
  384. void getGrid(LLVector3& origin, LLQuaternion& rotation, LLVector3 &scale);
  385. BOOL getTEMode() { return mTEMode; }
  386. void setTEMode(BOOL b) { mTEMode = b; }
  387. BOOL shouldShowSelection() { return mShowSelection; }
  388. LLBBox getBBoxOfSelection() const;
  389. LLBBox getSavedBBoxOfSelection() const { return mSavedSelectionBBox; }
  390. void dump();
  391. void cleanup();
  392. void updateSilhouettes();
  393. void renderSilhouettes(BOOL for_hud);
  394. void enableSilhouette(BOOL enable) { mRenderSilhouettes = enable; }
  395. ////////////////////////////////////////////////////////////////
  396. // Utility functions that operate on the current selection
  397. ////////////////////////////////////////////////////////////////
  398. void saveSelectedObjectTransform(EActionType action_type);
  399. void saveSelectedObjectColors();
  400. void saveSelectedObjectTextures();
  401. void selectionUpdatePhysics(BOOL use_physics);
  402. void selectionUpdateTemporary(BOOL is_temporary);
  403. void selectionUpdatePhantom(BOOL is_ghost);
  404. void selectionUpdateCastShadows(BOOL cast_shadows);
  405. void selectionDump();
  406. BOOL selectionAllPCode(LLPCode code); // all objects have this PCode
  407. BOOL selectionGetClickAction(U8 *out_action);
  408. bool selectionGetIncludeInSearch(bool* include_in_search_out); // true if all selected objects have same
  409. BOOL selectionGetGlow(F32 *glow);
  410. void selectionSetMaterial(U8 material);
  411. void selectionSetImage(const LLUUID& imageid); // could be item or asset id
  412. void selectionSetColor(const LLColor4 &color);
  413. void selectionSetColorOnly(const LLColor4 &color); // Set only the RGB channels
  414. void selectionSetAlphaOnly(const F32 alpha); // Set only the alpha channel
  415. void selectionRevertColors();
  416. BOOL selectionRevertTextures();
  417. void selectionSetBumpmap( U8 bumpmap );
  418. void selectionSetTexGen( U8 texgen );
  419. void selectionSetShiny( U8 shiny );
  420. void selectionSetFullbright( U8 fullbright );
  421. void selectionSetMedia( U8 media_type, const LLSD &media_data );
  422. void selectionSetClickAction(U8 action);
  423. void selectionSetIncludeInSearch(bool include_in_search);
  424. void selectionSetGlow(const F32 glow);
  425. void selectionSetObjectPermissions(U8 perm_field, BOOL set, U32 perm_mask, BOOL override = FALSE);
  426. void selectionSetObjectName(const std::string& name);
  427. void selectionSetObjectDescription(const std::string& desc);
  428. void selectionSetObjectCategory(const LLCategory& category);
  429. void selectionSetObjectSaleInfo(const LLSaleInfo& sale_info);
  430. void selectionTexScaleAutofit(F32 repeats_per_meter);
  431. void adjustTexturesByScale(BOOL send_to_sim, BOOL stretch);
  432. void selectionResetRotation(); // sets rotation quat to identity
  433. void selectionRotateAroundZ(F32 degrees);
  434. bool selectionMove(const LLVector3& displ, F32 rx, F32 ry, F32 rz,
  435.    U32 update_type);
  436. void sendSelectionMove();
  437. void sendGodlikeRequest(const std::string& request, const std::string& parameter);
  438. // will make sure all selected object meet current criteria, or deselect them otherwise
  439. void validateSelection();
  440. // returns TRUE if it is possible to select this object
  441. BOOL canSelectObject(LLViewerObject* object);
  442. // Returns TRUE if the viewer has information on all selected objects
  443. BOOL selectGetAllRootsValid();
  444. BOOL selectGetAllValid();
  445. BOOL selectGetAllValidAndObjectsFound();
  446. // returns TRUE if you can modify all selected objects. 
  447. BOOL selectGetRootsModify();
  448. BOOL selectGetModify();
  449. // returns TRUE if selected objects can be transferred.
  450. BOOL selectGetRootsTransfer();
  451. // returns TRUE if selected objects can be copied.
  452. BOOL selectGetRootsCopy();
  453. BOOL selectGetCreator(LLUUID& id, std::string& name); // TRUE if all have same creator, returns id
  454. BOOL selectGetOwner(LLUUID& id, std::string& name); // TRUE if all objects have same owner, returns id
  455. BOOL selectGetLastOwner(LLUUID& id, std::string& name); // TRUE if all objects have same owner, returns id
  456. // returns TRUE if all are the same. id is stuffed with
  457. // the value found if available.
  458. BOOL selectGetGroup(LLUUID& id); 
  459. BOOL selectGetPerm( U8 which_perm, U32* mask_on, U32* mask_off); // TRUE if all have data, returns two masks, each indicating which bits are all on and all off
  460. BOOL selectIsGroupOwned(); // TRUE if all root objects have valid data and are group owned.
  461. // returns TRUE if all the nodes are valid. Accumulates
  462. // permissions in the parameter.
  463. BOOL selectGetPermissions(LLPermissions& perm);
  464. // Get a bunch of useful sale information for the object(s) selected.
  465. // "_mixed" is true if not all objects have the same setting.
  466. void selectGetAggregateSaleInfo(U32 &num_for_sale,
  467. BOOL &is_for_sale_mixed, 
  468. BOOL &is_sale_price_mixed,
  469. S32 &total_sale_price,
  470. S32 &individual_sale_price);
  471. // returns TRUE if all nodes are valid. 
  472. BOOL selectGetCategory(LLCategory& category);
  473. // returns TRUE if all nodes are valid. method also stores an
  474. // accumulated sale info.
  475. BOOL selectGetSaleInfo(LLSaleInfo& sale_info);
  476. // returns TRUE if all nodes are valid. fills passed in object
  477. // with the aggregate permissions of the selection.
  478. BOOL selectGetAggregatePermissions(LLAggregatePermissions& ag_perm);
  479. // returns TRUE if all nodes are valid. fills passed in object
  480. // with the aggregate permissions for texture inventory items of the selection.
  481. BOOL selectGetAggregateTexturePermissions(LLAggregatePermissions& ag_perm);
  482. LLPermissions* findObjectPermissions(const LLViewerObject* object);
  483. void selectDelete(); // Delete on simulator
  484. void selectForceDelete(); // just delete, no into trash
  485. void selectDuplicate(const LLVector3& offset, BOOL select_copy); // Duplicate on simulator
  486. void repeatDuplicate();
  487. void selectDuplicateOnRay(const LLVector3 &ray_start_region,
  488. const LLVector3 &ray_end_region,
  489. BOOL bypass_raycast,
  490. BOOL ray_end_is_intersection,
  491. const LLUUID &ray_target_id,
  492. BOOL copy_centers,
  493. BOOL copy_rotates,
  494. BOOL select_copy);
  495. void sendMultipleUpdate(U32 type); // Position, rotation, scale all in one
  496. void sendOwner(const LLUUID& owner_id, const LLUUID& group_id, BOOL override = FALSE);
  497. void sendGroup(const LLUUID& group_id);
  498. // Category ID is the UUID of the folder you want to contain the purchase.
  499. // *NOTE: sale_info check doesn't work for multiple object buy,
  500. // which UI does not currently support sale info is used for
  501. // verification only, if it doesn't match region info then sale is
  502. // canceled
  503. void sendBuy(const LLUUID& buyer_id, const LLUUID& category_id, const LLSaleInfo sale_info);
  504. void sendAttach(U8 attachment_point);
  505. void sendDetach();
  506. void sendDropAttachment();
  507. void sendLink();
  508. void sendDelink();
  509. //void sendHinge(U8 type);
  510. //void sendDehinge();
  511. void sendSelect();
  512. void requestObjectPropertiesFamily(LLViewerObject* object); // asks sim for creator, permissions, resources, etc.
  513. static void processObjectProperties(LLMessageSystem *mesgsys, void **user_data);
  514. static void processObjectPropertiesFamily(LLMessageSystem *mesgsys, void **user_data);
  515. static void processForceObjectSelect(LLMessageSystem* msg, void**);
  516. void requestGodInfo();
  517. LLVector3d getSelectionCenterGlobal() const { return mSelectionCenterGlobal; }
  518. void updateSelectionCenter();
  519. void resetAgentHUDZoom();
  520. void setAgentHUDZoom(F32 target_zoom, F32 current_zoom);
  521. void getAgentHUDZoom(F32 &target_zoom, F32 &current_zoom) const;
  522. void updatePointAt();
  523. // Internal list maintenance functions. TODO: Make these private!
  524. void remove(std::vector<LLViewerObject*>& objects);
  525. void remove(LLViewerObject* object, S32 te = SELECT_ALL_TES, BOOL undoable = TRUE);
  526. void removeAll();
  527. void addAsIndividual(LLViewerObject* object, S32 te = SELECT_ALL_TES, BOOL undoable = TRUE);
  528. void promoteSelectionToRoot();
  529. void demoteSelectionToIndividuals();
  530. private:
  531. void convertTransient(); // converts temporarily selected objects to full-fledged selections
  532. ESelectType getSelectTypeForObject(LLViewerObject* object);
  533. void addAsFamily(std::vector<LLViewerObject*>& objects, BOOL add_to_end = FALSE);
  534. void generateSilhouette(LLSelectNode *nodep, const LLVector3& view_point);
  535. void updateSelectionSilhouette(LLObjectSelectionHandle object_handle, S32& num_sils_genned, std::vector<LLViewerObject*>& changed_objects);
  536. // Send one message to each region containing an object on selection list.
  537. void sendListToRegions( const std::string& message_name,
  538. void (*pack_header)(void *user_data), 
  539. void (*pack_body)(LLSelectNode* node, void *user_data), 
  540. void *user_data,
  541. ESendType send_type);
  542. static void packAgentID( void *);
  543. static void packAgentAndSessionID(void* user_data);
  544. static void packAgentAndGroupID(void* user_data);
  545. static void packAgentAndSessionAndGroupID(void* user_data);
  546. static void packAgentIDAndSessionAndAttachment(void*);
  547. static void packAgentGroupAndCatID(void*);
  548. static void packDeleteHeader(void* userdata);
  549. static void packDeRezHeader(void* user_data);
  550. static void packObjectID( LLSelectNode* node, void *);
  551. static void packObjectIDAsParam(LLSelectNode* node, void *);
  552. static void packObjectIDAndRotation(LLSelectNode* node, void *);
  553. static void packObjectLocalID(LLSelectNode* node, void *);
  554. static void packObjectClickAction(LLSelectNode* node, void* data);
  555. static void packObjectIncludeInSearch(LLSelectNode* node, void* data);
  556. static void packObjectName(LLSelectNode* node, void* user_data);
  557. static void packObjectDescription(LLSelectNode* node, void* user_data);
  558. static void packObjectCategory(LLSelectNode* node, void* user_data);
  559. static void packObjectSaleInfo(LLSelectNode* node, void* user_data);
  560. static void packBuyObjectIDs(LLSelectNode* node, void* user_data);
  561. static void packDuplicate( LLSelectNode* node, void *duplicate_data);
  562. static void packDuplicateHeader(void*);
  563. static void packDuplicateOnRayHead(void *user_data);
  564. static void packPermissions(LLSelectNode* node, void *user_data);
  565. static void packDeselect( LLSelectNode* node, void *user_data);
  566. static void packMultipleUpdate(LLSelectNode* node, void *user_data);
  567. static void packPhysics(LLSelectNode* node, void *user_data);
  568. static void packShape(LLSelectNode* node, void *user_data);
  569. static void packOwnerHead(void *user_data);
  570. static void packHingeHead(void *user_data);
  571. static void packPermissionsHead(void* user_data);
  572. static void packGodlikeHead(void* user_data);
  573. static bool confirmDelete(const LLSD& notification, const LLSD& response, LLObjectSelectionHandle handle);
  574. public:
  575. // Observer/callback support for when object selection changes or
  576. // properties are received/updated
  577. typedef boost::signals2::signal< void ()> update_signal_t;
  578. update_signal_t mUpdateSignal;
  579. private:
  580. LLPointer<LLViewerTexture> mSilhouetteImagep;
  581. LLObjectSelectionHandle mSelectedObjects;
  582. LLObjectSelectionHandle mHoverObjects;
  583. LLObjectSelectionHandle mHighlightedObjects;
  584. std::set<LLPointer<LLViewerObject> > mRectSelectedObjects;
  585. LLObjectSelection mGridObjects;
  586. LLQuaternion mGridRotation;
  587. LLVector3 mGridOrigin;
  588. LLVector3 mGridScale;
  589. EGridMode mGridMode;
  590. BOOL mGridValid;
  591. BOOL mTEMode; // render te
  592. LLVector3d mSelectionCenterGlobal;
  593. LLBBox mSelectionBBox;
  594. LLVector3d mLastSentSelectionCenterGlobal;
  595. BOOL mShowSelection; // do we send the selection center name value and do we animate this selection?
  596. LLVector3d mLastCameraPos; // camera position from last generation of selection silhouette
  597. BOOL mRenderSilhouettes; // do we render the silhouette
  598. LLBBox mSavedSelectionBBox;
  599. LLFrameTimer mEffectsTimer;
  600. BOOL mForceSelection;
  601. LLAnimPauseRequest mPauseRequest;
  602. };
  603. // *DEPRECATED: For callbacks or observers, use
  604. // LLSelectMgr::getInstance()->mUpdateSignal.connect( callback )
  605. // Update subscribers to the selection list
  606. void dialog_refresh_all();
  607. // Templates
  608. //-----------------------------------------------------------------------------
  609. // getSelectedTEValue
  610. //-----------------------------------------------------------------------------
  611. template <typename T> bool LLObjectSelection::getSelectedTEValue(LLSelectedTEGetFunctor<T>* func, T& res)
  612. {
  613. bool have_first = false;
  614. bool have_selected = false;
  615. T selected_value = T();
  616. // Now iterate through all TEs to test for sameness
  617. bool identical = TRUE;
  618. for (iterator iter = begin(); iter != end(); iter++)
  619. {
  620. LLSelectNode* node = *iter;
  621. LLViewerObject* object = node->getObject();
  622. S32 selected_te = -1;
  623. if (object == getPrimaryObject())
  624. {
  625. selected_te = node->getLastSelectedTE();
  626. }
  627. for (S32 te = 0; te < object->getNumTEs(); ++te)
  628. {
  629. if (!node->isTESelected(te))
  630. {
  631. continue;
  632. }
  633. T value = func->get(object, te);
  634. if (!have_first)
  635. {
  636. have_first = true;
  637. if (!have_selected)
  638. {
  639. selected_value = value;
  640. }
  641. }
  642. else
  643. {
  644. if ( value != selected_value )
  645. {
  646. identical = false;
  647. }
  648. if (te == selected_te)
  649. {
  650. selected_value = value;
  651. have_selected = true;
  652. }
  653. }
  654. }
  655. if (!identical && have_selected)
  656. {
  657. break;
  658. }
  659. }
  660. if (have_first || have_selected)
  661. {
  662. res = selected_value;
  663. }
  664. return identical;
  665. }
  666. // Templates
  667. //-----------------------------------------------------------------------------
  668. // isMultipleTEValue iterate through all TEs and test for uniqueness 
  669. // with certain return value ignored when performing the test. 
  670. // e.g. when testing if the selection has a unique non-empty homeurl :
  671. // you can set ignore_value = "" and it will only compare among the non-empty  
  672. // homeUrls and ignore the empty ones.
  673. //-----------------------------------------------------------------------------
  674. template <typename T> bool LLObjectSelection::isMultipleTEValue(LLSelectedTEGetFunctor<T>* func, const T& ignore_value)
  675. {
  676. bool have_first = false;
  677. T selected_value = T();
  678. // Now iterate through all TEs to test for sameness
  679. bool unique = TRUE;
  680. for (iterator iter = begin(); iter != end(); iter++)
  681. {
  682. LLSelectNode* node = *iter;
  683. LLViewerObject* object = node->getObject();
  684. for (S32 te = 0; te < object->getNumTEs(); ++te)
  685. {
  686. if (!node->isTESelected(te))
  687. {
  688. continue;
  689. }
  690. T value = func->get(object, te);
  691. if(value == ignore_value)
  692. {
  693. continue;
  694. }
  695. if (!have_first)
  696. {
  697. have_first = true;
  698. }
  699. else
  700. {
  701. if (value !=selected_value  )
  702. {
  703. unique = false;
  704. return !unique;
  705. }
  706. }
  707. }
  708. }
  709. return !unique;
  710. }
  711. #endif