diff options
| author | Dave Parks <davep@lindenlab.com> | 2011-10-20 18:53:12 -0500 | 
|---|---|---|
| committer | Dave Parks <davep@lindenlab.com> | 2011-10-20 18:53:12 -0500 | 
| commit | 34c01b6b1ff758463dcdff19782e5af668699304 (patch) | |
| tree | d90dbf1fa61564bee6f1137f24939b356ae7c4ce | |
| parent | 281b71300d0296f54809948d16c778b6bf08ef19 (diff) | |
SH-2564 Fix for bad frustum culling on visible region list
| -rw-r--r-- | indra/newview/llworld.cpp | 43 | 
1 files changed, 23 insertions, 20 deletions
| diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index a7ae456f3c..6f6e0d2334 100644 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -589,22 +589,22 @@ void LLWorld::updateVisibilities()  {  	F32 cur_far_clip = LLViewerCamera::getInstance()->getFar(); -	LLViewerCamera::getInstance()->setFar(mLandFarClip); - -	F32 diagonal_squared = F_SQRT2 * F_SQRT2 * mWidth * mWidth; -	// Go through the culled list and check for visible regions +	// Go through the culled list and check for visible regions (region is visible if land is visible)  	for (region_list_t::iterator iter = mCulledRegionList.begin();  		 iter != mCulledRegionList.end(); )  	{  		region_list_t::iterator curiter = iter++;  		LLViewerRegion* regionp = *curiter; -		F32 height = regionp->getLand().getMaxZ() - regionp->getLand().getMinZ(); -		F32 radius = 0.5f*(F32) sqrt(height * height + diagonal_squared); -		if (!regionp->getLand().hasZData() -			|| LLViewerCamera::getInstance()->sphereInFrustum(regionp->getCenterAgent(), radius)) +		 +		LLSpatialPartition* part = regionp->getSpatialPartition(LLViewerRegion::PARTITION_TERRAIN); +		if (part)  		{ -			mCulledRegionList.erase(curiter); -			mVisibleRegionList.push_back(regionp); +			LLSpatialGroup* group = (LLSpatialGroup*) part->mOctree->getListener(0); +			if (LLViewerCamera::getInstance()->AABBInFrustum(group->mBounds[0], group->mBounds[1])) +			{ +				mCulledRegionList.erase(curiter); +				mVisibleRegionList.push_back(regionp); +			}  		}  	} @@ -619,17 +619,20 @@ void LLWorld::updateVisibilities()  			continue;  		} -		F32 height = regionp->getLand().getMaxZ() - regionp->getLand().getMinZ(); -		F32 radius = 0.5f*(F32) sqrt(height * height + diagonal_squared); -		if (LLViewerCamera::getInstance()->sphereInFrustum(regionp->getCenterAgent(), radius)) +		LLSpatialPartition* part = regionp->getSpatialPartition(LLViewerRegion::PARTITION_TERRAIN); +		if (part)  		{ -			regionp->calculateCameraDistance(); -			regionp->getLand().updatePatchVisibilities(gAgent); -		} -		else -		{ -			mVisibleRegionList.erase(curiter); -			mCulledRegionList.push_back(regionp); +			LLSpatialGroup* group = (LLSpatialGroup*) part->mOctree->getListener(0); +			if (LLViewerCamera::getInstance()->AABBInFrustum(group->mBounds[0], group->mBounds[1])) +			{ +				regionp->calculateCameraDistance(); +				regionp->getLand().updatePatchVisibilities(gAgent); +			} +			else +			{ +				mVisibleRegionList.erase(curiter); +				mCulledRegionList.push_back(regionp); +			}  		}  	} | 
