Ansariel 2025-03-23 11:46:47 +01:00
commit b140406910
32 changed files with 631 additions and 264 deletions

View File

@ -35,6 +35,10 @@ LLCamera::LLCamera() :
LLCoordFrame(),
mView(DEFAULT_FIELD_OF_VIEW),
mAspect(DEFAULT_ASPECT_RATIO),
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
//mInverseAspect(1.0f / DEFAULT_ASPECT_RATIO),
mDrawDistanceMultiplier(1.0f),
// </FS:minerjr> [FIRE-35081]
mViewHeightInPixels( -1 ), // invalid height
mNearPlane(DEFAULT_NEAR_PLANE),
mFarPlane(DEFAULT_FAR_PLANE),
@ -63,10 +67,18 @@ LLCamera::LLCamera(F32 vertical_fov_rads, F32 aspect_ratio, S32 view_height_in_p
}
mAspect = llclamp(aspect_ratio, MIN_ASPECT_RATIO, MAX_ASPECT_RATIO);
// <FS:minerjr> [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;
// </FS:minerjr> [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);
// <FS:minerjr> [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;
// </FS:minerjr> [FIRE-35081]
setView(vertical_fov_rads);
}
@ -129,6 +141,10 @@ void LLCamera::setViewHeightInPixels(S32 height)
void LLCamera::setAspect(F32 aspect_ratio)
{
mAspect = llclamp(aspect_ratio, MIN_ASPECT_RATIO, MAX_ASPECT_RATIO);
// <FS:minerjr> [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;
// </FS:minerjr> [FIRE-35081]
calculateFrustumPlanes();
}
@ -143,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);
// <FS:minerjr> [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;
// </FS:minerjr> [FIRE-35081]
calculateFrustumPlanes();
}

View File

@ -127,6 +127,11 @@ private:
F32 mView; // angle between top and bottom frustum planes in radians.
F32 mAspect; // width/height
// <FS:minerjr> [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 mDrawDistanceMultiplier; // mFarPlane / DEFAULT_FAR_PLANE
// </FS:minerjr> [FIRE-35081]
S32 mViewHeightInPixels; // for ViewHeightInPixels() only
F32 mNearPlane;
F32 mFarPlane;
@ -161,6 +166,10 @@ public:
F32 getView() const { return mView; } // vertical FOV in radians
S32 getViewHeightInPixels() const { return mViewHeightInPixels; }
F32 getAspect() const { return mAspect; } // width / height
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
//F32 getInverseAspect() const { return mInverseAspect; } // width / height
F32 getDrawDistanceMultiplier() const { return mDrawDistanceMultiplier; } // mFarPlane / DEFAULT_FAR_PLANE (could also include near plane as well)
// </FS:minerjr> [FIRE-35081]
F32 getNear() const { return mNearPlane; } // meters
F32 getFar() const { return mFarPlane; } // meters

View File

@ -104,6 +104,12 @@ void LLGLTexture::setBoostLevel(S32 level)
if(mBoostLevel != LLGLTexture::BOOST_NONE
&& mBoostLevel != LLGLTexture::BOOST_ICON
&& mBoostLevel != LLGLTexture::BOOST_THUMBNAIL
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
// Add the new grass, light and tree boosts
&& mBoostLevel != LLGLTexture::BOOST_GRASS
&& mBoostLevel != LLGLTexture::BOOST_LIGHT
&& mBoostLevel != LLGLTexture::BOOST_TREE
// <FS:minerjr> [FIRE-35081]
&& mBoostLevel != LLGLTexture::BOOST_TERRAIN)
{
setNoDelete() ;

View File

@ -53,6 +53,11 @@ public:
BOOST_AVATAR_BAKED ,
BOOST_TERRAIN , // Needed for minimap generation for now. Lower than BOOST_HIGH so the texture stats don't get forced, i.e. texture stats are manually managed by minimap/terrain instead.
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
BOOST_GRASS , // Grass has a alternative calculation for virtual and face sizes.
BOOST_TREE , // Tree has a alternative calculation for virtual and face sizes.
BOOST_LIGHT , // Light textures has a alternative calculation for virtual and face sizes.
// </FS:minerjr> [FIRE-35081]
BOOST_HIGH = 10,
BOOST_SCULPTED ,
BOOST_BUMP ,

View File

@ -565,8 +565,13 @@ void LLConsole::Paragraph::updateLines(F32 screen_width, const LLFontGL* font, L
{
if ( !force_resize )
{
if ( mMaxWidth >= 0.0f
&& mMaxWidth < screen_width )
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
// if ( mMaxWidth >= 0.0f
//&& mMaxWidth < screen_width)
// If viewer window was made as small as possible with the console enabled, it would cause an assert error
// as the line below can go as small as -38
if ( ((mMaxWidth >= 0.0f) && (mMaxWidth < screen_width)) || (screen_width <= 30) )
// </FS:minerjr> [FIRE-35081]
{
return; //No resize required.
}

View File

@ -132,8 +132,8 @@ private:
void renderActiveRing( F32 radius, F32 width, const LLColor4& front_color, const LLColor4& back_color);
void renderManipulatorRings(const LLVector3& center, const LLQuaternion& finalAlignment);
void renderCenterCircle(const F32 radius, const LLColor4& normal_color = LLColor4(0.7f,0.7,0.7f,0.2), const LLColor4& highlight_color = LLColor4(0.8f,0.8f,0.8f,0.3));
void renderCenterSphere(const F32 radius, const LLColor4& normal_color = LLColor4(0.7f,0.7,0.7f,0.2), const LLColor4& highlight_color = LLColor4(0.8f,0.8f,0.8f,0.3));
void renderCenterCircle(const F32 radius, const LLColor4& normal_color = LLColor4(0.7f,0.7f,0.7f,0.2f), const LLColor4& highlight_color = LLColor4(0.8f,0.8f,0.8f,0.3f)); // <FS:minerjr> add missing f for float
void renderCenterSphere(const F32 radius, const LLColor4& normal_color = LLColor4(0.7f,0.7f,0.7f,0.2f), const LLColor4& highlight_color = LLColor4(0.8f,0.8f,0.8f,0.3f)); // <FS:minerjr> add missing f for float
void renderRingPass(const RingRenderParams& params, float radius, float width, int pass);
void renderAxes(const LLVector3& center, F32 size, const LLQuaternion& rotation);

View File

@ -133,7 +133,7 @@ private:
/// This takes advantage of how the actual vector migrates to equality with the target vector.
/// Certain physics settings (bouncing whatnots) account for some longer term work, but as this is applied per joint, it tends to reduce a lot of work.
/// </remarks>
const F32 closeEnough = 1e-6;
const F32 closeEnough = 1e-6f; // <FS:minerjr> add missing f for float
/// <summary>
/// The kind of joint state this animation is concerned with changing.

View File

@ -5991,8 +5991,8 @@ void LLAppViewer::idle()
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
// Added a max time limit to the object list updates as these updates do affect the texture system
//gObjectList.updateApparentAngles(gAgent);
F32 max_update_apparent_angles = 0.0020f * gFrameIntervalSeconds.value(); // 20 ms/second decode time
max_update_apparent_angles = llclamp(max_update_apparent_angles, 0.00005f, 0.0002f); // min 2ms/frame, max 5ms/frame)
F32 max_update_apparent_angles = 0.025f * gFrameIntervalSeconds.value(); // 20 ms/second decode time
max_update_apparent_angles = llclamp(max_update_apparent_angles, 0.002f, 0.005f); // min 2ms/frame, max 5ms/frame)
gObjectList.updateApparentAngles(gAgent, max_update_apparent_angles);
// </FS:minerjr> [FIRE-35081]
}

View File

@ -75,6 +75,14 @@ static LLStaticHashedString sColorIn("color_in");
bool LLFace::sSafeRenderSelect = true; // false
// <FS:minerjr> [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}} ;
// </FS:minerjr> [FIRE-35081]
#define DOTVEC(a,b) (a.mV[0]*b.mV[0] + a.mV[1]*b.mV[1] + a.mV[2]*b.mV[2])
@ -171,7 +179,10 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp)
mFaceColor = LLColor4(1,0,0,1);
mImportanceToCamera = 0.f ;
mImportanceToCamera = 1.f ;
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
mCloseToCamera = 1.0f;
// </FS:minerjr> [FIRE-35081]
mBoundingSphereRadius = 0.0f ;
mTexExtents[0].set(0, 0);
@ -375,6 +386,11 @@ void LLFace::switchTexture(U32 ch, LLViewerTexture* new_texture)
return;
}
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
// Need to update the new textures to the old textures boost and max virtual size, so they won't
new_texture->setBoostLevel(mTexture[ch]->getBoostLevel());
new_texture->addTextureStats(mTexture[ch]->getMaxVirtualSize());
// </FS:minerjr> [FIRE-35081]
if (ch == LLRender::DIFFUSE_MAP)
{
if (getViewerObject())
@ -1679,7 +1695,10 @@ bool LLFace::getGeometryVolume(const LLVolume& volume,
xforms = XFORM_NONE;
}
if (getVirtualSize() >= MIN_TEX_ANIM_SIZE) // || isState(LLFace::RIGGED))
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
// Removed check for turning off animations
//if (getVirtualSize() >= MIN_TEX_ANIM_SIZE) // || isState(LLFace::RIGGED))
// </FS:minerjr> [FIRE-35081]
{ //don't override texture transform during tc bake
tex_mode = 0;
}
@ -2280,10 +2299,16 @@ F32 LLFace::getTextureVirtualSize()
F32 radius;
F32 cos_angle_to_view_dir;
bool in_frustum = calcPixelArea(cos_angle_to_view_dir, radius);
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
//bool in_frustum = calcPixelArea(cos_angle_to_view_dir, radius);
// The mInFrustum value is now updated in calcPixelArea, so no longer need to accss the value
calcPixelArea(cos_angle_to_view_dir, radius);
if (mPixelArea < F_ALMOST_ZERO || !in_frustum)
//if (mPixelArea < F_ALMOST_ZERO || !in_frustum)
// Use the stored value from calcPixelArea
if (mPixelArea < F_ALMOST_ZERO || !mInFrustum)
// </FS:minerjr> [FIRE-35081]
{
setVirtualSize(0.f) ;
return 0.f;
@ -2312,6 +2337,10 @@ F32 LLFace::getTextureVirtualSize()
}
face_area = LLFace::adjustPixelArea(mImportanceToCamera, face_area);
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
// Remove the face area being affected by being partial off screen as close to screen textures can then become scaled down along with
// animated textures.
/*
if(face_area > LLViewerTexture::sMinLargeImageSize) //if is large image, shrink face_area by considering the partial overlapping.
{
if(mImportanceToCamera > LEAST_IMPORTANCE_FOR_LARGE_IMAGE && mTexture[LLRender::DIFFUSE_MAP].notNull() && mTexture[LLRender::DIFFUSE_MAP]->isLargeImage())
@ -2319,7 +2348,8 @@ F32 LLFace::getTextureVirtualSize()
face_area *= adjustPartialOverlapPixelArea(cos_angle_to_view_dir, radius );
}
}
*/
// </FS:minerjr> [FIRE-35081]
setVirtualSize(face_area) ;
return face_area;
@ -2405,6 +2435,10 @@ 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);
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
// Set the face to be out of the frustum as the object is invalid
mInFrustum = false;
// </FS:minerjr> [FIRE-35081]
return false;
}
@ -2451,6 +2485,14 @@ bool LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)
LLVector4a x_axis;
x_axis.load3(camera->getXAxis().mV);
cos_angle_to_view_dir = lookAt.dot3(x_axis).getF32();
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
// 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.
// Use positive distance to the camera and apply the multiplier based upon the texture scaled for increase in the default draw distance
mCloseToCamera = (dist >= 0.0f && dist <= FACE_IMPORTANCE_TO_CAMERA_OVER_DISTANCE[0][0] * camera->getDrawDistanceMultiplier()) ? 1.0f : 0.0f;
// Check if the object is positive distance to the far plane and positive cos angle is in frustum
mInFrustum = (dist >= 0 && dist <= camera->getFar() && cos_angle_to_view_dir > 0.0f);
// </FS:minerjr> [FIRE-35081]
//if has media, check if the face is out of the view frustum.
if(hasMedia())
@ -2458,6 +2500,10 @@ bool LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)
if(!camera->AABBInFrustum(center, size))
{
mImportanceToCamera = 0.f ;
// <FS:minerjr> [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 = false;
// </FS:minerjr> [FIRE-35081]
return false ;
}
if(cos_angle_to_view_dir > camera->getCosHalfFov()) //the center is within the view frustum
@ -2480,6 +2526,10 @@ bool LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)
{
cos_angle_to_view_dir = 1.0f ;
mImportanceToCamera = 1.0f ;
// <FS:minerjr> [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 = 1.0f;
// </FS:minerjr> [FIRE-35081]
}
else
{
@ -2518,22 +2568,21 @@ 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)
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_FACE;
F32 importance = 0.f ;
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
// Move camera out to use for the inital check for the distance to the face importance with the multiplier
LLViewerCamera* camera = LLViewerCamera::getInstance();
if(cos_angle_to_view_dir > LLViewerCamera::getInstance()->getCosHalfFov() &&
dist < FACE_IMPORTANCE_TO_CAMERA_OVER_DISTANCE[FACE_IMPORTANCE_LEVEL - 1][0])
if(cos_angle_to_view_dir > LLViewerCamera::getInstance()->getCosHalfFov() &&
//dist < FACE_IMPORTANCE_TO_CAMERA_OVER_DISTANCE[FACE_IMPORTANCE_LEVEL - 1][0])
dist < FACE_IMPORTANCE_TO_CAMERA_OVER_DISTANCE[FACE_IMPORTANCE_LEVEL - 1][0] * camera->getDrawDistanceMultiplier())
{
LLViewerCamera* camera = LLViewerCamera::getInstance();
//LLViewerCamera* camera = LLViewerCamera::getInstance();
// </FS:minerjr> [FIRE-35081]
F32 camera_moving_speed = camera->getAverageSpeed() ;
F32 camera_angular_speed = camera->getAverageAngularSpeed();
@ -2544,7 +2593,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);
// <FS:minerjr> [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);
// </FS:minerjr> [FIRE-35081]
i = llmin(i, FACE_IMPORTANCE_LEVEL - 1) ;
F32 dist_factor = FACE_IMPORTANCE_TO_CAMERA_OVER_DISTANCE[i][1] ;

View File

@ -52,7 +52,11 @@ class LLDrawInfo;
class LLMeshSkinInfo;
const F32 MIN_ALPHA_SIZE = 1024.f;
const F32 MIN_TEX_ANIM_SIZE = 512.f;
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
//const F32 MIN_TEX_ANIM_SIZE = 512.f;
// Change the min size to
const F32 MIN_TEX_ANIM_SIZE = 10.f;
// </FS:minerjr> [FIRE-35081]
const U8 FACE_DO_NOT_BATCH_TEXTURES = 255;
class alignas(16) LLFace
@ -123,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; }
@ -329,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;

View File

@ -60,7 +60,7 @@ static void touch_default_probe(LLReflectionMap* probe)
}
}
LLHeroProbeManager::LLHeroProbeManager()
LLHeroProbeManager::LLHeroProbeManager():mMirrorNormal(0,0,1) // <FS:Beq/> [FIRE-35007][#3331] mirrors not working after relog. make sure the mirror normal is not zero length
{
}
@ -84,12 +84,14 @@ void LLHeroProbeManager::update()
// For some reason clearing shaders will cause mirrors to actually work.
// There's likely some deeper state issue that needs to be resolved.
// - Geenz 2025-02-25
if (!mInitialized && LLStartUp::getStartupState() > STATE_PRECACHE)
{
LLViewerShaderMgr::instance()->clearShaderCache();
LLViewerShaderMgr::instance()->setShaders();
mInitialized = true;
}
// <FS:Beq> [FIRE-35007][#3331] mirrors not working after relog. hack no longer needed.
// if (!mInitialized && LLStartUp::getStartupState() > STATE_PRECACHE)
// {
// LLViewerShaderMgr::instance()->clearShaderCache();
// LLViewerShaderMgr::instance()->setShaders();
// mInitialized = true;
// }
// </FS:Beq>
LL_PROFILE_ZONE_SCOPED_CATEGORY_DISPLAY;
llassert(!gCubeSnapshot); // assert a snapshot is not in progress

View File

@ -695,7 +695,7 @@ void LLViewerMedia::updateMedia(void *dummy_arg)
static LLCachedControl<U32> max_instances(gSavedSettings, "PluginInstancesTotal", 8);
static LLCachedControl<U32> max_normal(gSavedSettings, "PluginInstancesNormal", 2);
static LLCachedControl<U32> max_low(gSavedSettings, "PluginInstancesLow", 4);
static LLCachedControl<F32> max_cpu(gSavedSettings, "PluginInstancesCPULimit", 0.9);
static LLCachedControl<F32> max_cpu(gSavedSettings, "PluginInstancesCPULimit", 0.9f); // <FS:minerjr> add missing f for float
// Setting max_cpu to 0.0 disables CPU usage checking.
bool check_cpu_usage = (max_cpu != 0.0f);
@ -3112,6 +3112,7 @@ LLViewerMediaTexture* LLViewerMediaImpl::updateMediaImage()
int discard_level = 0;
media_tex->createGLTexture(discard_level, raw);
//media_tex->setBoostLevel(LLViewerTexture::BOOST_HIGH);
// MEDIAOPT: set this dynamically on play/stop
// FIXME

View File

@ -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"
@ -12820,6 +12821,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));
// <FS:Beq/> Add telemetry controls to the viewer Develop menu (Toggle profiling)
view_listener_t::addMenu(new FSProfilerToggle(), "Develop.ToggleProfiling");

View File

@ -889,7 +889,7 @@ void LLViewerObjectList::updateApparentAngles(LLAgent &agent, F32 max_time)
max_value = (S32)mObjects.size();
LLTimer timer;
// If the number of objects since last being in here has changed (IE objects deleted, then reset the lazy update index)
if (mCurLazyUpdateIndex > max_value)
if (mCurLazyUpdateIndex >= max_value)
{
mCurLazyUpdateIndex = 0;
}
@ -898,6 +898,12 @@ void LLViewerObjectList::updateApparentAngles(LLAgent &agent, F32 max_time)
// loop over number of objects in the BIN (128), or below until we run out of time
while(num_updates < NUM_BINS)
{
// Moved to the first to fix up the issue of access violation if the object list chaanges size during processing.
if (i >= (S32)mObjects.size())
{
// Reset the index if we go over the max value
i = 0;
}
objectp = mObjects[i];
if (objectp != nullptr && !objectp->isDead())
{
@ -906,12 +912,7 @@ void LLViewerObjectList::updateApparentAngles(LLAgent &agent, F32 max_time)
objectp->setPixelAreaAndAngle(agent); // Also sets the approx. pixel area
objectp->updateTextures(); // Update the image levels of textures for this object.
}
i++;
// Reset the index if we go over the max value
if (i == max_value)
{
i = 0;
}
i++;
num_updates++;
// Escape either if we run out of time, or loop back onto ourselves.

View File

@ -41,7 +41,7 @@ LLViewerStatsRecorder::LLViewerStatsRecorder() :
mLastSnapshotTime(0.0),
mEnableStatsRecording(false),
mEnableStatsLogging(false),
mInterval(0.2),
mInterval(0.2f), // <FS:minerjr> add missing f for float
mMaxDuration(300.f),
mSkipSaveIfZeros(false)
{

View File

@ -768,6 +768,12 @@ void LLViewerTexture::setBoostLevel(S32 level)
mBoostLevel = level;
if(mBoostLevel != LLViewerTexture::BOOST_NONE &&
mBoostLevel != LLViewerTexture::BOOST_SELECTED &&
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
// Added the new boost levels
mBoostLevel != LLViewerTexture::BOOST_GRASS &&
mBoostLevel != LLViewerTexture::BOOST_LIGHT &&
mBoostLevel != LLViewerTexture::BOOST_TREE &&
// </FS:minerjr> [FIRE-35081]
mBoostLevel != LLViewerTexture::BOOST_ICON &&
mBoostLevel != LLViewerTexture::BOOST_THUMBNAIL)
{
@ -779,6 +785,13 @@ void LLViewerTexture::setBoostLevel(S32 level)
if (mBoostLevel >= LLViewerTexture::BOOST_HIGH)
{
mMaxVirtualSize = 2048.f * 2048.f;
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
// Add additional for the important to camera and in frustum
static LLCachedControl<F32> texture_camera_boost(gSavedSettings, "TextureCameraBoost", 7.f);
mMaxVirtualSize = mMaxVirtualSize + (mMaxVirtualSize * 1.0f * texture_camera_boost);
// Apply second boost based upon if the texture is close to the camera (< 16.1 meters * draw distance multiplier)
mMaxVirtualSize = mMaxVirtualSize + (mMaxVirtualSize * 1.0f * texture_camera_boost);
// </FS:minerjr> [FIRE-35081]
}
}
@ -1184,6 +1197,9 @@ void LLViewerFetchedTexture::init(bool firstinit)
mKeptSavedRawImageTime = 0.f;
mLastCallBackActiveTime = 0.f;
mForceCallbackFetch = false;
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
mCloseToCamera = 1.0f; // Store if the camera is close to the camera (0.0f or 1.0f)
// </FS:minerjr> [FIRE-35081]
mFTType = FTT_UNKNOWN;
}
@ -3059,8 +3075,23 @@ 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));
// <FS:minerjr> [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));
// </FS:minerjr> [FIRE-35081]
mDesiredDiscardLevel = llmin(mDesiredDiscardLevel, (S32)mLoadedCallbackDesiredDiscardLevel);
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
// Add scale down here as the textures off screen were not getting scaled down properly
S32 current_discard = getDiscardLevel();
if (mBoostLevel < LLGLTexture::BOOST_AVATAR_BAKED)
{
if (current_discard < mDesiredDiscardLevel && !mForceToSaveRawImage)
{ // should scale down
scaleDown();
}
}
// </FS:minerjr> [FIRE-35081]
}
else if (!mFullWidth || !mFullHeight)
{
@ -3069,6 +3100,8 @@ void LLViewerLODTexture::processTextureStats()
}
else
{
// <FS:minerjr> [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);
@ -3096,10 +3129,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
// </FS:minerjr> [FIRE-35081]
// Can't go higher than the max discard level
mDesiredDiscardLevel = llmin(getMaxDiscardLevel() + 1, (S32)discard_level);
@ -3394,11 +3445,23 @@ void LLViewerMediaTexture::initVirtualSize()
{
return;
}
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
// Add camera importance to the media textures as well
static LLCachedControl<F32> texture_camera_boost(gSavedSettings, "TextureCameraBoost", 7.f);
F32 vsize = 0.0f;
// </FS:minerjr> [FIRE-35081]
findFaces();
for(std::list< LLFace* >::iterator iter = mMediaFaceList.begin(); iter!= mMediaFaceList.end(); ++iter)
{
addTextureStats((*iter)->getVirtualSize());
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
//addTextureStats((*iter)->getVirtualSize());
// Add camera importance to the media textures as well
vsize = (*iter)->getVirtualSize();
vsize = vsize + (vsize * (*iter)->getImportanceToCamera() * 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 * (*iter)->getCloseToCamera() * texture_camera_boost);
addTextureStats(vsize);
// </FS:minerjr> [FIRE-35081]
}
}
@ -3458,6 +3521,10 @@ void LLViewerMediaTexture::addFace(U32 ch, LLFace* facep)
}
// [/SL:KB]
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
// Try to set the boost level to MEDIA to try to force the media to high quality
tex->setBoostLevel(LLViewerTexture::MEDIA);
// </FS:minerjr> [FIRE-35081]
mTextureList.push_back(tex);//increase the reference number by one for tex to avoid deleting it.
return;
}
@ -3699,7 +3766,10 @@ F32 LLViewerMediaTexture::getMaxVirtualSize()
{
addTextureStats(0.f, false);//reset
}
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
static LLCachedControl<F32> texture_camera_boost(gSavedSettings, "TextureCameraBoost", 7.f);
F32 vsize = 0.0f;
// </FS:minerjr> [FIRE-35081]
if(mIsPlaying) //media is playing
{
for (U32 ch = 0; ch < LLRender::NUM_TEXTURE_CHANNELS; ++ch)
@ -3709,8 +3779,16 @@ F32 LLViewerMediaTexture::getMaxVirtualSize()
{
LLFace* facep = mFaceList[ch][i];
if(facep->getDrawable()->isRecentlyVisible())
{
addTextureStats(facep->getVirtualSize());
{
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
//addTextureStats(facep->getVirtualSize());
// Add the importance to camera and close to camera to the media texture
vsize = facep->getVirtualSize();
vsize = vsize + (vsize * facep->getImportanceToCamera() * 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 * facep->getCloseToCamera() * texture_camera_boost);
addTextureStats(vsize);
// </FS:minerjr> [FIRE-35081]
}
}
}
@ -3726,7 +3804,15 @@ F32 LLViewerMediaTexture::getMaxVirtualSize()
LLFace* facep = *iter;
if(facep->getDrawable()->isRecentlyVisible())
{
addTextureStats(facep->getVirtualSize());
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
//addTextureStats(facep->getVirtualSize());
// Add the importance to camera and close to camera to the media texture
vsize = facep->getVirtualSize();
vsize = vsize + (vsize * facep->getImportanceToCamera() * 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 * facep->getCloseToCamera() * texture_camera_boost);
addTextureStats(vsize);
// </FS:minerjr> [FIRE-35081]
}
}
}

View File

@ -437,6 +437,11 @@ public:
void setInFastCacheList(bool in_list) { mInFastCacheList = in_list; }
bool isInFastCacheList() { return mInFastCacheList; }
// <FS:minerjr> [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)
// </FS:minerjr> [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.
// <FS:minerjr> [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
// </FS:minerjr> [FIRE-35081]
public:
static F32 sMaxVirtualSize; //maximum possible value of mMaxVirtualSize

View File

@ -372,23 +372,75 @@ void LLViewerTextureList::shutdown()
mInitialized = false ; //prevent loading textures again.
}
// <FS:minerjr> [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();
}
// </FS:minerjr> [FIRE-35081]
void LLViewerTextureList::dump()
{
LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
LL_INFOS() << "LLViewerTextureList::dump()" << LL_ENDL;
// <FS:minerjr> [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;
}
// </FS:minerjr> [FIRE-35081]
for (image_list_t::iterator it = mImageList.begin(); it != mImageList.end(); ++it)
{
LLViewerFetchedTexture* image = *it;
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
std::string face_counts = "";
std::string volume_counts = "";
for (S32 index = 0; index < LLRender::NUM_TEXTURE_CHANNELS; index++)
{
face_counts += std::to_string(image->getNumFaces(index)) + " ";
}
for (S32 index = 0; index < LLRender::NUM_VOLUME_TEXTURE_CHANNELS; index++)
{
volume_counts += std::to_string(image->getNumVolumes(index)) + " ";
}
// </FS:minerjr> [FIRE-35081]
LL_INFOS() << "priority " << image->getMaxVirtualSize()
<< " boost " << image->getBoostLevel()
<< " size " << image->getWidth() << "x" << image->getHeight()
<< " discard " << image->getDiscardLevel()
<< " desired " << image->getDesiredDiscardLevel()
// <FS:minerjr> [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)
<< " Sculpted " << (image->forSculpt() ? "Y" : "N")
<< " # of Faces " << face_counts
<< " # of Volumes " << volume_counts
// </FS:minerjr> [FIRE-35081]
<< " http://asset.siva.lindenlab.com/" << image->getID() << ".texture"
<< LL_ENDL;
// <FS:minerjr> [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());
// </FS:minerjr> [FIRE-35081]
}
// <FS:minerjr> [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;
}
// </FS:minerjr> [FIRE-35081]
}
void LLViewerTextureList::destroyGL()
@ -930,7 +982,7 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag
// convert bias into a vsize scaler
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
//bias = (F32) llroundf(powf(4, bias - 1.f));
// Pre-divied the bias so you can just use multiiply in the loop
// Pre-divide the bias so you can just use multiply in the loop
bias = (F32) 1.0f / llroundf(powf(4, bias - 1.f));
// Apply new rules to bias discard, there are now 2 bias, off-screen and on-screen.
@ -951,16 +1003,15 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag
S32 on_screen_count = 0;
// Moved all the variables outside of the loop
bool current_on_screen = false;
F32 radius; // Moved outside the loop to save reallocation every loop
F32 cos_angle_to_view_dir; // Moved outside the loop to save reallocation every loop
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
// </FS:minerjr> [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<F32> texture_camera_boost(gSavedSettings, "TextureCameraBoost", 7.f);
static LLCachedControl<F32> texture_camera_boost(gSavedSettings, "TextureCameraBoost", 7.f);
LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
for (U32 i = 0; i < LLRender::NUM_TEXTURE_CHANNELS; ++i)
{
@ -972,7 +1023,7 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag
{
++face_count;
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
// Moved outside the loop to stop createing new memory every loop
// No longer needed as we no longer re-calculate the face's virtual texture size, we use it directly from the face
//F32 radius;
//F32 cos_angle_to_view_dir;
// </FS:minerjr> [FIRE-35081]
@ -981,24 +1032,30 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag
{ // only call calcPixelArea at most once every 10 frames for a given face
// this helps eliminate redundant calls to calcPixelArea for faces that have multiple textures
// assigned to them, such as is the case with GLTF materials or Blinn-Phong materials
face->mInFrustum = face->calcPixelArea(cos_angle_to_view_dir, radius);
//face->calcPixelArea(cos_angle_to_view_dir, radius);
// The face already has a function to calculate the Texture Virtual Size, which already calls the calcPixelArea method
// so just call this instead. This can be called from outside this loop by LLVolume objects
face->getTextureVirtualSize();
face->mLastTextureUpdate = gFrameCount;
}
// Also moved allocation outside the loop
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
//F32 vsize = face->getPixelArea();
//on_screen = face->mInFrustum;
vsize = face->getPixelArea();
// Get the already calculated face's virtual size, instead of re-calculating it
vsize = face->getVirtualSize();
current_on_screen = face->mInFrustum; // Create a new var to store the current on screen status
on_screen_count += current_on_screen; // Count the number of on sceen faces instead of using brach
important_to_camera = face->mImportanceToCamera; // Store so we don't have to do 2 indirects later on
// If the face/texture is animated, then set the boost level to high, so that it will ways be the best quality
animated += S64(face->mTextureMatrix);
animated += S64(face->hasMedia()); // Add has media for both local and parcel media
animated += S64(imagep->hasParcelMedia());
// </FS:minerjr> [FIRE-35081]
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer (It is)
/*
// Scale desired texture resolution higher or lower depending on texture scale
//
// Minimum usage examples: a 1024x1024 texture with aplhabet (texture atlas),
@ -1007,6 +1064,7 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag
//
// Maximum usage examples: huge chunk of terrain repeats texture
// TODO: make this work with the GLTF texture transforms
S32 te_offset = face->getTEOffset(); // offset is -1 if not inited
LLViewerObject* objp = face->getViewerObject();
const LLTextureEntry* te = (te_offset < 0 || te_offset >= objp->getNumTEs()) ? nullptr : objp->getTE(te_offset);
@ -1014,8 +1072,6 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag
min_scale = llclamp(min_scale * min_scale, texture_scale_min(), texture_scale_max());
vsize /= min_scale;
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
/*
// apply bias to offscreen faces all the time, but only to onscreen faces when bias is large
if (!face->mInFrustum || LLViewerTexture::sDesiredDiscardBias > 2.f)
{
@ -1037,9 +1093,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() << face->getViewerObject()->getID() << " TID " << imagep->getID() << " #F " << imagep->getNumFaces(i) << " OS Vsize: " << vsize << " Vsize: " << (vsize * bias) << " CTC: " << face->mCloseToCamera << " Channel " << i << " Face Index " << fi << LL_ENDL;
max_on_screen_vsize = llmax(max_on_screen_vsize, vsize);
max_vsize = llmax(max_vsize, vsize * bias);
// </FS:minerjr> [FIRE-35081]
@ -1050,7 +1111,8 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag
// <FS:minerjr> [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
@ -1073,11 +1135,9 @@ void LLViewerTextureList::updateImageDecodePriority(LLViewerFetchedTexture* imag
}
}
imagep->addTextureStats(max_vsize);
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
// New logic block for the bias system
// All textures begin at the max_vsize with bias applied.
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
//imagep->addTextureStats(max_vsize);
// New logic block for the bias system
// Then depending on the type of texture, the higher resolution on_screen_max_vsize is applied.
// On Screen (Without Bias applied:
// LOD/Fetch Texture: Discard Levels 0, 1
@ -1091,11 +1151,16 @@ 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);
}
// </FS:minerjr> [FIRE-35081]
}
@ -1197,7 +1262,11 @@ F32 LLViewerTextureList::updateImagesCreateTextures(F32 max_time)
mCreateTextureList.pop();
if (imagep->hasGLTexture() && imagep->getDiscardLevel() < imagep->getDesiredDiscardLevel() &&
(imagep->getDesiredDiscardLevel() <= MAX_DISCARD_LEVEL))
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
//(imagep->getDesiredDiscardLevel() <= MAX_DISCARD_LEVEL))
// Add additional restrictions on scaling down (only BOOST_NONE LOD Textures (Also skip media)
(imagep->getDesiredDiscardLevel() <= MAX_DISCARD_LEVEL) && imagep->getBoostLevel() == LLViewerTexture::BOOST_NONE && imagep->getType() == LLViewerTexture::LOD_TEXTURE && !imagep->hasParcelMedia() && !imagep->isViewerMediaTexture())
// </FS:minerjr> [FIRE-35081]
{
// NOTE: this may happen if the desired discard reduces while a decode is in progress and does not
// necessarily indicate a problem, but if log occurrences excede that of dsiplay_stats: FPS,

View File

@ -111,6 +111,9 @@ public:
static void receiveImageHeader(LLMessageSystem *msg, void **user_data);
static void receiveImagePacket(LLMessageSystem *msg, void **user_data);
// </FS:Ansariel>
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
static void dumpTexturelist(); // Added code to handle dumping texture information
// </FS:minerjr> [FIRE-35081]
public:
LLViewerTextureList();

View File

@ -2975,12 +2975,19 @@ LLViewerFetchedTexture *LLVOAvatar::getBakedTextureImage(const U8 te, const LLUU
LL_DEBUGS("Avatar") << avString() << "get old-bake image from host " << uuid << LL_ENDL;
LLHost host = getObjectHost();
result = LLViewerTextureManager::getFetchedTexture(
uuid, FTT_HOST_BAKE, true, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, host);
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
//uuid, FTT_HOST_BAKE, true, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, host);
uuid, FTT_HOST_BAKE, true, LLGLTexture::BOOST_AVATAR_BAKED, LLViewerTexture::LOD_TEXTURE, 0, 0, host);
// <FS:minerjr> [FIRE-35081]
// </FS:Ansariel> [Legacy Bake]
}
LL_DEBUGS("Avatar") << avString() << "get server-bake image from URL " << url << LL_ENDL;
result = LLViewerTextureManager::getFetchedTextureFromUrl(
url, FTT_SERVER_BAKE, true, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, uuid);
// <FS:minerjr>
//url, FTT_SERVER_BAKE, true, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, uuid);
// Change the texture from LOD to AVATAR_BAKED.
url, FTT_SERVER_BAKE, true, LLGLTexture::BOOST_AVATAR_BAKED, LLViewerTexture::LOD_TEXTURE, 0, 0, uuid);
// </FS:minerjr> [FIRE-35081]
if (result->isMissingAsset())
{
result->setIsMissingAsset(false);
@ -10988,7 +10995,11 @@ void LLVOAvatar::applyParsedAppearanceMessage(LLAppearanceMessageContents& conte
//LL_DEBUGS("Avatar") << avString() << " baked_index " << (S32) baked_index << " using mLastTextureID " << mBakedTextureDatas[baked_index].mLastTextureID << LL_ENDL;
LL_DEBUGS("Avatar") << avString() << "sb " << (S32) isUsingServerBakes() << " baked_index " << (S32) baked_index << " using mLastTextureID " << mBakedTextureDatas[baked_index].mLastTextureID << LL_ENDL;
setTEImage(mBakedTextureDatas[baked_index].mTextureIndex,
LLViewerTextureManager::getFetchedTexture(mBakedTextureDatas[baked_index].mLastTextureID, FTT_DEFAULT, true, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE));
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
//LLViewerTextureManager::getFetchedTexture(mBakedTextureDatas[baked_index].mLastTextureID, FTT_DEFAULT, true, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE));
//Texture will use baked textures, so it should also use that for the boost.
LLViewerTextureManager::getFetchedTexture(mBakedTextureDatas[baked_index].mLastTextureID, FTT_DEFAULT, true, LLGLTexture::BOOST_AVATAR_BAKED, LLViewerTexture::LOD_TEXTURE));
// <FS:minerjr> [FIRE-35081]
}
else
{

View File

@ -99,7 +99,11 @@ void LLVOGrass::updateSpecies()
SpeciesMap::const_iterator it = sSpeciesTable.begin();
mSpecies = (*it).first;
}
setTEImage(0, LLViewerTextureManager::getFetchedTexture(sSpeciesTable[mSpecies]->mTextureID, FTT_DEFAULT, true, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE));
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
//setTEImage(0, LLViewerTextureManager::getFetchedTexture(sSpeciesTable[mSpecies]->mTextureID, FTT_DEFAULT, true, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE));
// Added new boost Grass as it forces a fixed size on updates
setTEImage(0, LLViewerTextureManager::getFetchedTexture(sSpeciesTable[mSpecies]->mTextureID, FTT_DEFAULT, true, LLGLTexture::BOOST_GRASS, LLViewerTexture::LOD_TEXTURE));
// </FS:minerjr> [FIRE-35081]
}

View File

@ -85,7 +85,7 @@ namespace {
const F32 VOLUME_SCALE_WEBRTC = 0.01f;
const F32 LEVEL_SCALE_WEBRTC = 0.008f;
const F32 SPEAKING_AUDIO_LEVEL = 0.30;
const F32 SPEAKING_AUDIO_LEVEL = 0.30f; // <FS:minerjr> add missing f for float
const uint32_t PEER_GAIN_CONVERSION_FACTOR = 220;

View File

@ -330,7 +330,11 @@ U32 LLVOTree::processUpdateMessage(LLMessageSystem *mesgsys,
// Load Species-Specific data
//
static const S32 MAX_TREE_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL = 32 ; //frames.
mTreeImagep = LLViewerTextureManager::getFetchedTexture(sSpeciesTable[mSpecies]->mTextureID, FTT_DEFAULT, true, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
//mTreeImagep = LLViewerTextureManager::getFetchedTexture(sSpeciesTable[mSpecies]->mTextureID, FTT_DEFAULT, true, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
// Set boost level for Tree as it overrides the normal texture sizes
mTreeImagep = LLViewerTextureManager::getFetchedTexture(sSpeciesTable[mSpecies]->mTextureID, FTT_DEFAULT, true, LLGLTexture::BOOST_TREE, LLViewerTexture::LOD_TEXTURE);
// </FS:minerjr> [FIRE-35081]
mTreeImagep->setMaxVirtualSizeResetInterval(MAX_TREE_TEXTURE_VIRTURE_SIZE_RESET_INTERVAL); //allow to wait for at most 16 frames to reset virtual size.
mBranchLength = sSpeciesTable[mSpecies]->mBranchLength;

View File

@ -742,7 +742,10 @@ void LLVOVolume::animateTextures()
{
LLFace* facep = mDrawable->getFace(i);
if (!facep) continue;
if(facep->getVirtualSize() <= MIN_TEX_ANIM_SIZE && facep->mTextureMatrix) continue;
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
// Removed check for turning off animations
//if(facep->getVirtualSize() <= MIN_TEX_ANIM_SIZE && facep->mTextureMatrix) continue;
// </FS:minerjr> [FIRE-35081]
const LLTextureEntry* te = facep->getTextureEntry();
@ -767,7 +770,10 @@ void LLVOVolume::animateTextures()
if (!facep->mTextureMatrix)
{
facep->mTextureMatrix = new LLMatrix4();
if (facep->getVirtualSize() > MIN_TEX_ANIM_SIZE)
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
// Removed check for turning off animations
//if (facep->getVirtualSize() > MIN_TEX_ANIM_SIZE)
// </FS:minerjr> [FIRE-35081]
{
// Fix the one edge case missed in
// LLVOVolume::updateTextureVirtualSize when the
@ -920,6 +926,10 @@ void LLVOVolume::updateTextureVirtualSize(bool forced)
F32 min_vsize=999999999.f, max_vsize=0.f;
LLViewerCamera* camera = LLViewerCamera::getInstance();
std::stringstream debug_text;
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
// Use this flag to indicate that there was a legit change to 0.0 for the mPixelArea (All faces off screen)
bool changed = false;
// </FS:minerjr> [FIRE-35081]
for (S32 i = 0; i < num_faces; i++)
{
LLFace* face = mDrawable->getFace(i);
@ -968,6 +978,13 @@ void LLVOVolume::updateTextureVirtualSize(bool forced)
mPixelArea = llmax(mPixelArea, face->getPixelArea());
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
// If the new area is changed from the old area, then accept it.
if (mPixelArea != old_area)
{
changed = true;
}
// </FS:minerjr> [FIRE-35081]
// if the face has gotten small enough to turn off texture animation and texture
// animation is running, rebuild the render batch for this face to turn off
// texture animation
@ -1056,7 +1073,10 @@ void LLVOVolume::updateTextureVirtualSize(bool forced)
{
LLLightImageParams* params = (LLLightImageParams*) getParameterEntry(LLNetworkData::PARAMS_LIGHT_IMAGE);
LLUUID id = params->getLightTexture();
mLightTexture = LLViewerTextureManager::getFetchedTexture(id, FTT_DEFAULT, true, LLGLTexture::BOOST_NONE);
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
// Light textures should be treaded not the same as normal LOD textures
mLightTexture = LLViewerTextureManager::getFetchedTexture(id, FTT_DEFAULT, true, LLGLTexture::BOOST_LIGHT);
// </FS:minerjr> [FIRE-35081]
if (mLightTexture.notNull())
{
F32 rad = getLightRadius();
@ -1106,7 +1126,11 @@ void LLVOVolume::updateTextureVirtualSize(bool forced)
setDebugText(output);
}
if (mPixelArea == 0)
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
//if (mPixelArea == 0)
// If there is a legit change to 0.0, don't dismiss it.
if (mPixelArea == 0 && !changed)
// </FS:minerjr> [FIRE-35081]
{ //flexi phasing issues make this happen
mPixelArea = old_area;
}
@ -5438,7 +5462,10 @@ bool can_batch_texture(LLFace* facep)
return false;
}
if (facep->isState(LLFace::TEXTURE_ANIM) && facep->getVirtualSize() > MIN_TEX_ANIM_SIZE)
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
// Removed check for turning off animations
if (facep->isState(LLFace::TEXTURE_ANIM))//&& facep->getVirtualSize() > MIN_TEX_ANIM_SIZE)
// </FS:minerjr> [FIRE-35081]
{ //texture animation breaks batches
return false;
}
@ -5585,7 +5612,10 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
}
const LLMatrix4* tex_mat = NULL;
if (facep->isState(LLFace::TEXTURE_ANIM) && facep->getVirtualSize() > MIN_TEX_ANIM_SIZE)
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
// Removed check for turning off animations
if (facep->isState(LLFace::TEXTURE_ANIM)) //&& facep->getVirtualSize() > MIN_TEX_ANIM_SIZE)
// </FS:minerjr> [FIRE-35081]
{
tex_mat = facep->mTextureMatrix;
}

View File

@ -5780,6 +5780,20 @@
<menu_item_check.on_click
function="Advanced.ToggleViewAdminOptions" />
</menu_item_check>
<menu_item_separator/>
<menu
create_jump_keys="true"
label="Dump"
name="Dump"
tear_off="true">
<menu_item_call
label="LLViewerTexturelist"
name="LLViewerTexturelist">
<menu_item_call.on_click
function="Develop.TextureList.Dump" />
</menu_item_call>
</menu>
</menu>
<menu
create_jump_keys="true"

View File

@ -1,146 +1,148 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater name="floater_poser" title="Poseur d'avatars et d'animesh">
<string name="header_mHead">Corps</string>
<string name="header_mFaceForeheadLeft">Front/sourcils</string>
<string name="header_mEyeLeft">Yeux/Paupières</string>
<string name="header_mFaceCheekUpperLeft">Joues/Lèvres</string>
<string name="header_mHandThumb1Left">Main gauche</string>
<string name="header_mCollarLeft">Bras gauche</string>
<string name="header_mHandThumb1Right">Main droite</string>
<string name="header_mCollarRight">Bras droit</string>
<string name="header_mHipLeft">Jambes</string>
<string name="header_mTail1">Queue</string>
<string name="header_mHindLimbsRoot">Membres postérieurs</string>
<string name="header_mWingsRoot">Ailes</string>
<string name="header_mFaceEar1Left">Oreilles/nez</string>
<string name="title_mPelvis">Tout l'avatar</string>
<string name="title_mTorso">Torse</string>
<string name="title_mChest">Poitrine</string>
<string name="title_mNeck">Cou</string>
<string name="title_mHead">Tête</string>
<string name="title_mEyeRight">Oeil droit</string>
<string name="title_mEyeLeft">Oeil gauche</string>
<string name="title_mFaceForeheadLeft">Front, côté gauche</string>
<string name="title_mFaceForeheadRight">Front, côté droit</string>
<string name="title_mFaceEyebrowOuterLeft">Sourcil, extérieur gauche</string>
<string name="title_mFaceEyebrowCenterLeft">Sourcil, milieu gauche</string>
<string name="title_mFaceEyebrowInnerLeft">Sourcil, intérieur gauche</string>
<string name="title_mFaceEyebrowOuterRight">Sourcil, extérieur droit</string>
<string name="title_mFaceEyebrowCenterRight">Sourcil, milieu droit</string>
<string name="title_mFaceEyebrowInnerRight">Sourcil, intérieur droit</string>
<string name="title_mFaceEyeLidUpperLeft">Paupière, en haut à gauche</string>
<string name="title_mFaceEyeLidLowerLeft">Paupière, en bas à gauche</string>
<string name="title_mFaceEyeLidUpperRight">Paupière, en haut à droite</string>
<string name="title_mFaceEyeLidLowerRight">Paupière en bas à droite</string>
<string name="title_mFaceEar1Left">Oreille en haut à gauche</string>
<string name="title_mFaceEar2Left">Oreille en bas à gauche</string>
<string name="title_mFaceEar1Right">Oreille en haut à droite</string>
<string name="title_mFaceEar2Right">Oreille en bas à droite</string>
<string name="title_mFaceNoseLeft">Nez à gauche</string>
<string name="title_mFaceNoseCenter">Nez au milieu</string>
<string name="title_mFaceNoseRight">Nez à droite</string>
<string name="title_mFaceCheekLowerLeft">Bas de la joue gauche</string>
<string name="title_mFaceCheekUpperLeft">Haut de la joue gauche</string>
<string name="title_mFaceCheekLowerRight">Bas de la joue droite</string>
<string name="title_mFaceCheekUpperRight">Haut de la joue droite</string>
<string name="title_mFaceJaw">Mâchoire</string>
<string name="title_mFaceTeethLower">Dents du bas</string>
<string name="title_mFaceLipLowerLeft">Lèvre du bas à gauche</string>
<string name="title_mFaceLipLowerRight">Lèvre du bas à droite</string>
<string name="title_mFaceLipLowerCenter">Lèvre du bas au milieu</string>
<string name="title_mFaceTongueBase">Base de la langue</string>
<string name="title_mFaceTongueTip">Extrémité de la langue</string>
<string name="title_mFaceJawShaper">Forme de la mâchoire</string>
<string name="title_mFaceForeheadCenter">Milieu du front</string>
<string name="title_mFaceNoseBase">Base du nez</string>
<string name="title_mFaceTeethUpper">Dents du haut</string>
<string name="title_mFaceLipUpperLeft">Lèvre supérieure à gauche</string>
<string name="title_mFaceLipUpperRight">Lèvre supérieure à droite</string>
<string name="title_mFaceLipCornerLeft">Coin gauche de la bouche</string>
<string name="title_mFaceLipCornerRight">Coin droit de la bouche</string>
<string name="title_mFaceLipUpperCenter">Milieu de la lèvre supérieure</string>
<string name="title_mFaceEyecornerInnerLeft">Coin interne gauche de l'œil</string>
<string name="title_mFaceEyecornerInnerRight">Coin interne droit de l'œil</string>
<string name="title_mFaceNoseBridge">Arête du nez</string>
<string name="title_mCollarLeft">Col</string>
<string name="title_mShoulderLeft">Bras entier</string>
<string name="title_mElbowLeft">Avant-bras</string>
<string name="title_mWristLeft">Poignet</string>
<string name="title_mHandMiddle1Left">Base du majeur</string>
<string name="title_mHandMiddle2Left">Milieu du majeur</string>
<string name="title_mHandMiddle3Left">Extrémité du majeur</string>
<string name="title_mHandIndex1Left">Base de l'index</string>
<string name="title_mHandIndex2Left">Milieu de l'index</string>
<string name="title_mHandIndex3Left">Extrémité de l'index</string>
<string name="title_mHandRing1Left">Base de l'annulaire</string>
<string name="title_mHandRing2Left">Milieu de l'annulaire</string>
<string name="title_mHandRing3Left">Extrémité de l'annulaire</string>
<string name="title_mHandPinky1Left">Base de l'auriculaire</string>
<string name="title_mHandPinky2Left">Milieu de l'auriculaire</string>
<string name="title_mHandPinky3Left">Extrémité de l'auriculaire</string>
<string name="title_mHandThumb1Left">Base du pouce</string>
<string name="title_mHandThumb2Left">Milieu du pouce</string>
<string name="title_mHandThumb3Left">Extrémité du pouce</string>
<string name="title_mCollarRight">Col</string>
<string name="title_mShoulderRight">Bras entier</string>
<string name="title_mElbowRight">Avant-bras</string>
<string name="title_mWristRight">Poignet</string>
<string name="title_mHandMiddle1Right">Base du majeur</string>
<string name="title_mHandMiddle2Right">Milieu du majeur</string>
<string name="title_mHandMiddle3Right">Extrémité du majeur</string>
<string name="title_mHandIndex1Right">Base de l'index</string>
<string name="title_mHandIndex2Right">Milieu de l'index</string>
<string name="title_mHandIndex3Right">Extrémité de l'index</string>
<string name="title_mHandRing1Right">Base de l'annulaire</string>
<string name="title_mHandRing2Right">Milieu de l'annulaire</string>
<string name="title_mHandRing3Right">Extrémité de l'annulaire</string>
<string name="title_mHandPinky1Right">Base de l'auriculaire</string>
<string name="title_mHandPinky2Right">Milieu de l'auriculaire</string>
<string name="title_mHandPinky3Right">Extrémité de l'auriculaire</string>
<string name="title_mHandThumb1Right">Base du pouce</string>
<string name="title_mHandThumb2Right">Milieu du pouce</string>
<string name="title_mHandThumb3Right">Extrémité du pouce</string>
<string name="title_mWingsRoot">Articulations</string>
<string name="title_mWing1Left">Gauche 1</string>
<string name="title_mWing2Left">Gauche 2</string>
<string name="title_mWing3Left">Gauche 3</string>
<string name="title_mWing4Left">Gauche 4</string>
<string name="title_mWing4FanLeft">Pale gauche</string>
<string name="title_mWing1Right">Droite 1</string>
<string name="title_mWing2Right">Droite 2</string>
<string name="title_mWing3Right">Droite 3</string>
<string name="title_mWing4Right">Droite 4</string>
<string name="title_mWing4FanRight">Pale droit</string>
<string name="title_mHipRight">Jambe droite</string>
<string name="title_mKneeRight">Genou droit</string>
<string name="title_mAnkleRight">Cheville droite</string>
<string name="title_mFootRight">Pied droit</string>
<string name="title_mToeRight">Orteil droit</string>
<string name="title_mHipLeft">Jambe gauche</string>
<string name="title_mKneeLeft">Genou gauche</string>
<string name="title_mAnkleLeft">Cheville gauche</string>
<string name="title_mFootLeft">Pied gauche</string>
<string name="title_mToeLeft">Orteil gauche</string>
<string name="title_mTail1">Base de la queue</string>
<string name="title_mTail2">Queue 2</string>
<string name="title_mTail3">Queue 3</string>
<string name="title_mTail4">Queue 4</string>
<string name="title_mTail5">Queue 5</string>
<string name="title_mTail6">Extrémité de la queue</string>
<string name="title_mGroin">Entrejambe</string>
<string name="title_mHindLimbsRoot">Membres postérieurs</string>
<string name="title_mHindLimb1Left">Pied gauche</string>
<string name="title_mHindLimb2Left">Gauche 2</string>
<string name="title_mHindLimb3Left">Gauche 3</string>
<string name="title_mHindLimb4Left">Gauche 4</string>
<string name="title_mHindLimb1Right">Pied droit</string>
<string name="title_mHindLimb2Right">Droite 2</string>
<string name="title_mHindLimb3Right">Droite 3</string>
<string name="title_mHindLimb4Right">Droite 4</string>
<string name="title_BUTT">Fesses</string>
<string name="title_BELLY">Ventre</string>
<string name="title_LEFT_PEC">Sein gauche</string>
<string name="title_RIGHT_PEC">Sein droit</string>
<string name="header_mHead">Corps</string>
<string name="header_mFaceForeheadLeft">Front/sourcils</string>
<string name="header_mEyeLeft">Yeux/Paupières</string>
<string name="header_mFaceCheekUpperLeft">Joues/Lèvres</string>
<string name="header_mHandThumb1Left">Main gauche</string>
<string name="header_mCollarLeft">Bras gauche</string>
<string name="header_mHandThumb1Right">Main droite</string>
<string name="header_mCollarRight">Bras droit</string>
<string name="header_mHipLeft">Jambes</string>
<string name="header_mTail1">Queue</string>
<string name="header_mHindLimbsRoot">Membres postérieurs</string>
<string name="header_mWingsRoot">Ailes</string>
<string name="header_mFaceEar1Left">Oreilles/nez</string>
<string name="title_mPelvis">Tout l'avatar</string>
<string name="title_mTorso">Torse</string>
<string name="title_mChest">Poitrine</string>
<string name="title_mNeck">Cou</string>
<string name="title_mHead">Tête</string>
<string name="title_mEyeRight">Oeil droit</string>
<string name="title_mEyeLeft">Oeil gauche</string>
<string name="title_mFaceForeheadLeft">Front, côté gauche</string>
<string name="title_mFaceForeheadRight">Front, côté droit</string>
<string name="title_mFaceEyebrowOuterLeft">Sourcil, extérieur gauche</string>
<string name="title_mFaceEyebrowCenterLeft">Sourcil, milieu gauche</string>
<string name="title_mFaceEyebrowInnerLeft">Sourcil, intérieur gauche</string>
<string name="title_mFaceEyebrowOuterRight">Sourcil, extérieur droit</string>
<string name="title_mFaceEyebrowCenterRight">Sourcil, milieu droit</string>
<string name="title_mFaceEyebrowInnerRight">Sourcil, intérieur droit</string>
<string name="title_mFaceEyeLidUpperLeft">Paupière, en haut à gauche</string>
<string name="title_mFaceEyeLidLowerLeft">Paupière, en bas à gauche</string>
<string name="title_mFaceEyeLidUpperRight">Paupière, en haut à droite</string>
<string name="title_mFaceEyeLidLowerRight">Paupière en bas à droite</string>
<string name="title_mFaceEar1Left">Oreille en haut à gauche</string>
<string name="title_mFaceEar2Left">Oreille en bas à gauche</string>
<string name="title_mFaceEar1Right">Oreille en haut à droite</string>
<string name="title_mFaceEar2Right">Oreille en bas à droite</string>
<string name="title_mFaceNoseLeft">Nez à gauche</string>
<string name="title_mFaceNoseCenter">Nez au milieu</string>
<string name="title_mFaceNoseRight">Nez à droite</string>
<string name="title_mFaceCheekLowerLeft">Bas de la joue gauche</string>
<string name="title_mFaceCheekUpperLeft">Haut de la joue gauche</string>
<string name="title_mFaceCheekLowerRight">Bas de la joue droite</string>
<string name="title_mFaceCheekUpperRight">Haut de la joue droite</string>
<string name="title_mFaceJaw">Mâchoire</string>
<string name="title_mFaceTeethLower">Dents du bas</string>
<string name="title_mFaceLipLowerLeft">Lèvre du bas à gauche</string>
<string name="title_mFaceLipLowerRight">Lèvre du bas à droite</string>
<string name="title_mFaceLipLowerCenter">Lèvre du bas au milieu</string>
<string name="title_mFaceTongueBase">Base de la langue</string>
<string name="title_mFaceTongueTip">Extrémité de la langue</string>
<string name="title_mFaceJawShaper">Forme de la mâchoire</string>
<string name="title_mFaceForeheadCenter">Milieu du front</string>
<string name="title_mFaceNoseBase">Base du nez</string>
<string name="title_mFaceTeethUpper">Dents du haut</string>
<string name="title_mFaceLipUpperLeft">Lèvre supérieure à gauche</string>
<string name="title_mFaceLipUpperRight">Lèvre supérieure à droite</string>
<string name="title_mFaceLipCornerLeft">Coin gauche de la bouche</string>
<string name="title_mFaceLipCornerRight">Coin droit de la bouche</string>
<string name="title_mFaceLipUpperCenter">Milieu de la lèvre supérieure</string>
<string name="title_mFaceEyecornerInnerLeft">Coin interne gauche de l'œil</string>
<string name="title_mFaceEyecornerInnerRight">Coin interne droit de l'œil</string>
<string name="title_mFaceNoseBridge">Arête du nez</string>
<string name="title_mCollarLeft">Col</string>
<string name="title_mShoulderLeft">Bras entier</string>
<string name="title_mElbowLeft">Avant-bras</string>
<string name="title_mWristLeft">Poignet</string>
<string name="title_mHandMiddle1Left">Base du majeur</string>
<string name="title_mHandMiddle2Left">Milieu du majeur</string>
<string name="title_mHandMiddle3Left">Extrémité du majeur</string>
<string name="title_mHandIndex1Left">Base de l'index</string>
<string name="title_mHandIndex2Left">Milieu de l'index</string>
<string name="title_mHandIndex3Left">Extrémité de l'index</string>
<string name="title_mHandRing1Left">Base de l'annulaire</string>
<string name="title_mHandRing2Left">Milieu de l'annulaire</string>
<string name="title_mHandRing3Left">Extrémité de l'annulaire</string>
<string name="title_mHandPinky1Left">Base de l'auriculaire</string>
<string name="title_mHandPinky2Left">Milieu de l'auriculaire</string>
<string name="title_mHandPinky3Left">Extrémité de l'auriculaire</string>
<string name="title_mHandThumb1Left">Base du pouce</string>
<string name="title_mHandThumb2Left">Milieu du pouce</string>
<string name="title_mHandThumb3Left">Extrémité du pouce</string>
<string name="title_mCollarRight">Col</string>
<string name="title_mShoulderRight">Bras entier</string>
<string name="title_mElbowRight">Avant-bras</string>
<string name="title_mWristRight">Poignet</string>
<string name="title_mHandMiddle1Right">Base du majeur</string>
<string name="title_mHandMiddle2Right">Milieu du majeur</string>
<string name="title_mHandMiddle3Right">Extrémité du majeur</string>
<string name="title_mHandIndex1Right">Base de l'index</string>
<string name="title_mHandIndex2Right">Milieu de l'index</string>
<string name="title_mHandIndex3Right">Extrémité de l'index</string>
<string name="title_mHandRing1Right">Base de l'annulaire</string>
<string name="title_mHandRing2Right">Milieu de l'annulaire</string>
<string name="title_mHandRing3Right">Extrémité de l'annulaire</string>
<string name="title_mHandPinky1Right">Base de l'auriculaire</string>
<string name="title_mHandPinky2Right">Milieu de l'auriculaire</string>
<string name="title_mHandPinky3Right">Extrémité de l'auriculaire</string>
<string name="title_mHandThumb1Right">Base du pouce</string>
<string name="title_mHandThumb2Right">Milieu du pouce</string>
<string name="title_mHandThumb3Right">Extrémité du pouce</string>
<string name="title_mWingsRoot">Articulations</string>
<string name="title_mWing1Left">Gauche 1</string>
<string name="title_mWing2Left">Gauche 2</string>
<string name="title_mWing3Left">Gauche 3</string>
<string name="title_mWing4Left">Gauche 4</string>
<string name="title_mWing4FanLeft">Pale gauche</string>
<string name="title_mWing1Right">Droite 1</string>
<string name="title_mWing2Right">Droite 2</string>
<string name="title_mWing3Right">Droite 3</string>
<string name="title_mWing4Right">Droite 4</string>
<string name="title_mWing4FanRight">Pale droit</string>
<string name="title_mHipRight">Jambe droite</string>
<string name="title_mKneeRight">Genou droit</string>
<string name="title_mAnkleRight">Cheville droite</string>
<string name="title_mFootRight">Pied droit</string>
<string name="title_mToeRight">Orteil droit</string>
<string name="title_mHipLeft">Jambe gauche</string>
<string name="title_mKneeLeft">Genou gauche</string>
<string name="title_mAnkleLeft">Cheville gauche</string>
<string name="title_mFootLeft">Pied gauche</string>
<string name="title_mToeLeft">Orteil gauche</string>
<string name="title_mTail1">Base de la queue</string>
<string name="title_mTail2">Queue 2</string>
<string name="title_mTail3">Queue 3</string>
<string name="title_mTail4">Queue 4</string>
<string name="title_mTail5">Queue 5</string>
<string name="title_mTail6">Extrémité de la queue</string>
<string name="title_mGroin">Entrejambe</string>
<string name="title_mHindLimbsRoot">Membres postérieurs</string>
<string name="title_mHindLimb1Left">Pied gauche</string>
<string name="title_mHindLimb2Left">Gauche 2</string>
<string name="title_mHindLimb3Left">Gauche 3</string>
<string name="title_mHindLimb4Left">Gauche 4</string>
<string name="title_mHindLimb1Right">Pied droit</string>
<string name="title_mHindLimb2Right">Droite 2</string>
<string name="title_mHindLimb3Right">Droite 3</string>
<string name="title_mHindLimb4Right">Droite 4</string>
<string name="title_BUTT">Fesses</string>
<string name="title_BELLY">Ventre</string>
<string name="title_LEFT_PEC">Sein gauche</string>
<string name="title_RIGHT_PEC">Sein droit</string>
<string name="LoadPoseLabel">Charger pose</string>
<string name="LoadDiffLabel">Charger diff</string>
<layout_stack name="poser_stack">
<layout_panel name="regular_controls_layout">
<panel name="joints_parent_panel">

View File

@ -624,6 +624,7 @@
<menu_item_call label="Demander le statut Admin" name="Request Admin Options"/>
<menu_item_call label="Quitter le statut Admin" name="Leave Admin Options"/>
<menu_item_check label="Afficher le menu Admin" name="View Admin Options"/>
<menu label="Vidage" name="Dump"/>
</menu>
<menu label="Admin" name="Admin">
<menu label="Objet" name="AdminObject">

View File

@ -227,7 +227,7 @@
Góra/Dół:
</text>
<text name="limb_yaw_label">
Lewo/Prawo:
Lwo/Prw:
</text>
<text name="limb_roll_label">
Zawijanie:

View File

@ -668,6 +668,7 @@
<menu_item_call label="Zażądaj statusu administratora" name="Request Admin Options"/>
<menu_item_call label="Porzuć status administratora" name="Leave Admin Options"/>
<menu_item_check label="Pokaż menu administratora" name="View Admin Options"/>
<menu label="Zrzuć" name="Dump" />
</menu>
<menu label="Administrator" name="Admin">
<menu label="Obiekt" name="AdminObject">

View File

@ -13,6 +13,7 @@
<string name="header_mTail1">Хвост</string>
<string name="header_mHindLimbsRoot">Задние конечности</string>
<string name="header_mWingsRoot">Крылья</string>
<string name="header_mFaceEar1Left">Уши/Нос</string>
<string name="title_mPelvis">Весь аватар</string>
<string name="title_mTorso">Торс</string>
@ -206,28 +207,45 @@
<panel title="Настр." name="settings_panel">
<text name="trackpad_sensitivity_label">Чувствительность трекпада:</text>
<slider name="trackpad_sensitivity_slider" tool_tip="Регулирует чувствительность трекбола"/>
<check_box name="natural_direction_checkbox" label="Используйте естественное выравнивание" tool_tip="Скелет имеет неестественные вращения суставов по умолчанию. Это усложняет позирование. Если отмечено, суставы будут вращаться более естественно." />
<check_box name="stop_posing_on_close_checkbox" label="Стоп позы по закрытию" tool_tip="Не прерывать позу может быть полезно, если вы много работаете и не хотите случайно потерять ее."/>
<check_box name="reset_base_rotation_on_edit_checkbox" label="Сброс базовый поворот" tool_tip="При первом редактировании поворота обнулите его значение. Это означает, что в вашей работе можно сохранить позу (а не разницу, см. раздел Загрузка/сохранение). Рядом с каждым суставом, экспорт которого вы обнулили, появляется зеленая галочка."/>
<check_box name="also_save_bvh_checkbox" label="Запись BVH при сохранении**" tool_tip="Когда вы сохраняете свою позу, также запишется файл BVH, который можно загрузить через 'Build > Upload > Animation', чтобы позировать себя или других в мире. Это требует, чтобы суставы сбросили свою 'базу' на ноль, потому что BVH требует оригинальной работы."/>
</panel>
</tab_container>
<button name="toggleVisualManipulators" tool_tip="Включать и выключать визуальные манипуляторы"/>
</panel>
<panel name="trackball_panel">
<text name="rotation_label">Вращение:</text>
<fs_virtual_trackpad name="limb_rotation" tool_tip="Измените поворот выбранной в данный момент части(ей) тела. Удерживайте нажатой клавишу Ctrl для замедления перемещения. Поверните колесо, чтобы отрегулировать 3-ю ось. Используйте Shift или Alt, чтобы изменить направление вращения."/>
<panel name="joint_manipulation_panel">
<tab_container name="modifier_tabs">
<panel label="Вращать" name="trackball_panel">
<fs_virtual_trackpad name="limb_rotation"
tool_tip="Измените вращение выбранной части тела. Удерживайте Ctrl, чтобы двигать медленно. Вращайте колесо, чтобы настроить 3-ю ось. Используйте Shift или Alt, чтобы изменить направление вращения"/>
<text name="limb_pitch_label">Вверх/Вниз:</text>
<text name="limb_yaw_label">Лево/Право:</text>
<text name="limb_roll_label">Крен:</text>
</panel>
<panel title="Сдвиг / Размер" name="position_panel">
<text name="pos_x_label">Позиция X:</text>
<text name="pos_y_label">Позиция Y:</text>
<text name="pos_z_label">Позиция Z:</text>
<text name="scale_x_label">Размер X:</text>
<text name="scale_y_label">Размер Y:</text>
<text name="scale_z_label">Размер Z:</text>
</panel>
</tab_container>
<panel name="trackball_button_panel">
<button name="undo_change" tool_tip="Отмените последнее изменение поворота"/>
<button name="button_redo_change" tool_tip="Повторить последнее отмененное изменение"/>
<button name="poser_joint_reset" tool_tip="Двойной клик чтобы восстановить все выбранные части тела на тот момент, когда вы впервые начали изменения"/>
<button name="delta_mode_toggle" tool_tip="При изменении нескольких суставов каждый из них изменяется на одинаковую величину, а не все они получают одинаковое вращение."/>
<button label="Зерк." name="button_toggleMirrorRotation" tool_tip="Изменять положение противоположного сустава как в зеркале."/>
<button label="Симм." name="button_toggleSympatheticRotation" tool_tip="Изменять положение противоположного сустав таким же образом."/>
<button label="Зерк." name="button_toggleMirrorRotation" tool_tip="Изменять положение противоположного сустава зеркально."/>
<button label="Копия" name="button_toggleSympatheticRotation" tool_tip="Скопировать изменения в противоположный сустав."/>
<button label="Копия Л&gt;П" name="button_symmetrize_left_to_right" tool_tip="Дважды щелкните, чтобы скопировать изменения из левой стороны в правую."/>
<button label="Копия П&gt;Л" name="button_symmetrize_right_to_left" tool_tip="Дважды щелкните, чтобы скопировать изменения с правой стороны на левую."/>
</panel>
<text name="limb_pitch_label">Вверх/Вниз:</text>
<text name="limb_yaw_label">Влево/Вправо:</text>
<text name="limb_roll_label">Крен:</text>
</panel>
<panel name="poses_loadSave">
<scroll_list name="poses_scroll" tool_tip="Загрузите позу для того, кого вы анимируете.">
<scroll_list name="poses_scroll" tool_tip="Загрузить позу для того, кого вы анимируете.">
<scroll_list.columns label="Имя Позы" name="name"/>
</scroll_list>
<line_editor label="Введите название для сохранения..." name="pose_save_name"/>
@ -235,7 +253,6 @@
</layout_panel>
<layout_panel name="button_controls_layout">
<panel name="button_controls_panel">
<button name="toggleAdvancedPanel" tool_tip="Переключить область дополнительных настроек"/>
<button name="FlipPose_avatar" tool_tip="Перевернуть всю позу влево/вправо"/>
<button name="FlipJoint_avatar" tool_tip="Зеркально отобразить выбранные части тела влево/вправо"/>
<button label="Recap" name="button_RecaptureParts" tool_tip="Если выбранная часть тела включена/выключены, это возвращает то, что эти части тела делают прямо сейчас"/>
@ -243,29 +260,7 @@
<button label="Свои позы" name="toggleLoadSavePanel" tool_tip="Загружайте, сохраняйте и управляйте позами, которые вы создаете"/>
<button tool_tip="Управляйте своим каталогом поз" name="open_poseDir_button"/>
<menu_button label="Загрузить" tool_tip="Загрузить текущую выбранную позу." name="load_poses_button"/>
<button label="Сохранить" tool_tip="Сохранить текущую позу." name="save_poses_button"/>
</panel>
</layout_panel>
<layout_panel name="advanced_controls_layout">
<panel name="advanced_parent_panel">
<tab_container name="modifier_tabs">
<panel title="Часть тела Позиция" name="position_panel">
<slider label="Позиция X:" name="Advanced_Position_X"/>
<slider label="Позиция Y:" name="Advanced_Position_Y"/>
<slider label="Позиция Z:" name="Advanced_Position_Z"/>
<button label="Отмена" name="undo_position_change" tool_tip="Отменить последнее изменение позиции"/>
<button label="Повторить" name="redo_position_change" tool_tip="Повторить последнее изменение позиции"/>
<button label="Сброс" name="reset_positions" tool_tip="Дважды щелкните, чтобы вернуть исходное положение."/>
</panel>
<panel title="Часть тела Размер" name="scale_panel">
<slider label="Размер X:" name="Advanced_Scale_X"/>
<slider label="Размер Y:" name="Advanced_Scale_Y"/>
<slider label="Размер Z:" name="Advanced_Scale_Z"/>
<button label="Отмена" name="undo_scale_change" tool_tip="Отменить последнее изменение размера"/>
<button label="Повторить" name="redo_scale_change" tool_tip="Повторить последнее изменение размера"/>
<button label="Сброс" name="reset_scales" tool_tip="Дважды щелкните, чтобы сбросить размер до исходного."/>
</panel>
</tab_container>
<button label="Сохр. Diff" tool_tip="Diff — это просто ваши изменения в существующей позе. Начните с T-Позы, чтобы сохранить новую работу." name="save_poses_button"/>
</panel>
</layout_panel>
</layout_stack>

View File

@ -497,14 +497,26 @@
</menu>
<menu label="Принудительно вызвать ошибку" name="Force Errors">
<menu_item_call label="Точка остановки (breakpoint)" name="Force Breakpoint"/>
<menu_item_call label="Вызов ошибки LL и сбой" name="Force LLError And Crash"/>
<menu_item_call label="Ошибка LL и сбой" name="Force LLError And Crash"/>
<menu_item_call label="Ошибка LL, Сообщение и Сбой" name="Force LLError Message And Crash"/>
<menu_item_call label="Неправильный доступ к памяти" name="Force Bad Memory Access"/>
<menu_item_call label="Неправильной доступ к памяти в сопрограмме" name="Force Bad Memory Access in Coroutine"/>
<menu_item_call label="Бесконечный цикл" name="Force Infinite Loop"/>
<menu_item_call label="Сбой драйвера" name="Force Driver Carsh"/>
<menu_item_call label="Исключение программы" name="Force Software Exception"/>
<menu_item_call label="Исключение в программе" name="Force Software Exception"/>
<menu_item_call label="Исключение в операционной системе" name="Force OS Exception"/>
<menu_item_call label="Исключение программного обеспечения в сопрограмме" name="Force Software Exception in Coroutine"/>
<menu_item_call label="Вызвать сбой в потоке" name="Force a Crash in a Thread"/>
<menu_item_call label="Отключение клиента" name="Force Disconnect Viewer"/>
<menu_item_call label="Имитировать утечку памяти" name="Memory Leaking Simulation"/>
</menu>
<menu label="GLTF" name="GLTF">
<menu_item_call label="Открыть..." name="Open..."/>
<menu_item_call label="Сохранить как..." name="Save As..."/>
<menu_item_call label="Загрузить..." name="Upload..."/>
<menu_item_call label="Редактировать..." name="Edit..."/>
</menu>
<menu label="Видео" name="Video"/>
<menu label="Тестирование прорисовки" name="Render Tests">
<menu_item_check label="Смещение камеры" name="Camera Offset"/>
<menu_item_check label="Случайная частота кадров" name="Randomize Framerate"/>
@ -534,6 +546,8 @@
<menu_item_check label="Счетчик Треугольников" name="Triangle Count"/>
<menu_item_check label="Строительство очереди" name="Build Queue"/>
<menu_item_check label="Освещение" name="Lights"/>
<menu_item_check label="Датчики отражений" name="Reflection Probes"/>
<menu_item_check label="Обновления датчиков" name="Probe Updates"/>
<menu_item_check label="Частицы" name="Particles"/>
<menu_item_check label="Каркас столкновений" name="Collision Skeleton"/>
<menu_item_check label="Стыки" name="Joints"/>
@ -573,6 +587,7 @@
<menu_item_check label="Текстуры в полном разрешении (ОПАСНО)" name="Full Res Textures"/>
<menu_item_check label="Прорисовка присоединенных источников света" name="Render Attached Lights"/>
<menu_item_check label="Прорисовка присоединенных частиц" name="Render Attached Particles"/>
<menu_item_check label="Сбор буферов вершин шрифтов" name="Collect Font Vertex Buffers"/>
<menu_item_check label="Включить кэш шейдеров" name="Enable Shader Cache"/>
<menu_item_call label="Очистить кэш шейдеров" name="Shader Cache Clear"/>
<menu_item_call label="Восстановить местность" name="Rebuild Terrain"/>
@ -603,9 +618,16 @@
<menu_item_check label="Перекрытие солнца в симуляторе" name="Sim Sun Override"/>
<menu_item_check label="Фиксированная погода" name="Fixed Weather"/>
<menu_item_call label="Дамп кэша объектов региона" name="Dump Region Object Cache"/>
<menu_item_check label="Список интересов: полное обновление" name="Interest List: Full Update"/>
<menu_item_check label="Записывать статистику в файл" name="Stats Recorder File"/>
<menu_item_check label="Списки интересов в режиме 360" name="Interest List: 360 Mode"/>
<menu_item_call label="Сброс списков интересов" name="Reset Interest Lists"/>
<menu_item_call label="Дамп возможностей симулятора в общий чат" name="DumpSimFeaturesToChat"/>
</menu>
<menu label="Местность" name="DevelopTerrain">
<menu_item_call label="Перестроить местность" name="Rebuild Terrain"/>
<menu_item_call label="Создать локальный рисунок карты" name="Create Local Paintmap"/>
<menu_item_call label="Удалить локальный рисунок карты" name="Delete Local Paintmap"/>
</menu>
<menu label="Интерфейс пользователя" name="UI">
<menu_item_call label="Тест браузера для просмотра медиа" name="Web Browser Test"/>
<menu_item_check label="Тест перезапуска региона..." name="Region Restart Test"/>
@ -697,6 +719,7 @@
<menu_item_call label="Запрос статуса администратора" name="Request Admin Options"/>
<menu_item_call label="Выход из статуса администратора" name="Leave Admin Options"/>
<menu_item_check label="Показать меню администратора" name="View Admin Options"/>
<menu label="Дамп" name="Dump" />
</menu>
<menu label="Администратор" name="Admin">
<menu label="Объект" name="AdminObject">

View File

@ -649,6 +649,9 @@
<menu_item_call label="要求管理員狀態" name="Request Admin Options" />
<menu_item_call label="離開管理員狀態" name="Leave Admin Options" />
<menu_item_check label="顯示管理員選項" name="View Admin Options" />
<menu label="轉儲" name="Dump">
<menu_item_call label="林登查看器紋理清單" name="LLViewerTexturelist"/>
</menu>
</menu>
<menu label="管理員" name="Admin">
<menu label="物件" name="AdminObject">