diff options
| author | Michael Pohoreski <ptolemy@lindenlab.com> | 2022-01-14 20:26:10 +0000 | 
|---|---|---|
| committer | Michael Pohoreski <ptolemy@lindenlab.com> | 2022-01-14 20:26:10 +0000 | 
| commit | 559b162eec914d8e4f6f9f28a46184c9bcd51921 (patch) | |
| tree | 3b1e3fbbe65081b08211f8d69cf15d46f5a67f4e /indra | |
| parent | 7495af2ecc055a7ed620d5bb4a60e44a4e166513 (diff) | |
| parent | 8babab20c588d0258eafd42df312d639821b89ef (diff) | |
Merged in SL-16607 (pull request #832)
SL-16607
Approved-by: Euclid Linden
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/llmath/lloctree.h | 45 | 
1 files changed, 27 insertions, 18 deletions
| diff --git a/indra/llmath/lloctree.h b/indra/llmath/lloctree.h index 8c4a1304b4..2283df1e1a 100644 --- a/indra/llmath/lloctree.h +++ b/indra/llmath/lloctree.h @@ -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]; | 
