summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Linden <none@none>2013-12-03 10:52:22 -0800
committerRichard Linden <none@none>2013-12-03 10:52:22 -0800
commit29476d29c4c78a6417c45090bdc6ea14c8251d73 (patch)
treefe171238c5db55f80babddffcd00ed2513be843c
parent34ff2fc46ba8c623f0eab8fe1dccb5db327775a8 (diff)
SH-4606 FIX Interesting: Small objects do not load until they are very close.
increased SceneLoadMinRadius to 32 changes logic so that falloff starts at SceneLoadMinRadius added timing to pixel threshold calculation
-rwxr-xr-xindra/newview/app_settings/settings.xml2
-rw-r--r--indra/newview/llvieweroctree.cpp18
-rw-r--r--indra/newview/llvieweroctree.h2
-rwxr-xr-xindra/newview/llvocache.cpp29
-rwxr-xr-xindra/newview/llvocache.h2
5 files changed, 32 insertions, 21 deletions
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index df2079a6e4..f7af39d486 100755
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -10240,7 +10240,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>20.0</real>
+ <real>32.0</real>
</map>
<key>SceneLoadRearMaxRadiusFraction</key>
<map>
diff --git a/indra/newview/llvieweroctree.cpp b/indra/newview/llvieweroctree.cpp
index ff8f4d2434..aef632e913 100644
--- a/indra/newview/llvieweroctree.cpp
+++ b/indra/newview/llvieweroctree.cpp
@@ -1439,22 +1439,30 @@ S32 LLViewerOctreeCull::AABBRegionSphereIntersectObjectExtents(const LLViewerOct
}
//------------------------------------------
//check if the objects projection large enough
-bool LLViewerOctreeCull::checkProjectionArea(const LLVector4a& center, const LLVector4a& size, const LLVector3& shift, F32 pixel_threshold, F32 near_squared_radius)
+
+static LLTrace::BlockTimerStatHandle sProjectedAreaCheckTimeStat("Object projected area check", "Culling objects based on projected area");
+
+bool LLViewerOctreeCull::checkProjectionArea(const LLVector4a& center, const LLVector4a& size, const LLVector3& shift, F32 pixel_threshold, F32 near_radius)
{
+ LL_RECORD_BLOCK_TIME(sProjectedAreaCheckTimeStat);
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();
- if(squared_dist < near_squared_radius)
+ F32 distance = lookAt.getLength3().getF32();
+ if(distance <= near_radius)
{
- return true; //always load closeby objects
+ return true; //always load close-by objects
}
+ // treat object as if it were near_radius meters closer than it actually was.
+ // this allows us to get some temporal coherence on visibility...objects that can be reached quickly will tend to be visible
+ distance -= near_radius;
+
F32 squared_rad = size.dot3(size).getF32();
- return squared_rad / squared_dist > pixel_threshold;
+ return squared_rad / (distance * distance) > pixel_threshold;
}
//virtual
diff --git a/indra/newview/llvieweroctree.h b/indra/newview/llvieweroctree.h
index d73772b84e..0f32e0dcc4 100644
--- a/indra/newview/llvieweroctree.h
+++ b/indra/newview/llvieweroctree.h
@@ -394,7 +394,7 @@ protected:
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 pixel_threshold, F32 near_squared_radius);
+ bool checkProjectionArea(const LLVector4a& center, const LLVector4a& size, const LLVector3& shift, F32 pixel_threshold, F32 near_radius);
virtual bool checkObjects(const OctreeNode* branch, const LLViewerOctreeGroup* group);
virtual void preprocess(LLViewerOctreeGroup* group);
virtual void processGroup(LLViewerOctreeGroup* group);
diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp
index 05d61fab49..956f9a2667 100755
--- a/indra/newview/llvocache.cpp
+++ b/indra/newview/llvocache.cpp
@@ -37,7 +37,7 @@
//static variables
U32 LLVOCacheEntry::sMinFrameRange = 0;
-F32 LLVOCacheEntry::sNearRadiusSquared = 1.0f;
+F32 LLVOCacheEntry::sNearRadius = 1.0f;
F32 LLVOCacheEntry::sRearFarRadius = 1.0f;
F32 LLVOCacheEntry::sFrontPixelThreshold = 1.0f;
F32 LLVOCacheEntry::sRearPixelThreshold = 1.0f;
@@ -353,9 +353,8 @@ void LLVOCacheEntry::updateDebugSettings()
//min radius: all objects within this radius remain loaded in memory
static LLCachedControl<F32> min_radius(gSavedSettings,"SceneLoadMinRadius");
- sNearRadiusSquared = llmin((F32)min_radius, gAgentCamera.mDrawDistance); //can not exceed the draw distance
- sNearRadiusSquared *= sNearRadiusSquared;
- sNearRadiusSquared = llmax(sNearRadiusSquared, 1.f); //minimum value is 1.0m
+ sNearRadius = llmin((F32)min_radius, gAgentCamera.mDrawDistance); //can not exceed the draw distance
+ sNearRadius = llmax(sNearRadius, 1.f); //minimum value is 1.0m
//objects within the view frustum whose visible area is greater than this threshold will be loaded
static LLCachedControl<F32> front_pixel_threshold(gSavedSettings,"SceneLoadFrontPixelThreshold");
@@ -434,8 +433,11 @@ bool LLVOCacheEntry::isAnyVisible(const LLVector4a& camera_origin, const LLVecto
return vis;
}
+static LLTrace::BlockTimerStatHandle sSceneContributionCalc("Calculate scene contribution", "Calculates relative importance of object to scene, to control object load from cache");
+
void LLVOCacheEntry::calcSceneContribution(const LLVector4a& camera_origin, bool needs_update, U32 last_update, F32 dist_threshold)
{
+ LL_RECORD_BLOCK_TIME(sSceneContributionCalc);
if(!needs_update && getVisible() >= last_update)
{
return; //no need to update
@@ -443,9 +445,9 @@ void LLVOCacheEntry::calcSceneContribution(const LLVector4a& camera_origin, bool
LLVector4a lookAt;
lookAt.setSub(getPositionGroup(), camera_origin);
- F32 squared_dist = lookAt.dot3(lookAt).getF32();
+ F32 distance = lookAt.getLength3().getF32();
- if(squared_dist < sNearRadiusSquared)
+ if(distance <= sNearRadius)
{
//nearby objects, set a large number
const F32 LARGE_SCENE_CONTRIBUTION = 1000.f; //a large number to force to load the object.
@@ -453,13 +455,14 @@ void LLVOCacheEntry::calcSceneContribution(const LLVector4a& camera_origin, bool
}
else
{
+ distance -= sNearRadius;
+
F32 rad = getBinRadius();
dist_threshold += rad;
- dist_threshold *= dist_threshold;
- if(squared_dist < dist_threshold)
+ if(distance < dist_threshold)
{
- mSceneContrib = rad * rad / squared_dist;
+ mSceneContrib = (rad * rad) / (distance * distance);
}
else
{
@@ -627,7 +630,7 @@ public:
{
mLocalShift = shift;
mUseObjectCacheOcclusion = use_object_cache_occlusion;
- mSquaredNearRadius = LLVOCacheEntry::sNearRadiusSquared;
+ mNearRadius = LLVOCacheEntry::sNearRadius;
}
virtual bool earlyFail(LLViewerOctreeGroup* base_group)
@@ -684,7 +687,7 @@ public:
{
//check if the objects projection large enough
const LLVector4a* exts = group->getObjectExtents();
- res = checkProjectionArea(exts[0], exts[1], mLocalShift, mPixelThreshold, mSquaredNearRadius);
+ res = checkProjectionArea(exts[0], exts[1], mLocalShift, mPixelThreshold, mNearRadius);
}
return res;
@@ -731,7 +734,7 @@ private:
LLViewerRegion* mRegionp;
LLVector3 mLocalShift; //shift vector from agent space to local region space.
F32 mPixelThreshold;
- F32 mSquaredNearRadius;
+ F32 mNearRadius;
bool mUseObjectCacheOcclusion;
};
@@ -775,7 +778,7 @@ public:
{
//check if the objects projection large enough
const LLVector4a* exts = group->getObjectExtents();
- return checkProjectionArea(exts[0], exts[1], mLocalShift, mPixelThreshold, mSphereRadius * mSphereRadius);
+ return checkProjectionArea(exts[0], exts[1], mLocalShift, mPixelThreshold, mSphereRadius);
}
return false;
}
diff --git a/indra/newview/llvocache.h b/indra/newview/llvocache.h
index 6af38e5b7c..80268d4e9c 100755
--- a/indra/newview/llvocache.h
+++ b/indra/newview/llvocache.h
@@ -159,7 +159,7 @@ protected:
public:
static U32 sMinFrameRange;
- static F32 sNearRadiusSquared;
+ static F32 sNearRadius;
static F32 sRearFarRadius;
static F32 sFrontPixelThreshold;
static F32 sRearPixelThreshold;