fix for SH-4284: interesting: viewer does not render cacheable objects on far corner of region when camera moves

master
Xiaohong Bao 2013-06-24 11:42:32 -06:00
parent 916b68d1cb
commit d95d69cbc4
4 changed files with 58 additions and 6 deletions

View File

@ -1022,6 +1022,11 @@ BOOL LLOcclusionCullingGroup::earlyFail(LLCamera* camera)
return TRUE;
}
U32 LLOcclusionCullingGroup::getLastOcclusionIssuedTime()
{
return mOcclusionIssued[LLViewerCamera::sCurCameraID];
}
void LLOcclusionCullingGroup::checkOcclusion()
{
if (LLPipeline::sUseOcclusion > 1)

View File

@ -320,6 +320,7 @@ public:
BOOL isOcclusionState(U32 state) const { return mOcclusionState[LLViewerCamera::sCurCameraID] & state ? TRUE : FALSE; }
BOOL needsUpdate();
U32 getLastOcclusionIssuedTime();
//virtual
void handleChildAddition(const OctreeNode* parent, OctreeNode* child);

View File

@ -399,9 +399,10 @@ void LLVOCachePartition::removeEntry(LLViewerOctreeEntry* entry)
class LLVOCacheOctreeCull : public LLViewerOctreeCull
{
public:
LLVOCacheOctreeCull(LLCamera* camera, LLViewerRegion* regionp, const LLVector3& shift, bool use_object_cache_occlusion)
LLVOCacheOctreeCull(LLCamera* camera, LLViewerRegion* regionp, const LLVector3& shift, bool use_object_cache_occlusion, LLVOCachePartition* part)
: LLViewerOctreeCull(camera),
mRegionp(regionp)
mRegionp(regionp),
mPartition(part)
{
mLocalShift = shift;
mUseObjectCacheOcclusion = (use_object_cache_occlusion && LLPipeline::sUseOcclusion);
@ -422,6 +423,7 @@ public:
if (group->isOcclusionState(LLSpatialGroup::OCCLUDED))
{
mPartition->addOccluders(group);
return true;
}
}
@ -473,9 +475,10 @@ public:
}
private:
LLViewerRegion* mRegionp;
LLVector3 mLocalShift; //shift vector from agent space to local region space.
bool mUseObjectCacheOcclusion;
LLVOCachePartition* mPartition;
LLViewerRegion* mRegionp;
LLVector3 mLocalShift; //shift vector from agent space to local region space.
bool mUseObjectCacheOcclusion;
};
S32 LLVOCachePartition::cull(LLCamera &camera)
@ -493,12 +496,48 @@ S32 LLVOCachePartition::cull(LLCamera &camera)
LLVector3 region_agent = mRegionp->getOriginAgent();
camera.calcRegionFrustumPlanes(region_agent);
LLVOCacheOctreeCull culler(&camera, mRegionp, region_agent, use_object_cache_occlusion);
mOccludedGroups.clear();
LLVOCacheOctreeCull culler(&camera, mRegionp, region_agent, use_object_cache_occlusion, this);
culler.traverse(mOctree);
if(!mOccludedGroups.empty())
{
processOccluders(&camera);
mOccludedGroups.clear();
}
return 0;
}
void LLVOCachePartition::addOccluders(LLviewerOctreeGroup* gp)
{
LLOcclusionCullingGroup* group = (LLOcclusionCullingGroup*)gp;
const U32 MIN_WAIT_TIME = 16; //wait 16 frames to issue a new occlusion request
U32 last_issued_time = group->getLastOcclusionIssuedTime();
if(gFrameCount > last_issued_time && gFrameCount < last_issued_time + MIN_WAIT_TIME)
{
return;
}
if(group && !group->isOcclusionState(LLOcclusionCullingGroup::ACTIVE_OCCLUSION))
{
group->setOcclusionState(LLOcclusionCullingGroup::ACTIVE_OCCLUSION);
mOccludedGroups.insert(group);
}
}
void LLVOCachePartition::processOccluders(LLCamera* camera)
{
for(std::set<LLOcclusionCullingGroup*>::iterator iter = mOccludedGroups.begin(); iter != mOccludedGroups.end(); ++iter)
{
LLOcclusionCullingGroup* group = *iter;
group->doOcclusion(camera);
group->clearOcclusionState(LLOcclusionCullingGroup::ACTIVE_OCCLUSION);
}
}
//-------------------------------------------------------------------
//LLVOCache
//-------------------------------------------------------------------

View File

@ -156,8 +156,15 @@ public:
void addEntry(LLViewerOctreeEntry* entry);
void removeEntry(LLViewerOctreeEntry* entry);
/*virtual*/ S32 cull(LLCamera &camera);
void addOccluders(LLviewerOctreeGroup* gp);
static LLTrace::MemStatHandle sMemStat;
private:
void processOccluders(LLCamera* camera);
private:
std::set<LLOcclusionCullingGroup*> mOccludedGroups;
};
//