fix for SH-4430: Interesting: Light objects behind you are not loaded at login.
parent
52118862ba
commit
ba4f64ed7a
|
|
@ -963,14 +963,16 @@ void LLViewerRegion::removeActiveCacheEntry(LLVOCacheEntry* entry, LLDrawable* d
|
|||
entry->setState(LLVOCacheEntry::INACTIVE);
|
||||
}
|
||||
|
||||
void LLViewerRegion::addVisibleGroup(LLviewerOctreeGroup* group)
|
||||
bool LLViewerRegion::addVisibleGroup(LLviewerOctreeGroup* group)
|
||||
{
|
||||
if(mDead || group->isEmpty())
|
||||
{
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
group->setVisible();
|
||||
|
||||
mImpl->mVisibleGroups.insert(group);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
U32 LLViewerRegion::getNumOfVisibleGroups() const
|
||||
|
|
|
|||
|
|
@ -229,7 +229,7 @@ public:
|
|||
F32 getWidth() const { return mWidth; }
|
||||
|
||||
BOOL idleUpdate(F32 max_update_time);
|
||||
void addVisibleGroup(LLviewerOctreeGroup* group);
|
||||
bool addVisibleGroup(LLviewerOctreeGroup* group);
|
||||
void addVisibleCacheEntry(LLVOCacheEntry* entry);
|
||||
void addActiveCacheEntry(LLVOCacheEntry* entry);
|
||||
void removeActiveCacheEntry(LLVOCacheEntry* entry, LLDrawable* drawablep);
|
||||
|
|
|
|||
|
|
@ -490,7 +490,8 @@ LLVOCachePartition::LLVOCachePartition(LLViewerRegion* regionp)
|
|||
{
|
||||
mLODPeriod = 16;
|
||||
mRegionp = regionp;
|
||||
mPartitionType = LLViewerRegion::PARTITION_VO_CACHE;
|
||||
mPartitionType = LLViewerRegion::PARTITION_VO_CACHE;
|
||||
mBackSlectionEnabled = -1;
|
||||
|
||||
for(S32 i = 0; i < LLViewerCamera::NUM_CAMERAS; i++)
|
||||
{
|
||||
|
|
@ -517,7 +518,8 @@ void LLVOCachePartition::removeEntry(LLViewerOctreeEntry* entry)
|
|||
class LLVOCacheOctreeCull : public LLViewerOctreeCull
|
||||
{
|
||||
public:
|
||||
LLVOCacheOctreeCull(LLCamera* camera, LLViewerRegion* regionp, const LLVector3& shift, bool use_object_cache_occlusion, LLVOCachePartition* part)
|
||||
LLVOCacheOctreeCull(LLCamera* camera, LLViewerRegion* regionp,
|
||||
const LLVector3& shift, bool use_object_cache_occlusion, LLVOCachePartition* part)
|
||||
: LLViewerOctreeCull(camera),
|
||||
mRegionp(regionp),
|
||||
mPartition(part)
|
||||
|
|
@ -583,7 +585,10 @@ public:
|
|||
!base_group->getOctreeNode()->getParent())
|
||||
{
|
||||
//no occlusion check
|
||||
mRegionp->addVisibleGroup(base_group);
|
||||
if(mRegionp->addVisibleGroup(base_group))
|
||||
{
|
||||
base_group->setVisible();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -603,7 +608,10 @@ public:
|
|||
}
|
||||
else
|
||||
{
|
||||
mRegionp->addVisibleGroup(base_group);
|
||||
if(mRegionp->addVisibleGroup(base_group))
|
||||
{
|
||||
base_group->setVisible();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -614,6 +622,81 @@ private:
|
|||
bool mUseObjectCacheOcclusion;
|
||||
};
|
||||
|
||||
//select objects behind camera
|
||||
class LLVOCacheOctreeBackCull : public LLViewerOctreeCull
|
||||
{
|
||||
public:
|
||||
LLVOCacheOctreeBackCull(LLCamera* camera, const LLVector3& shift, LLViewerRegion* regionp)
|
||||
: LLViewerOctreeCull(camera), mRegionp(regionp)
|
||||
{
|
||||
mLocalShift = shift;
|
||||
mSphereRadius = 20.f; //20m
|
||||
}
|
||||
|
||||
virtual S32 frustumCheck(const LLviewerOctreeGroup* group)
|
||||
{
|
||||
const LLVector4a* exts = group->getExtents();
|
||||
return backSphereCheck(exts[0], exts[1]);
|
||||
}
|
||||
|
||||
virtual S32 frustumCheckObjects(const LLviewerOctreeGroup* group)
|
||||
{
|
||||
const LLVector4a* exts = group->getObjectExtents();
|
||||
return backSphereCheck(exts[0], exts[1]);
|
||||
}
|
||||
|
||||
virtual void processGroup(LLviewerOctreeGroup* base_group)
|
||||
{
|
||||
mRegionp->addVisibleGroup(base_group);
|
||||
return;
|
||||
}
|
||||
|
||||
private:
|
||||
//a sphere around the camera origin, including objects behind camera.
|
||||
S32 backSphereCheck(const LLVector4a& min, const LLVector4a& max)
|
||||
{
|
||||
return AABBSphereIntersect(min, max, mCamera->getOrigin() - mLocalShift, mSphereRadius);
|
||||
}
|
||||
|
||||
private:
|
||||
F32 mSphereRadius;
|
||||
LLViewerRegion* mRegionp;
|
||||
LLVector3 mLocalShift; //shift vector from agent space to local region space.
|
||||
};
|
||||
|
||||
void LLVOCachePartition::selectBackObjects(LLCamera &camera)
|
||||
{
|
||||
if(LLViewerCamera::sCurCameraID != LLViewerCamera::CAMERA_WORLD)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if(mBackSlectionEnabled < 0)
|
||||
{
|
||||
mBackSlectionEnabled = LLVOCacheEntry::getInvisibleObjectsLiveTime() - 1;
|
||||
mBackSlectionEnabled = llmax(mBackSlectionEnabled, (S32)1);
|
||||
}
|
||||
|
||||
if(!mBackSlectionEnabled)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//localize the camera
|
||||
LLVector3 region_agent = mRegionp->getOriginAgent();
|
||||
|
||||
LLVOCacheOctreeBackCull culler(&camera, region_agent, mRegionp);
|
||||
culler.traverse(mOctree);
|
||||
|
||||
mBackSlectionEnabled--;
|
||||
if(!mRegionp->getNumOfVisibleGroups())
|
||||
{
|
||||
mBackSlectionEnabled = 0;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
S32 LLVOCachePartition::cull(LLCamera &camera, bool do_occlusion)
|
||||
{
|
||||
static LLCachedControl<bool> use_object_cache_occlusion(gSavedSettings,"UseObjectCacheOcclusion");
|
||||
|
|
@ -650,10 +733,15 @@ S32 LLVOCachePartition::cull(LLCamera &camera, bool do_occlusion)
|
|||
}
|
||||
if(LLViewerOctreeEntryData::getCurrentFrame() % seed != hash)
|
||||
{
|
||||
selectBackObjects(camera);//process back objects selection
|
||||
return 0; //nothing changed, reduce frequency of culling
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
mBackSlectionEnabled = -1; //reset it.
|
||||
}
|
||||
|
||||
if(LLViewerCamera::sCurCameraID == LLViewerCamera::CAMERA_WORLD)
|
||||
{
|
||||
mCullHistory[LLViewerCamera::sCurCameraID] <<= 1;
|
||||
|
|
|
|||
|
|
@ -126,10 +126,9 @@ public:
|
|||
U32 getUpdateFlags() const {return mUpdateFlags;}
|
||||
|
||||
static void updateBackCullingFactors();
|
||||
|
||||
private:
|
||||
static U32 getInvisibleObjectsLiveTime();
|
||||
|
||||
private:
|
||||
void updateParentBoundingInfo(const LLVOCacheEntry* child);
|
||||
|
||||
public:
|
||||
|
|
@ -172,6 +171,9 @@ public:
|
|||
void resetOccluders();
|
||||
void processOccluders(LLCamera* camera);
|
||||
|
||||
private:
|
||||
void selectBackObjects(LLCamera &camera); //select objects behind camera.
|
||||
|
||||
public:
|
||||
static BOOL sNeedsOcclusionCheck;
|
||||
//static LLTrace::MemStatHandle sMemStat;
|
||||
|
|
@ -180,6 +182,8 @@ private:
|
|||
U32 mCullHistory[LLViewerCamera::NUM_CAMERAS];
|
||||
U32 mCulledTime[LLViewerCamera::NUM_CAMERAS];
|
||||
std::set<LLOcclusionCullingGroup*> mOccludedGroups;
|
||||
|
||||
S32 mBackSlectionEnabled; //enable to select back objects if > 0.
|
||||
};
|
||||
|
||||
//
|
||||
|
|
|
|||
Loading…
Reference in New Issue