diff options
| author | Xiaohong Bao <bao@lindenlab.com> | 2013-09-20 11:40:30 -0600 | 
|---|---|---|
| committer | Xiaohong Bao <bao@lindenlab.com> | 2013-09-20 11:40:30 -0600 | 
| commit | ba4f64ed7ad64deeed5f7109f33c796bae0c4423 (patch) | |
| tree | 96b78f3536ff026c8f4f2949eed1fd7948423314 /indra | |
| parent | 52118862ba0946da3e4cfc558c3f457b0e6d0b2c (diff) | |
fix for SH-4430: Interesting: Light objects behind you are not loaded at login.
Diffstat (limited to 'indra')
| -rwxr-xr-x | indra/newview/llviewerregion.cpp | 8 | ||||
| -rwxr-xr-x | indra/newview/llviewerregion.h | 2 | ||||
| -rwxr-xr-x | indra/newview/llvocache.cpp | 98 | ||||
| -rwxr-xr-x | indra/newview/llvocache.h | 8 | 
4 files changed, 105 insertions, 11 deletions
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index abead17d6f..985f5a0a1f 100755 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -963,14 +963,16 @@ void LLViewerRegion::removeActiveCacheEntry(LLVOCacheEntry* entry, LLDrawable* d  	entry->setState(LLVOCacheEntry::INACTIVE);  } -void LLViewerRegion::addVisibleGroup(LLviewerOctreeGroup* group) +bool LLViewerRegion::addVisibleGroup(LLviewerOctreeGroup* group)  {  	if(mDead || group->isEmpty())  	{ -		return; +		return false;  	} -	group->setVisible(); +	  	mImpl->mVisibleGroups.insert(group); + +	return true;  }  U32 LLViewerRegion::getNumOfVisibleGroups() const diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index e07c2aa8d0..b2df8d5325 100755 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -229,7 +229,7 @@ public:  	F32	getWidth() const						{ return mWidth; }  	BOOL idleUpdate(F32 max_update_time); -	void addVisibleGroup(LLviewerOctreeGroup* group); +	bool addVisibleGroup(LLviewerOctreeGroup* group);  	void addVisibleCacheEntry(LLVOCacheEntry* entry);  	void addActiveCacheEntry(LLVOCacheEntry* entry);  	void removeActiveCacheEntry(LLVOCacheEntry* entry, LLDrawable* drawablep);	 diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp index 6d2a17882a..e3a3f0510b 100755 --- a/indra/newview/llvocache.cpp +++ b/indra/newview/llvocache.cpp @@ -490,7 +490,8 @@ LLVOCachePartition::LLVOCachePartition(LLViewerRegion* regionp)  {  	mLODPeriod = 16;  	mRegionp = regionp; -	mPartitionType = LLViewerRegion::PARTITION_VO_CACHE;	 +	mPartitionType = LLViewerRegion::PARTITION_VO_CACHE; +	mBackSlectionEnabled = -1;  	for(S32 i = 0; i < LLViewerCamera::NUM_CAMERAS; i++)  	{ @@ -517,7 +518,8 @@ void LLVOCachePartition::removeEntry(LLViewerOctreeEntry* entry)  class LLVOCacheOctreeCull : public LLViewerOctreeCull  {  public: -	LLVOCacheOctreeCull(LLCamera* camera, LLViewerRegion* regionp, const LLVector3& shift, bool use_object_cache_occlusion, LLVOCachePartition* part)  +	LLVOCacheOctreeCull(LLCamera* camera, LLViewerRegion* regionp,  +		const LLVector3& shift, bool use_object_cache_occlusion, LLVOCachePartition* part)   		: LLViewerOctreeCull(camera),   		  mRegionp(regionp),  		  mPartition(part) @@ -583,7 +585,10 @@ public:  			!base_group->getOctreeNode()->getParent())  		{   			//no occlusion check -			mRegionp->addVisibleGroup(base_group); +			if(mRegionp->addVisibleGroup(base_group)) +			{ +				base_group->setVisible(); +			}  			return;  		} @@ -603,7 +608,10 @@ public:  		}  		else  		{ -			mRegionp->addVisibleGroup(base_group); +			if(mRegionp->addVisibleGroup(base_group)) +			{ +				base_group->setVisible(); +			}  		}  	} @@ -614,6 +622,81 @@ private:  	bool                mUseObjectCacheOcclusion;  }; +//select objects behind camera +class LLVOCacheOctreeBackCull : public LLViewerOctreeCull +{ +public: +	LLVOCacheOctreeBackCull(LLCamera* camera, const LLVector3& shift, LLViewerRegion* regionp)  +		: LLViewerOctreeCull(camera), mRegionp(regionp) +	{ +		mLocalShift = shift; +		mSphereRadius = 20.f; //20m +	} + +	virtual S32 frustumCheck(const LLviewerOctreeGroup* group) +	{			 +		const LLVector4a* exts = group->getExtents(); +		return backSphereCheck(exts[0], exts[1]); +	} + +	virtual S32 frustumCheckObjects(const LLviewerOctreeGroup* group) +	{ +		const LLVector4a* exts = group->getObjectExtents(); +		return backSphereCheck(exts[0], exts[1]); +	} + +	virtual void processGroup(LLviewerOctreeGroup* base_group) +	{ +		mRegionp->addVisibleGroup(base_group); +		return; +	} + +private: +	//a sphere around the camera origin, including objects behind camera. +	S32 backSphereCheck(const LLVector4a& min, const LLVector4a& max) +	{ +		return AABBSphereIntersect(min, max, mCamera->getOrigin() - mLocalShift, mSphereRadius); +	} + +private: +	F32              mSphereRadius; +	LLViewerRegion*  mRegionp; +	LLVector3        mLocalShift; //shift vector from agent space to local region space. +}; + +void LLVOCachePartition::selectBackObjects(LLCamera &camera) +{ +	if(LLViewerCamera::sCurCameraID != LLViewerCamera::CAMERA_WORLD) +	{ +		return; +	} + +	if(mBackSlectionEnabled < 0) +	{ +		mBackSlectionEnabled = LLVOCacheEntry::getInvisibleObjectsLiveTime() - 1; +		mBackSlectionEnabled = llmax(mBackSlectionEnabled, (S32)1); +	} + +	if(!mBackSlectionEnabled) +	{ +		return; +	} + +	//localize the camera +	LLVector3 region_agent = mRegionp->getOriginAgent(); +	 +	LLVOCacheOctreeBackCull culler(&camera, region_agent, mRegionp); +	culler.traverse(mOctree); + +	mBackSlectionEnabled--; +	if(!mRegionp->getNumOfVisibleGroups()) +	{ +		mBackSlectionEnabled = 0; +	} + +	return; +} +  S32 LLVOCachePartition::cull(LLCamera &camera, bool do_occlusion)  {  	static LLCachedControl<bool> use_object_cache_occlusion(gSavedSettings,"UseObjectCacheOcclusion"); @@ -650,10 +733,15 @@ S32 LLVOCachePartition::cull(LLCamera &camera, bool do_occlusion)  		}  		if(LLViewerOctreeEntryData::getCurrentFrame() % seed != hash)  		{ +			selectBackObjects(camera);//process back objects selection  			return 0; //nothing changed, reduce frequency of culling  		}  	} -	 +	else +	{ +		mBackSlectionEnabled = -1; //reset it. +	} +  	if(LLViewerCamera::sCurCameraID == LLViewerCamera::CAMERA_WORLD)  	{  		mCullHistory[LLViewerCamera::sCurCameraID] <<= 1; diff --git a/indra/newview/llvocache.h b/indra/newview/llvocache.h index 7c7b64ad5b..bab3be26b8 100755 --- a/indra/newview/llvocache.h +++ b/indra/newview/llvocache.h @@ -126,10 +126,9 @@ public:  	U32  getUpdateFlags() const    {return mUpdateFlags;}  	static void updateBackCullingFactors(); - -private:  	static U32  getInvisibleObjectsLiveTime(); +private:  	void updateParentBoundingInfo(const LLVOCacheEntry* child);	  public: @@ -172,6 +171,9 @@ public:  	void resetOccluders();  	void processOccluders(LLCamera* camera); +private: +	void selectBackObjects(LLCamera &camera); //select objects behind camera. +  public:  	static BOOL sNeedsOcclusionCheck;  	//static	LLTrace::MemStatHandle	sMemStat; @@ -180,6 +182,8 @@ private:  	U32   mCullHistory[LLViewerCamera::NUM_CAMERAS];  	U32   mCulledTime[LLViewerCamera::NUM_CAMERAS];  	std::set<LLOcclusionCullingGroup*> mOccludedGroups; + +	S32   mBackSlectionEnabled; //enable to select back objects if > 0.  };  //  | 
