fix for SH-4284: interesting: viewer does not render cacheable objects on far corner of region when camera moves
parent
916b68d1cb
commit
d95d69cbc4
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
//-------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
||||
//
|
||||
|
|
|
|||
Loading…
Reference in New Issue