Xiaohong Bao 2013-08-22 15:48:21 -06:00
commit cdf5a1e1cc
6 changed files with 51 additions and 34 deletions

View File

@ -1058,12 +1058,8 @@ bool LLDrawable::isRecentlyVisible() const
if(!vis)
{
LLviewerOctreeGroup* group = getGroup();
if (group && group->isRecentlyVisible())
{
LLViewerOctreeEntryData::setVisible();
vis = TRUE ;
}
const U32 MIN_VIS_FRAME_RANGE = 2 ; //two frames:the current one and the last one.
vis = (sCurVisible - getVisible() < MIN_VIS_FRAME_RANGE);
}
return vis ;
@ -1140,14 +1136,6 @@ LLSpatialPartition* LLDrawable::getSpatialPartition()
return retval;
}
//virtual
U32 LLDrawable::getMinFrameRange() const
{
const U32 MIN_VIS_FRAME_RANGE = 2 ; //two frames:the current one and the last one.
return MIN_VIS_FRAME_RANGE ;
}
//=======================================
// Spatial Partition Bridging Drawable
//=======================================

View File

@ -194,7 +194,6 @@ public:
LLSpatialPartition* getSpatialPartition();
virtual U32 getMinFrameRange()const;
void removeFromOctree();
void setSpatialBridge(LLSpatialBridge* bridge) { mSpatialBridge = (LLDrawable*) bridge; }

View File

@ -409,7 +409,7 @@ bool LLViewerOctreeEntryData::isRecentlyVisible() const
return true;
}
return (sCurVisible - mEntry->mVisible < getMinFrameRange());
return false;
}
void LLViewerOctreeEntryData::setVisible() const

View File

@ -149,8 +149,6 @@ public:
virtual void setOctreeEntry(LLViewerOctreeEntry* entry);
virtual U32 getMinFrameRange()const = 0;
F32 getBinRadius() const {return mEntry->getBinRadius();}
const LLVector4a* getSpatialExtents() const;
LLviewerOctreeGroup* getGroup()const;
@ -327,6 +325,7 @@ public:
//virtual
BOOL isRecentlyVisible() const;
LLViewerOctreePartition* getSpatialPartition()const {return mSpatialPartition;}
static U32 getNewOcclusionQueryObjectName();
static void releaseOcclusionQueryObjectName(U32 name);

View File

@ -238,12 +238,6 @@ void LLVOCacheEntry::setState(U32 state)
}
}
//virtual
U32 LLVOCacheEntry::getMinFrameRange()const
{
return mMinFrameRange;
}
void LLVOCacheEntry::addChild(LLVOCacheEntry* entry)
{
llassert(entry != NULL);
@ -261,6 +255,12 @@ void LLVOCacheEntry::addChild(LLVOCacheEntry* entry)
if(getEntry() != NULL && isState(INACTIVE))
{
updateParentBoundingInfo(entry);
if(getGroup())
{
LLOcclusionCullingGroup* group = (LLOcclusionCullingGroup*)getGroup();
group->unbound();
((LLVOCachePartition*)group->getSpatialPartition())->setDirty();
}
}
}
@ -365,6 +365,28 @@ BOOL LLVOCacheEntry::writeToFile(LLAPRFile* apr_file) const
return success ;
}
bool LLVOCacheEntry::isRecentlyVisible() const
{
bool vis = LLViewerOctreeEntryData::isRecentlyVisible();
if(!vis)
{
vis = (sCurVisible - getVisible() < mMinFrameRange);
}
if(!vis && !mParentID && mSceneContrib > 0.f)
{
//projection area: mSceneContrib
//squared distance
const F32 SQUARED_CUT_OFF_DIST = 225.0; //15m
F32 rad = getBinRadius();
vis = (rad * rad / mSceneContrib > SQUARED_CUT_OFF_DIST);
}
return vis;
}
void LLVOCacheEntry::calcSceneContribution(const LLVector3& camera_origin, bool needs_update, U32 last_update)
{
if(!needs_update && getVisible() >= last_update)
@ -381,8 +403,11 @@ void LLVOCacheEntry::calcSceneContribution(const LLVector3& camera_origin, bool
lookAt.setSub(center, origin);
F32 squared_dist = lookAt.dot3(lookAt).getF32();
F32 rad = getBinRadius();
mSceneContrib = rad * rad / squared_dist;
if(squared_dist > 0.f)
{
F32 rad = getBinRadius();
mSceneContrib = rad * rad / squared_dist;
}
setVisible();
}
@ -479,12 +504,17 @@ LLVOCachePartition::LLVOCachePartition(LLViewerRegion* regionp)
new LLOcclusionCullingGroup(mOctree, this);
}
void LLVOCachePartition::setDirty()
{
mDirty = TRUE;
}
void LLVOCachePartition::addEntry(LLViewerOctreeEntry* entry)
{
llassert(entry->hasVOCacheEntry());
mOctree->insert(entry);
mDirty = TRUE;
setDirty();
}
void LLVOCachePartition::removeEntry(LLViewerOctreeEntry* entry)
@ -615,7 +645,7 @@ S32 LLVOCachePartition::cull(LLCamera &camera, bool do_occlusion)
}
((LLviewerOctreeGroup*)mOctree->getListener(0))->rebound();
mCullHistory[LLViewerCamera::sCurCameraID] <<= 2;
mCullHistory[LLViewerCamera::sCurCameraID] <<= 1;
//localize the camera
LLVector3 region_agent = mRegionp->getOriginAgent();

View File

@ -83,12 +83,14 @@ public:
bool hasState(U32 state) {return mState & state;}
U32 getState() const {return mState;}
//virtual
bool isRecentlyVisible() const;
U32 getLocalID() const { return mLocalID; }
U32 getCRC() const { return mCRC; }
S32 getHitCount() const { return mHitCount; }
S32 getCRCChangeCount() const { return mCRCChangeCount; }
U32 getMinFrameRange()const;
void calcSceneContribution(const LLVector3& camera_origin, bool needs_update, U32 last_update);
void setSceneContribution(F32 scene_contrib) {mSceneContrib = scene_contrib;}
F32 getSceneContribution() const { return mSceneContrib;}
@ -162,14 +164,13 @@ public:
/*virtual*/ S32 cull(LLCamera &camera, bool do_occlusion);
void addOccluders(LLviewerOctreeGroup* gp);
void resetOccluders();
static LLTrace::MemStatHandle sMemStat;
public:
void processOccluders(LLCamera* camera);
void setDirty();
public:
static BOOL sNeedsOcclusionCheck;
static LLTrace::MemStatHandle sMemStat;
private:
BOOL mDirty;