summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorJonathan "Geenz" Goodman <geenz@geenzo.com>2026-05-18 13:26:34 -0400
committerJonathan "Geenz" Goodman <geenz@geenzo.com>2026-05-18 13:26:34 -0400
commit97bcc7816d7084b4aaed67cdb90a5b7ae0ec1126 (patch)
treedff36f874abfc55ec8b56c917e9b9f4642b84738 /indra
parent97f8dfaca2a60e228b84aedbf71620f0c000412c (diff)
Add a texture "bubble" near the camera to ensure high res textures closer to the camera.
Diffstat (limited to 'indra')
-rw-r--r--indra/newview/app_settings/settings.xml11
-rw-r--r--indra/newview/llviewertexturelist.cpp13
2 files changed, 22 insertions, 2 deletions
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index e9d91b7add..35b3665bec 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -11921,6 +11921,17 @@
<integer>2</integer>
</map>
+ <key>TextureCloseBubbleMeters</key>
+ <map>
+ <key>Comment</key>
+ <string>Close-camera bubble (meters). Faces inside this distance get dist_factor = 0 (no discard contribution); the ramp to 1 spans (bubble, draw_distance].</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>5.0</real>
+ </map>
<key>TextureDistanceDiscardPower</key>
<map>
<key>Comment</key>
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index 235888e2d1..d555cd21db 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -933,6 +933,13 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag
bool on_agent_avatar = false;
F32 draw_distance = llmax(gAgentCamera.mDrawDistance, 0.001f);
+ // Close-camera bubble: distances under bubble_meters resolve to
+ // dist_factor = 0 (no discard contribution). The ramp from 0 -> 1
+ // spans (bubble, draw_distance] rather than (0, draw_distance].
+ static LLCachedControl<F32> close_bubble(gSavedSettings, "TextureCloseBubbleMeters", 5.f);
+ F32 bubble = llclamp((F32)close_bubble, 0.f, draw_distance - 0.001f);
+ F32 ramp_range = llmax(draw_distance - bubble, 0.001f);
+
U32 face_count = 0;
U32 max_faces_to_check = 1024;
@@ -990,7 +997,8 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag
on_screen |= face->mInFrustum;
- F32 dist_factor = llclampf(face->mDistanceToCamera / draw_distance);
+ F32 dist_above_bubble = llmax(face->mDistanceToCamera - bubble, 0.f);
+ F32 dist_factor = llclampf(dist_above_bubble / ramp_range);
min_distance_factor = llmin(min_distance_factor, dist_factor);
if (face->mAvatar && face->mAvatar == gAgentAvatarp)
@@ -1071,7 +1079,8 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag
static LLCachedControl<F32> terrain_distance_floor(gSavedSettings, "TextureTerrainDistanceFloor", 0.01f);
static LLCachedControl<F32> terrain_coverage(gSavedSettings, "TextureTerrainCoverageFraction", 0.99f);
F32 nearest = LLSurface::sNearestVisiblePatchDistance;
- F32 dist = (nearest < FLT_MAX) ? llclampf(nearest / draw_distance) : 1.f;
+ F32 nearest_above_bubble = (nearest < FLT_MAX) ? llmax(nearest - bubble, 0.f) : ramp_range;
+ F32 dist = llclampf(nearest_above_bubble / ramp_range);
imagep->mMinDistanceFactor = llmax(dist, llclampf((F32)terrain_distance_floor));
imagep->mMaxOnScreenSize = LLViewerTexture::sWindowPixelArea * llclampf((F32)terrain_coverage);
}