more fix for SH-4284: interesting: viewer does not render cacheable objects on far corner of region when camera moves
parent
c0fd2a15e4
commit
88fee7f87f
|
|
@ -978,7 +978,7 @@ void LLOcclusionCullingGroup::clearOcclusionState(U32 state, S32 mode)
|
|||
static LLFastTimer::DeclareTimer FTM_OCCLUSION_READBACK("Readback Occlusion");
|
||||
static LLFastTimer::DeclareTimer FTM_OCCLUSION_WAIT("Occlusion Wait");
|
||||
|
||||
BOOL LLOcclusionCullingGroup::earlyFail(LLCamera* camera)
|
||||
BOOL LLOcclusionCullingGroup::earlyFail(LLCamera* camera, const LLVector4a* bounds)
|
||||
{
|
||||
if (camera->getOrigin().isExactlyZero())
|
||||
{
|
||||
|
|
@ -989,7 +989,6 @@ BOOL LLOcclusionCullingGroup::earlyFail(LLCamera* camera)
|
|||
LLVector4a fudge;
|
||||
fudge.splat(vel);
|
||||
|
||||
const LLVector4a* bounds = getBounds();
|
||||
const LLVector4a& c = bounds[0];
|
||||
LLVector4a r;
|
||||
r.setAdd(bounds[1], fudge);
|
||||
|
|
@ -1125,12 +1124,23 @@ static LLFastTimer::DeclareTimer FTM_OCCLUSION_SET_BUFFER("Set Buffer");
|
|||
static LLFastTimer::DeclareTimer FTM_OCCLUSION_DRAW_WATER("Draw Water");
|
||||
static LLFastTimer::DeclareTimer FTM_OCCLUSION_DRAW("Draw");
|
||||
|
||||
void LLOcclusionCullingGroup::doOcclusion(LLCamera* camera)
|
||||
void LLOcclusionCullingGroup::doOcclusion(LLCamera* camera, const LLVector3* region_agent)
|
||||
{
|
||||
if (mSpatialPartition->isOcclusionEnabled() && LLPipeline::sUseOcclusion > 1)
|
||||
{
|
||||
//move mBounds to the agent space if necessary
|
||||
LLVector4a bounds[2];
|
||||
bounds[0] = mBounds[0];
|
||||
bounds[1] = mBounds[1];
|
||||
if(region_agent != NULL)
|
||||
{
|
||||
LLVector4a shift((*region_agent)[0], (*region_agent)[1], (*region_agent)[2]);
|
||||
bounds[0].sub(shift);
|
||||
bounds[1].sub(shift);
|
||||
}
|
||||
|
||||
// Don't cull hole/edge water, unless we have the GL_ARB_depth_clamp extension
|
||||
if (earlyFail(camera))
|
||||
if (earlyFail(camera, bounds))
|
||||
{
|
||||
LLFastTimer t(FTM_OCCLUSION_EARLY_FAIL);
|
||||
setOcclusionState(LLOcclusionCullingGroup::DISCARD_QUERY);
|
||||
|
|
@ -1184,10 +1194,10 @@ void LLOcclusionCullingGroup::doOcclusion(LLCamera* camera)
|
|||
LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
|
||||
llassert(shader);
|
||||
|
||||
shader->uniform3fv(LLShaderMgr::BOX_CENTER, 1, mBounds[0].getF32ptr());
|
||||
shader->uniform3f(LLShaderMgr::BOX_SIZE, mBounds[1][0]+SG_OCCLUSION_FUDGE,
|
||||
mBounds[1][1]+SG_OCCLUSION_FUDGE,
|
||||
mBounds[1][2]+SG_OCCLUSION_FUDGE);
|
||||
shader->uniform3fv(LLShaderMgr::BOX_CENTER, 1, bounds[0].getF32ptr());
|
||||
shader->uniform3f(LLShaderMgr::BOX_SIZE, bounds[1][0]+SG_OCCLUSION_FUDGE,
|
||||
bounds[1][1]+SG_OCCLUSION_FUDGE,
|
||||
bounds[1][2]+SG_OCCLUSION_FUDGE);
|
||||
|
||||
if (!use_depth_clamp && mSpatialPartition->mDrawableType == LLDrawPool::POOL_VOIDWATER)
|
||||
{
|
||||
|
|
@ -1201,7 +1211,7 @@ void LLOcclusionCullingGroup::doOcclusion(LLCamera* camera)
|
|||
}
|
||||
else
|
||||
{
|
||||
gPipeline.mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, mBounds[0]));
|
||||
gPipeline.mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, bounds[0]));
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
@ -1214,7 +1224,7 @@ void LLOcclusionCullingGroup::doOcclusion(LLCamera* camera)
|
|||
}
|
||||
else
|
||||
{
|
||||
gPipeline.mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, mBounds[0]));
|
||||
gPipeline.mCubeVB->drawRange(LLRender::TRIANGLE_FAN, 0, 7, 8, get_box_fan_indices(camera, bounds[0]));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -316,7 +316,7 @@ public:
|
|||
void setOcclusionState(U32 state, S32 mode = STATE_MODE_SINGLE);
|
||||
void clearOcclusionState(U32 state, S32 mode = STATE_MODE_SINGLE);
|
||||
void checkOcclusion(); //read back last occlusion query (if any)
|
||||
void doOcclusion(LLCamera* camera); //issue occlusion query
|
||||
void doOcclusion(LLCamera* camera, const LLVector3* region_agent = NULL); //issue occlusion query
|
||||
BOOL isOcclusionState(U32 state) const { return mOcclusionState[LLViewerCamera::sCurCameraID] & state ? TRUE : FALSE; }
|
||||
|
||||
BOOL needsUpdate();
|
||||
|
|
@ -332,7 +332,7 @@ protected:
|
|||
void releaseOcclusionQueryObjectNames();
|
||||
|
||||
private:
|
||||
BOOL earlyFail(LLCamera* camera);
|
||||
BOOL earlyFail(LLCamera* camera, const LLVector4a* bounds);
|
||||
|
||||
protected:
|
||||
U32 mOcclusionState[LLViewerCamera::NUM_CAMERAS];
|
||||
|
|
|
|||
|
|
@ -494,7 +494,7 @@ S32 LLVOCachePartition::cull(LLCamera &camera)
|
|||
|
||||
if(!mOccludedGroups.empty())
|
||||
{
|
||||
processOccluders(&camera);
|
||||
processOccluders(&camera, ®ion_agent);
|
||||
mOccludedGroups.clear();
|
||||
}
|
||||
|
||||
|
|
@ -505,26 +505,26 @@ void LLVOCachePartition::addOccluders(LLviewerOctreeGroup* gp)
|
|||
{
|
||||
LLOcclusionCullingGroup* group = (LLOcclusionCullingGroup*)gp;
|
||||
|
||||
const U32 MIN_WAIT_TIME = 16; //wait 16 frames to issue a new occlusion request
|
||||
const U32 MIN_WAIT_TIME = 19; //wait 19 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)
|
||||
if(!group->needsUpdate() && gFrameCount > last_issued_time && gFrameCount < last_issued_time + MIN_WAIT_TIME)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if(group && !group->isOcclusionState(LLOcclusionCullingGroup::ACTIVE_OCCLUSION))
|
||||
if(!group->isOcclusionState(LLOcclusionCullingGroup::ACTIVE_OCCLUSION))
|
||||
{
|
||||
group->setOcclusionState(LLOcclusionCullingGroup::ACTIVE_OCCLUSION);
|
||||
mOccludedGroups.insert(group);
|
||||
}
|
||||
}
|
||||
|
||||
void LLVOCachePartition::processOccluders(LLCamera* camera)
|
||||
void LLVOCachePartition::processOccluders(LLCamera* camera, const LLVector3* region_agent)
|
||||
{
|
||||
for(std::set<LLOcclusionCullingGroup*>::iterator iter = mOccludedGroups.begin(); iter != mOccludedGroups.end(); ++iter)
|
||||
{
|
||||
LLOcclusionCullingGroup* group = *iter;
|
||||
group->doOcclusion(camera);
|
||||
group->doOcclusion(camera, region_agent);
|
||||
group->clearOcclusionState(LLOcclusionCullingGroup::ACTIVE_OCCLUSION);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -161,7 +161,7 @@ public:
|
|||
static LLTrace::MemStatHandle sMemStat;
|
||||
|
||||
private:
|
||||
void processOccluders(LLCamera* camera);
|
||||
void processOccluders(LLCamera* camera, const LLVector3* region_agent);
|
||||
|
||||
private:
|
||||
std::set<LLOcclusionCullingGroup*> mOccludedGroups;
|
||||
|
|
|
|||
Loading…
Reference in New Issue