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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llvovolume.h
  3.  * @brief LLVOVolume class header file
  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_LLVOVOLUME_H
  33. #define LL_LLVOVOLUME_H
  34. #include "llviewerobject.h"
  35. #include "llviewertexture.h"
  36. #include "llviewermedia.h"
  37. #include "llframetimer.h"
  38. #include "m3math.h" // LLMatrix3
  39. #include "m4math.h" // LLMatrix4
  40. #include <map>
  41. class LLViewerTextureAnim;
  42. class LLDrawPool;
  43. class LLSelectNode;
  44. class LLObjectMediaDataClient;
  45. class LLObjectMediaNavigateClient;
  46. typedef std::vector<viewer_media_t> media_list_t;
  47. enum LLVolumeInterfaceType
  48. {
  49. INTERFACE_FLEXIBLE = 1,
  50. };
  51. // Base class for implementations of the volume - Primitive, Flexible Object, etc.
  52. class LLVolumeInterface
  53. {
  54. public:
  55. virtual ~LLVolumeInterface() { }
  56. virtual LLVolumeInterfaceType getInterfaceType() const = 0;
  57. virtual BOOL doIdleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) = 0;
  58. virtual BOOL doUpdateGeometry(LLDrawable *drawable) = 0;
  59. virtual LLVector3 getPivotPosition() const = 0;
  60. virtual void onSetVolume(const LLVolumeParams &volume_params, const S32 detail) = 0;
  61. virtual void onSetScale(const LLVector3 &scale, BOOL damped) = 0;
  62. virtual void onParameterChanged(U16 param_type, LLNetworkData *data, BOOL in_use, bool local_origin) = 0;
  63. virtual void onShift(const LLVector3 &shift_vector) = 0;
  64. virtual bool isVolumeUnique() const = 0; // Do we need a unique LLVolume instance?
  65. virtual bool isVolumeGlobal() const = 0; // Are we in global space?
  66. virtual bool isActive() const = 0; // Is this object currently active?
  67. virtual const LLMatrix4& getWorldMatrix(LLXformMatrix* xform) const = 0;
  68. virtual void updateRelativeXform() = 0;
  69. virtual U32 getID() const = 0;
  70. virtual void preRebuild() = 0;
  71. };
  72. // Class which embodies all Volume objects (with pcode LL_PCODE_VOLUME)
  73. class LLVOVolume : public LLViewerObject
  74. {
  75. LOG_CLASS(LLVOVolume);
  76. protected:
  77. virtual ~LLVOVolume();
  78. public:
  79. static void initClass();
  80. static void cleanupClass();
  81. static void preUpdateGeom();
  82. enum 
  83. {
  84. VERTEX_DATA_MASK = (1 << LLVertexBuffer::TYPE_VERTEX) |
  85. (1 << LLVertexBuffer::TYPE_NORMAL) |
  86. (1 << LLVertexBuffer::TYPE_TEXCOORD0) |
  87. (1 << LLVertexBuffer::TYPE_TEXCOORD1) |
  88. (1 << LLVertexBuffer::TYPE_COLOR)
  89. };
  90. public:
  91. LLVOVolume(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp);
  92. /*virtual*/ void markDead(); // Override (and call through to parent) to clean up media references
  93. /*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline);
  94. void deleteFaces();
  95. void animateTextures();
  96. /*virtual*/ BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
  97. /*virtual*/ BOOL isActive() const;
  98. /*virtual*/ BOOL isAttachment() const;
  99. /*virtual*/ BOOL isRootEdit() const; // overridden for sake of attachments treating themselves as a root object
  100. /*virtual*/ BOOL isHUDAttachment() const;
  101. void generateSilhouette(LLSelectNode* nodep, const LLVector3& view_point);
  102. /*virtual*/ BOOL setParent(LLViewerObject* parent);
  103. S32 getLOD() const { return mLOD; }
  104. const LLVector3 getPivotPositionAgent() const;
  105. const LLMatrix4& getRelativeXform() const { return mRelativeXform; }
  106. const LLMatrix3& getRelativeXformInvTrans() const { return mRelativeXformInvTrans; }
  107. /*virtual*/ const LLMatrix4 getRenderMatrix() const;
  108. U32  getRenderCost(std::set<LLUUID> &textures) const;
  109. /*virtual*/ BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end, 
  110.   S32 face = -1,                        // which face to check, -1 = ALL_SIDES
  111.   BOOL pick_transparent = FALSE,
  112.   S32* face_hit = NULL,                 // which face was hit
  113.   LLVector3* intersection = NULL,       // return the intersection point
  114.   LLVector2* tex_coord = NULL,          // return the texture coordinates of the intersection point
  115.   LLVector3* normal = NULL,             // return the surface normal at the intersection point
  116.   LLVector3* bi_normal = NULL           // return the surface bi-normal at the intersection point
  117. );
  118. LLVector3 agentPositionToVolume(const LLVector3& pos) const;
  119. LLVector3 agentDirectionToVolume(const LLVector3& dir) const;
  120. LLVector3 volumePositionToAgent(const LLVector3& dir) const;
  121. LLVector3 volumeDirectionToAgent(const LLVector3& dir) const;
  122. BOOL getVolumeChanged() const { return mVolumeChanged; }
  123. /*virtual*/ F32   getRadius() const { return mVObjRadius; };
  124. const LLMatrix4& getWorldMatrix(LLXformMatrix* xform) const;
  125. void markForUpdate(BOOL priority) { LLViewerObject::markForUpdate(priority); mVolumeChanged = TRUE; }
  126. /*virtual*/ void onShift(const LLVector3 &shift_vector); // Called when the drawable shifts
  127. /*virtual*/ void parameterChanged(U16 param_type, bool local_origin);
  128. /*virtual*/ void parameterChanged(U16 param_type, LLNetworkData* data, BOOL in_use, bool local_origin);
  129. /*virtual*/ U32 processUpdateMessage(LLMessageSystem *mesgsys,
  130. void **user_data,
  131. U32 block_num, const EObjectUpdateType update_type,
  132. LLDataPacker *dp);
  133. /*virtual*/ void setSelected(BOOL sel);
  134. /*virtual*/ BOOL setDrawableParent(LLDrawable* parentp);
  135. /*virtual*/ void setScale(const LLVector3 &scale, BOOL damped);
  136. /*virtual*/ void setNumTEs(const U8 num_tes);
  137. /*virtual*/ void setTEImage(const U8 te, LLViewerTexture *imagep);
  138. /*virtual*/ S32 setTETexture(const U8 te, const LLUUID &uuid);
  139. /*virtual*/ S32 setTEColor(const U8 te, const LLColor3 &color);
  140. /*virtual*/ S32 setTEColor(const U8 te, const LLColor4 &color);
  141. /*virtual*/ S32 setTEBumpmap(const U8 te, const U8 bump);
  142. /*virtual*/ S32 setTEShiny(const U8 te, const U8 shiny);
  143. /*virtual*/ S32 setTEFullbright(const U8 te, const U8 fullbright);
  144. /*virtual*/ S32 setTEBumpShinyFullbright(const U8 te, const U8 bump);
  145. /*virtual*/ S32 setTEMediaFlags(const U8 te, const U8 media_flags);
  146. /*virtual*/ S32 setTEGlow(const U8 te, const F32 glow);
  147. /*virtual*/ S32 setTEScale(const U8 te, const F32 s, const F32 t);
  148. /*virtual*/ S32 setTEScaleS(const U8 te, const F32 s);
  149. /*virtual*/ S32 setTEScaleT(const U8 te, const F32 t);
  150. /*virtual*/ S32 setTETexGen(const U8 te, const U8 texgen);
  151. /*virtual*/ S32 setTEMediaTexGen(const U8 te, const U8 media);
  152. /*virtual*/ BOOL  setMaterial(const U8 material);
  153. void setTexture(const S32 face);
  154. S32     getIndexInTex() const {return mIndexInTex ;}
  155. /*virtual*/ BOOL setVolume(const LLVolumeParams &volume_params, const S32 detail, bool unique_volume = false);
  156. void updateSculptTexture();
  157. void    setIndexInTex(S32 index) { mIndexInTex = index ;}
  158. void sculpt();
  159. void updateRelativeXform();
  160. /*virtual*/ BOOL updateGeometry(LLDrawable *drawable);
  161. /*virtual*/ void updateFaceSize(S32 idx);
  162. /*virtual*/ BOOL updateLOD();
  163. void updateRadius();
  164. /*virtual*/ void updateTextures();
  165. void updateTextureVirtualSize();
  166. void updateFaceFlags();
  167. void regenFaces();
  168. BOOL genBBoxes(BOOL force_global);
  169. void preRebuild();
  170. virtual void updateSpatialExtents(LLVector3& min, LLVector3& max);
  171. virtual F32 getBinRadius();
  172. virtual U32 getPartitionType() const;
  173. // For Lights
  174. void setIsLight(BOOL is_light);
  175. void setLightColor(const LLColor3& color);
  176. void setLightIntensity(F32 intensity);
  177. void setLightRadius(F32 radius);
  178. void setLightFalloff(F32 falloff);
  179. void setLightCutoff(F32 cutoff);
  180. void setLightTextureID(LLUUID id);
  181. void setSpotLightParams(LLVector3 params);
  182. BOOL getIsLight() const;
  183. LLColor3 getLightBaseColor() const; // not scaled by intensity
  184. LLColor3 getLightColor() const; // scaled by intensity
  185. LLUUID getLightTextureID() const;
  186. LLVector3 getSpotLightParams() const;
  187. void updateSpotLightPriority();
  188. F32 getSpotLightPriority() const;
  189. LLViewerTexture* getLightTexture();
  190. F32 getLightIntensity() const;
  191. F32 getLightRadius() const;
  192. F32 getLightFalloff() const;
  193. F32 getLightCutoff() const;
  194. // Flexible Objects
  195. U32 getVolumeInterfaceID() const;
  196. virtual BOOL isFlexible() const;
  197. virtual BOOL isSculpted() const;
  198. virtual BOOL hasLightTexture() const;
  199. BOOL isVolumeGlobal() const;
  200. BOOL canBeFlexible() const;
  201. BOOL setIsFlexible(BOOL is_flexible);
  202.     // Functions that deal with media, or media navigation
  203.     
  204.     // Update this object's media data with the given media data array
  205.     // (typically this is only called upon a response from a server request)
  206. void updateObjectMediaData(const LLSD &media_data_array, const std::string &media_version);
  207.     
  208.     // Bounce back media at the given index to its current URL (or home URL, if current URL is empty)
  209. void mediaNavigateBounceBack(U8 texture_index);
  210.     
  211.     // Returns whether or not this object has permission to navigate or control 
  212. // the given media entry
  213. enum MediaPermType {
  214. MEDIA_PERM_INTERACT, MEDIA_PERM_CONTROL
  215. };
  216.     bool hasMediaPermission(const LLMediaEntry* media_entry, MediaPermType perm_type);
  217.     
  218. void mediaNavigated(LLViewerMediaImpl *impl, LLPluginClassMedia* plugin, std::string new_location);
  219. void mediaEvent(LLViewerMediaImpl *impl, LLPluginClassMedia* plugin, LLViewerMediaObserver::EMediaEvent event);
  220. // Sync the given media data with the impl and the given te
  221. void syncMediaData(S32 te, const LLSD &media_data, bool merge, bool ignore_agent);
  222. // Send media data update to the simulator.
  223. void sendMediaDataUpdate();
  224. viewer_media_t getMediaImpl(U8 face_id) const;
  225. S32 getFaceIndexWithMediaImpl(const LLViewerMediaImpl* media_impl, S32 start_face_id);
  226. F64 getTotalMediaInterest() const;
  227.    
  228. bool hasMedia() const;
  229. LLVector3 getApproximateFaceNormal(U8 face_id);
  230. // Returns 'true' iff the media data for this object is in flight
  231. bool isMediaDataBeingFetched() const;
  232. // Returns the "last fetched" media version, or -1 if not fetched yet
  233. S32 getLastFetchedMediaVersion() const { return mLastFetchedMediaVersion; }
  234. protected:
  235. S32 computeLODDetail(F32 distance, F32 radius);
  236. BOOL calcLOD();
  237. LLFace* addFace(S32 face_index);
  238. void updateTEData();
  239. void requestMediaDataUpdate(bool isNew);
  240. void cleanUpMediaImpls();
  241. void addMediaImpl(LLViewerMediaImpl* media_impl, S32 texture_index) ;
  242. void removeMediaImpl(S32 texture_index) ;
  243. public:
  244. LLViewerTextureAnim *mTextureAnimp;
  245. U8 mTexAnimMode;
  246. private:
  247. friend class LLDrawable;
  248. BOOL mFaceMappingChanged;
  249. LLFrameTimer mTextureUpdateTimer;
  250. S32 mLOD;
  251. BOOL mLODChanged;
  252. BOOL mSculptChanged;
  253. F32 mSpotLightPriority;
  254. LLMatrix4 mRelativeXform;
  255. LLMatrix3 mRelativeXformInvTrans;
  256. BOOL mVolumeChanged;
  257. F32 mVObjRadius;
  258. LLVolumeInterface *mVolumeImpl;
  259. LLPointer<LLViewerFetchedTexture> mSculptTexture;
  260. LLPointer<LLViewerFetchedTexture> mLightTexture;
  261. media_list_t mMediaImplList;
  262. S32 mLastFetchedMediaVersion; // as fetched from the server, starts as -1
  263. S32 mIndexInTex;
  264. // statics
  265. public:
  266. static F32 sLODSlopDistanceFactor;// Changing this to zero, effectively disables the LOD transition slop 
  267. static F32 sLODFactor; // LOD scale factor
  268. static F32 sDistanceFactor; // LOD distance factor
  269. static LLPointer<LLObjectMediaDataClient> sObjectMediaClient;
  270. static LLPointer<LLObjectMediaNavigateClient> sObjectMediaNavigateClient;
  271. static const U32 ARC_TEXTURE_COST = 5;
  272. protected:
  273. static S32 sNumLODChanges;
  274. friend class LLVolumeImplFlexible;
  275. };
  276. #endif // LL_LLVOVOLUME_H