summaryrefslogtreecommitdiff
path: root/indra/newview/llface.cpp
diff options
context:
space:
mode:
authorJonathan "Geenz" Goodman <geenz@lindenlab.com>2026-07-09 08:09:24 -0400
committerGitHub <noreply@github.com>2026-07-09 08:09:24 -0400
commita937b237de3651e79cdb517f14381a5bdd4c844b (patch)
tree6ea93458c9a92b8660719b5346828583c7e7aefe /indra/newview/llface.cpp
parent4452ec69732310c02ee20fb225806f489785789c (diff)
Geenz/texture loading speed (#5985)
* Add more controls for texture loading budgets. Should yield much faster loading within a given FPS target - should generally self regulate depending on your framerate. * Harden texture pipeline against stalls and OOM. Generally makes texture loading faster, at the expense of some budgeting (which we weren't doing a great job at anyways).
Diffstat (limited to 'indra/newview/llface.cpp')
-rw-r--r--indra/newview/llface.cpp22
1 files changed, 22 insertions, 0 deletions
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index e34bea63ef..c96e1bd3b0 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -2297,6 +2297,8 @@ bool LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)
// don't update every frame
if (gFrameTimeSeconds - mLastPixelAreaUpdate < PIXEL_AREA_UPDATE_PERIOD)
{
+ cos_angle_to_view_dir = mLastCosAngleToViewDir;
+ radius = mLastRadius;
return true;
}
@@ -2368,6 +2370,7 @@ bool LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)
// no rigged extents, zero out bounding box and skip update
mRiggedExtents[0] = mRiggedExtents[1] = LLVector4a(0.f, 0.f, 0.f);
+ mInFrustum = false;
return false;
}
@@ -2422,6 +2425,7 @@ bool LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)
if(!camera->AABBInFrustum(center, size))
{
mImportanceToCamera = 0.f ;
+ mInFrustum = false;
return false ;
}
if(cos_angle_to_view_dir > camera->getCosHalfFov()) //the center is within the view frustum
@@ -2450,6 +2454,24 @@ bool LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)
mImportanceToCamera = LLFace::calcImportanceToCamera(cos_angle_to_view_dir, dist) ;
}
+ // On-screen test: does the face's projected disc overlap the screen disc?
+ // (Same construction as adjustPartialOverlapPixelArea.) Behind-camera faces
+ // get acos(cos) near pi and fall out; the generous screen radius errs toward
+ // "on screen" so fetch admission never starves edge content. mFrustumOverflow
+ // is how far past the boundary the disc sits, as a fraction of screen size -
+ // 0 on screen, 0.1 = 10% of a screen out - and feeds the frustum allowance
+ // falloff in computeDesiredDiscard.
+ {
+ F32 center_px = acosf(llclamp(cos_angle_to_view_dir, -1.f, 1.f)) * LLDrawable::sCurPixelAngle;
+ F32 screen_radius = (F32)llmax(gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw());
+ F32 past_edge = center_px - radius - screen_radius;
+ mInFrustum = past_edge <= 5.f;
+ mFrustumOverflow = llmax(past_edge - 5.f, 0.f) / screen_radius;
+ }
+
+ mLastCosAngleToViewDir = cos_angle_to_view_dir;
+ mLastRadius = radius;
+
return true ;
}