Ansariel 2021-02-18 19:32:52 +01:00
commit a84dfcb176
35 changed files with 953 additions and 408 deletions

View File

@ -30,7 +30,6 @@
const S32 LLAvatarAppearanceDefines::SCRATCH_TEX_WIDTH = 1024;
const S32 LLAvatarAppearanceDefines::SCRATCH_TEX_HEIGHT = 1024;
const S32 LLAvatarAppearanceDefines::IMPOSTOR_PERIOD = 2;
using namespace LLAvatarAppearanceDefines;

View File

@ -39,7 +39,6 @@ namespace LLAvatarAppearanceDefines
extern const S32 SCRATCH_TEX_WIDTH;
extern const S32 SCRATCH_TEX_HEIGHT;
extern const S32 IMPOSTOR_PERIOD;
static const U32 AVATAR_HOVER = 11001;

View File

@ -1 +1 @@
6.4.13
6.4.14

View File

@ -147,7 +147,7 @@ void main()
break;
case 2: // Blur (variable)
fragColor = texture2DRect(diffuseRect, fragTC).rgb;
fragColor = mix(fragColor, blurVariable(diffuseRect, fragTC, SPHERE_PARAMS.x, BLUR_DIRECTION, effectStrength), effectStrength > 0);
fragColor = mix(fragColor, blurVariable(diffuseRect, fragTC, SPHERE_PARAMS.x, BLUR_DIRECTION, effectStrength), int(effectStrength > 0));
break;
case 3: // ChromaticAberration
fragColor = chromaticAberration(diffuseRect, fragTC, SPHERE_PARAMS.xy, SPHERE_PARAMS.zw, effectStrength);

View File

@ -141,6 +141,7 @@ public:
mUserNameFont(NULL),
mUserNameTextBox(NULL),
mTimeBoxTextBox(NULL),
mHeaderLayoutStack(NULL),
mAvatarNameCacheConnection()
{}
@ -577,6 +578,7 @@ public:
mUserNameTextBox = getChild<LLTextBox>("user_name");
mTimeBoxTextBox = getChild<LLTextBox>("time_box");
mHeaderLayoutStack = getChild<LLLayoutStack>("header_ls");
mInfoCtrl = LLUICtrlFactory::getInstance()->createFromFile<LLUICtrl>("inspector_info_ctrl.xml", this, LLPanel::child_registry_t::instance());
llassert(mInfoCtrl != NULL);
@ -1063,8 +1065,10 @@ private:
mTimeBoxTextBox->translate(delta_pos_x, delta_pos_y);
//... & change width of the name control
const LLRect& user_rect = mUserNameTextBox->getRect();
mUserNameTextBox->reshape(user_rect.getWidth() + delta_pos_x, user_rect.getHeight());
//const LLRect& user_rect = mUserNameTextBox->getRect();
//mUserNameTextBox->reshape(user_rect.getWidth() + delta_pos_x, user_rect.getHeight());
const LLRect& layoutstack_rect = mHeaderLayoutStack->getRect();
mHeaderLayoutStack->reshape(layoutstack_rect.getWidth() + delta_pos_x, layoutstack_rect.getHeight());
}
void fetchAvatarName()
@ -1127,6 +1131,7 @@ protected:
const LLFontGL* mUserNameFont;
LLTextBox* mUserNameTextBox;
LLTextBox* mTimeBoxTextBox;
LLLayoutStack* mHeaderLayoutStack;
LLStyle::Params mNameStyleParams;

View File

@ -78,6 +78,24 @@ void LLControlAvatar::initInstance()
mInitFlags |= 1<<4;
}
const LLVOAvatar *LLControlAvatar::getAttachedAvatar() const
{
if (mRootVolp && mRootVolp->isAttachment())
{
return mRootVolp->getAvatarAncestor();
}
return NULL;
}
LLVOAvatar *LLControlAvatar::getAttachedAvatar()
{
if (mRootVolp && mRootVolp->isAttachment())
{
return mRootVolp->getAvatarAncestor();
}
return NULL;
}
void LLControlAvatar::getNewConstraintFixups(LLVector3& new_pos_fixup, F32& new_scale_fixup) const
{
@ -165,7 +183,7 @@ void LLControlAvatar::matchVolumeTransform()
if (mRootVolp->isAttachment())
{
LLVOAvatar *attached_av = mRootVolp->getAvatarAncestor();
LLVOAvatar *attached_av = getAttachedAvatar();
if (attached_av)
{
LLViewerJointAttachment *attach = attached_av->getTargetAttachmentPoint(mRootVolp);
@ -361,7 +379,34 @@ void LLControlAvatar::idleUpdate(LLAgent &agent, const F64 &time)
}
}
BOOL LLControlAvatar::updateCharacter(LLAgent &agent)
bool LLControlAvatar::computeNeedsUpdate()
{
computeUpdatePeriod();
// Animesh attachments are a special case. Should have the same update cadence as their attached parent avatar.
LLVOAvatar *attached_av = getAttachedAvatar();
if (attached_av)
{
// Have to run computeNeedsUpdate() for attached av in
// case it hasn't run updateCharacter() already this
// frame. Note this means that the attached av will
// run computeNeedsUpdate() multiple times per frame
// if it has animesh attachments. Results will be
// consistent except for the corner case of exceeding
// MAX_IMPOSTOR_INTERVAL in one call but not another,
// which should be rare.
attached_av->computeNeedsUpdate();
mNeedsImpostorUpdate = attached_av->mNeedsImpostorUpdate;
if (mNeedsImpostorUpdate)
{
mLastImpostorUpdateReason = 12;
}
return mNeedsImpostorUpdate;
}
return LLVOAvatar::computeNeedsUpdate();
}
bool LLControlAvatar::updateCharacter(LLAgent &agent)
{
return LLVOAvatar::updateCharacter(agent);
}
@ -635,29 +680,23 @@ std::string LLControlAvatar::getFullname() const
// virtual
bool LLControlAvatar::shouldRenderRigged() const
{
if (mRootVolp && mRootVolp->isAttachment())
{
LLVOAvatar *attached_av = mRootVolp->getAvatarAncestor();
if (attached_av)
{
return attached_av->shouldRenderRigged();
}
}
const LLVOAvatar *attached_av = getAttachedAvatar();
if (attached_av)
{
return attached_av->shouldRenderRigged();
}
return true;
}
// virtual
BOOL LLControlAvatar::isImpostor()
{
if (mRootVolp && mRootVolp->isAttachment())
{
// Attached animated objects should match state of their attached av.
LLVOAvatar *attached_av = mRootVolp->getAvatarAncestor();
if (attached_av)
{
return attached_av->isImpostor();
}
}
// Attached animated objects should match state of their attached av.
LLVOAvatar *attached_av = getAttachedAvatar();
if (attached_av)
{
return attached_av->isImpostor();
}
return LLVOAvatar::isImpostor();
}

View File

@ -40,6 +40,10 @@ public:
virtual void initInstance(); // Called after construction to initialize the class.
virtual ~LLControlAvatar();
// If this is an attachment, return the avatar it is attached to. Otherwise NULL.
virtual const LLVOAvatar *getAttachedAvatar() const;
virtual LLVOAvatar *getAttachedAvatar();
void getNewConstraintFixups(LLVector3& new_pos_constraint, F32& new_scale_constraint) const;
void matchVolumeTransform();
void updateVolumeGeom();
@ -53,7 +57,8 @@ public:
void markForDeath();
virtual void idleUpdate(LLAgent &agent, const F64 &time);
virtual BOOL updateCharacter(LLAgent &agent);
virtual bool computeNeedsUpdate();
virtual bool updateCharacter(LLAgent &agent);
void getAnimatedVolumes(std::vector<LLVOVolume*>& volumes);
void updateAnimations();

View File

@ -167,6 +167,7 @@ void LLDrawable::unload()
}
facep->clearState(LLFace::RIGGED);
}
pVVol->markForUpdate(TRUE);
}
@ -955,9 +956,7 @@ void LLDrawable::updateDistance(LLCamera& camera, bool force_update)
pos = LLVector3(getPositionGroup().getF32ptr());
}
pos -= camera.getOrigin();
pos -= camera.getOrigin();
mDistanceWRTCamera = ll_round(pos.magVec(), 0.01f);
mVObjp->updateLOD();
}
@ -1508,10 +1507,7 @@ void LLSpatialBridge::setVisible(LLCamera& camera_in, std::vector<LLDrawable*>*
LLVOAvatar* avatarp = (LLVOAvatar*) objparent;
if (avatarp->isVisible())
{
// <FS:Ansariel> Fix LL impostor hacking
//impostor = objparent->isAvatar() && ((LLVOAvatar*) objparent)->isImpostor();
impostor = objparent->isAvatar() && avatarp->isImpostor() && !avatarp->needsImpostorUpdate();
// </FS:Ansariel>
impostor = objparent->isAvatar() && !LLPipeline::sImpostorRender && ((LLVOAvatar*) objparent)->isImpostor();
loaded = objparent->isAvatar() && ((LLVOAvatar*) objparent)->isFullyLoaded();
}
else
@ -1595,16 +1591,14 @@ void LLSpatialBridge::updateDistance(LLCamera& camera_in, bool force_update)
if (mDrawable->getVObj())
{
if (mDrawable->getVObj()->isAttachment())
// Don't update if we are part of impostor, unles it's an impostor pass
if (!LLPipeline::sImpostorRender && mDrawable->getVObj()->isAttachment())
{
LLDrawable* parent = mDrawable->getParent();
if (parent && parent->getVObj())
{
LLVOAvatar* av = parent->getVObj()->asAvatar();
// <FS:Ansariel> Fix LL impostor hacking
//if (av && av->isImpostor())
if (av && av->isImpostor() && !av->needsImpostorUpdate())
// </FS:Ansariel>
if (av && av->isImpostor())
{
return;
}

View File

@ -459,7 +459,7 @@ void LLDrawPoolAvatar::beginShadowPass(S32 pass)
{
sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
}
if ((sShaderLevel > 0)) // for hardware blending
{
sRenderingSkinned = TRUE;
@ -479,7 +479,7 @@ void LLDrawPoolAvatar::beginShadowPass(S32 pass)
{
sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
}
if ((sShaderLevel > 0)) // for hardware blending
{
sRenderingSkinned = TRUE;
@ -579,15 +579,12 @@ void LLDrawPoolAvatar::renderShadow(S32 pass)
{
return;
}
BOOL impostor = avatarp->isImpostor();
if (impostor
// <FS:Ansariel> Fix LL impostor hacking; No shadow for impostors
//&& LLVOAvatar::AV_DO_NOT_RENDER != avatarp->getVisualMuteSettings()
//&& LLVOAvatar::AV_ALWAYS_RENDER != avatarp->getVisualMuteSettings())
)
// </FS:Ansariel>
LLVOAvatar::AvatarOverallAppearance oa = avatarp->getOverallAppearance();
BOOL impostor = !LLPipeline::sImpostorRender && avatarp->isImpostor();
if (oa == LLVOAvatar::AOA_INVISIBLE ||
(impostor && oa == LLVOAvatar::AOA_JELLYDOLL))
{
// No shadows for jellydolled or invisible avs.
return;
}
@ -1477,7 +1474,7 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
return;
}
LLVOAvatar *avatarp;
LLVOAvatar *avatarp = NULL;
if (single_avatar)
{
@ -1607,14 +1604,12 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
return;
}
BOOL impostor = avatarp->isImpostor() && !single_avatar;
BOOL impostor = !LLPipeline::sImpostorRender && avatarp->isImpostor() && !single_avatar;
// <FS:Ansariel> Fix LL impostor hacking; Don't render impostored avatars unless it needs an update
//if (( avatarp->isInMuteList()
// || impostor
// || (LLVOAvatar::AV_DO_NOT_RENDER == avatarp->getVisualMuteSettings() && !avatarp->needsImpostorUpdate()) ) && pass != 0)
if (impostor && !avatarp->needsImpostorUpdate() && pass != 0)
// </FS:Ansariel>
if (( /*avatarp->isInMuteList() // <FS:Ansariel> Partially undo MAINT-5700: Draw imposter for muted avatars
||*/ impostor
|| (LLVOAvatar::AOA_NORMAL != avatarp->getOverallAppearance() && !avatarp->needsImpostorUpdate()) ) && pass != 0)
// || (LLVOAvatar::AV_DO_NOT_RENDER == avatarp->getVisualMuteSettings() && !avatarp->needsImpostorUpdate()) ) && pass != 0)
{ //don't draw anything but the impostor for impostored avatars
return;
}
@ -1624,6 +1619,13 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
return;
}
LLVOAvatar *attached_av = avatarp->getAttachedAvatar();
if (attached_av && LLVOAvatar::AOA_NORMAL != attached_av->getOverallAppearance())
{
// Animesh attachment of a jellydolled or invisible parent - don't show
return;
}
if (pass == 0)
{
if (!LLPipeline::sReflectionRender)
@ -1631,10 +1633,8 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
LLVOAvatar::sNumVisibleAvatars++;
}
// <FS:Ansariel> Fix LL impostor hacking
//if (impostor || (LLVOAvatar::AV_DO_NOT_RENDER == avatarp->getVisualMuteSettings() && !avatarp->needsImpostorUpdate()))
if (impostor && !avatarp->needsImpostorUpdate())
// </FS:Ansariel>
// if (impostor || (LLVOAvatar::AV_DO_NOT_RENDER == avatarp->getVisualMuteSettings() && !avatarp->needsImpostorUpdate()))
if (impostor || (LLVOAvatar::AOA_NORMAL != avatarp->getOverallAppearance() && !avatarp->needsImpostorUpdate()))
{
if (LLPipeline::sRenderDeferred && !LLPipeline::sReflectionRender && avatarp->mImpostor.isComplete())
{
@ -1855,8 +1855,8 @@ bool LLDrawPoolAvatar::getRiggedGeometry(
}
// </FS:ND>
face->setGeomIndex(0);
face->setIndicesIndex(0);
face->setGeomIndex(0);
face->setIndicesIndex(0);
if (face->getTextureIndex() != FACE_DO_NOT_BATCH_TEXTURES)
{

View File

@ -2487,7 +2487,7 @@ void LLAvatarComplexityControls::setIndirectMaxNonImpostors()
{
U32 max_non_impostors = gSavedSettings.getU32("RenderAvatarMaxNonImpostors");
// for this one, we just need to make zero, which means off, the max value of the slider
U32 indirect_max_non_impostors = (0 == max_non_impostors) ? LLVOAvatar::IMPOSTORS_OFF : max_non_impostors;
U32 indirect_max_non_impostors = (0 == max_non_impostors) ? LLVOAvatar::NON_IMPOSTORS_MAX_SLIDER : max_non_impostors;
gSavedSettings.setU32("IndirectMaxNonImpostors", indirect_max_non_impostors);
}
@ -3178,7 +3178,7 @@ void LLFloaterPreference::updateMaxNonImpostors()
LLSliderCtrl* ctrl = getChild<LLSliderCtrl>("IndirectMaxNonImpostors",true);
U32 value = ctrl->getValue().asInteger();
if (0 == value || LLVOAvatar::IMPOSTORS_OFF <= value)
if (0 == value || LLVOAvatar::NON_IMPOSTORS_MAX_SLIDER <= value)
{
value=0;
}
@ -3203,7 +3203,7 @@ void LLFloaterPreference::updateMaxNonImpostorsLabel(const LLSD& newvalue)
{
U32 value = newvalue.asInteger();
if (0 == value || LLVOAvatar::IMPOSTORS_OFF <= value)
if (0 == value || LLVOAvatar::NON_IMPOSTORS_MAX_SLIDER <= value)
{
value=0;
}
@ -3254,7 +3254,7 @@ void LLFloaterPreferenceGraphicsAdvanced::updateMaxNonImpostors()
LLSliderCtrl* ctrl = getChild<LLSliderCtrl>("IndirectMaxNonImpostors",true);
U32 value = ctrl->getValue().asInteger();
if (0 == value || LLVOAvatar::IMPOSTORS_OFF <= value)
if (0 == value || LLVOAvatar::NON_IMPOSTORS_MAX_SLIDER <= value)
{
value=0;
}

View File

@ -3921,6 +3921,7 @@ class LLObjectMute : public view_listener_t
// [/RLVa:KB]
avatar->mNeedsImpostorUpdate = TRUE;
avatar->mLastImpostorUpdateReason = 9;
LLNameValue *firstname = avatar->getNVPair("FirstName");

View File

@ -136,7 +136,7 @@ void LLViewerPartSourceScript::update(const F32 dt)
{
mOwnerAvatarp = find_avatar(mOwnerUUID);
}
if (mOwnerAvatarp.notNull() && LLVOAvatar::AV_DO_NOT_RENDER == mOwnerAvatarp->getVisualMuteSettings())
if (mOwnerAvatarp.notNull() && LLVOAvatar::AOA_NORMAL != mOwnerAvatarp->getOverallAppearance())
{
return;
}

View File

@ -4162,11 +4162,10 @@ BOOL LLViewerShaderMgr::loadShadersWindLight()
gRlvSphereProgram.mName = "RLVa Sphere Post Processing Shader";
gRlvSphereProgram.mShaderFiles.clear();
gRlvSphereProgram.mShaderFiles.push_back(make_pair("deferred/rlvV.glsl", GL_VERTEX_SHADER_ARB));
#ifndef LL_DARWIN
gRlvSphereProgram.mShaderFiles.push_back(make_pair("deferred/rlvF.glsl", GL_FRAGMENT_SHADER_ARB));
#else
gRlvSphereProgram.mShaderFiles.push_back(make_pair("deferred/rlvFMac.glsl", GL_FRAGMENT_SHADER_ARB));
#endif
if (gGLManager.mGLVersion >= 4.5f)
gRlvSphereProgram.mShaderFiles.push_back(make_pair("deferred/rlvF.glsl", GL_FRAGMENT_SHADER_ARB));
else
gRlvSphereProgram.mShaderFiles.push_back(make_pair("deferred/rlvFLegacy.glsl", GL_FRAGMENT_SHADER_ARB));
gRlvSphereProgram.mShaderLevel = mShaderLevel[SHADER_WINDLIGHT];
success = gRlvSphereProgram.createShader(NULL, NULL);
}

View File

@ -5949,7 +5949,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
{
// <FS:Ansariel> FIRE-15667: 24bit depth maps
//U32 color_fmt = type == LLSnapshotModel::SNAPSHOT_TYPE_DEPTH ? GL_DEPTH_COMPONENT : GL_RGBA;
U32 color_fmt = (type == LLSnapshotModel::SNAPSHOT_TYPE_DEPTH || LLSnapshotModel::SNAPSHOT_TYPE_DEPTH24) ? GL_DEPTH_COMPONENT : GL_RGBA;
U32 color_fmt = (type == LLSnapshotModel::SNAPSHOT_TYPE_DEPTH || type == LLSnapshotModel::SNAPSHOT_TYPE_DEPTH24) ? GL_DEPTH_COMPONENT : GL_RGBA;
// </FS:Ansariel>
if (scratch_space.allocate(image_width, image_height, color_fmt, true, true))
{

File diff suppressed because it is too large Load Diff

View File

@ -91,6 +91,7 @@ class LLVOAvatar :
public:
friend class LLVOAvatarSelf;
friend class LLAvatarCheckImpostorMode;
/********************************************************************************
** **
@ -132,6 +133,7 @@ protected:
public:
/*virtual*/ void updateGL();
/*virtual*/ LLVOAvatar* asAvatar();
virtual U32 processUpdateMessage(LLMessageSystem *mesgsys,
void **user_data,
U32 block_num,
@ -257,6 +259,11 @@ public:
virtual bool isControlAvatar() const { return mIsControlAvatar; } // True if this avatar is a control av (no associated user)
virtual bool isUIAvatar() const { return mIsUIAvatar; } // True if this avatar is a supplemental av used in some UI views (no associated user)
// If this is an attachment, return the avatar it is attached to. Otherwise NULL.
virtual const LLVOAvatar *getAttachedAvatar() const { return NULL; }
virtual LLVOAvatar *getAttachedAvatar() { return NULL; }
private: //aligned members
LL_ALIGN_16(LLVector4a mImpostorExtents[2]);
@ -267,7 +274,8 @@ public:
void updateAppearanceMessageDebugText();
void updateAnimationDebugText();
virtual void updateDebugText();
virtual BOOL updateCharacter(LLAgent &agent);
virtual bool computeNeedsUpdate();
virtual bool updateCharacter(LLAgent &agent);
void updateFootstepSounds();
void computeUpdatePeriod();
void updateOrientation(LLAgent &agent, F32 speed, F32 delta_time);
@ -329,12 +337,12 @@ public:
public:
static S32 sRenderName;
static BOOL sRenderGroupTitles;
static const U32 IMPOSTORS_OFF; /* Must equal the maximum allowed the RenderAvatarMaxNonImpostors
* slider in panel_preferences_graphics1.xml */
static U32 sMaxNonImpostors; //(affected by control "RenderAvatarMaxNonImpostors")
static F32 sRenderDistance; //distance at which avatars will render.
static const U32 NON_IMPOSTORS_MAX_SLIDER; /* Must equal the maximum allowed the RenderAvatarMaxNonImpostors
* slider in panel_preferences_graphics1.xml */
static U32 sMaxNonImpostors; // affected by control "RenderAvatarMaxNonImpostors"
static bool sLimitNonImpostors; // use impostors for far away avatars
static F32 sRenderDistance; // distance at which avatars will render.
static BOOL sShowAnimationDebug; // show animation debug info
static bool sUseImpostors; //use impostors for far away avatars
static BOOL sShowFootPlane; // show foot collision plane reported by server
static BOOL sShowCollisionVolumes; // show skeletal collision volumes
static BOOL sVisibleInFirstPerson;
@ -425,6 +433,7 @@ public:
void initAttachmentPoints(bool ignore_hud_joints = false);
/*virtual*/ void buildCharacter();
void resetVisualParams();
void applyDefaultParams();
void resetSkeleton(bool reset_animations);
LLVector3 mCurRootToHeadOffset;
@ -445,12 +454,15 @@ public:
public:
U32 renderImpostor(LLColor4U color = LLColor4U(255,255,255,255), S32 diffuse_channel = 0);
bool isVisuallyMuted();
bool isInMuteList();
bool isInMuteList() const;
// [RLVa:KB] - Checked: RLVa-2.2 (@setcam_avdist)
bool isRlvSilhouette();
// [/RLVa:KB]
void forceUpdateVisualMuteSettings();
// Visual Mute Setting is an input. Does not necessarily determine
// what the avatar looks like, because it interacts with other
// settings like muting, complexity threshold. Should be private or protected.
enum VisualMuteSettings
{
AV_RENDER_NORMALLY = 0,
@ -458,11 +470,38 @@ public:
AV_ALWAYS_RENDER = 2
};
void setVisualMuteSettings(VisualMuteSettings set);
protected:
// If you think you need to access this outside LLVOAvatar, you probably want getOverallAppearance()
// [RLVa:KB] - Checked: RLVa-2.2 (@setcam_avdist)
VisualMuteSettings getVisualMuteSettings() { return (!isRlvSilhouette()) ? mVisuallyMuteSetting : AV_DO_NOT_RENDER; };
// [/RLVa:KB]
// VisualMuteSettings getVisualMuteSettings() { return mVisuallyMuteSetting; };
public:
// Overall Appearance is an output. Depending on whether the
// avatar is blocked/muted, whether it exceeds the complexity
// threshold, etc, avatar will want to be displayed in one of
// these ways. Rendering code that wants to know how to display an
// avatar should be looking at this value, NOT the visual mute
// settings
enum AvatarOverallAppearance
{
AOA_NORMAL,
AOA_JELLYDOLL,
AOA_INVISIBLE
};
AvatarOverallAppearance getOverallAppearance() const;
void setOverallAppearanceNormal();
void setOverallAppearanceJellyDoll();
void setOverallAppearanceInvisible();
void updateOverallAppearance();
void updateOverallAppearanceAnimations();
std::set<LLUUID> mJellyAnims;
U32 renderRigid();
U32 renderSkinned();
F32 getLastSkinTime() { return mLastSkinTime; }
@ -475,7 +514,8 @@ public:
static void restoreGL();
S32 mSpecialRenderMode; // special lighting
private:
private:
AvatarOverallAppearance mOverallAppearance;
F32 mAttachmentSurfaceArea; //estimated surface area of attachments
U32 mAttachmentVisibleTriangleCount;
F32 mAttachmentEstTriangleCount;
@ -492,8 +532,8 @@ public:
mutable bool mVisualComplexityStale;
U32 mReportedVisualComplexity; // from other viewers through the simulator
bool mCachedInMuteList;
F64 mCachedMuteListUpdateTime;
mutable bool mCachedInMuteList;
mutable F64 mCachedMuteListUpdateTime;
// [RLVa:KB] - Checked: RLVa-2.2 (@setcam_avdist)
mutable bool mCachedIsRlvSilhouette = false;
mutable F64 mCachedRlvSilhouetteUpdateTime = 0.f;
@ -550,7 +590,7 @@ private:
//--------------------------------------------------------------------
public:
virtual BOOL isImpostor();
BOOL shouldImpostor(const U32 rank_factor = 1) const;
BOOL shouldImpostor(const F32 rank_factor = 1.0);
BOOL needsImpostorUpdate() const;
const LLVector3& getImpostorOffset() const;
const LLVector2& getImpostorDim() const;
@ -561,6 +601,7 @@ public:
static void updateImpostors();
LLRenderTarget mImpostor;
BOOL mNeedsImpostorUpdate;
S32 mLastImpostorUpdateReason;
F32SecondsImplicit mLastImpostorUpdateFrameTime;
const LLVector3* getLastAnimExtents() const { return mLastAnimExtents; }
void setNeedsExtentUpdate(bool val) { mNeedsExtentUpdate = val; }

View File

@ -991,7 +991,7 @@ LLVOAvatarSelf::~LLVOAvatarSelf()
*********************************************************************************/
// virtual
BOOL LLVOAvatarSelf::updateCharacter(LLAgent &agent)
bool LLVOAvatarSelf::updateCharacter(LLAgent &agent)
{
// update screen joint size
if (mScreenp)

View File

@ -135,7 +135,7 @@ public:
// Updates
//--------------------------------------------------------------------
public:
/*virtual*/ BOOL updateCharacter(LLAgent &agent);
/*virtual*/ bool updateCharacter(LLAgent &agent);
/*virtual*/ void idleUpdateTractorBeam();
bool checkStuckAppearance();

View File

@ -3235,12 +3235,10 @@ void LLPipeline::markVisible(LLDrawable *drawablep, LLCamera& camera)
if (vobj) // this test may not be needed, see above
{
LLVOAvatar* av = vobj->asAvatar();
// <FS:Ansariel> Fix LL impostor hacking; Don't render impostored avatars unless it needs an update
//if (av && (av->isImpostor()
// || av->isInMuteList()
// || (LLVOAvatar::AV_DO_NOT_RENDER == av->getVisualMuteSettings() && !av->needsImpostorUpdate()) ))
if (av && av->isImpostor() && !av->needsImpostorUpdate())
// </FS:Ansariel>
if (av &&
((!sImpostorRender && av->isImpostor()) //ignore impostor flag during impostor pass
//|| av->isInMuteList() // <FS:Ansariel> Partially undo MAINT-5700: Draw imposter for muted avatars
|| (LLVOAvatar::AOA_JELLYDOLL == av->getOverallAppearance() && !av->needsImpostorUpdate()) ))
{
return;
}
@ -5018,6 +5016,7 @@ void LLPipeline::addTrianglesDrawn(S32 index_count, U32 render_type)
}
record(sStatBatchSize, count);
add(LLStatViewer::TRIANGLES_DRAWN, LLUnits::Triangles::fromValue(count));
if (LLPipeline::sRenderFrameTest)
@ -11271,7 +11270,6 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
{
LL_RECORD_BLOCK_TIME(FTM_IMPOSTOR_MARK_VISIBLE);
markVisible(avatar->mDrawable, *viewer_camera);
LLVOAvatar::sUseImpostors = false; // @TODO ???
LLVOAvatar::attachment_map_t::iterator iter;
for (iter = avatar->mAttachmentPoints.begin();
@ -11524,7 +11522,6 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
avatar->setImpostorDim(tdim);
LLVOAvatar::sUseImpostors = (0 != LLVOAvatar::sMaxNonImpostors);
sUseOcclusion = occlusion;
sReflectionRender = false;
sImpostorRender = false;

View File

@ -2266,7 +2266,7 @@ void FloaterQuickPrefs::updateMaxNonImpostors(const LLSD& newvalue)
// Responsible for fixing the setting RenderAvatarMaxNonImpostors
U32 value = newvalue.asInteger();
if (0 == value || LLVOAvatar::IMPOSTORS_OFF <= value)
if (0 == value || LLVOAvatar::NON_IMPOSTORS_MAX_SLIDER <= value)
{
value=0;
}

View File

@ -3667,6 +3667,9 @@ Ihr Outfit wurde in [TIME] Sekunden gebacken.
Nach [TIME] Sekunden wurde eine Aktualisierung Ihres Aussehens gesendet.
[STATUS]
</notification>
<notification name="AvatarRezSelfBakeForceUpdateNotification">
Der Viewer hat erkannt, dass Sie möglicherweise als Wolke dargestellt werden und versucht, das Problem automatisch zu korrigieren.
</notification>
<notification name="AvatarRezCloudNotification">
(Seit [EXISTENCE] Sekunden inworld )
Avatar &apos;[NAME]&apos; wird als Wolke angezeigt.

View File

@ -54,8 +54,8 @@
</text>
<button label="[USEDEFAULT]" name="btn_usedefault"/>
<button label="Inventar verwenden" name="btn_select_inventory"/>
<button label="Anpassen" name="btn_edit"/>
<check_box label="Parzelleneig. können Umg. übersteuern" name="chk_allow_override"/>
<button label="Tageszyklus anpassen" name="btn_edit"/>
<check_box label="Parzellenbesitzer können übersteuern" name="chk_allow_override"/>
</layout_panel>
<layout_panel name="pnl_environment_length">
<text name="day_settings_label">

View File

@ -3,7 +3,8 @@
<floater
legacy_header_height="0"
header_height="0"
bg_alpha_image_overlay="LtGray_50"
bg_opaque_image="Window_NoTitle_Foreground"
bg_alpha_image="Window_NoTitle_Foreground"
can_dock="false"
can_minimize="false"
can_resize="true"

View File

@ -9513,6 +9513,13 @@ You finished baking your outfit after [TIME] seconds.
You sent out an update of your appearance after [TIME] seconds.
[STATUS]
</notification>
<notification
icon="notifytip.tga"
name="AvatarRezSelfBakeForceUpdateNotification"
type="notifytip">
The viewer has detected that you may appear as a cloud and is attempting to fix this automatically.
</notification>
<notification
icon="notifytip.tga"

View File

@ -772,7 +772,7 @@
<combo_box.item
label="24 Hour incl. Timezone"
name="24_Hour_TZ"
value="12 Hour TZ"/>
value="24 Hour TZ"/>
<combo_box.item
label="24 Hour incl. Seconds &amp; Timezone"
name="24_Hour_TZ_Seconds"

View File

@ -113,7 +113,7 @@
layout="topleft"
height="23"
label="[USEDEFAULT]"
width="120"
width="200"
name="btn_usedefault"/>
<button
follows="top|left"
@ -122,7 +122,7 @@
layout="topleft"
height="23"
label="Use Inventory"
width="120"
width="200"
name="btn_select_inventory"/>
<button
follows="top|left"
@ -130,12 +130,12 @@
left_delta="0"
layout="topleft"
height="23"
label="Customize"
width="120"
label="Customize Day Cycle"
width="200"
name="btn_edit"/>
<check_box
height="20"
label="Parcel Owners May Override Environment"
label="Parcel Owners May Override"
layout="topleft"
left_delta="0"
top_pad="10"

View File

@ -117,7 +117,7 @@
<menu label="Import wielu plików" name="WL Bulk Import">
<menu_item_call label="Dni..." name="WL Bulk Import Days" />
<menu_item_call label="Nieba..." name="WL Bulk Import Skies" />
<menu_item_call label="Woda..." name="WL Bulk Import Water" />
<menu_item_call label="Wody..." name="WL Bulk Import Water" />
</menu>
</menu>
<!-- <menu label="Edytor otoczenia" name="Environment Editor">

View File

@ -3535,6 +3535,9 @@ Skończono wstępne przetwarzanie stroju po [TIME] sekundach.
Wysłano aktualizację wyglądu po [TIME] sekundach.
[STATUS]
</notification>
<notification name="AvatarRezSelfBakeForceUpdateNotification">
Przeglądarka wykryła, że możesz wyglądać jak chmurka i próbuje to automatycznie naprawić.
</notification>
<notification name="AvatarRezCloudNotification">
( [EXISTENCE] sekund w Second Life )
Awatar &apos;[NAME]&apos; stał się chmurą.

View File

@ -98,6 +98,20 @@
<check_box label="Pokaż wyszukiwarkę pozycji w menu" name="show_search_menu_check" />
<check_box label="Pokaż stan konta" name="FSShowCurrencyBalanceInStatusbar" />
<check_box label="Włącz autorozwijanie menusów przy wskazywaniu ikon na pasku" name="FSStatusBarMenuButtonPopupOnRollover" />
<text name="statusbar_timeformat_textbox">
Format czasu:
</text>
<combo_box name="FSStatusBarTimeFormat" tool_tip="Wybierz format czasu używany na pasku głównego menu.">
<combo_box.item label="Domyślny języka" name="Language" />
<combo_box.item label="12-godzinny" name="12_Hour" />
<combo_box.item label="12-godzinny z sekundami" name="12_Hour_Seconds" />
<combo_box.item label="12-godzinny ze strefą czasową" name="12_Hour_TZ" />
<combo_box.item label="12-godzinny ze strefą czasową i sekundami" name="12_Hour_TZ_Seconds" />
<combo_box.item label="24-godzinny" name="24_Hour" />
<combo_box.item label="24-godzinny z sekundami" name="24_Hour_Seconds" />
<combo_box.item label="24-godzinny ze strefą czasową" name="24_Hour_TZ" />
<combo_box.item label="24-godzinny ze strefą czasową i sekundami" name="24_Hour_TZ_Seconds" />
</combo_box>
<text name="navfav_textbox">
Paski nawigacji i ulubionych:
</text>

View File

@ -45,7 +45,7 @@
Wybierz otoczenie
</text>
<button label="Z Szafy" name="btn_select_inventory" />
<button label="Dostosuj" name="btn_edit" />
<button label="Dostosuj cykl dnia" name="btn_edit" />
<check_box label="Właściciele działek mogą zastąpić" name="chk_allow_override" />
</layout_panel>
<layout_panel name="pnl_environment_length">

View File

@ -33,6 +33,8 @@
<columns name="permanent" label="Постоянно"/>
</fs_scroll_list>
<button name="remove_btn" label="Удалить из черного списка" width="190"/>
<button name="remove_temp_btn" label="Удалить не постоянные" width="190" />
<button name="remove_temp_btn" label="Удалить не постоянные" width="170" />
<button name="play_btn" label="Проиграть звук" tool_tip="Воспроизвести выбранный звук; для воспроизведения можно выбрать только одну звуковую запись." width="120"/>
<button name="stop_btn" label="Остановить звук" tool_tip="Остановить воспроизведение текущего звука." width="120"/>
<button name="close_btn" label="Закрыть"/>
</floater>

View File

@ -102,6 +102,20 @@
<check_box label="Показать поиск в меню" name="show_search_menu_check"/>
<check_box label="Показать текущий баланс L$" name="FSShowCurrencyBalanceInStatusbar"/>
<check_box label="Включить выпадающие окна меню мыши на значках верхнего меню" name="FSStatusBarMenuButtonPopupOnRollover" width="270" />
<text name="statusbar_timeformat_textbox" width="100">
Формат времени:
</text>
<combo_box name="FSStatusBarTimeFormat" tool_tip="Выбирает формат времени, используемый в строке главного меню." width="250">
<combo_box.item label="Стандарт выбранного языка" name="Language"/>
<combo_box.item label="12 Часов" name="12_Hour"/>
<combo_box.item label="12 Часов с Секундами" name="12_Hour_Seconds"/>
<combo_box.item label="12 Часов с Часовым поясом" name="12_Hour_TZ"/>
<combo_box.item label="12 Часов с Секундами и Часовым поясом" name="12_Hour_TZ_Seconds"/>
<combo_box.item label="24 Часа" name="24_Hour"/>
<combo_box.item label="24 Часа с Секундами" name="24_Hour_Seconds"/>
<combo_box.item label="24 Часа с Часовым поясом" name="24_Hour_TZ"/>
<combo_box.item label="24 Часа с Секундами и Часовым поясом" name="24_Hour_TZ_Seconds"/>
</combo_box>
<text name="navfav_textbox">
Панель навигации и закладок:
</text>

View File

@ -136,6 +136,11 @@
<key>value</key>
<string>'[OBJECT]' было отказано в разрешении телепортировать вас из-за ограничений RLV</string>
</map>
<key>blocked_scriptdialog</key>
<map>
<key>value</key>
<string>Невозможно отобразить диалоговое окно или текстовое поле скрипта из-за ограничений RLV</string>
</map>
<key>blocked_startim</key>
<map>
<key>value</key>

View File

@ -79,15 +79,32 @@ def compare_trees(file_trees):
print "Summary:"
print summary
def dump_appearance_params(tree):
vals = []
for e in tree.getroot().iter():
if e.tag == "param":
g = int(e.get("group"))
if g in [0,3]:
vals.append("{" + e.get("id") + "," +e.get("u8") + "}")
#print e.get("id"), e.get("name"), e.get("group"), e.get("u8")
if len(vals)==253:
print ", ".join(vals)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="compare avatar XML archetype files")
parser.add_argument("--verbose", help="verbose flag", action="store_true")
parser.add_argument("--compare", help="compare flag", action="store_true")
parser.add_argument("--appearance_params", help="compare flag", action="store_true")
parser.add_argument("files", nargs="+", help="name of one or more archtype files")
args = parser.parse_args()
print "files",args.files
file_trees = [etree.parse(filename) for filename in args.files]
compare_trees(file_trees)
print args
if args.compare:
compare_trees(file_trees)
if args.appearance_params:
dump_appearance_params(file_trees[0])