Ansariel 2025-03-28 14:41:36 +01:00
commit d5ec2b709e
50 changed files with 905 additions and 357 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

@ -159,8 +159,8 @@ void LLConsole::draw()
// <FS>
//static const F32 padding_horizontal = 10;
//static const F32 padding_vertical = 3;
static const F32 padding_horizontal = 15;
static const F32 padding_vertical = 8;
constexpr F32 padding_horizontal = 15;
constexpr F32 padding_vertical = 8;
// </FS>
LLGLSUIDefault gls_ui;
@ -177,7 +177,7 @@ void LLConsole::draw()
// <FS:minerjr> [FIRE-35039] Add flag to show/hide the on-screen console
// Get the Show On-screen Console flag from the Comm menu
static LLCachedControl<bool> showOnscreenConsole(*LLUI::getInstance()->mSettingGroups["config"], "FSShowOnscreenConsole");
static LLUICachedControl<bool> showOnscreenConsole("FSShowOnscreenConsole");
// If the Show On-screen Console flag is disabled and the current console is the global console
// (Not a debug console), then don't try to draw
if (!showOnscreenConsole && this == gConsole)
@ -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

@ -25423,6 +25423,17 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<integer>1</integer>
</map>
<key>FSStatusBarShowFPSColors</key>
<map>
<key>Comment</key>
<string>If enabled, display FPS number in a color based on the current status.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>FSExperimentalLostAttachmentsFix</key>
<map>
<key>Comment</key>
@ -26209,5 +26220,16 @@ Change of this parameter will affect the layout of buttons in notification toast
<key>Value</key>
<integer>1</integer>
</map>
<key>FSLocalMeshApplyJointOffsets</key>
<map>
<key>Comment</key>
<string>use joint offsets if they are present</string>
<key>Persist</key>
<integer>0</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>0</integer>
</map>
</map>
</llsd>

View File

@ -428,6 +428,8 @@ void ColladaExportFloater::CacheReadResponder::completed(bool success)
// For other formats we need to decode first
if (mFormattedImage->updateData() && ( (mFormattedImage->getWidth() * mFormattedImage->getHeight() * mFormattedImage->getComponents()) != 0 ) )
{
mFormattedImage->setDiscardLevel(0); // <FS/> [FIRE-35292] Fix for textures getting downscaled and compressed
LLPointer<LLImageRaw> raw = new LLImageRaw;
raw->resize(mFormattedImage->getWidth(), mFormattedImage->getHeight(), mFormattedImage->getComponents());
@ -503,7 +505,15 @@ void ColladaExportFloater::CacheReadResponder::saveTexturesWorker(void* data)
std::string name = gDirUtilp->getDirName(me->mFilename);
name += gDirUtilp->getDirDelimiter() + me->mTexturesToSave[id];
CacheReadResponder* responder = new CacheReadResponder(id, img, name, img_type);
LLAppViewer::getTextureCache()->readFromCache(id, 0, 999999, responder);
// <FS:minerjr> [FIRE-35292] Fix for textures getting downscaled and compressed
//LLAppViewer::getTextureCache()->readFromCache(id, 0, 999999, responder);
// The above line hard coded the size of data to read from the cached version of the texture as 999999,
// where now we will calcuate the correct value based upon the texture's full width, height and # of components (3=RGB, 4=RGBA) and
// the discard level (0)). There is a choice to change the rate, but we seem to use the value of 1/8 compression level
S32 texture_size = LLImageJ2C::calcDataSizeJ2C(imagep->getFullWidth(), imagep->getFullHeight(), imagep->getComponents(), 0);// , F32 rate) rate = const F32 DEFAULT_COMPRESSION_RATE = 1.f/8.f;
// Use calculated texture_size (from LLTextureFetch::createRequest see "else if (w*h*c > 0)" statement for more info)
LLAppViewer::getTextureCache()->readFromCache(id, 0, texture_size, responder);
// </FS:minerjr> [FIRE-35292]
me->mTexturesToSave.erase(id);
me->updateTitleProgress();
me->mTimer.reset();

View File

@ -690,7 +690,14 @@ void FSFloaterObjectExport::fetchTextureFromCache(LLViewerFetchedTexture* src_vi
const LLUUID& texture_id = src_vi->getID();
LLImageJ2C* mFormattedImage = new LLImageJ2C;
FSFloaterObjectExport::FSExportCacheReadResponder* responder = new FSFloaterObjectExport::FSExportCacheReadResponder(texture_id, mFormattedImage, this);
LLAppViewer::getTextureCache()->readFromCache(texture_id, 0, 999999, responder);
// <FS:minerjr> [FIRE-35292] Fix for textures getting downscaled and compressed
//LLAppViewer::getTextureCache()->readFromCache(id, 0, 999999, responder);
// The above line hard coded the size of data to read from the cached version of the texture as 999999,
// where now we will calcuate the correct value based upon the texture's full width, height and # of components (3=RGB, 4=RGBA) and
// the discard level (0)). There is a choice to change the rate, but we seem to use the value of 1/8 compression level
S32 texture_size = LLImageJ2C::calcDataSizeJ2C(src_vi->getFullWidth(), src_vi->getFullHeight(), src_vi->getComponents(), 0);// , F32 rate) rate = const F32 DEFAULT_COMPRESSION_RATE = 1.f/8.f;
// Use calculated texture_size (from LLTextureFetch::createRequest see "else if (w*h*c > 0)" statement for more info)
LLAppViewer::getTextureCache()->readFromCache(texture_id, 0, texture_size, responder);
LL_DEBUGS("export") << "Fetching " << texture_id << " from the TextureCache" << LL_ENDL;
}

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

@ -37,6 +37,7 @@
#include "llviewerregion.h"
// </FS:Ansariel>
LLAgentBenefits::LLAgentBenefits():
m_initalized(false),
m_animated_object_limit(-1),
@ -213,7 +214,27 @@ S32 LLAgentBenefits::getPicksLimit() const
{
// <FS:Ansariel> OpenSim legacy economy
//return m_picks_limit;
return LLGridManager::instance().isInSecondLife() ? m_picks_limit : LLAgentPicksInfo::instance().getMaxNumberOfPicks();
if (LLGridManager::instance().isInSecondLife())
{
return m_picks_limit;
}
else
{
constexpr S32 MAX_OPENSIM_PICKS_FALLBACK = 20; // [FIRE-35276] Freeze on OpenSim (default agreed with Ubit Umarov) (originally by Hecklezz)
S32 max_profile_picks = MAX_OPENSIM_PICKS_FALLBACK;
if (gAgent.getRegion())
{
LLSD features;
gAgent.getRegion()->getSimulatorFeatures(features);
if (features.has("MaxProfilePicks"))
{
max_profile_picks = features["MaxProfilePicks"].asInteger();
}
}
return max_profile_picks;
}
// </FS:Ansariel>
}

View File

@ -5955,8 +5955,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);
@ -1679,7 +1690,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 +2294,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 +2332,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 +2343,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 +2430,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 +2480,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 +2495,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 +2521,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 +2563,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 +2588,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

@ -91,6 +91,8 @@
#include "fscommon.h"
#include "llstartup.h"
#include "llviewernetwork.h" // <FS/> Access to GridManager
static LLDefaultChildRegistry::Register<LLNetMap> r1("net_map");
constexpr F32 LLNetMap::MAP_SCALE_MIN = 32;
@ -454,26 +456,75 @@ void LLNetMap::draw()
gGL.color4f(1.f, 0.5f, 0.5f, 1.f);
}
// Draw using texture.
gGL.getTexUnit(0)->bind(regionp->getLand().getSTexture());
gGL.begin(LLRender::TRIANGLES);
// <FS> [FIRE-35147] OpenSim regions can be greater than 256x256 and need to be accounted for
if (!LLGridManager::getInstance()->isInSecondLife())
{
gGL.texCoord2f(0.f, 1.f);
gGL.vertex2f(left, top);
gGL.texCoord2f(0.f, 0.f);
gGL.vertex2f(left, bottom);
gGL.texCoord2f(1.f, 0.f);
gGL.vertex2f(right, bottom);
// Fixes OpenSim race condition on grid change not having updated Grid Info yet
bool isAgentTeleporting = gAgent.getTeleportState() != LLAgent::TELEPORT_NONE;
if (!isAgentTeleporting)
{
const LLViewerRegion::tex_matrix_t& tiles(regionp->getWorldMapTiles());
for (S32 i(0), scaled_width((S32)(real_width / region_width)), square_width(scaled_width * scaled_width);
i < square_width; ++i)
{
const F32 y = (F32)(i / scaled_width);
const F32 x = (F32)(i - y * scaled_width);
const F32 local_left(left + x * mScale);
const F32 local_right(local_left + mScale);
const F32 local_bottom(bottom + y * mScale);
const F32 local_top(local_bottom + mScale);
LLPointer<LLViewerTexture> pRegionImage = tiles[(U64)(x * scaled_width + y)];
if (pRegionImage.isNull())
continue;
gGL.texCoord2f(0.f, 1.f);
gGL.vertex2f(left, top);
gGL.texCoord2f(1.f, 0.f);
gGL.vertex2f(right, bottom);
gGL.texCoord2f(1.f, 1.f);
gGL.vertex2f(right, top);
if (pRegionImage->hasGLTexture())
{
gGL.getTexUnit(0)->bind(pRegionImage);
gGL.begin(LLRender::TRIANGLES);
{
gGL.texCoord2f(0.f, 1.f);
gGL.vertex2f(local_left, local_top);
gGL.texCoord2f(0.f, 0.f);
gGL.vertex2f(local_left, local_bottom);
gGL.texCoord2f(1.f, 0.f);
gGL.vertex2f(local_right, local_bottom);
gGL.texCoord2f(0.f, 1.f);
gGL.vertex2f(local_left, local_top);
gGL.texCoord2f(1.f, 0.f);
gGL.vertex2f(local_right, local_bottom);
gGL.texCoord2f(1.f, 1.f);
gGL.vertex2f(local_right, local_top);
}
gGL.end();
}
pRegionImage->setBoostLevel(LLViewerTexture::BOOST_MAP_VISIBLE);
}
}
}
gGL.end();
// </FS>
else
{
// Draw using texture.
gGL.getTexUnit(0)->bind(regionp->getLand().getSTexture());
gGL.begin(LLRender::TRIANGLES);
{
gGL.texCoord2f(0.f, 1.f);
gGL.vertex2f(left, top);
gGL.texCoord2f(0.f, 0.f);
gGL.vertex2f(left, bottom);
gGL.texCoord2f(1.f, 0.f);
gGL.vertex2f(right, bottom);
gGL.texCoord2f(0.f, 1.f);
gGL.vertex2f(left, top);
gGL.texCoord2f(1.f, 0.f);
gGL.vertex2f(right, bottom);
gGL.texCoord2f(1.f, 1.f);
gGL.vertex2f(right, top);
}
gGL.end();
}
gGL.flush();
}

View File

@ -3147,10 +3147,10 @@ void LLPanelProfileNotes::updateData()
#ifdef OPENSIM
if (LLGridManager::instance().isInOpenSim() && gAgent.getRegionCapability(PROFILE_PROPERTIES_CAP).empty())
{
LLUUID avatar_id = getAvatarId();
if (!getStarted() && avatar_id.notNull() && gAgent.getRegionCapability(PROFILE_PROPERTIES_CAP).empty() && !getSelfProfile())
{
setIsLoading();
LLUUID avatar_id = getAvatarId();
if (!getStarted() && avatar_id.notNull())
{
setIsLoading();
LLAvatarPropertiesProcessor::getInstance()->sendAvatarNotesRequest(avatar_id);
}
}

View File

@ -604,44 +604,48 @@ void LLStatusBar::refresh()
static LLCachedControl<bool> fsStatusBarShowFPS(gSavedSettings, "FSStatusBarShowFPS");
if (fsStatusBarShowFPS && mFPSUpdateTimer.getElapsedTimeF32() > 1.f)
{
static LLCachedControl<bool> fsStatusBarShowFPSColors(gSavedSettings, "FSStatusBarShowFPSColors");
static LLCachedControl<U32> max_fps(gSavedSettings, "FramePerSecondLimit");
static LLCachedControl<bool> limit_fps_enabled(gSavedSettings, "FSLimitFramerate");
static LLCachedControl<bool> vsync_enabled(gSavedSettings, "RenderVSyncEnable");
static const auto fps_below_limit_color = LLUIColorTable::instance().getColor("Yellow");
static const auto fps_limit_reached_color = LLUIColorTable::instance().getColor("Green");
static const auto vsync_limit_reached_color = LLUIColorTable::instance().getColor("Green");
static const auto fps_uncapped_color = LLUIColorTable::instance().getColor("White");
static const auto fps_unfocussed_color = LLUIColorTable::instance().getColor("Gray");
static const auto fps_below_limit_color = LLUIColorTable::instance().getColor("FpsDisplayBelowLimitColor");
static const auto fps_limit_reached_color = LLUIColorTable::instance().getColor("FpsDisplayFpsLimitReachedColor");
static const auto vsync_limit_reached_color = LLUIColorTable::instance().getColor("FpsDisplayVSyncLimitReachedColor");
static const auto fps_uncapped_color = LLUIColorTable::instance().getColor("FpsDisplayUncappedColor");
static const auto fps_unfocussed_color = LLUIColorTable::instance().getColor("FpsDisplayUnfocussedColor");
static auto current_fps_color = fps_uncapped_color;
mFPSUpdateTimer.reset();
const auto fps = LLTrace::get_frame_recording().getPeriodMedianPerSec(LLStatViewer::FPS);
mFPSText->setText(llformat("%.1f", fps));
// if background, go grey, else go white unless we have a cap (checked next)
auto fps_color{ fps_uncapped_color };
auto window = gViewerWindow ? gViewerWindow->getWindow() : nullptr;
if ((window && !window->getVisible()) || !gFocusMgr.getAppHasFocus())
if (fsStatusBarShowFPSColors)
{
fps_color = fps_unfocussed_color;
}
else
{
S32 vsync_freq{ -1 };
if (window)
// if background, go grey, else go white unless we have a cap (checked next)
auto window = gViewerWindow ? gViewerWindow->getWindow() : nullptr;
if ((window && !window->getVisible()) || !gFocusMgr.getAppHasFocus())
{
vsync_freq = window->getRefreshRate();
fps_color = fps_unfocussed_color;
}
else
{
S32 vsync_freq{ -1 };
if (window)
{
vsync_freq = window->getRefreshRate();
}
if (limit_fps_enabled && max_fps > 0)
{
fps_color = (fps >= max_fps - 1) ? fps_limit_reached_color : fps_below_limit_color;
}
// use vsync if enabled and the freq is lower than the max_fps
if (vsync_enabled && vsync_freq > 0 && (!limit_fps_enabled || vsync_freq < (S32)max_fps))
{
fps_color = (fps >= vsync_freq - 1) ? vsync_limit_reached_color : fps_below_limit_color;
if (limit_fps_enabled && max_fps > 0)
{
fps_color = (fps >= max_fps - 1) ? fps_limit_reached_color : fps_below_limit_color;
}
// use vsync if enabled and the freq is lower than the max_fps
if (vsync_enabled && vsync_freq > 0 && (!limit_fps_enabled || vsync_freq < (S32)max_fps))
{
fps_color = (fps >= vsync_freq - 1) ? vsync_limit_reached_color : fps_below_limit_color;
}
}
}

View File

@ -86,6 +86,10 @@ void LLURLLineEditor::copyEscapedURLToClipboard()
// *HACK: Because LLSLURL is currently broken we cannot use it to check if unescaped_text is a valid SLURL (see EXT-8335).
if (LLStringUtil::startsWith(unescaped_text, "http://") || LLStringUtil::startsWith(unescaped_text, "secondlife://")) // SLURL
text_to_copy = utf8str_to_wstring(LLWeb::escapeURL(unescaped_text));
// <FS:HT> [FIRE-34020] Copy of address bar contents does not URL encode space in region name for OpenSim only
else if (LLStringUtil::startsWith(unescaped_text, "hop://"))
text_to_copy = utf8str_to_wstring(LLWeb::escapeURL(unescaped_text));
// </FS:HT>
else // human-readable location
text_to_copy = utf8str_to_wstring(unescaped_text);

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);
@ -3113,6 +3113,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"
@ -5141,6 +5142,13 @@ class FSSelfCheckMoveLock : public view_listener_t
if (LLGridManager::getInstance()->isInSecondLife())
{
new_value = gSavedPerAccountSettings.getBOOL("UseMoveLock");
// <FS:Chanayane> prevents having Move Lock activated but disabled when for some reason the LSL Bridge is not worn or not ready
if (new_value && !enable_bridge_function())
{
gSavedPerAccountSettings.setBOOL("UseMoveLock", false);
new_value = false;
}
// </FS:Chanayane>
}
#ifdef OPENSIM
else
@ -12784,6 +12792,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

@ -762,6 +762,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)
{
@ -773,6 +779,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]
}
}
@ -1178,6 +1191,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;
}
@ -3053,8 +3069,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)
{
@ -3063,6 +3094,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);
@ -3090,10 +3123,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);
@ -3388,11 +3439,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]
}
}
@ -3452,6 +3515,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;
}
@ -3693,7 +3760,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)
@ -3703,8 +3773,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]
}
}
}
@ -3720,7 +3798,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

@ -371,23 +371,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()
@ -919,7 +971,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.
@ -940,16 +992,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)
{
@ -961,7 +1012,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]
@ -970,24 +1021,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, runing string
@ -995,6 +1052,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);
@ -1002,8 +1060,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)
{
@ -1025,9 +1081,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]
@ -1038,7 +1099,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
@ -1061,11 +1123,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
@ -1079,11 +1139,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]
}
@ -1185,7 +1250,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,
@ -1332,11 +1401,7 @@ F32 LLViewerTextureList::updateImagesFetchTextures(F32 max_time)
iter = mUUIDMap.begin();
}
// <FS:minerjr> [FIRE-35081] Blurry prims not changing with graphics settings, not happening with SL Viewer
//if (iter->second->getGLTexture())
// Can skip processing TEX_LIST_SCALED as they are UI elements and should not be discarded
if (iter->second->getGLTexture() && get_element_type(iter->second->getBoostLevel()) == TEX_LIST_STANDARD)
// </FS:minerjr> [FIRE-35081]
if (iter->second->getGLTexture())
{
entries.push_back(iter->second);
}

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);
@ -10956,7 +10963,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

@ -1410,4 +1410,19 @@
<color
name="NotecardCursorColor"
reference="TextCursorColor" />
<color
name="FpsDisplayUncappedColor"
reference="LabelTextColor" />
<color
name="FpsDisplayUnfocussedColor"
reference="Gray" />
<color
name="FpsDisplayBelowLimitColor"
reference="Yellow" />
<color
name="FpsDisplayFpsLimitReachedColor"
reference="Green" />
<color
name="FpsDisplayVSyncLimitReachedColor"
reference="Green" />
</colors>

View File

@ -1403,4 +1403,19 @@
<color
name="NotecardCursorColor"
reference="TextCursorColor" />
<color
name="FpsDisplayUncappedColor"
reference="LabelTextColor" />
<color
name="FpsDisplayUnfocussedColor"
reference="Gray" />
<color
name="FpsDisplayBelowLimitColor"
reference="Yellow" />
<color
name="FpsDisplayFpsLimitReachedColor"
reference="Green" />
<color
name="FpsDisplayVSyncLimitReachedColor"
reference="Green" />
</colors>

View File

@ -1378,4 +1378,19 @@
<color
name="NotecardCursorColor"
reference="TextCursorColor" />
<color
name="FpsDisplayUncappedColor"
reference="LabelTextColor" />
<color
name="FpsDisplayUnfocussedColor"
reference="Gray" />
<color
name="FpsDisplayBelowLimitColor"
reference="Yellow" />
<color
name="FpsDisplayFpsLimitReachedColor"
reference="Green" />
<color
name="FpsDisplayVSyncLimitReachedColor"
reference="Green" />
</colors>

View File

@ -10,6 +10,7 @@
<menu_item_check label="Kontostand anzeigen" name="FSShowCurrencyBalanceInStatusbar"/>
<menu_item_check label="Mediensteuerung anzeigen" name="FSEnableVolumeControls"/>
<menu_item_check label="Bilder pro Sekunde anzeigen" name="FSStatusBarShowFPS"/>
<menu_item_check label="Farb-Indikator für Bilder pro Sekunde anzeigen" name="FSStatusBarShowFPSColors"/>
<menu_item_check label="Datentransfer-Indikator anzeigen" name="ShowNetStats"/>
<menu_item_check label="Koordinaten anzeigen" name="Coordinates"/>
<menu_item_check label="Parzelleneigenschaften anzeigen" name="Parcel Properties"/>

View File

@ -33,7 +33,7 @@
<button name="stream_toggle_btn" tool_tip="Audiostream der Parzelle starten/stoppen"/>
<button name="media_toggle_btn" tool_tip="Alle Medien starten/stoppen (Musik, Video, Webseiten)"/>
<button name="volume_btn" tool_tip="Steuerung der Gesamtlautstärke"/>
<text name="FPSText" tool_tip="Bilder pro Sekunde">
<text name="FPSText" tool_tip="Bilder pro Sekunde (klicken, um Begrenzung anzupassen)">
200.0
</text>
</panel>

View File

@ -165,7 +165,7 @@ Additional code generously contributed to Firestorm by:
top_pad="4"
width="450"
wrap="true">
Aira Yumi, Albatroz Hird, Alexie Birman, Andromeda Rage, Angus Boyd, Animats, Armin Weatherwax, Ayane Lyla, Casper Warden, Chalice Yao, Chaser Zaks, Chorazin Allen, Cron Stardust, Damian Zhaoying, Dan Threebeards, Dawa Gurbux, Dax Dupont, Denver Maksim, Dragonborn Forzane, Drake Arconis, Felyza Wishbringer, f0rbidden, Fractured Crystal, Geenz Spad, Gibson Firehawk, Hitomi Tiponi, humbletim, Inusaito Sayori, Jean Severine, Katharine Berry, Kittin Ninetails, Kool Koolhoven, Lance Corrimal, Lassie, Latif Khalifa, Laurent Bechir, Magne Metaverse LLC, Magus Freston, Makidoll, Manami Hokkigai, MartinRJ Fayray, McCabe Maxstead, Melancholy Lemon, Melysmile, Mimika Oh, minerjr, Mister Acacia, MorganMegan, Morgan Pennent, Mysty Saunders, Nagi Michinaga, Name Short, nhede Core, NiranV Dean, Nogardrevlis Lectar, Oren Hurvitz, paperwork, Penny Patton, Peyton Menges, programmtest, Qwerty Venom, rafak360, Rebecca Ashbourne, Revolution Smythe, Romka Swallowtail, Sahkolihaa Contepomi, sal Kaligawa, Samm Florian, Satomi Ahn, Sei Lisa, Sempervirens Oddfellow, Shin Wasp, Shyotl Kuhr, Sione Lomu, Skills Hak, StarlightShining, Sunset Faulkes, Tapple Gao, Testicular Slingshot, Thickbrick Sleaford, Ubit Umarov, Vaalith Jinn, Vincent Sylvester, Whirly Fizzle, Xenhat Liamano, 小滢 Zi Ying, Zwagoth Klaar and others.
Aira Yumi, Albatroz Hird, Alexie Birman, Andromeda Rage, Angus Boyd, Animats, Armin Weatherwax, Ayane Lyla, Casper Warden, Chalice Yao, Chaser Zaks, Chorazin Allen, Cron Stardust, Damian Zhaoying, Dan Threebeards, Dawa Gurbux, Dax Dupont, Denver Maksim, Dragonborn Forzane, Drake Arconis, Felyza Wishbringer, f0rbidden, Fractured Crystal, Geenz Spad, Gibson Firehawk, Hecklezz, Hitomi Tiponi, humbletim, Inusaito Sayori, Jean Severine, Katharine Berry, Kittin Ninetails, Kool Koolhoven, Lance Corrimal, Lassie, Latif Khalifa, Laurent Bechir, Magne Metaverse LLC, Magus Freston, Makidoll, Manami Hokkigai, MartinRJ Fayray, McCabe Maxstead, Melancholy Lemon, Melysmile, Mimika Oh, minerjr, Mister Acacia, MorganMegan, Morgan Pennent, Mysty Saunders, Nagi Michinaga, Name Short, nhede Core, NiranV Dean, Nogardrevlis Lectar, Oren Hurvitz, paperwork, Penny Patton, Peyton Menges, programmtest, Qwerty Venom, rafak360, Rebecca Ashbourne, Revolution Smythe, Romka Swallowtail, Sahkolihaa Contepomi, sal Kaligawa, Samm Florian, Satomi Ahn, Sei Lisa, Sempervirens Oddfellow, Shin Wasp, Shyotl Kuhr, Sione Lomu, Skills Hak, StarlightShining, Sunset Faulkes, Tapple Gao, Testicular Slingshot, Thickbrick Sleaford, Ubit Umarov, Vaalith Jinn, Vincent Sylvester, Whirly Fizzle, Xenhat Liamano, 小滢 Zi Ying, Zwagoth Klaar and others.
</text>
<text
follows="top|left"

View File

@ -1032,8 +1032,6 @@
max_val="5"
top_delta="-2"
width="127">
<slider_bar.commit_callback
function="Advanced.ClearShaderCache" />
</slider_bar>
<spinner
name="S_Shadow_Res"
@ -1047,8 +1045,6 @@
min_val="0"
width="53"
increment="0.5">
<spinner.commit_callback
function="Advanced.ClearShaderCache" />
</spinner>
<button
follows="left|top"

View File

@ -5,7 +5,7 @@
can_resize="true"
can_dock="false"
can_close="true"
height="300"
height="305"
width="505"
min_width="505"
min_height="300"
@ -21,7 +21,7 @@
follows="top|left|right|bottom"
top="20"
left="0"
height="223"
height="233"
width="500"
tab_position="top"
enable_tabs_flashing="true"
@ -114,6 +114,15 @@
width="300"
label="Assume scale is in meters."
tool_tip="Ignore the cm scale units used by tools such as Maya" />
<check_box name="local_mesh_scale_use_meters"
height="15"
control_name="FSLocalMeshApplyJointOffsets"
follows="top|left"
top_pad="5"
left="8"
width="300"
label="Apply joint offsets."
tool_tip="Apply any joint offsets in the mesh, by default these are ignored." />
<text name="lod_suffix_label"
follows="left|top"
layout="topleft"
@ -256,7 +265,6 @@
label="Apply"
layout="topleft"
left="10"
top="253"
width="90"
visible="true" />
<combo_box name="object_apply_list"
@ -264,7 +272,7 @@
layout="topleft"
follows="bottom"
left="105"
top="253"
top_delta="0"
width="315"
visible="true" />
<button name="btn_add"
@ -272,7 +280,6 @@
label="Add"
layout="topleft"
left="10"
top="275"
width="90"
visible="true" />
<button name="btn_remove"
@ -280,7 +287,7 @@
label="Remove"
layout="topleft"
left="105"
top="275"
top_delta="0"
width="90"
visible="true" />
<button name="btn_reload"
@ -288,7 +295,7 @@
label="Reload"
layout="topleft"
left="200"
top="275"
top_delta="0"
width="90"
visible="true" />
<button name="btn_clear"
@ -296,7 +303,7 @@
label="Clear"
layout="topleft"
left="295"
top="275"
top_delta="0"
width="90"
visible="true" />
<button name="btn_rez"
@ -305,7 +312,7 @@
tool_tip="Create a donor mesh inworld and populate with selected local mesh. This creates an empty object in-world."
layout="topleft"
left="390"
top="275"
top_delta="0"
width="90"
visible="true" />
</floater>

View File

@ -118,6 +118,19 @@
function="CheckControl"
parameter="FSStatusBarShowFPS" />
</menu_item_check>
<menu_item_check
label="Show Color Indicator for Frames per Second"
name="FSStatusBarShowFPSColors">
<on_click
function="ToggleControl"
parameter="FSStatusBarShowFPSColors" />
<on_check
function="CheckControl"
parameter="FSStatusBarShowFPSColors" />
<on_enable
function="CheckControl"
parameter="FSStatusBarShowFPS" />
</menu_item_check>
<menu_item_check
label="Show Traffic Indicator"
name="ShowNetStats">

View File

@ -5761,6 +5761,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">

View File

@ -753,34 +753,36 @@ bool LLLocalMeshImportDAE::processSkin(daeDatabase* collada_db, daeElement* coll
}
}
}
int jointname_idx = 0;
for (auto jointname_iterator = skininfop->mJointNames.begin(); jointname_iterator != skininfop->mJointNames.end(); ++jointname_iterator, ++jointname_idx)
static LLCachedControl<bool> apply_joint_offsets(gSavedSettings, "FSLocalMeshApplyJointOffsets");
if (apply_joint_offsets)
{
std::string name_lookup = jointname_iterator->mName;
if (joint_map.find(name_lookup) == joint_map.end())
int jointname_idx = 0;
for (auto jointname_iterator = skininfop->mJointNames.begin();
jointname_iterator != skininfop->mJointNames.end();
++jointname_iterator, ++jointname_idx)
{
pushLog("DAE Importer", "WARNING: Unknown joint named " + name_lookup + " found, skipping over it.");
continue;
std::string name_lookup = jointname_iterator->mName;
if (joint_map.find(name_lookup) == joint_map.end())
{
pushLog("DAE Importer", "WARNING: Unknown joint named " + name_lookup + " found, skipping over it.");
continue;
}
else
{
LL_DEBUGS("LocalMesh") << "Calc invBindMat for joint name: " << name_lookup << LL_ENDL;
}
if (skininfop->mInvBindMatrix.size() <= jointname_idx)
{
pushLog("DAE Importer", "WARNING: Requesting out of bounds joint named " + name_lookup);
break;
}
LLMatrix4 newinverse = LLMatrix4(skininfop->mInvBindMatrix[jointname_idx].getF32ptr());
const auto& joint_translation = joint_transforms[name_lookup].getTranslation();
newinverse.setTranslation(joint_translation);
skininfop->mAlternateBindMatrix.push_back(LLMatrix4a(newinverse));
}
else
{
LL_DEBUGS("LocalMesh") << "Calc invBindMat for joint name: " << name_lookup << LL_ENDL;
}
if (skininfop->mInvBindMatrix.size() <= jointname_idx)
{
// doesn't seem like a critical fail that should invalidate the entire skin, just break and move on?
pushLog("DAE Importer", "WARNING: Requesting out of bounds joint named " + name_lookup);
break;
}
LLMatrix4 newinverse = LLMatrix4(skininfop->mInvBindMatrix[jointname_idx].getF32ptr());
const auto& joint_translation = joint_transforms[name_lookup].getTranslation();
newinverse.setTranslation(joint_translation);
skininfop->mAlternateBindMatrix.push_back( LLMatrix4a(newinverse) );
}
size_t bind_count = skininfop->mAlternateBindMatrix.size();
if ((bind_count > 0) && (bind_count != skininfop->mJointNames.size()))
{