fix for SH-4609: Interesting: Occluded objects are loaded at login

master
Xiaohong Bao 2013-11-14 18:07:40 -07:00
parent 67ffa86817
commit 7c7c043e38
3 changed files with 28 additions and 7 deletions

View File

@ -305,6 +305,7 @@ public:
void checkOcclusion(); //read back last occlusion query (if any)
void doOcclusion(LLCamera* camera, const LLVector4a* shift = NULL); //issue occlusion query
BOOL isOcclusionState(U32 state) const { return mOcclusionState[LLViewerCamera::sCurCameraID] & state ? TRUE : FALSE; }
U32 getOcclusionState() const { return mOcclusionState[LLViewerCamera::sCurCameraID];}
BOOL needsUpdate();
U32 getLastOcclusionIssuedTime();

View File

@ -412,7 +412,7 @@ bool LLVOCacheEntry::isAnyVisible(const LLVector4a& camera_origin, const LLVecto
}
//within the back sphere
if(!vis && !mParentID)
if(!vis && !mParentID && !group->isOcclusionState(LLOcclusionCullingGroup::OCCLUDED))
{
LLVector4a lookAt;
@ -738,12 +738,28 @@ private:
class LLVOCacheOctreeBackCull : public LLViewerOctreeCull
{
public:
LLVOCacheOctreeBackCull(LLCamera* camera, const LLVector3& shift, LLViewerRegion* regionp, F32 pixel_threshold)
: LLViewerOctreeCull(camera), mRegionp(regionp), mPixelThreshold(pixel_threshold)
LLVOCacheOctreeBackCull(LLCamera* camera, const LLVector3& shift, LLViewerRegion* regionp, F32 pixel_threshold, bool use_occlusion)
: LLViewerOctreeCull(camera), mRegionp(regionp), mPixelThreshold(pixel_threshold), mUseObjectCacheOcclusion(use_occlusion)
{
mLocalShift = shift;
mSphereRadius = LLVOCacheEntry::sRearFarRadius;
}
virtual bool earlyFail(LLViewerOctreeGroup* base_group)
{
if( mUseObjectCacheOcclusion &&
base_group->getOctreeNode()->getParent()) //never occlusion cull the root node
{
LLOcclusionCullingGroup* group = (LLOcclusionCullingGroup*)base_group;
if (group->getOcclusionState() > 0) //occlusion state is not clear.
{
return true;
}
}
return false;
}
virtual S32 frustumCheck(const LLViewerOctreeGroup* group)
{
@ -781,9 +797,10 @@ private:
LLViewerRegion* mRegionp;
LLVector3 mLocalShift; //shift vector from agent space to local region space.
F32 mPixelThreshold;
bool mUseObjectCacheOcclusion;
};
void LLVOCachePartition::selectBackObjects(LLCamera &camera, F32 pixel_threshold)
void LLVOCachePartition::selectBackObjects(LLCamera &camera, F32 pixel_threshold, bool use_occlusion)
{
if(LLViewerCamera::sCurCameraID != LLViewerCamera::CAMERA_WORLD)
{
@ -804,7 +821,7 @@ void LLVOCachePartition::selectBackObjects(LLCamera &camera, F32 pixel_threshold
//localize the camera
LLVector3 region_agent = mRegionp->getOriginAgent();
LLVOCacheOctreeBackCull culler(&camera, region_agent, mRegionp, pixel_threshold);
LLVOCacheOctreeBackCull culler(&camera, region_agent, mRegionp, pixel_threshold, use_occlusion);
culler.traverse(mOctree);
mBackSlectionEnabled--;
@ -855,7 +872,10 @@ S32 LLVOCachePartition::cull(LLCamera &camera, bool do_occlusion)
if(LLViewerOctreeEntryData::getCurrentFrame() % seed != mIdleHash)
{
mFrontCull = FALSE;
selectBackObjects(camera, LLVOCacheEntry::getSquaredPixelThreshold(mFrontCull));//process back objects selection
//process back objects selection
selectBackObjects(camera, LLVOCacheEntry::getSquaredPixelThreshold(mFrontCull),
do_occlusion && use_object_cache_occlusion);
return 0; //nothing changed, reduce frequency of culling
}
}

View File

@ -195,7 +195,7 @@ public:
bool isFrontCull() const {return mFrontCull;}
private:
void selectBackObjects(LLCamera &camera, F32 projection_area_cutoff); //select objects behind camera.
void selectBackObjects(LLCamera &camera, F32 projection_area_cutoff, bool use_occlusion); //select objects behind camera.
public:
static BOOL sNeedsOcclusionCheck;