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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llviewerobject.h
  3.  * @brief Description of LLViewerObject class, which is the base class for most objects in the viewer.
  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_LLVIEWEROBJECT_H
  33. #define LL_LLVIEWEROBJECT_H
  34. #include <map>
  35. #include "llassetstorage.h"
  36. #include "lldarrayptr.h"
  37. #include "llhudtext.h"
  38. #include "llhudicon.h"
  39. #include "llinventory.h"
  40. #include "llrefcount.h"
  41. #include "llmemtype.h"
  42. #include "llprimitive.h"
  43. #include "lluuid.h"
  44. #include "llvoinventorylistener.h"
  45. #include "object_flags.h"
  46. #include "llquaternion.h"
  47. #include "v3dmath.h"
  48. #include "v3math.h"
  49. #include "llvertexbuffer.h"
  50. class LLAgent; // TODO: Get rid of this.
  51. class LLAudioSource;
  52. class LLAudioSourceVO;
  53. class LLBBox;
  54. class LLDataPacker;
  55. class LLColor4;
  56. class LLFrameTimer;
  57. class LLDrawable;
  58. class LLHost;
  59. class LLWorld;
  60. class LLNameValue;
  61. class LLNetMap;
  62. class LLMessageSystem;
  63. class LLPartSysData;
  64. class LLPrimitive;
  65. class LLPipeline;
  66. class LLTextureEntry;
  67. class LLViewerTexture;
  68. class LLViewerInventoryItem;
  69. class LLViewerObject;
  70. class LLViewerPartSourceScript;
  71. class LLViewerRegion;
  72. class LLViewerObjectMedia;
  73. class LLVOInventoryListener;
  74. class LLVOAvatar;
  75. typedef enum e_object_update_type
  76. {
  77. OUT_FULL,
  78. OUT_TERSE_IMPROVED,
  79. OUT_FULL_COMPRESSED,
  80. OUT_FULL_CACHED,
  81. } EObjectUpdateType;
  82. // callback typedef for inventory
  83. typedef void (*inventory_callback)(LLViewerObject*,
  84.    InventoryObjectList*,
  85.    S32 serial_num,
  86.    void*);
  87. // a small struct for keeping track of joints
  88. struct LLVOJointInfo
  89. {
  90. EHavokJointType mJointType;
  91. LLVector3 mPivot; // parent-frame
  92. // whether the below an axis or anchor (and thus its frame)
  93. // depends on the joint type:
  94. //     HINGE   ==>   axis=parent-frame
  95. //     P2P     ==>   anchor=child-frame
  96. LLVector3 mAxisOrAnchor;
  97. };
  98. // for exporting textured materials from SL
  99. struct LLMaterialExportInfo
  100. {
  101. public:
  102. LLMaterialExportInfo(S32 mat_index, S32 texture_index, LLColor4 color) : 
  103.   mMaterialIndex(mat_index), mTextureIndex(texture_index), mColor(color) {};
  104. S32 mMaterialIndex;
  105. S32 mTextureIndex;
  106. LLColor4 mColor;
  107. };
  108. //============================================================================
  109. class LLViewerObject : public LLPrimitive, public LLRefCount, public LLGLUpdate
  110. {
  111. protected:
  112. ~LLViewerObject(); // use unref()
  113. // TomY: Provide for a list of extra parameter structures, mapped by structure name
  114. struct ExtraParameter
  115. {
  116. BOOL in_use;
  117. LLNetworkData *data;
  118. };
  119. std::map<U16, ExtraParameter*> mExtraParameterList;
  120. public:
  121. typedef std::list<LLPointer<LLViewerObject> > child_list_t;
  122. typedef std::list<LLPointer<LLViewerObject> > vobj_list_t;
  123. typedef const child_list_t const_child_list_t;
  124. LLViewerObject(const LLUUID &id, const LLPCode type, LLViewerRegion *regionp, BOOL is_global = FALSE);
  125. MEM_TYPE_NEW(LLMemType::MTYPE_OBJECT);
  126. virtual void markDead(); // Mark this object as dead, and clean up its references
  127. BOOL isDead() const {return mDead;}
  128. BOOL isOrphaned() const { return mOrphaned; }
  129. BOOL isParticleSource() const;
  130. virtual LLVOAvatar* asAvatar();
  131. static void initVOClasses();
  132. static void cleanupVOClasses();
  133. void addNVPair(const std::string& data);
  134. BOOL removeNVPair(const std::string& name);
  135. LLNameValue* getNVPair(const std::string& name) const; // null if no name value pair by that name
  136. // Object create and update functions
  137. virtual BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
  138. // Types of media we can associate
  139. enum { MEDIA_NONE = 0, MEDIA_SET = 1 };
  140. // Return codes for processUpdateMessage
  141. enum { 
  142.         MEDIA_URL_REMOVED = 0x1, 
  143.         MEDIA_URL_ADDED = 0x2, 
  144.         MEDIA_URL_UPDATED = 0x4, 
  145.         MEDIA_FLAGS_CHANGED = 0x8,
  146.         INVALID_UPDATE = 0x80000000
  147.     };
  148. virtual U32 processUpdateMessage(LLMessageSystem *mesgsys,
  149. void **user_data,
  150. U32 block_num,
  151. const EObjectUpdateType update_type,
  152. LLDataPacker *dp);
  153. virtual BOOL    isActive() const; // Whether this object needs to do an idleUpdate.
  154. BOOL onActiveList() const {return mOnActiveList;}
  155. void setOnActiveList(BOOL on_active) { mOnActiveList = on_active; }
  156. virtual BOOL isAttachment() const { return FALSE; }
  157. virtual BOOL isHUDAttachment() const { return FALSE; }
  158. virtual void  updateRadius() {};
  159. virtual F32  getVObjRadius() const; // default implemenation is mDrawable->getRadius()
  160. BOOL  isJointChild() const { return mJointInfo ? TRUE : FALSE; } 
  161. EHavokJointType getJointType() const { return mJointInfo ? mJointInfo->mJointType : HJT_INVALID; }
  162. // for jointed and other parent-relative hacks
  163. LLViewerObject* getSubParent();
  164. const LLViewerObject* getSubParent() const;
  165. // Object visiblility and GPW functions
  166. virtual void setPixelAreaAndAngle(LLAgent &agent); // Override to generate accurate apparent angle and area
  167. virtual U32 getNumVertices() const;
  168. virtual U32 getNumIndices() const;
  169. S32 getNumFaces() const { return mNumFaces; }
  170. // Graphical stuff for objects - maybe broken out into render class later?
  171. virtual void updateTextures();
  172. virtual void boostTexturePriority(BOOL boost_children = TRUE); // When you just want to boost priority of this object
  173. virtual LLDrawable* createDrawable(LLPipeline *pipeline);
  174. virtual BOOL updateGeometry(LLDrawable *drawable);
  175. virtual void updateGL();
  176. virtual void updateFaceSize(S32 idx);
  177. virtual BOOL updateLOD();
  178. virtual BOOL setDrawableParent(LLDrawable* parentp);
  179. F32 getRotTime() { return mRotTime; }
  180. void resetRot();
  181. void applyAngularVelocity(F32 dt);
  182. void setLineWidthForWindowSize(S32 window_width);
  183. static void increaseArrowLength(); // makes axis arrows for selections longer
  184. static void decreaseArrowLength(); // makes axis arrows for selections shorter
  185. // Accessor functions
  186. LLViewerRegion* getRegion() const { return mRegionp; }
  187. BOOL isSelected() const { return mUserSelected; }
  188. virtual void setSelected(BOOL sel) { mUserSelected = sel; mRotTime = 0.f;}
  189. const LLUUID &getID() const { return mID; }
  190. U32 getLocalID() const { return mLocalID; }
  191. U32 getCRC() const { return mTotalCRC; }
  192. virtual BOOL isFlexible() const { return FALSE; }
  193. virtual BOOL isSculpted() const  { return FALSE; }
  194. virtual BOOL hasLightTexture() const { return FALSE; }
  195. // This method returns true if the object is over land owned by
  196. // the agent.
  197. BOOL isOverAgentOwnedLand() const;
  198. // True if over land owned by group of which the agent is
  199. // either officer or member.
  200. BOOL isOverGroupOwnedLand() const;
  201. /*
  202. // This method will scan through this object, and then query the
  203. // selection manager to see if the local agent probably has the
  204. // ability to modify the object. Since this calls into the
  205. // selection manager, you should avoid calling this method from
  206. // there.
  207. BOOL isProbablyModifiable() const;
  208. */
  209. virtual BOOL setParent(LLViewerObject* parent);
  210. virtual void addChild(LLViewerObject *childp);
  211. virtual void removeChild(LLViewerObject *childp);
  212. const_child_list_t& getChildren() const {  return mChildList; }
  213. S32 numChildren() const { return mChildList.size(); }
  214. void addThisAndAllChildren(std::vector<LLViewerObject*>& objects);
  215. void addThisAndNonJointChildren(std::vector<LLViewerObject*>& objects);
  216. BOOL isChild(LLViewerObject *childp) const;
  217. BOOL isSeat() const;
  218. //detect if given line segment (in agent space) intersects with this viewer object.
  219. //returns TRUE if intersection detected and returns information about intersection
  220. virtual BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
  221.   S32 face = -1,                          // which face to check, -1 = ALL_SIDES
  222.   BOOL pick_transparent = FALSE,
  223.   S32* face_hit = NULL,                   // which face was hit
  224.   LLVector3* intersection = NULL,         // return the intersection point
  225.   LLVector2* tex_coord = NULL,            // return the texture coordinates of the intersection point
  226.   LLVector3* normal = NULL,               // return the surface normal at the intersection point
  227.   LLVector3* bi_normal = NULL             // return the surface bi-normal at the intersection point
  228. );
  229. virtual BOOL lineSegmentBoundingBox(const LLVector3& start, const LLVector3& end);
  230. virtual const LLVector3d getPositionGlobal() const;
  231. virtual const LLVector3 &getPositionRegion() const;
  232. virtual const LLVector3 getPositionEdit() const;
  233. virtual const LLVector3 &getPositionAgent() const;
  234. virtual const LLVector3 getRenderPosition() const;
  235. virtual const LLVector3 getPivotPositionAgent() const; // Usually = to getPositionAgent, unless like flex objects it's not
  236. LLViewerObject* getRootEdit() const;
  237. const LLQuaternion getRotationRegion() const;
  238. const LLQuaternion getRotationEdit() const;
  239. const LLQuaternion getRenderRotation() const;
  240. virtual const LLMatrix4 getRenderMatrix() const;
  241. void setPosition(const LLVector3 &pos, BOOL damped = FALSE);
  242. void setPositionGlobal(const LLVector3d &position, BOOL damped = FALSE);
  243. void setPositionRegion(const LLVector3 &position, BOOL damped = FALSE);
  244. void setPositionEdit(const LLVector3 &position, BOOL damped = FALSE);
  245. void setPositionAgent(const LLVector3 &pos_agent, BOOL damped = FALSE);
  246. void setPositionParent(const LLVector3 &pos_parent, BOOL damped = FALSE);
  247. void setPositionAbsoluteGlobal( const LLVector3d &pos_global, BOOL damped = FALSE );
  248. virtual const LLMatrix4& getWorldMatrix(LLXformMatrix* xform) const { return xform->getWorldMatrix(); }
  249. inline void setRotation(const F32 x, const F32 y, const F32 z, BOOL damped = FALSE);
  250. inline void setRotation(const LLQuaternion& quat, BOOL damped = FALSE);
  251. void sendRotationUpdate() const;
  252. /*virtual*/ void setNumTEs(const U8 num_tes);
  253. /*virtual*/ void setTE(const U8 te, const LLTextureEntry &texture_entry);
  254. /*virtual*/ S32 setTETexture(const U8 te, const LLUUID &uuid);
  255. S32 setTETextureCore(const U8 te, const LLUUID& uuid, LLHost host);
  256. /*virtual*/ S32 setTEColor(const U8 te, const LLColor3 &color);
  257. /*virtual*/ S32 setTEColor(const U8 te, const LLColor4 &color);
  258. /*virtual*/ S32 setTEScale(const U8 te, const F32 s, const F32 t);
  259. /*virtual*/ S32 setTEScaleS(const U8 te, const F32 s);
  260. /*virtual*/ S32 setTEScaleT(const U8 te, const F32 t);
  261. /*virtual*/ S32 setTEOffset(const U8 te, const F32 s, const F32 t);
  262. /*virtual*/ S32 setTEOffsetS(const U8 te, const F32 s);
  263. /*virtual*/ S32 setTEOffsetT(const U8 te, const F32 t);
  264. /*virtual*/ S32 setTERotation(const U8 te, const F32 r);
  265. /*virtual*/ S32 setTEBumpmap(const U8 te, const U8 bump );
  266. /*virtual*/ S32 setTETexGen(const U8 te, const U8 texgen );
  267. /*virtual*/ S32 setTEMediaTexGen(const U8 te, const U8 media ); // *FIXME: this confusingly acts upon a superset of setTETexGen's flags without absorbing its semantics
  268. /*virtual*/ S32 setTEShiny(const U8 te, const U8 shiny );
  269. /*virtual*/ S32 setTEFullbright(const U8 te, const U8 fullbright );
  270. /*virtual*/ S32 setTEMediaFlags(const U8 te, const U8 media_flags );
  271. /*virtual*/ S32     setTEGlow(const U8 te, const F32 glow);
  272. /*virtual*/ BOOL setMaterial(const U8 material);
  273. virtual void setTEImage(const U8 te, LLViewerTexture *imagep); // Not derived from LLPrimitive
  274. void                changeTEImage(S32 index, LLViewerTexture* new_image)  ;
  275. LLViewerTexture *getTEImage(const U8 te) const;
  276. void fitFaceTexture(const U8 face);
  277. void sendTEUpdate() const; // Sends packed representation of all texture entry information
  278. virtual void setScale(const LLVector3 &scale, BOOL damped = FALSE);
  279. void sendShapeUpdate();
  280. U8 getState() { return mState; }
  281. F32 getAppAngle() const { return mAppAngle; }
  282. F32 getPixelArea() const { return mPixelArea; }
  283. void setPixelArea(F32 area) { mPixelArea = area; }
  284. F32 getMaxScale() const;
  285. F32 getMidScale() const;
  286. F32 getMinScale() const;
  287. // Owner id is this object's owner
  288. void setAttachedSound(const LLUUID &audio_uuid, const LLUUID& owner_id, const F32 gain, const U8 flags);
  289. void adjustAudioGain(const F32 gain);
  290. void clearAttachedSound() { mAudioSourcep = NULL; }
  291.  // Create if necessary
  292. LLAudioSource *getAudioSource(const LLUUID& owner_id);
  293. bool isAudioSource() {return mAudioSourcep != NULL;}
  294. U8 getMediaType() const;
  295. void setMediaType(U8 media_type);
  296. std::string getMediaURL() const;
  297. void setMediaURL(const std::string& media_url);
  298. BOOL getMediaPassedWhitelist() const;
  299. void setMediaPassedWhitelist(BOOL passed);
  300. void sendMaterialUpdate() const;
  301. void setCanSelect(BOOL canSelect);
  302. void setDebugText(const std::string &utf8text);
  303. void setIcon(LLViewerTexture* icon_image);
  304. void clearIcon();
  305. void markForUpdate(BOOL priority);
  306. void updateVolume(const LLVolumeParams& volume_params);
  307. virtual void updateSpatialExtents(LLVector3& min, LLVector3& max);
  308. virtual F32 getBinRadius();
  309. LLBBox getBoundingBoxAgent() const;
  310. void updatePositionCaches() const; // Update the global and region position caches from the object (and parent's) xform.
  311. void updateText(); // update text label position
  312. virtual void updateDrawable(BOOL force_damped); // force updates on static objects
  313. void setDrawableState(U32 state, BOOL recursive = TRUE);
  314. void clearDrawableState(U32 state, BOOL recursive = TRUE);
  315. // Called when the drawable shifts
  316. virtual void onShift(const LLVector3 &shift_vector) { }
  317. //////////////////////////////////////
  318. //
  319. // Inventory methods
  320. //
  321. // This function is called when someone is interested in a viewer
  322. // object's inventory. The callback is called as soon as the
  323. // viewer object has the inventory stored locally.
  324. void registerInventoryListener(LLVOInventoryListener* listener, void* user_data);
  325. void removeInventoryListener(LLVOInventoryListener* listener);
  326. BOOL isInventoryPending() { return mInventoryPending; }
  327. void clearInventoryListeners();
  328. void requestInventory();
  329. void fetchInventoryFromServer();
  330. static void processTaskInv(LLMessageSystem* msg, void** user_data);
  331. void removeInventory(const LLUUID& item_id);
  332. // The updateInventory() call potentially calls into the selection
  333. // manager, so do no call updateInventory() from the selection
  334. // manager until we have better iterators.
  335. void updateInventory(LLViewerInventoryItem* item, U8 key, bool is_new);
  336. void updateInventoryLocal(LLInventoryItem* item, U8 key); // Update without messaging.
  337. LLInventoryObject* getInventoryObject(const LLUUID& item_id);
  338. void getInventoryContents(InventoryObjectList& objects);
  339. LLInventoryObject* getInventoryRoot();
  340. LLViewerInventoryItem* getInventoryItemByAsset(const LLUUID& asset_id);
  341. S16 getInventorySerial() const { return mInventorySerialNum; }
  342. // These functions does viewer-side only object inventory modifications
  343. void updateViewerInventoryAsset(
  344. const LLViewerInventoryItem* item,
  345. const LLUUID& new_asset);
  346. // This function will make sure that we refresh the inventory.
  347. void dirtyInventory();
  348. BOOL isInventoryDirty() { return mInventoryDirty; }
  349. // save a script, which involves removing the old one, and rezzing
  350. // in the new one. This method should be called with the asset id
  351. // of the new and old script AFTER the bytecode has been saved.
  352. void saveScript(const LLViewerInventoryItem* item, BOOL active, bool is_new);
  353. // move an inventory item out of the task and into agent
  354. // inventory. This operation is based on messaging. No permissions
  355. // checks are made on the viewer - the server will double check.
  356. void moveInventory(const LLUUID& agent_folder, const LLUUID& item_id);
  357. // Find the number of instances of this object's inventory that are of the given type
  358. S32 countInventoryContents( LLAssetType::EType type );
  359. BOOL permAnyOwner() const;
  360. BOOL permYouOwner() const;
  361. BOOL permGroupOwner() const;
  362. BOOL permOwnerModify() const;
  363. BOOL permModify() const;
  364. BOOL permCopy() const;
  365. BOOL permMove() const;
  366. BOOL permTransfer() const;
  367. inline BOOL usePhysics() const { return ((mFlags & FLAGS_USE_PHYSICS) != 0); }
  368. inline BOOL flagScripted() const { return ((mFlags & FLAGS_SCRIPTED) != 0); }
  369. inline BOOL flagHandleTouch() const { return ((mFlags & FLAGS_HANDLE_TOUCH) != 0); }
  370. inline BOOL flagTakesMoney() const { return ((mFlags & FLAGS_TAKES_MONEY) != 0); }
  371. inline BOOL flagPhantom() const { return ((mFlags & FLAGS_PHANTOM) != 0); }
  372. inline BOOL flagInventoryEmpty() const { return ((mFlags & FLAGS_INVENTORY_EMPTY) != 0); }
  373. inline BOOL flagCastShadows() const { return ((mFlags & FLAGS_CAST_SHADOWS) != 0); }
  374. inline BOOL flagAllowInventoryAdd() const { return ((mFlags & FLAGS_ALLOW_INVENTORY_DROP) != 0); }
  375. inline BOOL flagTemporary() const { return ((mFlags & FLAGS_TEMPORARY) != 0); }
  376. inline BOOL flagTemporaryOnRez() const { return ((mFlags & FLAGS_TEMPORARY_ON_REZ) != 0); }
  377. inline BOOL flagAnimSource() const { return ((mFlags & FLAGS_ANIM_SOURCE) != 0); }
  378. inline BOOL flagCameraSource() const { return ((mFlags & FLAGS_CAMERA_SOURCE) != 0); }
  379. inline BOOL flagCameraDecoupled() const { return ((mFlags & FLAGS_CAMERA_DECOUPLED) != 0); }
  380. inline BOOL flagObjectMove() const { return ((mFlags & FLAGS_OBJECT_MOVE) != 0); }
  381. bool getIncludeInSearch() const;
  382. void setIncludeInSearch(bool include_in_search);
  383. // Does "open" object menu item apply?
  384. BOOL allowOpen() const;
  385. void setClickAction(U8 action) { mClickAction = action; }
  386. U8 getClickAction() const { return mClickAction; }
  387. bool specialHoverCursor() const; // does it have a special hover cursor?
  388. void setRegion(LLViewerRegion *regionp);
  389. virtual void updateRegion(LLViewerRegion *regionp) {}
  390. void updateFlags();
  391. BOOL setFlags(U32 flag, BOOL state);
  392. virtual void dump() const;
  393. static U32 getNumZombieObjects() { return sNumZombieObjects; }
  394. void printNameValuePairs() const;
  395. virtual S32 getLOD() const { return 3; } 
  396. virtual U32 getPartitionType() const;
  397. virtual void dirtySpatialGroup(BOOL priority = FALSE) const;
  398. virtual void dirtyMesh();
  399. virtual LLNetworkData* getParameterEntry(U16 param_type) const;
  400. virtual bool setParameterEntry(U16 param_type, const LLNetworkData& new_value, bool local_origin);
  401. virtual BOOL getParameterEntryInUse(U16 param_type) const;
  402. virtual bool setParameterEntryInUse(U16 param_type, BOOL in_use, bool local_origin);
  403. // Called when a parameter is changed
  404. virtual void parameterChanged(U16 param_type, bool local_origin);
  405. virtual void parameterChanged(U16 param_type, LLNetworkData* data, BOOL in_use, bool local_origin);
  406. friend class LLViewerObjectList;
  407. friend class LLViewerMediaList;
  408. public:
  409. //counter-translation
  410. void resetChildrenPosition(const LLVector3& offset, BOOL simplified = FALSE) ;
  411. //counter-rotation
  412. void resetChildrenRotationAndPosition(const std::vector<LLQuaternion>& rotations, 
  413. const std::vector<LLVector3>& positions) ;
  414. void saveUnselectedChildrenRotation(std::vector<LLQuaternion>& rotations) ;
  415. void saveUnselectedChildrenPosition(std::vector<LLVector3>& positions) ;
  416. std::vector<LLVector3> mUnselectedChildrenPositions ;
  417. private:
  418. ExtraParameter* createNewParameterEntry(U16 param_type);
  419. ExtraParameter* getExtraParameterEntry(U16 param_type) const;
  420. ExtraParameter* getExtraParameterEntryCreate(U16 param_type);
  421. bool unpackParameterEntry(U16 param_type, LLDataPacker *dp);
  422.     // This function checks to see if the given media URL has changed its version
  423.     // and the update wasn't due to this agent's last action.
  424.     U32 checkMediaURL(const std::string &media_url);
  425. public:
  426. //
  427. // Viewer-side only types - use the LL_PCODE_APP mask.
  428. //
  429. typedef enum e_vo_types
  430. {
  431. LL_VO_CLOUDS = LL_PCODE_APP | 0x20,
  432. LL_VO_SURFACE_PATCH = LL_PCODE_APP | 0x30,
  433. //LL_VO_STARS = LL_PCODE_APP | 0x40,
  434. LL_VO_SQUARE_TORUS = LL_PCODE_APP | 0x50,
  435. LL_VO_SKY = LL_PCODE_APP | 0x60,
  436. LL_VO_WATER = LL_PCODE_APP | 0x70,
  437. LL_VO_GROUND = LL_PCODE_APP | 0x80,
  438. LL_VO_PART_GROUP = LL_PCODE_APP | 0x90,
  439. LL_VO_TRIANGLE_TORUS = LL_PCODE_APP | 0xa0,
  440. LL_VO_WL_SKY = LL_PCODE_APP | 0xb0, // should this be moved to 0x40?
  441. LL_VO_HUD_PART_GROUP = LL_PCODE_APP | 0xc0,
  442. } EVOType;
  443. LLUUID mID;
  444. // unique within region, not unique across regions
  445. // Local ID = 0 is not used
  446. U32 mLocalID;
  447. // Last total CRC received from sim, used for caching
  448. U32 mTotalCRC;
  449. LLPointer<LLViewerTexture> *mTEImages;
  450. // Selection, picking and rendering variables
  451. U32 mGLName; // GL "name" used by selection code
  452. BOOL mbCanSelect; // true if user can select this object by clicking
  453. // Grabbed from UPDATE_FLAGS
  454. U32 mFlags;
  455. // Pipeline classes
  456. LLPointer<LLDrawable> mDrawable;
  457. // Band-aid to select object after all creation initialization is done
  458. BOOL mCreateSelected;
  459. // Replace textures with web pages on this object while drawing
  460. BOOL mRenderMedia;
  461. // In bits
  462. S32 mBestUpdatePrecision;
  463. // TODO: Make all this stuff private.  JC
  464. LLPointer<LLHUDText> mText;
  465. LLPointer<LLHUDIcon> mIcon;
  466. static BOOL sUseSharedDrawables;
  467. protected:
  468. // delete an item in the inventory, but don't tell the
  469. // server. This is used internally by remove, update, and
  470. // savescript.
  471. void deleteInventoryItem(const LLUUID& item_id);
  472. // do the update/caching logic. called by saveScript and
  473. // updateInventory.
  474. void doUpdateInventory(LLPointer<LLViewerInventoryItem>& item, U8 key, bool is_new);
  475. static LLViewerObject *createObject(const LLUUID &id, LLPCode pcode, LLViewerRegion *regionp);
  476. BOOL setData(const U8 *datap, const U32 data_size);
  477. // Hide or show HUD, icon and particles
  478. void hideExtraDisplayItems( BOOL hidden );
  479. //////////////////////////
  480. //
  481. // inventory functionality
  482. //
  483. static void processTaskInvFile(void** user_data, S32 error_code, LLExtStat ext_status);
  484. void loadTaskInvFile(const std::string& filename);
  485. void doInventoryCallback();
  486. BOOL isOnMap();
  487. void unpackParticleSource(const S32 block_num, const LLUUID& owner_id);
  488. void unpackParticleSource(LLDataPacker &dp, const LLUUID& owner_id);
  489. void deleteParticleSource();
  490. void setParticleSource(const LLPartSysData& particle_parameters, const LLUUID& owner_id);
  491. private:
  492. void setNameValueList(const std::string& list); // clears nv pairs and then individually adds n separated NV pairs from  terminated string
  493. void deleteTEImages(); // correctly deletes list of images
  494. protected:
  495. typedef std::map<char *, LLNameValue *> name_value_map_t;
  496. name_value_map_t mNameValuePairs; // Any name-value pairs stored by script
  497. child_list_t mChildList;
  498. F64 mLastInterpUpdateSecs; // Last update for purposes of interpolation
  499. F64 mLastMessageUpdateSecs; // Last update from a message from the simulator
  500. TPACKETID mLatestRecvPacketID; // Latest time stamp on message from simulator
  501. // extra data sent from the sim...currently only used for tree species info
  502. U8* mData;
  503. LLPointer<LLViewerPartSourceScript> mPartSourcep; // Particle source associated with this object.
  504. LLAudioSourceVO* mAudioSourcep;
  505. F32 mAudioGain;
  506. F32 mAppAngle; // Apparent visual arc in degrees
  507. F32 mPixelArea; // Apparent area in pixels
  508. // This is the object's inventory from the viewer's perspective.
  509. InventoryObjectList* mInventory;
  510. class LLInventoryCallbackInfo
  511. {
  512. public:
  513. ~LLInventoryCallbackInfo();
  514. LLVOInventoryListener* mListener;
  515. void* mInventoryData;
  516. };
  517. typedef std::list<LLInventoryCallbackInfo*> callback_list_t;
  518. callback_list_t mInventoryCallbacks;
  519. S16 mInventorySerialNum;
  520. LLViewerRegion *mRegionp; // Region that this object belongs to.
  521. BOOL mInventoryPending;
  522. BOOL mInventoryDirty;
  523. BOOL mDead;
  524. BOOL mOrphaned; // This is an orphaned child
  525. BOOL mUserSelected; // Cached user select information
  526. BOOL mOnActiveList;
  527. BOOL mOnMap; // On the map.
  528. BOOL mStatic; // Object doesn't move.
  529. S32 mNumFaces;
  530. F32 mTimeDilation; // Time dilation sent with the object.
  531. F32 mRotTime; // Amount (in seconds) that object has rotated according to angular velocity (llSetTargetOmega)
  532. LLQuaternion mLastRot; // last rotation received from the simulator
  533. LLVOJointInfo*  mJointInfo;
  534. U8 mState; // legacy
  535. LLViewerObjectMedia* mMedia; // NULL if no media associated
  536. U8 mClickAction;
  537. static U32 sNumZombieObjects; // Objects which are dead, but not deleted
  538. static BOOL sMapDebug; // Map render mode
  539. static LLColor4 sEditSelectColor;
  540. static LLColor4 sNoEditSelectColor;
  541. static F32 sCurrentPulse;
  542. static BOOL sPulseEnabled;
  543. static S32 sAxisArrowLength;
  544. // These two caches are only correct for non-parented objects right now!
  545. mutable LLVector3 mPositionRegion;
  546. mutable LLVector3 mPositionAgent;
  547. private:
  548. static S32 sNumObjects;
  549. public:
  550. const LLUUID &getItemID() const { return mAttachmentItemID; }
  551. void setItemID(const LLUUID &id) { mAttachmentItemID = id; }
  552. private:
  553. LLUUID mAttachmentItemID; // ItemID when item is in user inventory.
  554. };
  555. ///////////////////
  556. //
  557. // Inlines
  558. //
  559. //
  560. inline void LLViewerObject::setRotation(const LLQuaternion& quat, BOOL damped)
  561. {
  562. LLPrimitive::setRotation(quat);
  563. setChanged(ROTATED | SILHOUETTE);
  564. updateDrawable(damped);
  565. }
  566. inline void LLViewerObject::setRotation(const F32 x, const F32 y, const F32 z, BOOL damped)
  567. {
  568. LLPrimitive::setRotation(x, y, z);
  569. setChanged(ROTATED | SILHOUETTE);
  570. updateDrawable(damped);
  571. }
  572. class LLViewerObjectMedia
  573. {
  574. public:
  575. LLViewerObjectMedia() : mMediaURL(), mPassedWhitelist(FALSE), mMediaType(0) { }
  576. std::string mMediaURL; // for web pages on surfaces, one per prim
  577. BOOL mPassedWhitelist; // user has OK'd display
  578. U8 mMediaType; // see LLTextureEntry::WEB_PAGE, etc.
  579. };
  580. // subclass of viewer object that can be added to particle partitions
  581. class LLAlphaObject : public LLViewerObject
  582. {
  583. public:
  584. LLAlphaObject(const LLUUID &id, const LLPCode type, LLViewerRegion *regionp)
  585. : LLViewerObject(id,type,regionp) 
  586. { mDepth = 0.f; }
  587. virtual F32 getPartSize(S32 idx);
  588. virtual void getGeometry(S32 idx,
  589. LLStrider<LLVector3>& verticesp,
  590. LLStrider<LLVector3>& normalsp, 
  591. LLStrider<LLVector2>& texcoordsp,
  592. LLStrider<LLColor4U>& colorsp, 
  593. LLStrider<U16>& indicesp) = 0;
  594. F32 mDepth;
  595. };
  596. class LLStaticViewerObject : public LLViewerObject
  597. {
  598. public:
  599. LLStaticViewerObject(const LLUUID& id, const LLPCode type, LLViewerRegion* regionp, BOOL is_global = FALSE)
  600. : LLViewerObject(id,type,regionp, is_global)
  601. { }
  602. virtual void updateDrawable(BOOL force_damped);
  603. };
  604. extern BOOL gVelocityInterpolate;
  605. extern BOOL gPingInterpolate;
  606. #endif