aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/linden/indra/newview/llspatialpartition.h
diff options
context:
space:
mode:
Diffstat (limited to 'linden/indra/newview/llspatialpartition.h')
-rw-r--r--linden/indra/newview/llspatialpartition.h213
1 files changed, 139 insertions, 74 deletions
diff --git a/linden/indra/newview/llspatialpartition.h b/linden/indra/newview/llspatialpartition.h
index 1936423..a38e3fe 100644
--- a/linden/indra/newview/llspatialpartition.h
+++ b/linden/indra/newview/llspatialpartition.h
@@ -40,14 +40,18 @@
40#include "llvertexbuffer.h" 40#include "llvertexbuffer.h"
41#include "llgltypes.h" 41#include "llgltypes.h"
42#include "llcubemap.h" 42#include "llcubemap.h"
43#include "lldrawpool.h"
43 44
44#include <queue> 45#include <queue>
45 46
46#define SG_STATE_INHERIT_MASK (CULLED | OCCLUDED) 47#define SG_STATE_INHERIT_MASK (OCCLUDED)
47#define SG_INITIAL_STATE_MASK (OCCLUSION_DIRTY | DIRTY | GEOM_DIRTY) 48#define SG_INITIAL_STATE_MASK (DIRTY | GEOM_DIRTY)
48 49
49class LLSpatialPartition; 50class LLSpatialPartition;
50class LLSpatialBridge; 51class LLSpatialBridge;
52class LLSpatialGroup;
53
54S32 AABBSphereIntersect(const LLVector3& min, const LLVector3& max, const LLVector3 &origin, const F32 &rad);
51 55
52class LLDrawInfo : public LLRefCount 56class LLDrawInfo : public LLRefCount
53{ 57{
@@ -55,7 +59,7 @@ protected:
55 ~LLDrawInfo(); 59 ~LLDrawInfo();
56 60
57public: 61public:
58 LLDrawInfo(U32 start, U32 end, U32 count, U32 offset, 62 LLDrawInfo(U16 start, U16 end, U32 count, U32 offset,
59 LLViewerImage* image, LLVertexBuffer* buffer, 63 LLViewerImage* image, LLVertexBuffer* buffer,
60 BOOL fullbright = FALSE, U8 bump = 0, BOOL particle = FALSE, F32 part_size = 0); 64 BOOL fullbright = FALSE, U8 bump = 0, BOOL particle = FALSE, F32 part_size = 0);
61 65
@@ -64,9 +68,11 @@ public:
64 LLPointer<LLViewerImage> mTexture; 68 LLPointer<LLViewerImage> mTexture;
65 LLPointer<LLCubeMap> mReflectionMap; 69 LLPointer<LLCubeMap> mReflectionMap;
66 LLColor4U mGlowColor; 70 LLColor4U mGlowColor;
71 S32 mDebugColor;
67 const LLMatrix4* mTextureMatrix; 72 const LLMatrix4* mTextureMatrix;
68 U32 mStart; 73 const LLMatrix4* mModelMatrix;
69 U32 mEnd; 74 U16 mStart;
75 U16 mEnd;
70 U32 mCount; 76 U32 mCount;
71 U32 mOffset; 77 U32 mOffset;
72 BOOL mFullbright; 78 BOOL mFullbright;
@@ -74,7 +80,8 @@ public:
74 BOOL mParticle; 80 BOOL mParticle;
75 F32 mPartSize; 81 F32 mPartSize;
76 F32 mVSize; 82 F32 mVSize;
77 83 LLSpatialGroup* mGroup;
84
78 struct CompareTexture 85 struct CompareTexture
79 { 86 {
80 bool operator()(const LLDrawInfo& lhs, const LLDrawInfo& rhs) 87 bool operator()(const LLDrawInfo& lhs, const LLDrawInfo& rhs)
@@ -84,7 +91,7 @@ public:
84 }; 91 };
85 92
86 struct CompareTexturePtr 93 struct CompareTexturePtr
87 { 94 { //sort by texture
88 bool operator()(const LLPointer<LLDrawInfo>& lhs, const LLPointer<LLDrawInfo>& rhs) 95 bool operator()(const LLPointer<LLDrawInfo>& lhs, const LLPointer<LLDrawInfo>& rhs)
89 { 96 {
90 // sort by pointer, sort NULL down to the end 97 // sort by pointer, sort NULL down to the end
@@ -93,6 +100,17 @@ public:
93 } 100 }
94 }; 101 };
95 102
103 struct CompareTexturePtrMatrix
104 {
105 bool operator()(const LLPointer<LLDrawInfo>& lhs, const LLPointer<LLDrawInfo>& rhs)
106 {
107 return lhs.get() != rhs.get()
108 && (lhs.isNull() || (rhs.notNull() && (lhs->mTexture.get() > rhs->mTexture.get() ||
109 (lhs->mTexture.get() == rhs->mTexture.get() && lhs->mModelMatrix > rhs->mModelMatrix))));
110 }
111
112 };
113
96 struct CompareBump 114 struct CompareBump
97 { 115 {
98 bool operator()(const LLPointer<LLDrawInfo>& lhs, const LLPointer<LLDrawInfo>& rhs) 116 bool operator()(const LLPointer<LLDrawInfo>& lhs, const LLPointer<LLDrawInfo>& rhs)
@@ -108,23 +126,24 @@ class LLSpatialGroup : public LLOctreeListener<LLDrawable>
108{ 126{
109 friend class LLSpatialPartition; 127 friend class LLSpatialPartition;
110public: 128public:
129 static U32 sNodeCount;
111 130
112 typedef std::vector<LLPointer<LLSpatialGroup> > sg_vector_t; 131 typedef std::vector<LLPointer<LLSpatialGroup> > sg_vector_t;
113 typedef std::set<LLPointer<LLSpatialGroup> > sg_set_t; 132 typedef std::set<LLPointer<LLSpatialGroup> > sg_set_t;
114 typedef std::vector<LLPointer<LLSpatialBridge> > bridge_list_t; 133 typedef std::vector<LLPointer<LLSpatialBridge> > bridge_list_t;
115 typedef std::vector<LLPointer<LLDrawInfo> > drawmap_elem_t; 134 typedef std::vector<LLPointer<LLDrawInfo> > drawmap_elem_t;
116 typedef std::map<U32, drawmap_elem_t > draw_map_t; 135 typedef std::map<U32, drawmap_elem_t > draw_map_t;
117 typedef std::map<LLPointer<LLViewerImage>, LLPointer<LLVertexBuffer> > buffer_map_t; 136 typedef std::vector<LLPointer<LLVertexBuffer> > buffer_list_t;
137 typedef std::map<LLPointer<LLViewerImage>, buffer_list_t> buffer_map_t;
118 138
119 typedef LLOctreeListener<LLDrawable> BaseType; 139 typedef LLOctreeListener<LLDrawable> BaseType;
120 typedef LLOctreeListener<LLDrawable> OctreeListener; 140 typedef LLOctreeListener<LLDrawable> OctreeListener;
121 typedef LLTreeNode<LLDrawable> TreeNode; 141 typedef LLTreeNode<LLDrawable> TreeNode;
122 typedef LLOctreeNode<LLDrawable> OctreeNode; 142 typedef LLOctreeNode<LLDrawable> OctreeNode;
123 typedef LLOctreeRoot<LLDrawable> OctreeRoot; 143 typedef LLOctreeRoot<LLDrawable> OctreeRoot;
124 typedef LLOctreeState<LLDrawable> OctreeState;
125 typedef LLOctreeTraveler<LLDrawable> OctreeTraveler; 144 typedef LLOctreeTraveler<LLDrawable> OctreeTraveler;
126 typedef LLOctreeState<LLDrawable>::element_iter element_iter; 145 typedef LLOctreeNode<LLDrawable>::element_iter element_iter;
127 typedef LLOctreeState<LLDrawable>::element_list element_list; 146 typedef LLOctreeNode<LLDrawable>::element_list element_list;
128 147
129 struct CompareDistanceGreater 148 struct CompareDistanceGreater
130 { 149 {
@@ -144,29 +163,22 @@ public:
144 163
145 typedef enum 164 typedef enum
146 { 165 {
147 IN_QUEUE = 0x00000001, 166 OCCLUDED = 0x00000001,
148 QUERY_PENDING = 0x00000002, 167 IN_QUEUE = 0x00000002,
149 CULLED = 0x00000004, 168 QUERY_PENDING = 0x00000004,
150 OCCLUDED = 0x00000008, 169 ACTIVE_OCCLUSION = 0x00000008,
151 DEAD = 0x00000010, 170 DISCARD_QUERY = 0x00000010,
152 ACTIVE_OCCLUSION = 0x00000020, 171 DEAD = 0x00000020,
153 EARLY_FAIL = 0x00000040, 172 EARLY_FAIL = 0x00000040,
154 DEACTIVATE_OCCLUSION = 0x00000080, 173 DIRTY = 0x00000080,
155 RESHADOW = 0x00000100, 174 OBJECT_DIRTY = 0x00000100,
156 RESHADOW_QUEUE = 0x00000200, 175 GEOM_DIRTY = 0x00000200,
157 DIRTY = 0x00000400, 176 ALPHA_DIRTY = 0x00000800,
158 OBJECT_DIRTY = 0x00000800, 177 SKIP_FRUSTUM_CHECK = 0x00001000,
159 GEOM_DIRTY = 0x00001000, 178 IN_IMAGE_QUEUE = 0x00002000,
160 MATRIX_DIRTY = 0x00002000, 179 IMAGE_DIRTY = 0x00004000,
161 ALPHA_DIRTY = 0x00004000, 180 OCCLUSION_DIRTY = 0x00008000,
162 DISCARD_QUERY = 0x00008000, 181 MESH_DIRTY = 0x00010000,
163 QUERY_OUT = 0x00010000,
164 OCCLUDING = 0x00020000,
165 SKIP_FRUSTUM_CHECK = 0x00040000,
166 OCCLUSION_DIRTY = 0x00080000,
167 BELOW_WATER = 0x00100000,
168 IN_IMAGE_QUEUE = 0x00200000,
169 IMAGE_DIRTY = 0x00400000,
170 } eSpatialState; 182 } eSpatialState;
171 183
172 typedef enum 184 typedef enum
@@ -181,11 +193,12 @@ public:
181 BOOL isDead() { return isState(DEAD); } 193 BOOL isDead() { return isState(DEAD); }
182 BOOL isState(U32 state) const { return mState & state ? TRUE : FALSE; } 194 BOOL isState(U32 state) const { return mState & state ? TRUE : FALSE; }
183 U32 getState() { return mState; } 195 U32 getState() { return mState; }
184 void setState(U32 state) { mState |= state; } 196 void setState(U32 state);
185 void clearState(U32 state) { mState &= ~state; } 197 void clearState(U32 state);
186 198
187 void clearDrawMap(); 199 void clearDrawMap();
188 void validate(); 200 void validate();
201 void checkStates();
189 void validateDrawMap(); 202 void validateDrawMap();
190 203
191 void setState(U32 state, S32 mode); 204 void setState(U32 state, S32 mode);
@@ -196,20 +209,26 @@ public:
196 BOOL addObject(LLDrawable *drawablep, BOOL add_all = FALSE, BOOL from_octree = FALSE); 209 BOOL addObject(LLDrawable *drawablep, BOOL add_all = FALSE, BOOL from_octree = FALSE);
197 BOOL removeObject(LLDrawable *drawablep, BOOL from_octree = FALSE); 210 BOOL removeObject(LLDrawable *drawablep, BOOL from_octree = FALSE);
198 BOOL updateInGroup(LLDrawable *drawablep, BOOL immediate = FALSE); // Update position if it's in the group 211 BOOL updateInGroup(LLDrawable *drawablep, BOOL immediate = FALSE); // Update position if it's in the group
199 BOOL isVisible(); 212 BOOL isVisible() const;
213 void setVisible();
200 void shift(const LLVector3 &offset); 214 void shift(const LLVector3 &offset);
201 BOOL boundObjects(BOOL empty, LLVector3& newMin, LLVector3& newMax); 215 BOOL boundObjects(BOOL empty, LLVector3& newMin, LLVector3& newMax);
202 void unbound(); 216 void unbound();
203 BOOL rebound(); 217 BOOL rebound();
218 void buildOcclusion(); //rebuild mOcclusionVerts
219 void checkOcclusion(); //read back last occlusion query (if any)
220 void doOcclusion(LLCamera* camera); //issue occlusion query
204 void destroyGL(); 221 void destroyGL();
205 222
206 void updateDistance(LLCamera& camera); 223 void updateDistance(LLCamera& camera);
224 BOOL needsUpdate();
207 BOOL changeLOD(); 225 BOOL changeLOD();
208 void rebuildGeom(); 226 void rebuildGeom();
209 void makeStatic(); 227
210
211 void dirtyGeom() { setState(GEOM_DIRTY); } 228 void dirtyGeom() { setState(GEOM_DIRTY); }
212 element_list& getData() { return mOctreeNode->getOctState()->getData(); } 229 void dirtyMesh() { setState(MESH_DIRTY); }
230 element_list& getData() { return mOctreeNode->getData(); }
231 U32 getElementCount() const { return mOctreeNode->getElementCount(); }
213 232
214 //LISTENER FUNCTIONS 233 //LISTENER FUNCTIONS
215 virtual void handleInsertion(const TreeNode* node, LLDrawable* face); 234 virtual void handleInsertion(const TreeNode* node, LLDrawable* face);
@@ -235,25 +254,24 @@ public:
235 LLSpatialPartition* mSpatialPartition; 254 LLSpatialPartition* mSpatialPartition;
236 LLVector3 mBounds[2]; 255 LLVector3 mBounds[2];
237 LLVector3 mExtents[2]; 256 LLVector3 mExtents[2];
257
238 LLVector3 mObjectExtents[2]; 258 LLVector3 mObjectExtents[2];
239 LLVector3 mObjectBounds[2]; 259 LLVector3 mObjectBounds[2];
240 260
241 LLPointer<LLVertexBuffer> mVertexBuffer; 261 LLPointer<LLVertexBuffer> mVertexBuffer;
242 LLPointer<LLVertexBuffer> mOcclusionVerts; 262 F32* mOcclusionVerts;
263 GLuint mOcclusionQuery;
243 LLPointer<LLCubeMap> mReflectionMap; 264 LLPointer<LLCubeMap> mReflectionMap;
244 265
245 U32 mBufferUsage; 266 U32 mBufferUsage;
246 draw_map_t mDrawMap; 267 draw_map_t mDrawMap;
247 268
248 U32 mVertexCount; 269 S32 mVisible;
249 U32 mIndexCount;
250 F32 mDistance; 270 F32 mDistance;
251 F32 mDepth; 271 F32 mDepth;
252 F32 mLastUpdateDistance; 272 F32 mLastUpdateDistance;
253 F32 mLastUpdateTime; 273 F32 mLastUpdateTime;
254 F32 mLastAddTime; 274
255 F32 mLastRenderTime;
256
257 LLVector3 mViewAngle; 275 LLVector3 mViewAngle;
258 LLVector3 mLastUpdateViewAngle; 276 LLVector3 mLastUpdateViewAngle;
259 277
@@ -275,7 +293,9 @@ public:
275class LLSpatialPartition: public LLGeometryManager 293class LLSpatialPartition: public LLGeometryManager
276{ 294{
277public: 295public:
278 LLSpatialPartition(U32 data_mask, BOOL is_volatile = FALSE, U32 mBufferUsage = GL_STATIC_DRAW_ARB); 296 static BOOL sFreezeState; //if true, no spatialgroup state updates will be made
297
298 LLSpatialPartition(U32 data_mask, U32 mBufferUsage = GL_STATIC_DRAW_ARB);
279 virtual ~LLSpatialPartition(); 299 virtual ~LLSpatialPartition();
280 300
281 LLSpatialGroup *put(LLDrawable *drawablep, BOOL was_visible = FALSE); 301 LLSpatialGroup *put(LLDrawable *drawablep, BOOL was_visible = FALSE);
@@ -293,63 +313,42 @@ public:
293 virtual void rebuildGeom(LLSpatialGroup* group); 313 virtual void rebuildGeom(LLSpatialGroup* group);
294 314
295 S32 cull(LLCamera &camera, std::vector<LLDrawable *>* results = NULL, BOOL for_select = FALSE); // Cull on arbitrary frustum 315 S32 cull(LLCamera &camera, std::vector<LLDrawable *>* results = NULL, BOOL for_select = FALSE); // Cull on arbitrary frustum
296 BOOL checkOcclusion(LLSpatialGroup* group, LLCamera* camera);
297 void markReimage(LLSpatialGroup* group); 316 void markReimage(LLSpatialGroup* group);
298 void processImagery(LLCamera* camera); 317 void processImagery(LLCamera* camera);
299 void processOcclusion(LLCamera* camera); 318
300 void buildOcclusion();
301 void doOcclusion(LLCamera* camera);
302 BOOL isVisible(const LLVector3& v); 319 BOOL isVisible(const LLVector3& v);
303 BOOL isVolatile() const { return mVolatile; } 320
304
305 virtual LLSpatialBridge* asBridge() { return NULL; } 321 virtual LLSpatialBridge* asBridge() { return NULL; }
306 virtual BOOL isBridge() { return asBridge() != NULL; } 322 virtual BOOL isBridge() { return asBridge() != NULL; }
307 323
308 S32 getObjects(const LLVector3& pos, F32 rad, LLDrawable::drawable_set_t &results );
309 S32 getLights(const LLVector3& pos, F32 rad, LLDrawable::drawable_set_t &results );
310
311 void renderDebug(); 324 void renderDebug();
312 void restoreGL(); 325 void restoreGL();
313 void resetVertexBuffers(); 326 void resetVertexBuffers();
314 327
315protected: 328protected:
316 S32 getDrawables(const LLVector3& pos, F32 rad, LLDrawable::drawable_set_t &results, BOOL get_lights );
317 329
318 typedef std::set<LLPointer<LLSpatialGroup> > spatial_group_set_t; 330 typedef std::set<LLPointer<LLSpatialGroup> > spatial_group_set_t;
319 spatial_group_set_t mSpatialGroups; 331 spatial_group_set_t mSpatialGroups;
320 332
321 //things that might be occluded
322 typedef std::queue<LLPointer<LLSpatialGroup> > spatial_group_queue_t; 333 typedef std::queue<LLPointer<LLSpatialGroup> > spatial_group_queue_t;
323 spatial_group_queue_t mOcclusionQueue; 334
324
325 //things that need an image update 335 //things that need an image update
326 spatial_group_queue_t mImageQueue; 336 spatial_group_queue_t mImageQueue;
327 337
328 //things awaiting query
329 spatial_group_queue_t mQueryQueue;
330
331 std::vector<LLGLuint> mOcclusionQueries;
332
333public: 338public:
334 LLSpatialGroup::OctreeNode* mOctree; 339 LLSpatialGroup::OctreeNode* mOctree;
335 340 BOOL mOcclusionEnabled; // if TRUE, occlusion culling is performed
341 BOOL mInfiniteFarClip; // if TRUE, frustum culling ignores far clip plane
336 U32 mBufferUsage; 342 U32 mBufferUsage;
337 BOOL mRenderByGroup; 343 BOOL mRenderByGroup;
338 BOOL mImageEnabled; 344 BOOL mImageEnabled;
339 U32 mLODSeed; 345 U32 mLODSeed;
340 U32 mLODPeriod; 346 U32 mLODPeriod; //number of frames between LOD updates for a given spatial group (staggered by mLODSeed)
341 U32 mVertexDataMask; 347 U32 mVertexDataMask;
342 F32 mSlopRatio; //percentage distance must change before drawables receive LOD update (default is 0.25); 348 F32 mSlopRatio; //percentage distance must change before drawables receive LOD update (default is 0.25);
343 BOOL mVolatile; //if TRUE, occlusion queries will be discarded when nodes change size
344 BOOL mDepthMask; //if TRUE, objects in this partition will be written to depth during alpha rendering 349 BOOL mDepthMask; //if TRUE, objects in this partition will be written to depth during alpha rendering
345 U32 mDrawableType; 350 U32 mDrawableType;
346 U32 mPartitionType; 351 U32 mPartitionType;
347
348 //index buffer for occlusion verts
349 LLPointer<LLVertexBuffer> mOcclusionIndices;
350
351 //things that are occluded
352 std::vector<LLPointer<LLSpatialGroup> > mOccludedList;
353}; 352};
354 353
355// class for creating bridges between spatial partitions 354// class for creating bridges between spatial partitions
@@ -370,7 +369,6 @@ public:
370 virtual void setVisible(LLCamera& camera_in, std::vector<LLDrawable*>* results = NULL, BOOL for_select = FALSE); 369 virtual void setVisible(LLCamera& camera_in, std::vector<LLDrawable*>* results = NULL, BOOL for_select = FALSE);
371 virtual void updateDistance(LLCamera& camera_in); 370 virtual void updateDistance(LLCamera& camera_in);
372 virtual void makeActive(); 371 virtual void makeActive();
373 virtual void makeStatic();
374 virtual void move(LLDrawable *drawablep, LLSpatialGroup *curp, BOOL immediate = FALSE); 372 virtual void move(LLDrawable *drawablep, LLSpatialGroup *curp, BOOL immediate = FALSE);
375 virtual BOOL updateMove(); 373 virtual BOOL updateMove();
376 virtual void shiftPos(const LLVector3& vec); 374 virtual void shiftPos(const LLVector3& vec);
@@ -383,6 +381,72 @@ public:
383 LLDrawable* mDrawable; 381 LLDrawable* mDrawable;
384}; 382};
385 383
384class LLCullResult
385{
386public:
387 LLCullResult();
388
389 typedef std::vector<LLSpatialGroup*> sg_list_t;
390 typedef std::vector<LLDrawable*> drawable_list_t;
391 typedef std::vector<LLSpatialBridge*> bridge_list_t;
392 typedef std::vector<LLDrawInfo*> drawinfo_list_t;
393
394 void clear();
395
396 sg_list_t::iterator beginVisibleGroups();
397 sg_list_t::iterator endVisibleGroups();
398
399 sg_list_t::iterator beginAlphaGroups();
400 sg_list_t::iterator endAlphaGroups();
401
402 sg_list_t::iterator beginOcclusionGroups();
403 sg_list_t::iterator endOcclusionGroups();
404
405 sg_list_t::iterator beginDrawableGroups();
406 sg_list_t::iterator endDrawableGroups();
407
408 drawable_list_t::iterator beginVisibleList();
409 drawable_list_t::iterator endVisibleList();
410
411 bridge_list_t::iterator beginVisibleBridge();
412 bridge_list_t::iterator endVisibleBridge();
413
414 drawinfo_list_t::iterator beginRenderMap(U32 type);
415 drawinfo_list_t::iterator endRenderMap(U32 type);
416
417 void pushVisibleGroup(LLSpatialGroup* group);
418 void pushAlphaGroup(LLSpatialGroup* group);
419 void pushOcclusionGroup(LLSpatialGroup* group);
420 void pushDrawableGroup(LLSpatialGroup* group);
421 void pushDrawable(LLDrawable* drawable);
422 void pushBridge(LLSpatialBridge* bridge);
423 void pushDrawInfo(U32 type, LLDrawInfo* draw_info);
424
425 U32 getVisibleGroupsSize() { return mVisibleGroupsSize; }
426 U32 getAlphaGroupsSize() { return mAlphaGroupsSize; }
427 U32 getDrawableGroupsSize() { return mDrawableGroupsSize; }
428 U32 getVisibleListSize() { return mVisibleListSize; }
429 U32 getVisibleBridgeSize() { return mVisibleBridgeSize; }
430 U32 getRenderMapSize(U32 type) { return mRenderMapSize[type]; }
431
432private:
433 U32 mVisibleGroupsSize;
434 U32 mAlphaGroupsSize;
435 U32 mOcclusionGroupsSize;
436 U32 mDrawableGroupsSize;
437 U32 mVisibleListSize;
438 U32 mVisibleBridgeSize;
439 U32 mRenderMapSize[LLRenderPass::NUM_RENDER_TYPES];
440
441 sg_list_t mVisibleGroups;
442 sg_list_t mAlphaGroups;
443 sg_list_t mOcclusionGroups;
444 sg_list_t mDrawableGroups;
445 drawable_list_t mVisibleList;
446 bridge_list_t mVisibleBridge;
447 drawinfo_list_t mRenderMap[LLRenderPass::NUM_RENDER_TYPES];
448};
449
386//spatial partition for water (implemented in LLVOWater.cpp) 450//spatial partition for water (implemented in LLVOWater.cpp)
387class LLWaterPartition : public LLSpatialPartition 451class LLWaterPartition : public LLSpatialPartition
388{ 452{
@@ -500,5 +564,6 @@ extern const F32 SG_BOX_RAD;
500extern const F32 SG_OBJ_SIDE; 564extern const F32 SG_OBJ_SIDE;
501extern const F32 SG_MAX_OBJ_RAD; 565extern const F32 SG_MAX_OBJ_RAD;
502 566
567
503#endif //LL_LLSPATIALPARTITION_H 568#endif //LL_LLSPATIALPARTITION_H
504 569