Merged in SL-16607 (pull request #832)

SL-16607

Approved-by: Euclid Linden
meow-7.2.2
Michael Pohoreski 2022-01-14 20:26:10 +00:00
commit 559b162eec
1 changed files with 27 additions and 18 deletions

View File

@ -34,6 +34,9 @@
#define OCT_ERRS LL_WARNS("OctreeErrors")
#define OCTREE_DEBUG_COLOR_REMOVE 0x0000FF // r
#define OCTREE_DEBUG_COLOR_INSERT 0x00FF00 // g
#define OCTREE_DEBUG_COLOR_BALANCE 0xFF0000 // b
extern U32 gOctreeMaxCapacity;
extern float gOctreeMinSize;
@ -92,10 +95,15 @@ public:
typedef LLOctreeNode<T> oct_node;
typedef LLOctreeListener<T> oct_listener;
enum
{
NO_CHILD_NODES = 255 // Note: This is an U8 to match the max value in mChildMap[]
};
LLOctreeNode( const LLVector4a& center,
const LLVector4a& size,
BaseType* parent,
U8 octant = 255)
U8 octant = NO_CHILD_NODES)
: mParent((oct_node*)parent),
mOctant(octant)
{
@ -108,7 +116,7 @@ public:
mSize = size;
updateMinMax();
if ((mOctant == 255) && mParent)
if ((mOctant == NO_CHILD_NODES) && mParent)
{
mOctant = ((oct_node*) mParent)->getOctant(mCenter);
}
@ -118,9 +126,9 @@ public:
clearChildren();
}
virtual ~LLOctreeNode()
virtual ~LLOctreeNode()
{
BaseType::destroyListeners();
BaseType::destroyListeners();
for (U32 i = 0; i < mElementCount; ++i)
{
@ -159,7 +167,7 @@ public:
return rad <= mSize[0]*2.f && isInside(pos);
}
inline bool isInside(T* data) const
inline bool isInside(T* data) const
{
return isInside(data->getPositionGroup(), data->getBinRadius());
}
@ -253,7 +261,7 @@ public:
for (U32 i = 0; i < 8; i++)
{
U8 idx = mChildMap[i];
if (idx != 255)
if (idx != NO_CHILD_NODES)
{
LLOctreeNode<T>* child = mChild[idx];
@ -276,7 +284,7 @@ public:
LLOctreeNode<T>* node = this;
if (node->isInside(pos, rad))
{
{
//do a quick search by octant
U8 octant = node->getOctant(pos);
@ -286,7 +294,7 @@ public:
// the data
U8 next_node = node->mChildMap[octant];
while (next_node != 255 && node->getSize()[0] >= rad)
while (next_node != NO_CHILD_NODES && node->getSize()[0] >= rad)
{
node = node->getChild(next_node);
octant = node->getOctant(pos);
@ -303,6 +311,8 @@ public:
virtual bool insert(T* data)
{
//LL_PROFILE_ZONE_NAMED_COLOR("Octree::insert()",OCTREE_DEBUG_COLOR_INSERT);
if (data == NULL || data->getBinIndex() != -1)
{
OCT_ERRS << "!!! INVALID ELEMENT ADDED TO OCTREE BRANCH !!!" << LL_ENDL;
@ -449,6 +459,8 @@ public:
bool remove(T* data)
{
//LL_PROFILE_ZONE_NAMED_COLOR("Octree::remove()", OCTREE_DEBUG_COLOR_REMOVE);
S32 i = data->getBinIndex();
if (i >= 0 && i < mElementCount)
@ -514,9 +526,7 @@ public:
void clearChildren()
{
mChildCount = 0;
U32* foo = (U32*) mChildMap;
foo[0] = foo[1] = 0xFFFFFFFF;
memset(mChildMap, NO_CHILD_NODES, sizeof(mChildMap));
}
void validate()
@ -607,11 +617,9 @@ public:
--mChildCount;
mChild[index] = mChild[mChildCount];
//rebuild child map
U32* foo = (U32*) mChildMap;
foo[0] = foo[1] = 0xFFFFFFFF;
memset(mChildMap, NO_CHILD_NODES, sizeof(mChildMap));
for (U32 i = 0; i < mChildCount; ++i)
{
@ -647,7 +655,7 @@ public:
OCT_ERRS << "Octree failed to delete requested child." << LL_ENDL;
}
protected:
protected:
typedef enum
{
CENTER = 0,
@ -671,7 +679,6 @@ protected:
element_list mData;
element_iter mDataEnd;
U32 mElementCount;
};
//just like a regular node, except it might expand on insert and compress on balance
@ -680,7 +687,7 @@ class LLOctreeRoot : public LLOctreeNode<T>
{
public:
typedef LLOctreeNode<T> BaseType;
typedef LLOctreeNode<T> oct_node;
typedef LLOctreeNode<T> oct_node;
LLOctreeRoot(const LLVector4a& center,
const LLVector4a& size,
@ -691,9 +698,11 @@ public:
bool balance()
{
//LL_PROFILE_ZONE_NAMED_COLOR("Octree::balance()",OCTREE_DEBUG_COLOR_BALANCE);
if (this->getChildCount() == 1 &&
!(this->mChild[0]->isLeaf()) &&
this->mChild[0]->getElementCount() == 0)
this->mChild[0]->getElementCount() == 0)
{ //if we have only one child and that child is an empty branch, make that child the root
oct_node* child = this->mChild[0];