diff options
| -rw-r--r-- | indra/newview/llvieweroctree.cpp | 4 | ||||
| -rwxr-xr-x | indra/newview/llviewerregion.cpp | 72 | ||||
| -rwxr-xr-x | indra/newview/llviewerregion.h | 4 | 
3 files changed, 51 insertions, 29 deletions
| diff --git a/indra/newview/llvieweroctree.cpp b/indra/newview/llvieweroctree.cpp index 62d34d12b5..201677b3de 100644 --- a/indra/newview/llvieweroctree.cpp +++ b/indra/newview/llvieweroctree.cpp @@ -268,6 +268,10 @@ void LLViewerOctreeEntry::removeData(LLViewerOctreeEntryData* data)  	{  		return;  	} +	if(mData[data->getDataType()] != data) +	{ +		return; +	}  	mData[data->getDataType()] = NULL; diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 2eb065c1ef..f1ac4328e4 100755 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -847,7 +847,7 @@ void LLViewerRegion::replaceVisibleCacheEntry(LLVOCacheEntry* old_entry, LLVOCac  }  //physically delete the cache entry -void LLViewerRegion::killCacheEntry(LLVOCacheEntry* entry) +void LLViewerRegion::killCacheEntry(LLVOCacheEntry* entry, bool kill_obj)  {	  	if(!entry)  	{ @@ -857,6 +857,14 @@ void LLViewerRegion::killCacheEntry(LLVOCacheEntry* entry)  	//remove from active list and waiting list  	if(entry->isState(LLVOCacheEntry::ACTIVE))  	{ +		if(kill_obj && entry->getEntry()) +		{ +			LLDrawable* drawablep = (LLDrawable*)entry->getEntry()->getDrawable(); +			if(drawablep) +			{ +				gObjectList.killObject(drawablep->getVObj()); +			} +		}  		mImpl->mActiveSet.erase(entry);  	}  	else @@ -887,16 +895,19 @@ void LLViewerRegion::killCacheEntry(LLVOCacheEntry* entry)  		entry->removeAllChildren();  	} -	entry->setState(LLVOCacheEntry::INACTIVE); -	 +	if(kill_obj) +	{ +		entry->setState(LLVOCacheEntry::INACTIVE); +	} +  	//remove from mCacheMap, real deletion  	mImpl->mCacheMap.erase(entry->getLocalID());  }  //physically delete the cache entry	 -void LLViewerRegion::killCacheEntry(U32 local_id)  +void LLViewerRegion::killCacheEntry(U32 local_id, bool kill_obj)   { -	killCacheEntry(getCacheEntry(local_id)); +	killCacheEntry(getCacheEntry(local_id), kill_obj);  }  U32 LLViewerRegion::getNumOfActiveCachedObjects() const @@ -1458,6 +1469,7 @@ void LLViewerRegion::killObject(LLVOCacheEntry* entry, std::vector<LLDrawable*>&  	//kill the object.  	LLDrawable* drawablep = (LLDrawable*)entry->getEntry()->getDrawable();  	llassert(drawablep); +	llassert(drawablep->getRegion() == this);  	if(drawablep && !drawablep->getParent())  	{ @@ -1509,12 +1521,21 @@ LLViewerObject* LLViewerRegion::addNewObject(LLVOCacheEntry* entry)  	}  	else  	{ +		LLViewerRegion* old_regionp = ((LLDrawable*)entry->getEntry()->getDrawable())->getRegion(); +		if(old_regionp != this) +		{ +			//this object exists in two regions at the same time; +			//this case can be safely ignored here because +			//server should soon send update message to remove one region for this object. + +			LL_WARNS() << "Entry: " << entry->getLocalID() << " exists in two regions at the same time." << LL_ENDL; +			return NULL; +		} +		 +		LL_WARNS() << "Entry: " << entry->getLocalID() << " in rendering pipeline but not set to be active." << LL_ENDL; +  		//should not hit here any more, but does not hurt either, just put it back to active list  		addActiveCacheEntry(entry); - -		//object is already created, crash here for debug use. -		LL_WARNS() << "Object is already created." << LL_ENDL; -		llassert(!entry->getEntry()->hasDrawable());  	}  	return obj;  } @@ -2027,6 +2048,20 @@ void LLViewerRegion::decodeBoundingInfo(LLVOCacheEntry* entry)  		if(entry->getEntry()->hasDrawable()) //already in the rendering pipeline  		{ +			LLViewerRegion* old_regionp = ((LLDrawable*)entry->getEntry()->getDrawable())->getRegion(); +			if(old_regionp != this && old_regionp) +			{ +				LLViewerObject* obj = ((LLDrawable*)entry->getEntry()->getDrawable())->getVObj(); +				if(obj) +				{ +					//remove from old region +					old_regionp->killCacheEntry(obj->getLocalID(), false); + +					//change region +					obj->setRegion(this); +				} +			} +  			addActiveCacheEntry(entry);  			//set parent id @@ -2173,7 +2208,7 @@ LLViewerRegion::eCacheUpdateResult LLViewerRegion::cacheFullUpdate(LLDataPackerB  				mImpl->mCacheMap[local_id] = entry;  				decodeBoundingInfo(entry); -		} +			}  			result = CACHE_UPDATE_CHANGED;  		} @@ -2199,23 +2234,6 @@ LLViewerRegion::eCacheUpdateResult LLViewerRegion::cacheFullUpdate(LLViewerObjec  {  	eCacheUpdateResult result = cacheFullUpdate(dp, flags); -#if 0 -	LLVOCacheEntry* entry = mImpl->mCacheMap[objectp->getLocalID()]; -	if(!entry) -	{ -		return result; -	} -		 -	if(objectp->mDrawable.notNull() && !entry->getEntry()) -	{ -		entry->setOctreeEntry(objectp->mDrawable->getEntry()); -	} -	if(entry->getEntry() && entry->getEntry()->hasDrawable() && entry->isState(LLVOCacheEntry::INACTIVE)) -	{ -		addActiveCacheEntry(entry); -	} -#endif -  	return result;  } diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index a789cc6715..0f27def8a5 100755 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -235,7 +235,7 @@ public:  	void addVisibleCacheEntry(LLVOCacheEntry* entry);  	void addActiveCacheEntry(LLVOCacheEntry* entry);  	void removeActiveCacheEntry(LLVOCacheEntry* entry, LLDrawable* drawablep);	 -	void killCacheEntry(U32 local_id); //physically delete the cache entry	 +	void killCacheEntry(U32 local_id, bool kill_obj = true); //physically delete the cache entry	  	// Like idleUpdate, but forces everything to complete regardless of  	// how long it takes. @@ -385,7 +385,7 @@ private:  	void killObject(LLVOCacheEntry* entry, std::vector<LLDrawable*>& delete_list);	  	void removeFromVOCacheTree(LLVOCacheEntry* entry);  	void replaceVisibleCacheEntry(LLVOCacheEntry* old_entry, LLVOCacheEntry* new_entry); -	void killCacheEntry(LLVOCacheEntry* entry); //physically delete the cache entry	 +	void killCacheEntry(LLVOCacheEntry* entry, bool kill_obj = true); //physically delete the cache entry	  	void killInvisibleObjects(F32 max_time);  	void createVisibleObjects(F32 max_time);  	void updateVisibleEntries(F32 max_time); //update visible entries | 
