summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXiaohong Bao <bao@lindenlab.com>2013-06-24 11:42:32 -0600
committerXiaohong Bao <bao@lindenlab.com>2013-06-24 11:42:32 -0600
commitd95d69cbc4063fae1d93ce2f0c4d22d3ef9c8edd (patch)
tree15e62f15906070a04b8979ccf3d992fd98d94312
parent916b68d1cb706b2dc469219f1976f10baadaea08 (diff)
fix for SH-4284: interesting: viewer does not render cacheable objects on far corner of region when camera moves
-rw-r--r--indra/newview/llvieweroctree.cpp5
-rw-r--r--indra/newview/llvieweroctree.h1
-rwxr-xr-xindra/newview/llvocache.cpp51
-rwxr-xr-xindra/newview/llvocache.h7
4 files changed, 58 insertions, 6 deletions
diff --git a/indra/newview/llvieweroctree.cpp b/indra/newview/llvieweroctree.cpp
index d631985e82..576dbfd2c2 100644
--- a/indra/newview/llvieweroctree.cpp
+++ b/indra/newview/llvieweroctree.cpp
@@ -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)
diff --git a/indra/newview/llvieweroctree.h b/indra/newview/llvieweroctree.h
index 7f2ca6ed2d..e210d8f478 100644
--- a/indra/newview/llvieweroctree.h
+++ b/indra/newview/llvieweroctree.h
@@ -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);
diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp
index b3c7b80c29..f23375adfa 100755
--- a/indra/newview/llvocache.cpp
+++ b/indra/newview/llvocache.cpp
@@ -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
//-------------------------------------------------------------------
diff --git a/indra/newview/llvocache.h b/indra/newview/llvocache.h
index b8a7ccac99..1aa58528db 100755
--- a/indra/newview/llvocache.h
+++ b/indra/newview/llvocache.h
@@ -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;
};
//