diff options
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/llmath/lloctree.h | 52 | ||||
| -rw-r--r-- | indra/newview/llspatialpartition.cpp | 98 | ||||
| -rw-r--r-- | indra/newview/llspatialpartition.h | 10 | 
3 files changed, 80 insertions, 80 deletions
| diff --git a/indra/llmath/lloctree.h b/indra/llmath/lloctree.h index c3f6f7de2a..68d8110f1d 100644 --- a/indra/llmath/lloctree.h +++ b/indra/llmath/lloctree.h @@ -78,7 +78,7 @@ public:  	typedef LLOctreeTraveler<T>									oct_traveler;  	typedef LLTreeTraveler<T>									tree_traveler; -	typedef LLPointer<T>*										element_list; +	typedef std::vector<LLPointer<T>>							element_list;  	typedef LLPointer<T>*										element_iter;  	typedef const LLPointer<T>*									const_element_iter;  	typedef typename std::vector<LLTreeListener<T>*>::iterator	tree_listener_iter; @@ -106,8 +106,9 @@ public:  	:	mParent((oct_node*)parent),   		mOctant(octant)   	{  -		mData = NULL; -		mDataEnd = NULL; +		//always keep a NULL terminated list to avoid out of bounds exceptions in debug builds +		mData.push_back(NULL); +		mDataEnd = &mData[0];  		mCenter = center;  		mSize = size; @@ -133,9 +134,9 @@ public:  			mData[i] = NULL;  		} -		free(mData); -		mData = NULL; -		mDataEnd = NULL; +		mData.clear(); +		mData.push_back(NULL); +		mDataEnd = &mData[0];  		for (U32 i = 0; i < getChildCount(); i++)  		{ @@ -239,9 +240,9 @@ public:  	bool isEmpty() const							{ return mElementCount == 0; }  	element_list& getData()							{ return mData; }  	const element_list& getData() const				{ return mData; } -	element_iter getDataBegin()						{ return mData; } +	element_iter getDataBegin()						{ return &mData[0]; }  	element_iter getDataEnd()						{ return mDataEnd; } -	const_element_iter getDataBegin() const			{ return mData; } +	const_element_iter getDataBegin() const			{ return &mData[0]; }  	const_element_iter getDataEnd() const			{ return mDataEnd; }  	U32 getChildCount()	const						{ return mChildCount; } @@ -321,14 +322,10 @@ public:  			if ((getElementCount() < gOctreeMaxCapacity && contains(data->getBinRadius()) ||  				(data->getBinRadius() > getSize()[0] &&	parent && parent->getElementCount() >= gOctreeMaxCapacity)))   			{ //it belongs here +				mData.push_back(NULL); +				mData[mElementCount] = data;  				mElementCount++; -				mData = (element_list) realloc(mData, sizeof(LLPointer<T>)*mElementCount); - -				//avoid unref on uninitialized memory -				memset(mData+mElementCount-1, 0, sizeof(LLPointer<T>)); - -				mData[mElementCount-1] = data; -				mDataEnd = mData + mElementCount; +				mDataEnd = &mData[mElementCount];  				data->setBinIndex(mElementCount-1);  				BaseType::insert(data);  				return true; @@ -364,14 +361,10 @@ public:  				if( lt == 0x7 )  				{ +					mData.push_back(NULL); +					mData[mElementCount] = data;  					mElementCount++; -					mData = (element_list) realloc(mData, sizeof(LLPointer<T>)*mElementCount); - -					//avoid unref on uninitialized memory -					memset(mData+mElementCount-1, 0, sizeof(LLPointer<T>)); - -					mData[mElementCount-1] = data; -					mDataEnd = mData + mElementCount; +					mDataEnd = &mData[mElementCount];  					data->setBinIndex(mElementCount-1);  					BaseType::insert(data);  					return true; @@ -436,16 +429,15 @@ public:  				mData[i]->setBinIndex(i);  			} -			mData[mElementCount] = NULL; //needed for unref -			mData = (element_list) realloc(mData, sizeof(LLPointer<T>)*mElementCount); -			mDataEnd = mData+mElementCount; +			mData[mElementCount] = NULL; +			mData.pop_back(); +			mDataEnd = &mData[mElementCount];  		}  		else  		{ -			mData[0] = NULL; //needed for unref -			free(mData); -			mData = NULL; -			mDataEnd = NULL; +			mData.clear(); +			mData.push_back(NULL); +			mDataEnd = &mData[0];  		}  		notifyRemoval(data); @@ -491,7 +483,7 @@ public:  		}  		//node is now root -		llwarns << "!!! OCTREE REMOVING FACE BY ADDRESS, SEVERE PERFORMANCE PENALTY |||" << llendl; +		llwarns << "!!! OCTREE REMOVING ELEMENT BY ADDRESS, SEVERE PERFORMANCE PENALTY |||" << llendl;  		node->removeByAddress(data);  		llassert(data->getBinIndex() == -1);  		return true; diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index 5083478392..fc15b8b7f4 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -4680,55 +4680,63 @@ LLCullResult::LLCullResult()  	mVisibleListAllocated = 0;  	mVisibleBridgeAllocated = 0; -	mVisibleGroups = NULL; -	mVisibleGroupsEnd = NULL; -	mAlphaGroups = NULL; -	mAlphaGroupsEnd = NULL; -	mOcclusionGroups = NULL; -	mOcclusionGroupsEnd = NULL; -	mDrawableGroups = NULL; -	mDrawableGroupsEnd = NULL; -	mVisibleList = NULL; -	mVisibleListEnd = NULL; -	mVisibleBridge = NULL; -	mVisibleBridgeEnd = NULL; +	mVisibleGroups.clear(); +	mVisibleGroups.push_back(NULL); +	mVisibleGroupsEnd = &mVisibleGroups[0]; +	mAlphaGroups.clear(); +	mAlphaGroups.push_back(NULL); +	mAlphaGroupsEnd = &mAlphaGroups[0]; +	mOcclusionGroups.clear(); +	mOcclusionGroups.push_back(NULL); +	mOcclusionGroupsEnd = &mOcclusionGroups[0]; +	mDrawableGroups.clear(); +	mDrawableGroups.push_back(NULL); +	mDrawableGroupsEnd = &mDrawableGroups[0]; +	mVisibleList.clear(); +	mVisibleList.push_back(NULL); +	mVisibleListEnd = &mVisibleList[0]; +	mVisibleBridge.clear(); +	mVisibleBridge.push_back(NULL); +	mVisibleBridgeEnd = &mVisibleBridge[0];  	for (U32 i = 0; i < LLRenderPass::NUM_RENDER_TYPES; i++)  	{ -		mRenderMap[i] = NULL; -		mRenderMapEnd[i] = NULL; +		mRenderMap[i].clear(); +		mRenderMap[i].push_back(NULL); +		mRenderMapEnd[i] = &mRenderMap[i][0];  		mRenderMapAllocated[i] = 0;  	}  	clear();  } -void LLCullResult::pushBack(void**& head, U32& count, void* val) +template <class T, class V>  +void LLCullResult::pushBack(T& head, U32& count, V* val)  { +	head[count] = val; +	head.push_back(NULL);  	count++; -	head = (void**) realloc((void*) head, sizeof(void*) * count); -	head[count-1] = val;  }  void LLCullResult::clear()  {  	mVisibleGroupsSize = 0; -	mVisibleGroupsEnd = mVisibleGroups; +	mVisibleGroupsEnd = &mVisibleGroups[0];  	mAlphaGroupsSize = 0; -	mAlphaGroupsEnd = mAlphaGroups; +	mAlphaGroupsEnd = &mAlphaGroups[0];  	mOcclusionGroupsSize = 0; -	mOcclusionGroupsEnd = mOcclusionGroups; +	mOcclusionGroupsEnd = &mOcclusionGroups[0];  	mDrawableGroupsSize = 0; -	mDrawableGroupsEnd = mDrawableGroups; +	mDrawableGroupsEnd = &mDrawableGroups[0];  	mVisibleListSize = 0; -	mVisibleListEnd = mVisibleList; +	mVisibleListEnd = &mVisibleList[0];  	mVisibleBridgeSize = 0; -	mVisibleBridgeEnd = mVisibleBridge; +	mVisibleBridgeEnd = &mVisibleBridge[0];  	for (U32 i = 0; i < LLRenderPass::NUM_RENDER_TYPES; i++) @@ -4738,13 +4746,13 @@ void LLCullResult::clear()  			mRenderMap[i][j] = 0;  		}  		mRenderMapSize[i] = 0; -		mRenderMapEnd[i] = mRenderMap[i]; +		mRenderMapEnd[i] = &(mRenderMap[i][0]);  	}  }  LLCullResult::sg_iterator LLCullResult::beginVisibleGroups()  { -	return mVisibleGroups; +	return &mVisibleGroups[0];  }  LLCullResult::sg_iterator LLCullResult::endVisibleGroups() @@ -4754,7 +4762,7 @@ LLCullResult::sg_iterator LLCullResult::endVisibleGroups()  LLCullResult::sg_iterator LLCullResult::beginAlphaGroups()  { -	return mAlphaGroups; +	return &mAlphaGroups[0];  }  LLCullResult::sg_iterator LLCullResult::endAlphaGroups() @@ -4764,7 +4772,7 @@ LLCullResult::sg_iterator LLCullResult::endAlphaGroups()  LLCullResult::sg_iterator LLCullResult::beginOcclusionGroups()  { -	return mOcclusionGroups; +	return &mOcclusionGroups[0];  }  LLCullResult::sg_iterator LLCullResult::endOcclusionGroups() @@ -4774,7 +4782,7 @@ LLCullResult::sg_iterator LLCullResult::endOcclusionGroups()  LLCullResult::sg_iterator LLCullResult::beginDrawableGroups()  { -	return mDrawableGroups; +	return &mDrawableGroups[0];  }  LLCullResult::sg_iterator LLCullResult::endDrawableGroups() @@ -4784,7 +4792,7 @@ LLCullResult::sg_iterator LLCullResult::endDrawableGroups()  LLCullResult::drawable_iterator LLCullResult::beginVisibleList()  { -	return mVisibleList; +	return &mVisibleList[0];  }  LLCullResult::drawable_iterator LLCullResult::endVisibleList() @@ -4794,7 +4802,7 @@ LLCullResult::drawable_iterator LLCullResult::endVisibleList()  LLCullResult::bridge_iterator LLCullResult::beginVisibleBridge()  { -	return mVisibleBridge; +	return &mVisibleBridge[0];  }  LLCullResult::bridge_iterator LLCullResult::endVisibleBridge() @@ -4804,7 +4812,7 @@ LLCullResult::bridge_iterator LLCullResult::endVisibleBridge()  LLCullResult::drawinfo_iterator LLCullResult::beginRenderMap(U32 type)  { -	return mRenderMap[type]; +	return &mRenderMap[type][0];  }  LLCullResult::drawinfo_iterator LLCullResult::endRenderMap(U32 type) @@ -4820,10 +4828,10 @@ void LLCullResult::pushVisibleGroup(LLSpatialGroup* group)  	}  	else  	{ -		pushBack((void**&) mVisibleGroups, mVisibleGroupsAllocated, (void*) group); +		pushBack(mVisibleGroups, mVisibleGroupsAllocated, group);  	}  	++mVisibleGroupsSize; -	mVisibleGroupsEnd = mVisibleGroups+mVisibleGroupsSize; +	mVisibleGroupsEnd = &mVisibleGroups[mVisibleGroupsSize];  }  void LLCullResult::pushAlphaGroup(LLSpatialGroup* group) @@ -4834,10 +4842,10 @@ void LLCullResult::pushAlphaGroup(LLSpatialGroup* group)  	}  	else  	{ -		pushBack((void**&) mAlphaGroups, mAlphaGroupsAllocated, (void*) group); +		pushBack(mAlphaGroups, mAlphaGroupsAllocated, group);  	}  	++mAlphaGroupsSize; -	mAlphaGroupsEnd = mAlphaGroups+mAlphaGroupsSize; +	mAlphaGroupsEnd = &mAlphaGroups[mAlphaGroupsSize];  }  void LLCullResult::pushOcclusionGroup(LLSpatialGroup* group) @@ -4848,10 +4856,10 @@ void LLCullResult::pushOcclusionGroup(LLSpatialGroup* group)  	}  	else  	{ -		pushBack((void**&) mOcclusionGroups, mOcclusionGroupsAllocated, (void*) group); +		pushBack(mOcclusionGroups, mOcclusionGroupsAllocated, group);  	}  	++mOcclusionGroupsSize; -	mOcclusionGroupsEnd = mOcclusionGroups+mOcclusionGroupsSize; +	mOcclusionGroupsEnd = &mOcclusionGroups[mOcclusionGroupsSize];  }  void LLCullResult::pushDrawableGroup(LLSpatialGroup* group) @@ -4862,10 +4870,10 @@ void LLCullResult::pushDrawableGroup(LLSpatialGroup* group)  	}  	else  	{ -		pushBack((void**&) mDrawableGroups, mDrawableGroupsAllocated, (void*) group); +		pushBack(mDrawableGroups, mDrawableGroupsAllocated, group);  	}  	++mDrawableGroupsSize; -	mDrawableGroupsEnd = mDrawableGroups+mDrawableGroupsSize; +	mDrawableGroupsEnd = &mDrawableGroups[mDrawableGroupsSize];  }  void LLCullResult::pushDrawable(LLDrawable* drawable) @@ -4876,10 +4884,10 @@ void LLCullResult::pushDrawable(LLDrawable* drawable)  	}  	else  	{ -		pushBack((void**&) mVisibleList, mVisibleListAllocated, (void*) drawable); +		pushBack(mVisibleList, mVisibleListAllocated, drawable);  	}  	++mVisibleListSize; -	mVisibleListEnd = mVisibleList+mVisibleListSize; +	mVisibleListEnd = &mVisibleList[mVisibleListSize];  }  void LLCullResult::pushBridge(LLSpatialBridge* bridge) @@ -4890,10 +4898,10 @@ void LLCullResult::pushBridge(LLSpatialBridge* bridge)  	}  	else  	{ -		pushBack((void**&) mVisibleBridge, mVisibleBridgeAllocated, (void*) bridge); +		pushBack(mVisibleBridge, mVisibleBridgeAllocated, bridge);  	}  	++mVisibleBridgeSize; -	mVisibleBridgeEnd = mVisibleBridge+mVisibleBridgeSize; +	mVisibleBridgeEnd = &mVisibleBridge[mVisibleBridgeSize];  }  void LLCullResult::pushDrawInfo(U32 type, LLDrawInfo* draw_info) @@ -4904,10 +4912,10 @@ void LLCullResult::pushDrawInfo(U32 type, LLDrawInfo* draw_info)  	}  	else  	{ -		pushBack((void**&) mRenderMap[type], mRenderMapAllocated[type], (void*) draw_info); +		pushBack(mRenderMap[type], mRenderMapAllocated[type], draw_info);  	}  	++mRenderMapSize[type]; -	mRenderMapEnd[type] = mRenderMap[type] + mRenderMapSize[type]; +	mRenderMapEnd[type] = &(mRenderMap[type][mRenderMapSize[type]]);  } diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h index f050df2b39..d3252fe26a 100644 --- a/indra/newview/llspatialpartition.h +++ b/indra/newview/llspatialpartition.h @@ -567,10 +567,10 @@ class LLCullResult  public:  	LLCullResult(); -	typedef LLSpatialGroup** sg_list_t; -	typedef LLDrawable** drawable_list_t; -	typedef LLSpatialBridge** bridge_list_t; -	typedef LLDrawInfo** drawinfo_list_t; +	typedef std::vector<LLSpatialGroup*> sg_list_t; +	typedef std::vector<LLDrawable*> drawable_list_t; +	typedef std::vector<LLSpatialBridge*> bridge_list_t; +	typedef std::vector<LLDrawInfo*> drawinfo_list_t;  	typedef LLSpatialGroup** sg_iterator;  	typedef LLSpatialBridge** bridge_iterator; @@ -620,7 +620,7 @@ public:  private: -	void pushBack(void** &head, U32& count, void* val); +	template <class T, class V> void pushBack(T &head, U32& count, V* val);  	U32					mVisibleGroupsSize;  	U32					mAlphaGroupsSize; | 
