diff --git a/indra/llmath/llcamera.cpp b/indra/llmath/llcamera.cpp
index 988d600486..3103ce90dd 100644
--- a/indra/llmath/llcamera.cpp
+++ b/indra/llmath/llcamera.cpp
@@ -36,7 +36,8 @@ LLCamera::LLCamera() :
mView(DEFAULT_FIELD_OF_VIEW),
mAspect(DEFAULT_ASPECT_RATIO),
// [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
- mInverseAspect(1.0f / DEFAULT_ASPECT_RATIO),
+ //mInverseAspect(1.0f / DEFAULT_ASPECT_RATIO),
+ mDrawDistanceMultiplier(1.0f),
// [FIRE-35081]
mViewHeightInPixels( -1 ), // invalid height
mNearPlane(DEFAULT_NEAR_PLANE),
@@ -68,12 +69,16 @@ LLCamera::LLCamera(F32 vertical_fov_rads, F32 aspect_ratio, S32 view_height_in_p
mAspect = llclamp(aspect_ratio, MIN_ASPECT_RATIO, MAX_ASPECT_RATIO);
// [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
// Store the inverse of the aspect ratio, so we can remove it from texture calculations
- mInverseAspect = 1.0f / mAspect;
+ //mInverseAspect = 1.0f / mAspect;
// [FIRE-35081]
mNearPlane = llclamp(near_plane, MIN_NEAR_PLANE, MAX_NEAR_PLANE);
if(far_plane < 0) far_plane = DEFAULT_FAR_PLANE;
mFarPlane = llclamp(far_plane, MIN_FAR_PLANE, MAX_FAR_PLANE);
-
+ // [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
+ // Store the draw distance multiplier based upon how much bigger/smaller the far plan is then the default (64.0f)
+ mDrawDistanceMultiplier = mFarPlane / DEFAULT_FAR_PLANE;
+ mDrawDistanceMultiplier = mDrawDistanceMultiplier < 1.0f ? 1.0f : mDrawDistanceMultiplier;
+ // [FIRE-35081]
setView(vertical_fov_rads);
}
@@ -138,7 +143,7 @@ void LLCamera::setAspect(F32 aspect_ratio)
mAspect = llclamp(aspect_ratio, MIN_ASPECT_RATIO, MAX_ASPECT_RATIO);
// [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
// Store the inverse of the aspect ratio, so we can remove it from texture calculations
- mInverseAspect = 1.0f / mAspect;
+ //mInverseAspect = 1.0f / mAspect;
// [FIRE-35081]
calculateFrustumPlanes();
}
@@ -154,6 +159,11 @@ void LLCamera::setNear(F32 near_plane)
void LLCamera::setFar(F32 far_plane)
{
mFarPlane = llclamp(far_plane, MIN_FAR_PLANE, MAX_FAR_PLANE);
+ // [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
+ // Store the draw distance multiplier based upon how much bigger/smaller the far plan is then the default (64.0f)
+ mDrawDistanceMultiplier = mFarPlane / DEFAULT_FAR_PLANE;
+ mDrawDistanceMultiplier = mDrawDistanceMultiplier < 1.0f ? 1.0f : mDrawDistanceMultiplier;
+ // [FIRE-35081]
calculateFrustumPlanes();
}
diff --git a/indra/llmath/llcamera.h b/indra/llmath/llcamera.h
index 8155573263..c89162b9ff 100644
--- a/indra/llmath/llcamera.h
+++ b/indra/llmath/llcamera.h
@@ -129,7 +129,8 @@ private:
F32 mAspect; // width/height
// [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
// Store the inverse of the aspect ratio, for the texture's sizes
- F32 mInverseAspect; // height/width
+ //F32 mInverseAspect; // height/width
+ F32 mDrawDistanceMultiplier; // mFarPlane / DEFAULT_FAR_PLANE
// [FIRE-35081]
S32 mViewHeightInPixels; // for ViewHeightInPixels() only
F32 mNearPlane;
@@ -166,7 +167,8 @@ public:
S32 getViewHeightInPixels() const { return mViewHeightInPixels; }
F32 getAspect() const { return mAspect; } // width / height
// [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
- F32 getInverseAspect() const { return mInverseAspect; } // width / height
+ //F32 getInverseAspect() const { return mInverseAspect; } // width / height
+ F32 getDrawDistanceMultiplier() const { return mDrawDistanceMultiplier; } // mFarPlane / DEFAULT_FAR_PLANE (could also include near plane as well)
// [FIRE-35081]
F32 getNear() const { return mNearPlane; } // meters
F32 getFar() const { return mFarPlane; } // meters
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 31a439bc49..9a7ab65a91 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -75,6 +75,14 @@ static LLStaticHashedString sColorIn("color_in");
bool LLFace::sSafeRenderSelect = true; // false
+// [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
+// Moved to allow more code to access these values
+const S8 FACE_IMPORTANCE_LEVEL = 4 ;
+const F32 FACE_IMPORTANCE_TO_CAMERA_OVER_DISTANCE[FACE_IMPORTANCE_LEVEL][2] = //{distance, importance_weight}
+{{16.1f, 1.0f}, {32.1f, 0.5f}, {48.1f, 0.2f}, {96.1f, 0.05f} } ;
+const F32 FACE_IMPORTANCE_TO_CAMERA_OVER_ANGLE[FACE_IMPORTANCE_LEVEL][2] = //{cos(angle), importance_weight}
+{{0.985f /*cos(10 degrees)*/, 1.0f}, {0.94f /*cos(20 degrees)*/, 0.8f}, {0.866f /*cos(30 degrees)*/, 0.64f}, {0.0f, 0.36f}} ;
+// [FIRE-35081]
#define DOTVEC(a,b) (a.mV[0]*b.mV[0] + a.mV[1]*b.mV[1] + a.mV[2]*b.mV[2])
@@ -2332,7 +2340,7 @@ F32 LLFace::getTextureVirtualSize()
// [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
// Remove the aspect ratio and FOV from the area of the face to remove the changes to the window size from affecting the calculations.
// So that textures are in the same space as the face.
- face_area = face_area * LLViewerCamera::getInstance()->getInverseAspect();
+ //face_area = face_area * LLViewerCamera::getInstance()->getInverseAspect();
// [FIRE-35081]
setVirtualSize(face_area) ;
@@ -2470,8 +2478,9 @@ bool LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)
x_axis.load3(camera->getXAxis().mV);
cos_angle_to_view_dir = lookAt.dot3(x_axis).getF32();
// [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
- // Added real in frustum check value. Previous was only false for media textures off screen and invalid rig objects
- mInFrustum = cos_angle_to_view_dir > camera->getCosHalfFov() && cos_angle_to_view_dir < camera->getCosHalfFov() * 2.0f;
+ // Added close to camera (based upon the mImportanceToCamera) where any object that is within the FACE_IMPORTANCE_TO_CAMERA_OVER_DISTANCE (16.1f)
+ // gets an extra texture scaling up.
+ mCloseToCamera = dist <= FACE_IMPORTANCE_TO_CAMERA_OVER_DISTANCE[0][0] * camera->getDrawDistanceMultiplier() ? 1.0f : 0.0f;
// [FIRE-35081]
//if has media, check if the face is out of the view frustum.
@@ -2506,10 +2515,17 @@ bool LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)
{
cos_angle_to_view_dir = 1.0f ;
mImportanceToCamera = 1.0f ;
+ // [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
+ mInFrustum = true; // If the face is important to the camera, it is in the frustum
+ mCloseToCamera = true;
+ // [FIRE-35081]
}
else
{
mImportanceToCamera = LLFace::calcImportanceToCamera(cos_angle_to_view_dir, dist) ;
+ // [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
+ mInFrustum = bool(mImportanceToCamera); // If the face is important to the camera, it is in the frustum
+ // [FIRE-35081]
}
return true ;
@@ -2544,12 +2560,6 @@ F32 LLFace::adjustPartialOverlapPixelArea(F32 cos_angle_to_view_dir, F32 radius
return 1.0f ;
}
-const S8 FACE_IMPORTANCE_LEVEL = 4 ;
-const F32 FACE_IMPORTANCE_TO_CAMERA_OVER_DISTANCE[FACE_IMPORTANCE_LEVEL][2] = //{distance, importance_weight}
- {{16.1f, 1.0f}, {32.1f, 0.5f}, {48.1f, 0.2f}, {96.1f, 0.05f} } ;
-const F32 FACE_IMPORTANCE_TO_CAMERA_OVER_ANGLE[FACE_IMPORTANCE_LEVEL][2] = //{cos(angle), importance_weight}
- {{0.985f /*cos(10 degrees)*/, 1.0f}, {0.94f /*cos(20 degrees)*/, 0.8f}, {0.866f /*cos(30 degrees)*/, 0.64f}, {0.0f, 0.36f}} ;
-
//static
F32 LLFace::calcImportanceToCamera(F32 cos_angle_to_view_dir, F32 dist)
{
@@ -2570,7 +2580,10 @@ F32 LLFace::calcImportanceToCamera(F32 cos_angle_to_view_dir, F32 dist)
}
S32 i = 0 ;
- for(i = 0; i < FACE_IMPORTANCE_LEVEL && dist > FACE_IMPORTANCE_TO_CAMERA_OVER_DISTANCE[i][0]; ++i);
+ // [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
+ // Added draw distance multiplier to the distance
+ for(i = 0; i < FACE_IMPORTANCE_LEVEL && dist > FACE_IMPORTANCE_TO_CAMERA_OVER_DISTANCE[i][0] * camera->getDrawDistanceMultiplier(); ++i);
+ // [FIRE-35081]
i = llmin(i, FACE_IMPORTANCE_LEVEL - 1) ;
F32 dist_factor = FACE_IMPORTANCE_TO_CAMERA_OVER_DISTANCE[i][1] ;
diff --git a/indra/newview/llface.h b/indra/newview/llface.h
index 0a1225eb0f..a3bd935760 100644
--- a/indra/newview/llface.h
+++ b/indra/newview/llface.h
@@ -127,6 +127,8 @@ public:
void setPixelArea(F32 area) { mPixelArea = area; }
F32 getVirtualSize() const { return mVSize; }
F32 getPixelArea() const { return mPixelArea; }
+ F32 getImportanceToCamera() const { return mImportanceToCamera; }
+ F32 getCloseToCamera() const { return mCloseToCamera; }
S32 getIndexInTex(U32 ch) const { llassert(ch < LLRender::NUM_TEXTURE_CHANNELS); return mIndexInTex[ch]; }
void setIndexInTex(U32 ch, S32 index) { llassert(ch < LLRender::NUM_TEXTURE_CHANNELS); mIndexInTex[ch] = index; }
@@ -333,6 +335,7 @@ private:
//1.0: the most important.
//based on the distance from the face to the view point and the angle from the face center to the view direction.
F32 mImportanceToCamera ;
+ F32 mCloseToCamera;
F32 mBoundingSphereRadius ;
bool mHasMedia ;
bool mIsMediaAllowed;
diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp
index b995fccada..0df185e716 100644
--- a/indra/newview/llviewercamera.cpp
+++ b/indra/newview/llviewercamera.cpp
@@ -69,7 +69,6 @@ LLViewerCamera::LLViewerCamera() : LLCamera()
mCameraFOVDefault = DEFAULT_FIELD_OF_VIEW;
mPrevCameraFOVDefault = DEFAULT_FIELD_OF_VIEW;
mCosHalfCameraFOV = cosf(mCameraFOVDefault * 0.5f);
- mCosCameraFOV = cosf(mCameraFOVDefault);
mPixelMeterRatio = 0.f;
mScreenPixelArea = 0;
mZoomFactor = 1.f;
@@ -144,10 +143,6 @@ void LLViewerCamera::updateCameraLocation(const LLVector3 ¢er, const LLVecto
mAverageSpeed = (F32)LLTrace::get_frame_recording().getPeriodMeanPerSec(sVelocityStat, 50);
mAverageAngularSpeed = (F32)LLTrace::get_frame_recording().getPeriodMeanPerSec(sAngularVelocityStat);
mCosHalfCameraFOV = cosf(0.5f * getView() * llmax(1.0f, getAspect()));
- // [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
- // Store the full Cos FOV value
- mCosCameraFOV = cosf(getView() * llmax(1.0f, getAspect()));
- // [FIRE-35081]
// update pixel meter ratio using default fov, not modified one
mPixelMeterRatio = (F32)(getViewHeightInPixels()/ (2.f*tanf(mCameraFOVDefault*0.5f)));
@@ -827,9 +822,6 @@ void LLViewerCamera::setDefaultFOV(F32 vertical_fov_rads)
setView(vertical_fov_rads);
mCameraFOVDefault = vertical_fov_rads;
mCosHalfCameraFOV = cosf(mCameraFOVDefault * 0.5f);
- // [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
- mCosCameraFOV = cosf(mCameraFOVDefault);
- // [FIRE-35081]
}
bool LLViewerCamera::isDefaultFOVChanged()
diff --git a/indra/newview/llviewercamera.h b/indra/newview/llviewercamera.h
index 6fa3d3c6f2..b202f0812a 100644
--- a/indra/newview/llviewercamera.h
+++ b/indra/newview/llviewercamera.h
@@ -81,7 +81,6 @@ public:
static LLTrace::CountStatHandle<>* getVelocityStat() {return &sVelocityStat; }
static LLTrace::CountStatHandle<>* getAngularVelocityStat() {return &sAngularVelocityStat; }
F32 getCosHalfFov() {return mCosHalfCameraFOV;}
- F32 getCosFov() {return mCosCameraFOV;}
F32 getAverageSpeed() {return mAverageSpeed ;}
F32 getAverageAngularSpeed() {return mAverageAngularSpeed;}
@@ -121,10 +120,6 @@ protected:
F32 mCameraFOVDefault;
F32 mPrevCameraFOVDefault;
F32 mCosHalfCameraFOV;
- // [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
- // Store the Cos of the full FOV
- F32 mCosCameraFOV;
- // [FIRE-35081]
LLVector3 mLastPointOfInterest;
F32 mPixelMeterRatio; // Divide by distance from camera to get pixels per meter at that distance.
S32 mScreenPixelArea; // Pixel area of entire window
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index a25ff25cee..651dfffed4 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -128,6 +128,7 @@
#include "llviewerparcelmgr.h"
#include "llviewerstats.h"
#include "llviewerstatsrecorder.h"
+#include "llviewertexturelist.h"
#include "llvlcomposition.h"
#include "llvoavatarself.h"
#include "llvoicevivox.h"
@@ -12784,6 +12785,9 @@ void initialize_menus()
// Develop (Fonts debugging)
commit.add("Develop.Fonts.Dump", boost::bind(&LLFontGL::dumpFonts));
commit.add("Develop.Fonts.DumpTextures", boost::bind(&LLFontGL::dumpFontTextures));
+
+ //Develop (dump data)
+ commit.add("Develop.TextureList.Dump", boost::bind(&LLViewerTextureList::dumpTexturelist));
// Add telemetry controls to the viewer Develop menu (Toggle profiling)
view_listener_t::addMenu(new FSProfilerToggle(), "Develop.ToggleProfiling");
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 22f872ec3f..1951df6a9c 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -1178,6 +1178,9 @@ void LLViewerFetchedTexture::init(bool firstinit)
mKeptSavedRawImageTime = 0.f;
mLastCallBackActiveTime = 0.f;
mForceCallbackFetch = false;
+ // [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
+ mCloseToCamera = 0.0f; // Store if the camera is close to the camera (0.0f or 1.0f)
+ // [FIRE-35081]
mFTType = FTT_UNKNOWN;
}
@@ -3053,7 +3056,11 @@ void LLViewerLODTexture::processTextureStats()
else if (mBoostLevel < LLGLTexture::BOOST_HIGH && mMaxVirtualSize <= 10.f)
{
// If the image has not been significantly visible in a while, we don't want it
- mDesiredDiscardLevel = llmin(mMinDesiredDiscardLevel, (S8)(MAX_DISCARD_LEVEL + 1));
+ // [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
+ //mDesiredDiscardLevel = llmin(mMinDesiredDiscardLevel, (S8)(MAX_DISCARD_LEVEL + 1));
+ // Off screen textures at 6 would not downscale.
+ mDesiredDiscardLevel = llmin(mMinDesiredDiscardLevel, (S8)(MAX_DISCARD_LEVEL));
+ // [FIRE-35081]
mDesiredDiscardLevel = llmin(mDesiredDiscardLevel, (S32)mLoadedCallbackDesiredDiscardLevel);
}
else if (!mFullWidth || !mFullHeight)
@@ -3063,6 +3070,8 @@ void LLViewerLODTexture::processTextureStats()
}
else
{
+ // [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
+ /*
//static const F64 log_2 = log(2.0);
static const F64 log_4 = log(4.0);
@@ -3090,10 +3099,28 @@ void LLViewerLODTexture::processTextureStats()
discard_level = floorf(discard_level);
F32 min_discard = 0.f;
- if (mFullWidth > max_tex_res || mFullHeight > max_tex_res)
- min_discard = 1.f;
+ */
- discard_level = llclamp(discard_level, min_discard, (F32)MAX_DISCARD_LEVEL);
+ // Use a S32 value for the discard level
+ S32 discard_level = 0;
+ // Find the best discard that covers the entire mMaxVirtualSize of the on screen texture
+ for (; discard_level <= MAX_DISCARD_LEVEL; discard_level++)
+ {
+ // If the max virtual size is greater then the current discard level, then break out of the loop and use the current discard level
+ if (mMaxVirtualSize > getWidth(discard_level) * getHeight(discard_level))
+ {
+ break;
+ }
+ }
+
+ // Use a S32 instead of a float
+ S32 min_discard = 0;
+ if (mFullWidth > max_tex_res || mFullHeight > max_tex_res)
+ min_discard = 1;
+
+ //discard_level = llclamp(discard_level, min_discard, (F32)MAX_DISCARD_LEVEL);
+ discard_level = llclamp(discard_level, min_discard, MAX_DISCARD_LEVEL); // Don't convert to float and back again
+ // [FIRE-35081]
// Can't go higher than the max discard level
mDesiredDiscardLevel = llmin(getMaxDiscardLevel() + 1, (S32)discard_level);
diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h
index 10a79515e9..13b6b6b883 100644
--- a/indra/newview/llviewertexture.h
+++ b/indra/newview/llviewertexture.h
@@ -437,6 +437,11 @@ public:
void setInFastCacheList(bool in_list) { mInFastCacheList = in_list; }
bool isInFastCacheList() { return mInFastCacheList; }
+ // [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
+ F32 getCloseToCamera() const {return mCloseToCamera ;} // Get close to camera value
+ void setCloseToCamera(F32 value) {mCloseToCamera = value ;} // Set the close to camera value (0.0f or 1.0f)
+ // [FIRE-35081]
+
/*virtual*/bool isActiveFetching() override; //is actively in fetching by the fetching pipeline.
virtual bool scaleDown() { return false; };
@@ -537,6 +542,9 @@ protected:
bool mForSculpt ; //a flag if the texture is used as sculpt data.
bool mIsFetched ; //is loaded from remote or from cache, not generated locally.
+ // [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
+ F32 mCloseToCamera; // Float (0.0f or 1.0f) to indicate if the texture is close to the camera
+ // [FIRE-35081]
public:
static F32 sMaxVirtualSize; //maximum possible value of mMaxVirtualSize
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index 28981d4bec..2bd3f3738f 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -371,11 +371,28 @@ void LLViewerTextureList::shutdown()
mInitialized = false ; //prevent loading textures again.
}
+// [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
+// static
+// Allows the menu to call the dump method of the texture list
+void LLViewerTextureList::dumpTexturelist()
+{
+ gTextureList.dump();
+}
+// [FIRE-35081]
void LLViewerTextureList::dump()
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
LL_INFOS() << "LLViewerTextureList::dump()" << LL_ENDL;
+ // [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
+ S32 texture_count = 0;
+ S32 textures_close_to_camera = 0;
+ S32 image_counts[MAX_DISCARD_LEVEL + 1];
+ for (S32 index = 0; index <= MAX_DISCARD_LEVEL; index++)
+ {
+ image_counts[index] = 0;
+ }
+ // [FIRE-35081]
for (image_list_t::iterator it = mImageList.begin(); it != mImageList.end(); ++it)
{
LLViewerFetchedTexture* image = *it;
@@ -385,9 +402,28 @@ void LLViewerTextureList::dump()
<< " size " << image->getWidth() << "x" << image->getHeight()
<< " discard " << image->getDiscardLevel()
<< " desired " << image->getDesiredDiscardLevel()
+ // [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
+ << " close to camera " << (image->getCloseToCamera() > 0.0f ? "Y" : "N") // Display the close to camera flag
+ << " FFType " << fttype_to_string(image->getFTType()) // Display the FFType of the camera
+ << " Type " << (S32)image->getType() // Display the type of the image (LOCAL_TEXTURE = 0, MEDIA_TEXTURE = 1, DYNAMIC_TEXTURE = 2, FETCHED_TEXTURE = 3,LOD_TEXTURE = 4)
+ // [FIRE-35081]
<< " http://asset.siva.lindenlab.com/" << image->getID() << ".texture"
<< LL_ENDL;
+ // [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
+ image_counts[image->getDiscardLevel()] += 1;
+ texture_count++;
+ textures_close_to_camera += S32(image->getCloseToCamera());
+ // [FIRE-35081]
}
+ // [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
+ // Add overal texture totals
+ LL_INFOS() << "Texture Stats: Textures in Close to Camera " << textures_close_to_camera << " of " << texture_count << " : " << LL_ENDL;
+
+ for (S32 index = 0; index <= MAX_DISCARD_LEVEL; index++)
+ {
+ LL_INFOS() << " Discard Level: " << index << " Number of Textures: " << image_counts[index] << LL_ENDL;
+ }
+ // [FIRE-35081]
}
void LLViewerTextureList::destroyGL()
@@ -942,12 +978,13 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag
bool current_on_screen = false;
F32 vsize = 0.0f; // Moved outside the loop to save reallocation every loop
F32 important_to_camera = 0.0f;
+ F32 close_to_camera = 0.0f; // Track if the texture is close to the cameras
F64 animated = 0; // U64 used to track if a pointer is set for the animations. (The texture matrix of the face is null if no animation assigned to the texture)
// So if you keep adding and the final result is 0, there is no animation
// [FIRE-35081]
// boost resolution of textures that are important to the camera
// Can instead of using max for a min of 1.0, just subtract 1 from the boost and just do a 1 + (TextureCameraBoost - 1) * importanceToCamera)
- static LLCachedControl texture_camera_boost(gSavedSettings, "TextureCameraBoost", 7.f);
+ static LLCachedControl texture_camera_boost(gSavedSettings, "TextureCameraBoost", 7.f);
LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
for (U32 i = 0; i < LLRender::NUM_TEXTURE_CHANNELS; ++i)
{
@@ -1026,9 +1063,14 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag
// Lerp instead of doing conditional input
// If the image is import to the camera, even a little then make the on screen true
on_screen_count += S32(important_to_camera * 1000.0f);
- vsize = vsize + (vsize * (1.0f + important_to_camera * texture_camera_boost) - vsize) * F32(current_on_screen);
-
+ //vsize = vsize + (vsize * (1.0f + important_to_camera * texture_camera_boost) - vsize) * F32(current_on_screen);
+ // Apply boost of size based upon importance to camera
+ vsize = vsize + (vsize * important_to_camera * texture_camera_boost);
+ // Apply second boost based upon if the texture is close to the camera (< 16.1 meters * draw distance multiplier)
+ vsize = vsize + (vsize * face->mCloseToCamera * texture_camera_boost);
// Update the max on screen vsize based upon the on screen vsize
+ close_to_camera += face->mCloseToCamera;
+ LL_DEBUGS() << "" << imagep->getID() << " " << imagep->getNumFaces(i) << " OS Vsize: " << vsize << " Vsize: " << (vsize * bias) << " CTC: " << face->mCloseToCamera << LL_ENDL;
max_on_screen_vsize = llmax(max_on_screen_vsize, vsize);
max_vsize = llmax(max_vsize, vsize * bias);
// [FIRE-35081]
@@ -1039,7 +1081,8 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag
// [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
// Replaced all the checks for this bool to be only in this 1 place instead of in the loop.
// If the on screen counter is greater then 0, then there was at least 1 on screen texture
- on_screen = bool(on_screen_count);
+ on_screen = bool(on_screen_count);
+ imagep->setCloseToCamera(close_to_camera > 0.0f ? 1.0f : 0.0f);
//if (face_count > 1024)
// Add check for if the image is animated to boost to high as well
@@ -1078,16 +1121,25 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag
imagep->addTextureStats(max_on_screen_vsize);
}
// If the boost level just became high, or the texture is (Local, Media Dynamic)
- else if (imagep->getBoostLevel() == LLViewerTexture::BOOST_HIGH || imagep->getType() < LLViewerTexture::FETCHED_TEXTURE)
+ else if (imagep->getBoostLevel() == LLViewerTexture::BOOST_HIGH || imagep->getType() < LLViewerTexture::FETCHED_TEXTURE || close_to_camera)
{
// Always use the best quality of the texture
imagep->addTextureStats(max_on_screen_vsize);
}
// All other texture cases will use max_vsize with bias applied.
else
- {
+ {
imagep->addTextureStats(max_vsize);
}
+ U32 max_tex_res = LLGLTexture::MAX_IMAGE_SIZE_DEFAULT;
+ if (imagep->getBoostLevel() < LLGLTexture::BOOST_HIGH)
+ {
+ // restrict texture resolution to download based on RenderMaxTextureResolution
+ static LLCachedControl max_texture_resolution(gSavedSettings, "RenderMaxTextureResolution", 2048);
+ // sanity clamp debug setting to avoid settings hack shenanigans
+ max_tex_res = (U32)llclamp((U32)max_texture_resolution, 512, LLGLTexture::MAX_IMAGE_SIZE_DEFAULT);
+ imagep->mMaxVirtualSize = llmin(imagep->mMaxVirtualSize, (F32)(max_tex_res * max_tex_res));
+ }
// [FIRE-35081]
}
diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h
index 3816c32500..c8e9693c58 100644
--- a/indra/newview/llviewertexturelist.h
+++ b/indra/newview/llviewertexturelist.h
@@ -111,6 +111,9 @@ public:
static void receiveImageHeader(LLMessageSystem *msg, void **user_data);
static void receiveImagePacket(LLMessageSystem *msg, void **user_data);
//
+ // [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
+ static void dumpTexturelist(); // Added code to handle dumping texture information
+ // [FIRE-35081]
public:
LLViewerTextureList();
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index b9d9830298..f01e813a3f 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -2275,12 +2275,23 @@ F32 LLPipeline::calcPixelArea(LLVector3 center, LLVector3 size, LLCamera &camera
//ramp down distance for nearby objects
//shrink dist by dist/16.
+ // [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
+ /*
if (dist < 16.f)
{
dist /= 16.f;
dist *= dist;
dist *= 16.f;
}
+ */
+ // Applied the camera draw distance multiplier to the distance similar to the textures
+ if (dist < 16.f * camera.getDrawDistanceMultiplier())
+ {
+ dist /= 16.f * camera.getDrawDistanceMultiplier();
+ dist *= dist;
+ dist *= 16.f * camera.getDrawDistanceMultiplier();
+ }
+ // [FIRE-35081]
//get area of circle around node
F32 app_angle = atanf(size.length()/dist);
@@ -2300,12 +2311,23 @@ F32 LLPipeline::calcPixelArea(const LLVector4a& center, const LLVector4a& size,
//ramp down distance for nearby objects
//shrink dist by dist/16.
+ // [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
+ /*
if (dist < 16.f)
{
- dist /= 16.f;
- dist *= dist;
- dist *= 16.f;
+ dist /= 16.f;
+ dist *= dist;
+ dist *= 16.f;
}
+ */
+ // Applied the camera draw distance multiplier to the distance similar to the textures
+ if (dist < 16.f * camera.getDrawDistanceMultiplier())
+ {
+ dist /= 16.f * camera.getDrawDistanceMultiplier();
+ dist *= dist;
+ dist *= 16.f * camera.getDrawDistanceMultiplier();
+ }
+ // [FIRE-35081]
//get area of circle around node
F32 app_angle = atanf(size.getLength3().getF32() / dist);
@@ -8082,7 +8104,7 @@ bool LLPipeline::renderSnapshotFrame(LLRenderTarget* src, LLRenderTarget* dst)
{
float frame_width = w;
float frame_height = frame_width / snapshot_aspect;
- // Centre this box in [0..1]×[0..1]
+ // Centre this box in [0..1]�[0..1]
float y_offset = 0.5f * (h - frame_height);
left = 0.f;
top = y_offset / h;
@@ -8093,7 +8115,7 @@ bool LLPipeline::renderSnapshotFrame(LLRenderTarget* src, LLRenderTarget* dst)
{
float frame_height = h;
float frame_width = h * snapshot_aspect;
- // Centre this box in [0..1]×[0..1]
+ // Centre this box in [0..1]�[0..1]
float x_offset = 0.5f * (w - frame_width);
left = x_offset / w;
top = 0.f;
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index f8a8fd49b3..bb2f0ebf23 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -5761,6 +5761,20 @@
+
+
+