Xiaohong Bao 2013-10-17 20:22:02 -06:00
commit cf89975f16
6 changed files with 80 additions and 13 deletions

View File

@ -7114,7 +7114,17 @@
<real>0.75</real>
</array>
</map>
<key>ObjectProjectionAreaCutOFF</key>
<map>
<key>Comment</key>
<string>Threshold in number of pixels of the projection area in screen of object bounding sphere. Objects smaller than this threshold are not rendered.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>F32</string>
<key>Value</key>
<real>1.0</real>
</map>
<key>ParcelMediaAutoPlayEnable</key>
<map>
<key>Comment</key>

View File

@ -1430,6 +1430,25 @@ S32 LLViewerOctreeCull::AABBRegionSphereIntersectObjectExtents(const LLViewerOct
return AABBSphereIntersect(group->mObjectExtents[0], group->mObjectExtents[1], mCamera->getOrigin() - shift, mCamera->mFrustumCornerDist);
}
//------------------------------------------
//check if the objects projection large enough
bool LLViewerOctreeCull::checkProjectionArea(const LLVector4a& center, const LLVector4a& size, const LLVector3& shift, F32 projection_cutoff)
{
LLVector3 local_orig = mCamera->getOrigin() - shift;
LLVector4a origin;
origin.load3(local_orig.mV);
LLVector4a lookAt;
lookAt.setSub(center, origin);
F32 squared_dist = lookAt.dot3(lookAt).getF32();
F32 squared_rad = size.dot3(size).getF32();
if(squared_dist > 0.f)
{
return squared_rad / squared_dist > projection_cutoff;
}
return true;
}
//virtual
bool LLViewerOctreeCull::checkObjects(const OctreeNode* branch, const LLViewerOctreeGroup* group)

View File

@ -362,9 +362,11 @@ class LLViewerOctreeCull : public OctreeTraveler
public:
LLViewerOctreeCull(LLCamera* camera)
: mCamera(camera), mRes(0) { }
virtual bool earlyFail(LLViewerOctreeGroup* group);
virtual void traverse(const OctreeNode* n);
protected:
virtual bool earlyFail(LLViewerOctreeGroup* group);
//agent space group cull
S32 AABBInFrustumNoFarClipGroupBounds(const LLViewerOctreeGroup* group);
@ -389,6 +391,7 @@ public:
virtual S32 frustumCheck(const LLViewerOctreeGroup* group) = 0;
virtual S32 frustumCheckObjects(const LLViewerOctreeGroup* group) = 0;
bool checkProjectionArea(const LLVector4a& center, const LLVector4a& size, const LLVector3& shift, F32 projection_cutoff);
virtual bool checkObjects(const OctreeNode* branch, const LLViewerOctreeGroup* group);
virtual void preprocess(LLViewerOctreeGroup* group);
virtual void processGroup(LLViewerOctreeGroup* group);

View File

@ -1157,6 +1157,8 @@ F32 LLViewerRegion::updateVisibleEntries(F32 max_time)
F32 LLViewerRegion::createVisibleObjects(F32 max_time)
{
static LLCachedControl<F32> projection_area_cutoff(gSavedSettings,"ObjectProjectionAreaCutOFF");
if(mDead)
{
return max_time;
@ -1166,6 +1168,11 @@ F32 LLViewerRegion::createVisibleObjects(F32 max_time)
return max_time;
}
//object projected area threshold
F32 pixel_meter_ratio = LLViewerCamera::getInstance()->getPixelMeterRatio();
F32 projection_threshold = pixel_meter_ratio > 0.f ? projection_area_cutoff / pixel_meter_ratio : 0.f;
projection_threshold *= projection_threshold;
S32 throttle = sNewObjectCreationThrottle;
LLTimer update_timer;
for(LLVOCacheEntry::vocache_entry_priority_list_t::iterator iter = mImpl->mWaitingList.begin();
@ -1173,6 +1180,11 @@ F32 LLViewerRegion::createVisibleObjects(F32 max_time)
{
LLVOCacheEntry* vo_entry = *iter;
if(vo_entry->getSceneContribution() < projection_threshold)
{
break;
}
if(vo_entry->getState() < LLVOCacheEntry::WAITING)
{
addNewObject(vo_entry);

View File

@ -548,10 +548,11 @@ class LLVOCacheOctreeCull : public LLViewerOctreeCull
{
public:
LLVOCacheOctreeCull(LLCamera* camera, LLViewerRegion* regionp,
const LLVector3& shift, bool use_object_cache_occlusion, LLVOCachePartition* part)
const LLVector3& shift, bool use_object_cache_occlusion, F32 projection_area_cutoff, LLVOCachePartition* part)
: LLViewerOctreeCull(camera),
mRegionp(regionp),
mPartition(part)
mPartition(part),
mProjectionAreaCutOff(projection_area_cutoff)
{
mLocalShift = shift;
mUseObjectCacheOcclusion = use_object_cache_occlusion;
@ -605,6 +606,14 @@ public:
{
res = llmin(res, AABBRegionSphereIntersectObjectExtents(group, mLocalShift));
}
if(res != 0)
{
//check if the objects projection large enough
const LLVector4a* exts = group->getObjectExtents();
res = checkProjectionArea(exts[0], exts[1], mLocalShift, mProjectionAreaCutOff);
}
return res;
}
@ -648,6 +657,7 @@ private:
LLVOCachePartition* mPartition;
LLViewerRegion* mRegionp;
LLVector3 mLocalShift; //shift vector from agent space to local region space.
F32 mProjectionAreaCutOff;
bool mUseObjectCacheOcclusion;
};
@ -655,8 +665,8 @@ private:
class LLVOCacheOctreeBackCull : public LLViewerOctreeCull
{
public:
LLVOCacheOctreeBackCull(LLCamera* camera, const LLVector3& shift, LLViewerRegion* regionp, F32 back_sphere_radius)
: LLViewerOctreeCull(camera), mRegionp(regionp)
LLVOCacheOctreeBackCull(LLCamera* camera, const LLVector3& shift, LLViewerRegion* regionp, F32 back_sphere_radius, F32 projection_area_cutoff)
: LLViewerOctreeCull(camera), mRegionp(regionp), mProjectionAreaCutOff(projection_area_cutoff)
{
mLocalShift = shift;
mSphereRadius = back_sphere_radius;
@ -671,7 +681,13 @@ public:
virtual S32 frustumCheckObjects(const LLViewerOctreeGroup* group)
{
const LLVector4a* exts = group->getObjectExtents();
return backSphereCheck(exts[0], exts[1]);
if(backSphereCheck(exts[0], exts[1]))
{
//check if the objects projection large enough
const LLVector4a* exts = group->getObjectExtents();
return checkProjectionArea(exts[0], exts[1], mLocalShift, mProjectionAreaCutOff);
}
return false;
}
virtual void processGroup(LLViewerOctreeGroup* base_group)
@ -691,9 +707,10 @@ private:
F32 mSphereRadius;
LLViewerRegion* mRegionp;
LLVector3 mLocalShift; //shift vector from agent space to local region space.
F32 mProjectionAreaCutOff;
};
void LLVOCachePartition::selectBackObjects(LLCamera &camera, F32 back_sphere_radius)
void LLVOCachePartition::selectBackObjects(LLCamera &camera, F32 back_sphere_radius, F32 projection_area_cutoff)
{
if(LLViewerCamera::sCurCameraID != LLViewerCamera::CAMERA_WORLD)
{
@ -714,7 +731,7 @@ void LLVOCachePartition::selectBackObjects(LLCamera &camera, F32 back_sphere_rad
//localize the camera
LLVector3 region_agent = mRegionp->getOriginAgent();
LLVOCacheOctreeBackCull culler(&camera, region_agent, mRegionp, back_sphere_radius);
LLVOCacheOctreeBackCull culler(&camera, region_agent, mRegionp, back_sphere_radius, projection_area_cutoff);
culler.traverse(mOctree);
mBackSlectionEnabled--;
@ -730,6 +747,7 @@ S32 LLVOCachePartition::cull(LLCamera &camera, bool do_occlusion)
{
static LLCachedControl<bool> use_object_cache_occlusion(gSavedSettings,"UseObjectCacheOcclusion");
static LLCachedControl<F32> back_sphere_radius(gSavedSettings,"BackShpereCullingRadius");
static LLCachedControl<F32> projection_area_cutoff(gSavedSettings,"ObjectProjectionAreaCutOFF");
if(!LLViewerRegion::sVOCacheCullingEnabled)
{
@ -753,6 +771,11 @@ S32 LLVOCachePartition::cull(LLCamera &camera, bool do_occlusion)
}
mCulledTime[LLViewerCamera::sCurCameraID] = LLViewerOctreeEntryData::getCurrentFrame();
//object projected area threshold
F32 pixel_meter_ratio = LLViewerCamera::getInstance()->getPixelMeterRatio();
F32 projection_threshold = pixel_meter_ratio > 0.f ? projection_area_cutoff / pixel_meter_ratio : 0.f;
projection_threshold *= projection_threshold;
if(!mCullHistory[LLViewerCamera::sCurCameraID] && LLViewerRegion::isViewerCameraStatic())
{
U32 seed = llmax(mLODPeriod >> 1, (U32)4);
@ -765,7 +788,7 @@ S32 LLVOCachePartition::cull(LLCamera &camera, bool do_occlusion)
}
if(LLViewerOctreeEntryData::getCurrentFrame() % seed != mIdleHash)
{
selectBackObjects(camera, back_sphere_radius);//process back objects selection
selectBackObjects(camera, back_sphere_radius, projection_threshold);//process back objects selection
return 0; //nothing changed, reduce frequency of culling
}
}
@ -783,7 +806,7 @@ S32 LLVOCachePartition::cull(LLCamera &camera, bool do_occlusion)
LLVector3 region_agent = mRegionp->getOriginAgent();
camera.calcRegionFrustumPlanes(region_agent);
LLVOCacheOctreeCull culler(&camera, mRegionp, region_agent, do_occlusion && use_object_cache_occlusion, this);
LLVOCacheOctreeCull culler(&camera, mRegionp, region_agent, do_occlusion && use_object_cache_occlusion, projection_threshold, this);
culler.traverse(mOctree);
if(mRegionp->getNumOfVisibleGroups() > 0)

View File

@ -186,7 +186,7 @@ public:
void removeOccluder(LLVOCacheGroup* group);
private:
void selectBackObjects(LLCamera &camera, F32 back_sphere_radius); //select objects behind camera.
void selectBackObjects(LLCamera &camera, F32 back_sphere_radius, F32 projection_area_cutoff); //select objects behind camera.
public:
static BOOL sNeedsOcclusionCheck;