diff options
| author | Xiaohong Bao <bao@lindenlab.com> | 2014-01-31 18:25:18 -0700 | 
|---|---|---|
| committer | Xiaohong Bao <bao@lindenlab.com> | 2014-01-31 18:25:18 -0700 | 
| commit | 01f8595bb216b93fd54be45ab06a426b23099c87 (patch) | |
| tree | a19f9509985384ceb78e5db11c49d452b455c803 | |
| parent | 5df86c9a6e258221440a775e229a5be25a4b7e51 (diff) | |
| parent | b49170b732e6e4b2cf11b40c12b3d75a8709cf5c (diff) | |
Automated merge with http://bitbucket.org/lindenlab/viewer-interesting
| -rwxr-xr-x | indra/newview/lldrawable.cpp | 11 | ||||
| -rwxr-xr-x | indra/newview/llviewerregion.cpp | 39 | ||||
| -rwxr-xr-x | indra/newview/llviewerregion.h | 2 | ||||
| -rwxr-xr-x | indra/newview/llvocache.cpp | 25 | ||||
| -rwxr-xr-x | indra/newview/llvocache.h | 4 | 
5 files changed, 54 insertions, 27 deletions
| diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp index 7414b24811..c56006d9a3 100755 --- a/indra/newview/lldrawable.cpp +++ b/indra/newview/lldrawable.cpp @@ -128,13 +128,14 @@ void LLDrawable::init(bool new_entry)  		{  			vo_entry->setOctreeEntry(mEntry);  		} -		else if(vo_entry->getNumOfChildren() > 0) -		{ -			getRegion()->addVisibleCacheEntry(vo_entry); //to load all children. -		} -	 +		  		getRegion()->addActiveCacheEntry(vo_entry); +		if(vo_entry->getNumOfChildren() > 0) +		{ +			getRegion()->addVisibleChildCacheEntry(vo_entry, NULL); //to load all children. +		}		 +  		llassert(!vo_entry->getGroup()); //not in the object cache octree.  	} diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 3d8afcceb0..e2143babcf 100755 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -1007,37 +1007,36 @@ void LLViewerRegion::removeFromVOCacheTree(LLVOCacheEntry* entry)  	mImpl->mVOCachePartition->removeEntry(entry->getEntry());	  } -//add the visible entries -void LLViewerRegion::addVisibleCacheEntry(LLVOCacheEntry* entry) +//add child objects as visible entries +void LLViewerRegion::addVisibleChildCacheEntry(LLVOCacheEntry* parent, LLVOCacheEntry* child)  { -	if(mDead || !entry || !entry->getEntry() || !entry->isValid()) -	{ -		return;  -	} - -	if(entry->isState(LLVOCacheEntry::IN_QUEUE)) +	if(mDead)  	{  		return;  	} -	if(entry->isState(LLVOCacheEntry::INACTIVE)) +	if(parent && (!parent->isValid() || !parent->isState(LLVOCacheEntry::ACTIVE)))  	{ -		entry->setState(LLVOCacheEntry::IN_QUEUE); +		return; //parent must be valid and in rendering pipeline  	} -	if(!entry->isState(LLVOCacheEntry::ACTIVE)) +	if(child && (!child->getEntry() || !child->isValid() || !child->isState(LLVOCacheEntry::INACTIVE)))  	{ -		mImpl->mVisibleEntries.insert(entry); +		return; //child must be valid and not in the rendering pipeline  	} -	//add all children -	if(entry->getNumOfChildren() > 0) +	if(child)  	{ -		LLVOCacheEntry* child = entry->getChild(); +		child->setState(LLVOCacheEntry::IN_QUEUE); +		mImpl->mVisibleEntries.insert(child); +	}	 +	else if(parent && parent->getNumOfChildren() > 0) //add all children +	{ +		child = parent->getChild();  		while(child != NULL)  		{ -			addVisibleCacheEntry(child); -			child = entry->getChild(); +			addVisibleCacheEntry(NULL, child); +			child = parent->getChild();  		}  	}  } @@ -2002,7 +2001,7 @@ void LLViewerRegion::findOrphans(U32 parent_id)  		for(S32 i = 0; i < children->size(); i++)  		{  			//parent is visible, so is the child. -			addVisibleCacheEntry(getCacheEntry((*children)[i])); +			addVisibleChildCacheEntry(NULL, getCacheEntry((*children)[i]));  		}  		children->clear();  		mOrphanMap.erase(parent_id); @@ -2106,7 +2105,7 @@ void LLViewerRegion::decodeBoundingInfo(LLVOCacheEntry* entry)  				if(isNonCacheableObjectCreated(parent_id))  				{  					//parent is visible, so is the child. -					addVisibleCacheEntry(entry); +					addVisibleChildCacheEntry(NULL, entry);  				}  				else  				{ @@ -2124,7 +2123,7 @@ void LLViewerRegion::decodeBoundingInfo(LLVOCacheEntry* entry)  			if(!parent->isState(LLVOCacheEntry::INACTIVE))   			{  				//parent is visible, so is the child. -				addVisibleCacheEntry(entry); +				addVisibleCacheEntry(parent, entry);  			}  			else  			{ diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index 7ce191fe8f..7f6a8186a5 100755 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -232,7 +232,7 @@ public:  	void idleUpdate(F32 max_update_time);  	void lightIdleUpdate();  	bool addVisibleGroup(LLViewerOctreeGroup* group); -	void addVisibleCacheEntry(LLVOCacheEntry* entry); +	void addVisibleChildCacheEntry(LLVOCacheEntry* parent, LLVOCacheEntry* child);  	void addActiveCacheEntry(LLVOCacheEntry* entry);  	void removeActiveCacheEntry(LLVOCacheEntry* entry, LLDrawable* drawablep);	  	void killCacheEntry(U32 local_id); //physically delete the cache entry	 diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp index 8af6d74ad7..0ff38ebdc8 100755 --- a/indra/newview/llvocache.cpp +++ b/indra/newview/llvocache.cpp @@ -194,6 +194,31 @@ void LLVOCacheEntry::updateEntry(U32 crc, LLDataPackerBinaryBuffer &dp)  	mDP = dp;  } +void LLVOCacheEntry::setParentID(U32 id)  +{ +	if(mParentID != id) +	{ +		removeAllChildren(); +		mParentID = id; +	} +} + +void LLVOCacheEntry::removeAllChildren() +{ +	if(mChildrenList.empty()) +	{ +		return; +	} + +	for(vocache_entry_set_t::iterator iter = mChildrenList.begin(); iter != mChildrenList.end(); ++iter) + 	{ +		*iter->setParentID(0); + 	} +	mChildrenList.clear(); + +	return; +} +  //virtual   void LLVOCacheEntry::setOctreeEntry(LLViewerOctreeEntry* entry)  { diff --git a/indra/newview/llvocache.h b/indra/newview/llvocache.h index 7396de4709..082f5f0b1d 100755 --- a/indra/newview/llvocache.h +++ b/indra/newview/llvocache.h @@ -113,11 +113,13 @@ public:  	/*virtual*/ void setOctreeEntry(LLViewerOctreeEntry* entry); -	void setParentID(U32 id) {mParentID = id;} +	void setParentID(U32 id);  	U32  getParentID() const {return mParentID;} +	bool isChild() const {return mParentID > 0;}  	void addChild(LLVOCacheEntry* entry);  	void removeChild(LLVOCacheEntry* entry); +	void removeAllChildren();  	LLVOCacheEntry* getChild(); //remove the first child, and return it.  	S32  getNumOfChildren() const  {return mChildrenList.size();} | 
