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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llspatialpartition.h
  3.  * @brief LLSpatialGroup header file including definitions for supporting functions
  4.  *
  5.  * $LicenseInfo:firstyear=2003&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2003-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_LLSPATIALPARTITION_H
  33. #define LL_LLSPATIALPARTITION_H
  34. #define SG_MIN_DIST_RATIO 0.00001f
  35. #include "lldrawable.h"
  36. #include "lloctree.h"
  37. #include "llpointer.h"
  38. #include "llrefcount.h"
  39. #include "llvertexbuffer.h"
  40. #include "llgltypes.h"
  41. #include "llcubemap.h"
  42. #include "lldrawpool.h"
  43. #include "llface.h"
  44. #include "llviewercamera.h"
  45. #include <queue>
  46. #define SG_STATE_INHERIT_MASK (OCCLUDED)
  47. #define SG_INITIAL_STATE_MASK (DIRTY | GEOM_DIRTY)
  48. class LLSpatialPartition;
  49. class LLSpatialBridge;
  50. class LLSpatialGroup;
  51. class LLTextureAtlas;
  52. class LLTextureAtlasSlot;
  53. S32 AABBSphereIntersect(const LLVector3& min, const LLVector3& max, const LLVector3 &origin, const F32 &rad);
  54. S32 AABBSphereIntersectR2(const LLVector3& min, const LLVector3& max, const LLVector3 &origin, const F32 &radius_squared);
  55. // get index buffer for binary encoded axis vertex buffer given a box at center being viewed by given camera
  56. U8* get_box_fan_indices(LLCamera* camera, const LLVector3& center);
  57. class LLDrawInfo : public LLRefCount 
  58. {
  59. protected:
  60. ~LLDrawInfo();
  61. public:
  62. LLDrawInfo(U16 start, U16 end, U32 count, U32 offset, 
  63. LLViewerTexture* image, LLVertexBuffer* buffer, 
  64. BOOL fullbright = FALSE, U8 bump = 0, BOOL particle = FALSE, F32 part_size = 0);
  65. LLPointer<LLVertexBuffer> mVertexBuffer;
  66. LLPointer<LLViewerTexture>     mTexture;
  67. LLColor4U mGlowColor;
  68. S32 mDebugColor;
  69. const LLMatrix4* mTextureMatrix;
  70. const LLMatrix4* mModelMatrix;
  71. U16 mStart;
  72. U16 mEnd;
  73. U32 mCount;
  74. U32 mOffset;
  75. BOOL mFullbright;
  76. U8 mBump;
  77. BOOL mParticle;
  78. F32 mPartSize;
  79. F32 mVSize;
  80. LLSpatialGroup* mGroup;
  81. LLFace* mFace; //associated face
  82. F32 mDistance;
  83. LLVector3 mExtents[2];
  84. struct CompareTexture
  85. {
  86. bool operator()(const LLDrawInfo& lhs, const LLDrawInfo& rhs)
  87. {
  88. return lhs.mTexture > rhs.mTexture;
  89. }
  90. };
  91. struct CompareTexturePtr
  92. { //sort by texture
  93. bool operator()(const LLPointer<LLDrawInfo>& lhs, const LLPointer<LLDrawInfo>& rhs)
  94. {
  95. // sort by pointer, sort NULL down to the end
  96. return lhs.get() != rhs.get() 
  97. && (lhs.isNull() || (rhs.notNull() && lhs->mTexture.get() > rhs->mTexture.get()));
  98. }
  99. };
  100. struct CompareVertexBuffer
  101. { //sort by texture
  102. bool operator()(const LLPointer<LLDrawInfo>& lhs, const LLPointer<LLDrawInfo>& rhs)
  103. {
  104. // sort by pointer, sort NULL down to the end
  105. return lhs.get() != rhs.get() 
  106. && (lhs.isNull() || (rhs.notNull() && lhs->mVertexBuffer.get() > rhs->mVertexBuffer.get()));
  107. }
  108. };
  109. struct CompareTexturePtrMatrix
  110. {
  111. bool operator()(const LLPointer<LLDrawInfo>& lhs, const LLPointer<LLDrawInfo>& rhs)
  112. {
  113. return lhs.get() != rhs.get() 
  114. && (lhs.isNull() || (rhs.notNull() && (lhs->mTexture.get() > rhs->mTexture.get() ||
  115.    (lhs->mTexture.get() == rhs->mTexture.get() && lhs->mModelMatrix > rhs->mModelMatrix))));
  116. }
  117. };
  118. struct CompareBump
  119. {
  120. bool operator()(const LLPointer<LLDrawInfo>& lhs, const LLPointer<LLDrawInfo>& rhs) 
  121. {
  122. // sort by mBump value, sort NULL down to the end
  123. return lhs.get() != rhs.get() 
  124. && (lhs.isNull() || (rhs.notNull() && lhs->mBump > rhs->mBump));
  125. }
  126. };
  127. struct CompareDistanceGreater
  128. {
  129. bool operator()(const LLPointer<LLDrawInfo>& lhs, const LLPointer<LLDrawInfo>& rhs) 
  130. {
  131. // sort by mBump value, sort NULL down to the end
  132. return lhs.get() != rhs.get() 
  133. && (lhs.isNull() || (rhs.notNull() && lhs->mDistance > rhs->mDistance));
  134. }
  135. };
  136. };
  137. class LLSpatialGroup : public LLOctreeListener<LLDrawable>
  138. {
  139. friend class LLSpatialPartition;
  140. friend class LLOctreeStateCheck;
  141. public:
  142. static U32 sNodeCount;
  143. static BOOL sNoDelete; //deletion of spatial groups and draw info not allowed if TRUE
  144. typedef std::vector<LLPointer<LLSpatialGroup> > sg_vector_t;
  145. typedef std::set<LLPointer<LLSpatialGroup> > sg_set_t;
  146. typedef std::list<LLPointer<LLSpatialGroup> > sg_list_t;
  147. typedef std::vector<LLPointer<LLSpatialBridge> > bridge_list_t;
  148. typedef std::vector<LLPointer<LLDrawInfo> > drawmap_elem_t; 
  149. typedef std::map<U32, drawmap_elem_t > draw_map_t;
  150. typedef std::vector<LLPointer<LLVertexBuffer> > buffer_list_t;
  151. typedef std::map<LLPointer<LLViewerTexture>, buffer_list_t> buffer_texture_map_t;
  152. typedef std::map<U32, buffer_texture_map_t> buffer_map_t;
  153. typedef LLOctreeListener<LLDrawable> BaseType;
  154. typedef LLOctreeListener<LLDrawable> OctreeListener;
  155. typedef LLTreeNode<LLDrawable> TreeNode;
  156. typedef LLOctreeNode<LLDrawable> OctreeNode;
  157. typedef LLOctreeRoot<LLDrawable> OctreeRoot;
  158. typedef LLOctreeTraveler<LLDrawable> OctreeTraveler;
  159. typedef LLOctreeNode<LLDrawable>::element_iter element_iter;
  160. typedef LLOctreeNode<LLDrawable>::element_list element_list;
  161. struct CompareDistanceGreater
  162. {
  163. bool operator()(const LLSpatialGroup* const& lhs, const LLSpatialGroup* const& rhs)
  164. {
  165. return lhs->mDistance > rhs->mDistance;
  166. }
  167. };
  168. struct CompareUpdateUrgency
  169. {
  170. bool operator()(const LLPointer<LLSpatialGroup> lhs, const LLPointer<LLSpatialGroup> rhs)
  171. {
  172. return lhs->getUpdateUrgency() > rhs->getUpdateUrgency();
  173. }
  174. };
  175. struct CompareDepthGreater
  176. {
  177. bool operator()(const LLSpatialGroup* const& lhs, const LLSpatialGroup* const& rhs)
  178. {
  179. return lhs->mDepth > rhs->mDepth;
  180. }
  181. };
  182. typedef enum
  183. {
  184. OCCLUDED = 0x00010000,
  185. QUERY_PENDING = 0x00020000,
  186. ACTIVE_OCCLUSION = 0x00040000,
  187. DISCARD_QUERY = 0x00080000,
  188. EARLY_FAIL = 0x00100000,
  189. } eOcclusionState;
  190. typedef enum
  191. {
  192. DEAD = 0x00000001,
  193. DIRTY = 0x00000002,
  194. OBJECT_DIRTY = 0x00000004,
  195. GEOM_DIRTY = 0x00000008,
  196. ALPHA_DIRTY = 0x00000010,
  197. SKIP_FRUSTUM_CHECK = 0x00000020,
  198. IN_IMAGE_QUEUE = 0x00000040,
  199. IMAGE_DIRTY = 0x00000080,
  200. OCCLUSION_DIRTY = 0x00000100,
  201. MESH_DIRTY = 0x00000200,
  202. NEW_DRAWINFO = 0x00000400,
  203. IN_BUILD_Q1 = 0x00000800,
  204. IN_BUILD_Q2 = 0x00001000,
  205. STATE_MASK = 0x0000FFFF,
  206. } eSpatialState;
  207. typedef enum
  208. {
  209. STATE_MODE_SINGLE = 0, //set one node
  210. STATE_MODE_BRANCH, //set entire branch
  211. STATE_MODE_DIFF, //set entire branch as long as current state is different
  212. STATE_MODE_ALL_CAMERAS, //used for occlusion state, set state for all cameras
  213. } eSetStateMode;
  214. LLSpatialGroup(OctreeNode* node, LLSpatialPartition* part);
  215. BOOL isDead() { return isState(DEAD); }
  216. BOOL isState(U32 state) const;
  217. BOOL isOcclusionState(U32 state) const { return mOcclusionState[LLViewerCamera::sCurCameraID] & state ? TRUE : FALSE; }
  218. U32 getState() { return mState; }
  219. void setState(U32 state);
  220. void clearState(U32 state);
  221. void clearDrawMap();
  222. void validate();
  223. void checkStates();
  224. void validateDrawMap();
  225. void setState(U32 state, S32 mode);
  226. void clearState(U32 state, S32 mode);
  227. void setOcclusionState(U32 state, S32 mode = STATE_MODE_SINGLE);
  228. void clearOcclusionState(U32 state, S32 mode = STATE_MODE_SINGLE);
  229. LLSpatialGroup* getParent();
  230. BOOL addObject(LLDrawable *drawablep, BOOL add_all = FALSE, BOOL from_octree = FALSE);
  231. BOOL removeObject(LLDrawable *drawablep, BOOL from_octree = FALSE);
  232. BOOL updateInGroup(LLDrawable *drawablep, BOOL immediate = FALSE); // Update position if it's in the group
  233. BOOL isVisible() const;
  234. BOOL isRecentlyVisible() const;
  235. void setVisible();
  236. void shift(const LLVector3 &offset);
  237. BOOL boundObjects(BOOL empty, LLVector3& newMin, LLVector3& newMax);
  238. void unbound();
  239. BOOL rebound();
  240. void buildOcclusion(); //rebuild mOcclusionVerts
  241. void checkOcclusion(); //read back last occlusion query (if any)
  242. void doOcclusion(LLCamera* camera); //issue occlusion query
  243. void destroyGL();
  244. void updateDistance(LLCamera& camera);
  245. BOOL needsUpdate();
  246. F32 getUpdateUrgency() const;
  247. BOOL changeLOD();
  248. void rebuildGeom();
  249. void rebuildMesh();
  250. void dirtyGeom() { setState(GEOM_DIRTY); }
  251. void dirtyMesh() { setState(MESH_DIRTY); }
  252. element_list& getData() { return mOctreeNode->getData(); }
  253. U32 getElementCount() const { return mOctreeNode->getElementCount(); }
  254. void drawObjectBox(LLColor4 col);
  255.  //LISTENER FUNCTIONS
  256. virtual void handleInsertion(const TreeNode* node, LLDrawable* face);
  257. virtual void handleRemoval(const TreeNode* node, LLDrawable* face);
  258. virtual void handleDestruction(const TreeNode* node);
  259. virtual void handleStateChange(const TreeNode* node);
  260. virtual void handleChildAddition(const OctreeNode* parent, OctreeNode* child);
  261. virtual void handleChildRemoval(const OctreeNode* parent, const OctreeNode* child);
  262. //-------------------
  263. //for atlas use
  264. //-------------------
  265. //atlas
  266. void setCurUpdatingTime(U32 t) {mCurUpdatingTime = t ;}
  267. U32  getCurUpdatingTime() const { return mCurUpdatingTime ;}
  268. void setCurUpdatingSlot(LLTextureAtlasSlot* slotp) ;
  269. LLTextureAtlasSlot* getCurUpdatingSlot(LLViewerTexture* imagep, S8 recursive_level = 3) ;
  270. void setCurUpdatingTexture(LLViewerTexture* tex){ mCurUpdatingTexture = tex ;}
  271. LLViewerTexture* getCurUpdatingTexture() const { return mCurUpdatingTexture ;}
  272. BOOL hasAtlas(LLTextureAtlas* atlasp) ;
  273. LLTextureAtlas* getAtlas(S8 ncomponents, S8 to_be_reserved, S8 recursive_level = 3) ;
  274. void addAtlas(LLTextureAtlas* atlasp, S8 recursive_level = 3) ;
  275. void removeAtlas(LLTextureAtlas* atlasp, BOOL remove_group = TRUE, S8 recursive_level = 3) ;
  276. void clearAtlasList() ;
  277. private:
  278. U32                     mCurUpdatingTime ;
  279. //do not make the below two to use LLPointer
  280. //because mCurUpdatingTime invalidates them automatically.
  281. LLTextureAtlasSlot* mCurUpdatingSlotp ;
  282. LLViewerTexture*          mCurUpdatingTexture ;
  283. std::vector< std::list<LLTextureAtlas*> > mAtlasList ; 
  284. //-------------------
  285. //end for atlas use
  286. //-------------------
  287. protected:
  288. virtual ~LLSpatialGroup();
  289. U32 mState;
  290. U32 mOcclusionState[LLViewerCamera::NUM_CAMERAS];
  291. S32 mLODHash;
  292. static S32 sLODSeed;
  293. public:
  294. bridge_list_t mBridgeList;
  295. buffer_map_t mBufferMap; //used by volume buffers to store unique buffers per texture
  296. F32 mBuilt;
  297. OctreeNode* mOctreeNode;
  298. LLSpatialPartition* mSpatialPartition;
  299. LLVector3 mBounds[2];
  300. LLVector3 mExtents[2];
  301. LLVector3 mObjectExtents[2];
  302. LLVector3 mObjectBounds[2];
  303. LLPointer<LLVertexBuffer> mVertexBuffer;
  304. F32* mOcclusionVerts;
  305. GLuint mOcclusionQuery[LLViewerCamera::NUM_CAMERAS];
  306. U32 mBufferUsage;
  307. draw_map_t mDrawMap;
  308. S32 mVisible[LLViewerCamera::NUM_CAMERAS];
  309. F32 mDistance;
  310. F32 mDepth;
  311. F32 mLastUpdateDistance;
  312. F32 mLastUpdateTime;
  313. LLVector3 mViewAngle;
  314. LLVector3 mLastUpdateViewAngle;
  315. F32 mPixelArea;
  316. F32 mRadius;
  317. };
  318. class LLGeometryManager
  319. {
  320. public:
  321. std::vector<LLFace*> mFaceList;
  322. virtual ~LLGeometryManager() { }
  323. virtual void rebuildGeom(LLSpatialGroup* group) = 0;
  324. virtual void rebuildMesh(LLSpatialGroup* group) = 0;
  325. virtual void getGeometry(LLSpatialGroup* group) = 0;
  326. virtual void addGeometryCount(LLSpatialGroup* group, U32 &vertex_count, U32 &index_count);
  327. virtual LLVertexBuffer* createVertexBuffer(U32 type_mask, U32 usage);
  328. };
  329. class LLSpatialPartition: public LLGeometryManager
  330. {
  331. public:
  332. LLSpatialPartition(U32 data_mask,  BOOL render_by_group, U32 mBufferUsage);
  333. virtual ~LLSpatialPartition();
  334. LLSpatialGroup *put(LLDrawable *drawablep, BOOL was_visible = FALSE);
  335. BOOL remove(LLDrawable *drawablep, LLSpatialGroup *curp);
  336. LLDrawable* lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
  337.  BOOL pick_transparent, 
  338.  S32* face_hit,                          // return the face hit
  339.  LLVector3* intersection = NULL,         // return the intersection point
  340.  LLVector2* tex_coord = NULL,            // return the texture coordinates of the intersection point
  341.  LLVector3* normal = NULL,               // return the surface normal at the intersection point
  342.  LLVector3* bi_normal = NULL             // return the surface bi-normal at the intersection point
  343. );
  344. // If the drawable moves, move it here.
  345. virtual void move(LLDrawable *drawablep, LLSpatialGroup *curp, BOOL immediate = FALSE);
  346. virtual void shift(const LLVector3 &offset);
  347. virtual F32 calcDistance(LLSpatialGroup* group, LLCamera& camera);
  348. virtual F32 calcPixelArea(LLSpatialGroup* group, LLCamera& camera);
  349. virtual void rebuildGeom(LLSpatialGroup* group);
  350. virtual void rebuildMesh(LLSpatialGroup* group);
  351. BOOL visibleObjectsInFrustum(LLCamera& camera);
  352. S32 cull(LLCamera &camera, std::vector<LLDrawable *>* results = NULL, BOOL for_select = FALSE); // Cull on arbitrary frustum
  353. BOOL isVisible(const LLVector3& v);
  354. virtual LLSpatialBridge* asBridge() { return NULL; }
  355. virtual BOOL isBridge() { return asBridge() != NULL; }
  356. void renderDebug();
  357. void renderIntersectingBBoxes(LLCamera* camera);
  358. void restoreGL();
  359. void resetVertexBuffers();
  360. BOOL isOcclusionEnabled();
  361. BOOL getVisibleExtents(LLCamera& camera, LLVector3& visMin, LLVector3& visMax);
  362. public:
  363. LLSpatialGroup::OctreeNode* mOctree;
  364. BOOL mOcclusionEnabled; // if TRUE, occlusion culling is performed
  365. BOOL mInfiniteFarClip; // if TRUE, frustum culling ignores far clip plane
  366. U32 mBufferUsage;
  367. const BOOL mRenderByGroup;
  368. U32 mLODSeed;
  369. U32 mLODPeriod; //number of frames between LOD updates for a given spatial group (staggered by mLODSeed)
  370. U32 mVertexDataMask;
  371. F32 mSlopRatio; //percentage distance must change before drawables receive LOD update (default is 0.25);
  372. BOOL mDepthMask; //if TRUE, objects in this partition will be written to depth during alpha rendering
  373. U32 mDrawableType;
  374. U32 mPartitionType;
  375. };
  376. // class for creating bridges between spatial partitions
  377. class LLSpatialBridge : public LLDrawable, public LLSpatialPartition
  378. {
  379. protected:
  380. ~LLSpatialBridge();
  381. public:
  382. typedef std::vector<LLPointer<LLSpatialBridge> > bridge_vector_t;
  383. LLSpatialBridge(LLDrawable* root, BOOL render_by_group, U32 data_mask);
  384. virtual BOOL isSpatialBridge() const { return TRUE; }
  385. virtual void updateSpatialExtents();
  386. virtual void updateBinRadius();
  387. virtual void setVisible(LLCamera& camera_in, std::vector<LLDrawable*>* results = NULL, BOOL for_select = FALSE);
  388. virtual void updateDistance(LLCamera& camera_in, bool force_update);
  389. virtual void makeActive();
  390. virtual void move(LLDrawable *drawablep, LLSpatialGroup *curp, BOOL immediate = FALSE);
  391. virtual BOOL updateMove();
  392. virtual void shiftPos(const LLVector3& vec);
  393. virtual void cleanupReferences();
  394. virtual LLSpatialPartition* asPartition() { return this; }
  395. virtual LLSpatialBridge* asBridge() { return this; }
  396. virtual LLCamera transformCamera(LLCamera& camera);
  397. LLDrawable* mDrawable;
  398. };
  399. class LLCullResult 
  400. {
  401. public:
  402. LLCullResult();
  403. typedef std::vector<LLSpatialGroup*> sg_list_t;
  404. typedef std::vector<LLDrawable*> drawable_list_t;
  405. typedef std::vector<LLSpatialBridge*> bridge_list_t;
  406. typedef std::vector<LLDrawInfo*> drawinfo_list_t;
  407. void clear();
  408. sg_list_t::iterator beginVisibleGroups();
  409. sg_list_t::iterator endVisibleGroups();
  410. sg_list_t::iterator beginAlphaGroups();
  411. sg_list_t::iterator endAlphaGroups();
  412. sg_list_t::iterator beginOcclusionGroups();
  413. sg_list_t::iterator endOcclusionGroups();
  414. sg_list_t::iterator beginDrawableGroups();
  415. sg_list_t::iterator endDrawableGroups();
  416. drawable_list_t::iterator beginVisibleList();
  417. drawable_list_t::iterator endVisibleList();
  418. bridge_list_t::iterator beginVisibleBridge();
  419. bridge_list_t::iterator endVisibleBridge();
  420. drawinfo_list_t::iterator beginRenderMap(U32 type);
  421. drawinfo_list_t::iterator endRenderMap(U32 type);
  422. void pushVisibleGroup(LLSpatialGroup* group);
  423. void pushAlphaGroup(LLSpatialGroup* group);
  424. void pushOcclusionGroup(LLSpatialGroup* group);
  425. void pushDrawableGroup(LLSpatialGroup* group);
  426. void pushDrawable(LLDrawable* drawable);
  427. void pushBridge(LLSpatialBridge* bridge);
  428. void pushDrawInfo(U32 type, LLDrawInfo* draw_info);
  429. U32 getVisibleGroupsSize() { return mVisibleGroupsSize; }
  430. U32 getAlphaGroupsSize() { return mAlphaGroupsSize; }
  431. U32 getDrawableGroupsSize() { return mDrawableGroupsSize; }
  432. U32 getVisibleListSize() { return mVisibleListSize; }
  433. U32 getVisibleBridgeSize() { return mVisibleBridgeSize; }
  434. U32 getRenderMapSize(U32 type) { return mRenderMapSize[type]; }
  435. void assertDrawMapsEmpty();
  436. private:
  437. U32 mVisibleGroupsSize;
  438. U32 mAlphaGroupsSize;
  439. U32 mOcclusionGroupsSize;
  440. U32 mDrawableGroupsSize;
  441. U32 mVisibleListSize;
  442. U32 mVisibleBridgeSize;
  443. U32 mRenderMapSize[LLRenderPass::NUM_RENDER_TYPES];
  444. sg_list_t mVisibleGroups;
  445. sg_list_t mAlphaGroups;
  446. sg_list_t mOcclusionGroups;
  447. sg_list_t mDrawableGroups;
  448. drawable_list_t mVisibleList;
  449. bridge_list_t mVisibleBridge;
  450. drawinfo_list_t mRenderMap[LLRenderPass::NUM_RENDER_TYPES];
  451. };
  452. //spatial partition for water (implemented in LLVOWater.cpp)
  453. class LLWaterPartition : public LLSpatialPartition
  454. {
  455. public:
  456. LLWaterPartition();
  457. virtual void getGeometry(LLSpatialGroup* group) {  }
  458. virtual void addGeometryCount(LLSpatialGroup* group, U32 &vertex_count, U32& index_count) { }
  459. };
  460. //spatial partition for terrain (impelmented in LLVOSurfacePatch.cpp)
  461. class LLTerrainPartition : public LLSpatialPartition
  462. {
  463. public:
  464. LLTerrainPartition();
  465. virtual void getGeometry(LLSpatialGroup* group);
  466. virtual LLVertexBuffer* createVertexBuffer(U32 type_mask, U32 usage);
  467. };
  468. //spatial partition for trees
  469. class LLTreePartition : public LLSpatialPartition
  470. {
  471. public:
  472. LLTreePartition();
  473. virtual void getGeometry(LLSpatialGroup* group) { }
  474. virtual void addGeometryCount(LLSpatialGroup* group, U32 &vertex_count, U32& index_count) { }
  475. };
  476. //spatial partition for particles (implemented in LLVOPartGroup.cpp)
  477. class LLParticlePartition : public LLSpatialPartition
  478. {
  479. public:
  480. LLParticlePartition();
  481. virtual void getGeometry(LLSpatialGroup* group);
  482. virtual void addGeometryCount(LLSpatialGroup* group, U32 &vertex_count, U32& index_count);
  483. virtual F32 calcPixelArea(LLSpatialGroup* group, LLCamera& camera);
  484. protected:
  485. U32 mRenderPass;
  486. };
  487. class LLHUDParticlePartition : public LLParticlePartition
  488. {
  489. public:
  490. LLHUDParticlePartition();
  491. };
  492. //spatial partition for grass (implemented in LLVOGrass.cpp)
  493. class LLGrassPartition : public LLParticlePartition
  494. {
  495. public:
  496. LLGrassPartition();
  497. };
  498. //spatial partition for clouds (implemented in LLVOClouds.cpp)
  499. class LLCloudPartition : public LLParticlePartition
  500. {
  501. public:
  502. LLCloudPartition();
  503. };
  504. //class for wrangling geometry out of volumes (implemented in LLVOVolume.cpp)
  505. class LLVolumeGeometryManager: public LLGeometryManager
  506. {
  507. public:
  508. virtual ~LLVolumeGeometryManager() { }
  509. virtual void rebuildGeom(LLSpatialGroup* group);
  510. virtual void rebuildMesh(LLSpatialGroup* group);
  511. virtual void getGeometry(LLSpatialGroup* group);
  512. void genDrawInfo(LLSpatialGroup* group, U32 mask, std::vector<LLFace*>& faces, BOOL distance_sort = FALSE);
  513. void registerFace(LLSpatialGroup* group, LLFace* facep, U32 type);
  514. };
  515. //spatial partition that uses volume geometry manager (implemented in LLVOVolume.cpp)
  516. class LLVolumePartition : public LLSpatialPartition, public LLVolumeGeometryManager
  517. {
  518. public:
  519. LLVolumePartition();
  520. virtual void rebuildGeom(LLSpatialGroup* group) { LLVolumeGeometryManager::rebuildGeom(group); }
  521. virtual void getGeometry(LLSpatialGroup* group) { LLVolumeGeometryManager::getGeometry(group); }
  522. virtual void rebuildMesh(LLSpatialGroup* group) { LLVolumeGeometryManager::rebuildMesh(group); }
  523. virtual void addGeometryCount(LLSpatialGroup* group, U32 &vertex_count, U32& index_count) { LLVolumeGeometryManager::addGeometryCount(group, vertex_count, index_count); }
  524. };
  525. //spatial bridge that uses volume geometry manager (implemented in LLVOVolume.cpp)
  526. class LLVolumeBridge : public LLSpatialBridge, public LLVolumeGeometryManager
  527. {
  528. public:
  529. LLVolumeBridge(LLDrawable* drawable);
  530. virtual void rebuildGeom(LLSpatialGroup* group) { LLVolumeGeometryManager::rebuildGeom(group); }
  531. virtual void getGeometry(LLSpatialGroup* group) { LLVolumeGeometryManager::getGeometry(group); }
  532. virtual void rebuildMesh(LLSpatialGroup* group) { LLVolumeGeometryManager::rebuildMesh(group); }
  533. virtual void addGeometryCount(LLSpatialGroup* group, U32 &vertex_count, U32& index_count) { LLVolumeGeometryManager::addGeometryCount(group, vertex_count, index_count); }
  534. };
  535. class LLHUDBridge : public LLVolumeBridge
  536. {
  537. public:
  538. LLHUDBridge(LLDrawable* drawablep);
  539. virtual void shiftPos(const LLVector3& vec);
  540. virtual F32 calcPixelArea(LLSpatialGroup* group, LLCamera& camera);
  541. };
  542. //spatial partition that holds nothing but spatial bridges
  543. class LLBridgePartition : public LLSpatialPartition
  544. {
  545. public:
  546. LLBridgePartition();
  547. virtual void getGeometry(LLSpatialGroup* group) { }
  548. virtual void addGeometryCount(LLSpatialGroup* group, U32 &vertex_count, U32& index_count) {  }
  549. };
  550. class LLHUDPartition : public LLBridgePartition
  551. {
  552. public:
  553. LLHUDPartition();
  554. virtual void shift(const LLVector3 &offset);
  555. };
  556. void validate_draw_info(LLDrawInfo& params);
  557. extern const F32 SG_BOX_SIDE;
  558. extern const F32 SG_BOX_OFFSET;
  559. extern const F32 SG_BOX_RAD;
  560. extern const F32 SG_OBJ_SIDE;
  561. extern const F32 SG_MAX_OBJ_RAD;
  562. #endif //LL_LLSPATIALPARTITION_H