From 5c7e91f62fb8d76f437a751503c4e40f0c0fedf1 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Wed, 8 Apr 2020 14:40:01 +0100 Subject: SL-12996 - replace checks of VisualMuteSettings with OverallAppearance --- indra/newview/lldrawpoolavatar.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'indra/newview/lldrawpoolavatar.cpp') diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 63abadbcf4..636e5b7366 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -559,9 +559,9 @@ void LLDrawPoolAvatar::renderShadow(S32 pass) BOOL impostor = avatarp->isImpostor(); if (impostor - && LLVOAvatar::AV_DO_NOT_RENDER != avatarp->getVisualMuteSettings() - && LLVOAvatar::AV_ALWAYS_RENDER != avatarp->getVisualMuteSettings()) + && LLVOAvatar::AOA_NORMAL != avatarp->getOverallAppearance()) { + // No shadows for jellydolled or invisible avs. return; } @@ -1387,7 +1387,8 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass) if (( avatarp->isInMuteList() || impostor - || (LLVOAvatar::AV_DO_NOT_RENDER == avatarp->getVisualMuteSettings() && !avatarp->needsImpostorUpdate()) ) && pass != 0) + || (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; } @@ -1404,7 +1405,8 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass) LLVOAvatar::sNumVisibleAvatars++; } - if (impostor || (LLVOAvatar::AV_DO_NOT_RENDER == avatarp->getVisualMuteSettings() && !avatarp->needsImpostorUpdate())) +// 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()) { -- cgit v1.3 From a9ddf20ff2c704d30ec4b4d8652da0b0775b7631 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Wed, 22 Jul 2020 17:49:45 +0100 Subject: SL-13611 - make sure impostor gets drawn for initially jellydolled avatars --- indra/newview/lldrawpoolavatar.cpp | 2 +- indra/newview/llvoavatar.cpp | 39 +++++++++++++++++--------------------- 2 files changed, 18 insertions(+), 23 deletions(-) (limited to 'indra/newview/lldrawpoolavatar.cpp') diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index e19a62625e..0fe0a637a4 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -1474,7 +1474,7 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass) return; } - LLVOAvatar *avatarp; + LLVOAvatar *avatarp = NULL; if (single_avatar) { diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index de2428436d..3156e0e724 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -4763,15 +4763,6 @@ U32 LLVOAvatar::renderSkinned() return num_indices; } - // if (!isSelf() && !isControlAvatar()) - // { - // LL_DEBUGS("Avatar") << "renderSkinned: av " << getFullname() - // << " frame " << LLFrameTimer::getFrameCount() - // << " worldPos " << mRoot->getXform()->getWorldPosition() - // << " renderpos " << getRenderPosition() - // << LL_ENDL; - // } - LLFace* face = mDrawable->getFace(0); bool needs_rebuild = !face || !face->getVertexBuffer() || mDrawable->isState(LLDrawable::REBUILD_GEOMETRY); @@ -8024,12 +8015,14 @@ BOOL LLVOAvatar::processFullyLoadedChange(bool loading) } // did our loading state "change" from last call? - // runway - why are we updating every 30 calls even if nothing has changed? + // FIXME runway - why are we updating every 30 calls even if nothing has changed? + // This causes updateLOD() to run every 30 frames, among other things. const S32 UPDATE_RATE = 30; BOOL changed = ((mFullyLoaded != mPreviousFullyLoaded) || // if the value is different from the previous call (!mFullyLoadedInitialized) || // if we've never been called before (mFullyLoadedFrameCounter % UPDATE_RATE == 0)); // every now and then issue a change + BOOL fully_loaded_changed = (mFullyLoaded != mPreviousFullyLoaded); mPreviousFullyLoaded = mFullyLoaded; mFullyLoadedInitialized = TRUE; @@ -8040,7 +8033,12 @@ BOOL LLVOAvatar::processFullyLoadedChange(bool loading) // to know about outfit switching LLAvatarRenderNotifier::getInstance()->updateNotificationState(); } - + + if (fully_loaded_changed && !isSelf() && mFullyLoaded && isImpostor()) + { + // Fix for jellydoll initially invisible + mNeedsImpostorUpdate = TRUE; + } return changed; } @@ -10187,17 +10185,10 @@ void LLVOAvatar::updateImpostors() iter != instances_copy.end(); ++iter) { LLVOAvatar* avatar = (LLVOAvatar*) *iter; - if (!avatar->isDead() && avatar->isVisible() - && ( -#ifdef JELLYDOLLS_SHOULD_IMPOSTOR - (avatar->isImpostor() || LLVOAvatar::AV_DO_NOT_RENDER == avatar->getVisualMuteSettings()) - && avatar->needsImpostorUpdate()) -#else - (avatar->isImpostor()) - && avatar->needsImpostorUpdate() - ) -#endif - ) + if (!avatar->isDead() + && avatar->isVisible() + && avatar->isImpostor() + && avatar->needsImpostorUpdate()) { avatar->calcMutedAVColor(); gPipeline.generateImpostor(avatar); @@ -10737,6 +10728,10 @@ void LLVOAvatar::updateOverallAppearance() break; } mOverallAppearance = new_overall; + if (!isSelf()) + { + mNeedsImpostorUpdate = TRUE; + } updateMeshVisibility(); } -- cgit v1.3 From 1049f15c9cbb3d9fdd3f1f8529b7ca46c5f2b7f3 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Wed, 9 Sep 2020 15:36:41 +0100 Subject: SL-13541 - don't show shadow of invisible avatars --- indra/newview/lldrawpoolavatar.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'indra/newview/lldrawpoolavatar.cpp') diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 0fe0a637a4..cc51b08cc7 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -582,10 +582,10 @@ void LLDrawPoolAvatar::renderShadow(S32 pass) { return; } - + LLVOAvatar::AvatarOverallAppearance oa = avatarp->getOverallAppearance(); BOOL impostor = avatarp->isImpostor(); - if (impostor - && LLVOAvatar::AOA_NORMAL != avatarp->getOverallAppearance()) + if (oa == LLVOAvatar::AOA_INVISIBLE || + (impostor && oa == LLVOAvatar::AOA_JELLYDOLL)) { // No shadows for jellydolled or invisible avs. return; -- cgit v1.3 From 9618df484b7659ed84285a9c16939b384dbe616c Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Fri, 16 Oct 2020 20:47:00 +0300 Subject: SL-14130 Jellydolls have wrong appearance when non-impostors is uncapped --- indra/newview/lldrawable.cpp | 5 +++-- indra/newview/lldrawpoolavatar.cpp | 4 ++-- indra/newview/llvoavatar.cpp | 14 +++++++------- indra/newview/llvoavatar.h | 4 ++-- indra/newview/pipeline.cpp | 7 ++++--- indra/newview/pipeline.h | 1 + 6 files changed, 19 insertions(+), 16 deletions(-) (limited to 'indra/newview/lldrawpoolavatar.cpp') diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp index 2219f20272..c65cfe91be 100644 --- a/indra/newview/lldrawable.cpp +++ b/indra/newview/lldrawable.cpp @@ -1485,7 +1485,7 @@ void LLSpatialBridge::setVisible(LLCamera& camera_in, std::vector* LLVOAvatar* avatarp = (LLVOAvatar*) objparent; if (avatarp->isVisible()) { - impostor = objparent->isAvatar() && ((LLVOAvatar*) objparent)->isImpostor(); + impostor = objparent->isAvatar() && !LLPipeline::sImpostorRenderAVVO && ((LLVOAvatar*) objparent)->isImpostor(); loaded = objparent->isAvatar() && ((LLVOAvatar*) objparent)->isFullyLoaded(); } else @@ -1569,7 +1569,8 @@ 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::sImpostorRenderAVVO && mDrawable->getVObj()->isAttachment()) { LLDrawable* parent = mDrawable->getParent(); if (parent && parent->getVObj()) diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 11f7809574..8abec252a1 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -574,7 +574,7 @@ void LLDrawPoolAvatar::renderShadow(S32 pass) return; } LLVOAvatar::AvatarOverallAppearance oa = avatarp->getOverallAppearance(); - BOOL impostor = avatarp->isImpostor(); + BOOL impostor = !LLPipeline::sImpostorRenderAVVO && avatarp->isImpostor(); if (oa == LLVOAvatar::AOA_INVISIBLE || (impostor && oa == LLVOAvatar::AOA_JELLYDOLL)) { @@ -1511,7 +1511,7 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass) return; } - BOOL impostor = avatarp->isImpostor() && !single_avatar; + BOOL impostor = !LLPipeline::sImpostorRenderAVVO && avatarp->isImpostor() && !single_avatar; if (( avatarp->isInMuteList() || impostor diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index f45c3c86a1..9ac52120d3 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -2763,7 +2763,7 @@ void LLVOAvatar::idleUpdateMisc(bool detailed_update) BOOL visible = isVisible() || mNeedsAnimUpdate; // update attachments positions - if (detailed_update || !sUseImpostors) + if (detailed_update) { LL_RECORD_BLOCK_TIME(FTM_ATTACHMENT_UPDATE); for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); @@ -3608,7 +3608,7 @@ bool LLVOAvatar::isVisuallyMuted() { muted = true; } - else + else if (sUseImpostors) { muted = isTooComplex(); } @@ -3995,7 +3995,7 @@ void LLVOAvatar::computeUpdatePeriod() && isVisible() && (!isSelf() || visually_muted) && !isUIAvatar() - && sUseImpostors + && (sUseImpostors || visually_muted) && !mNeedsAnimUpdate && !sFreezeCounter) { @@ -10050,7 +10050,7 @@ BOOL LLVOAvatar::updateLOD() return FALSE; } - if (isImpostor() && 0 != mDrawable->getNumFaces() && mDrawable->getFace(0)->hasGeometry()) + if (!LLPipeline::sImpostorRenderAVVO && isImpostor() && 0 != mDrawable->getNumFaces() && mDrawable->getFace(0)->hasGeometry()) { return TRUE; } @@ -10257,12 +10257,12 @@ void LLVOAvatar::updateImpostors() // virtual BOOL LLVOAvatar::isImpostor() { - return sUseImpostors && (isVisuallyMuted() || (mUpdatePeriod >= IMPOSTOR_PERIOD)) ? TRUE : FALSE; + return (isVisuallyMuted() || (sUseImpostors && (mUpdatePeriod >= IMPOSTOR_PERIOD))) ? TRUE : FALSE; } -BOOL LLVOAvatar::shouldImpostor(const U32 rank_factor) const +BOOL LLVOAvatar::shouldImpostor(const U32 rank_factor) { - return (!isSelf() && sUseImpostors && mVisibilityRank > (sMaxNonImpostors * rank_factor)); + return (!isSelf() && (sUseImpostors || isVisuallyMuted()) && mVisibilityRank > (sMaxNonImpostors * rank_factor)); } BOOL LLVOAvatar::needsImpostorUpdate() const diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 8d23d955e3..af65e5750f 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -320,7 +320,7 @@ public: static U32 sMaxNonImpostors; //(affected by control "RenderAvatarMaxNonImpostors") 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 sUseImpostors; //use impostors for far away avatars, impostors are always on for 'mute' list static BOOL sShowFootPlane; // show foot collision plane reported by server static BOOL sShowCollisionVolumes; // show skeletal collision volumes static BOOL sVisibleInFirstPerson; @@ -554,7 +554,7 @@ private: //-------------------------------------------------------------------- public: virtual BOOL isImpostor(); - BOOL shouldImpostor(const U32 rank_factor = 1) const; + BOOL shouldImpostor(const U32 rank_factor = 1); BOOL needsImpostorUpdate() const; const LLVector3& getImpostorOffset() const; const LLVector2& getImpostorDim() const; diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 82ae99309d..3fa40c4ecf 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -340,6 +340,7 @@ bool LLPipeline::sRenderGlow = false; bool LLPipeline::sReflectionRender = false; bool LLPipeline::sDistortionRender = false; bool LLPipeline::sImpostorRender = false; +bool LLPipeline::sImpostorRenderAVVO = false; bool LLPipeline::sImpostorRenderAlphaDepthPass = false; bool LLPipeline::sUnderWaterRender = false; bool LLPipeline::sTextureBindTest = false; @@ -3076,7 +3077,7 @@ void LLPipeline::markVisible(LLDrawable *drawablep, LLCamera& camera) { LLVOAvatar* av = vobj->asAvatar(); if (av && - (av->isImpostor() + ((!sImpostorRenderAVVO && av->isImpostor()) //ignore impostor flag during impostor pass || av->isInMuteList() || (LLVOAvatar::AOA_JELLYDOLL == av->getOverallAppearance() && !av->needsImpostorUpdate()) )) { @@ -10920,7 +10921,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar) { LL_RECORD_BLOCK_TIME(FTM_IMPOSTOR_MARK_VISIBLE); markVisible(avatar->mDrawable, *viewer_camera); - LLVOAvatar::sUseImpostors = false; // @TODO ??? + sImpostorRenderAVVO = true; LLVOAvatar::attachment_map_t::iterator iter; for (iter = avatar->mAttachmentPoints.begin(); @@ -11160,7 +11161,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar) avatar->setImpostorDim(tdim); - LLVOAvatar::sUseImpostors = (0 != LLVOAvatar::sMaxNonImpostors); + sImpostorRenderAVVO = false; sUseOcclusion = occlusion; sReflectionRender = false; sImpostorRender = false; diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index 600bdd9d06..397c5ef9ff 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -590,6 +590,7 @@ public: static bool sReflectionRender; static bool sDistortionRender; static bool sImpostorRender; + static bool sImpostorRenderAVVO; static bool sImpostorRenderAlphaDepthPass; static bool sUnderWaterRender; static bool sRenderGlow; -- cgit v1.3 From caea7260c73eb606bb8b349debadf6682dbdb3a8 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Tue, 20 Oct 2020 13:51:58 +0100 Subject: SL-14142 - impostor management cleanup --- indra/llappearance/llavatarappearancedefines.cpp | 1 - indra/llappearance/llavatarappearancedefines.h | 1 - indra/newview/lldrawable.cpp | 4 +-- indra/newview/lldrawpoolavatar.cpp | 4 +-- indra/newview/llfloaterpreference.cpp | 4 +-- indra/newview/llvoavatar.cpp | 32 +++++++++++++----------- indra/newview/llvoavatar.h | 6 ++--- indra/newview/pipeline.cpp | 5 +--- indra/newview/pipeline.h | 1 - 9 files changed, 27 insertions(+), 31 deletions(-) (limited to 'indra/newview/lldrawpoolavatar.cpp') diff --git a/indra/llappearance/llavatarappearancedefines.cpp b/indra/llappearance/llavatarappearancedefines.cpp index c72943bb82..0109ff7dd7 100644 --- a/indra/llappearance/llavatarappearancedefines.cpp +++ b/indra/llappearance/llavatarappearancedefines.cpp @@ -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; diff --git a/indra/llappearance/llavatarappearancedefines.h b/indra/llappearance/llavatarappearancedefines.h index 5663d24293..aae56d7bd4 100644 --- a/indra/llappearance/llavatarappearancedefines.h +++ b/indra/llappearance/llavatarappearancedefines.h @@ -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; diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp index c65cfe91be..5034bd1c5e 100644 --- a/indra/newview/lldrawable.cpp +++ b/indra/newview/lldrawable.cpp @@ -1485,7 +1485,7 @@ void LLSpatialBridge::setVisible(LLCamera& camera_in, std::vector* LLVOAvatar* avatarp = (LLVOAvatar*) objparent; if (avatarp->isVisible()) { - impostor = objparent->isAvatar() && !LLPipeline::sImpostorRenderAVVO && ((LLVOAvatar*) objparent)->isImpostor(); + impostor = objparent->isAvatar() && !LLPipeline::sImpostorRender && ((LLVOAvatar*) objparent)->isImpostor(); loaded = objparent->isAvatar() && ((LLVOAvatar*) objparent)->isFullyLoaded(); } else @@ -1570,7 +1570,7 @@ void LLSpatialBridge::updateDistance(LLCamera& camera_in, bool force_update) if (mDrawable->getVObj()) { // Don't update if we are part of impostor, unles it's an impostor pass - if (!LLPipeline::sImpostorRenderAVVO && mDrawable->getVObj()->isAttachment()) + if (!LLPipeline::sImpostorRender && mDrawable->getVObj()->isAttachment()) { LLDrawable* parent = mDrawable->getParent(); if (parent && parent->getVObj()) diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 8abec252a1..ff036e1934 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -574,7 +574,7 @@ void LLDrawPoolAvatar::renderShadow(S32 pass) return; } LLVOAvatar::AvatarOverallAppearance oa = avatarp->getOverallAppearance(); - BOOL impostor = !LLPipeline::sImpostorRenderAVVO && avatarp->isImpostor(); + BOOL impostor = !LLPipeline::sImpostorRender && avatarp->isImpostor(); if (oa == LLVOAvatar::AOA_INVISIBLE || (impostor && oa == LLVOAvatar::AOA_JELLYDOLL)) { @@ -1511,7 +1511,7 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass) return; } - BOOL impostor = !LLPipeline::sImpostorRenderAVVO && avatarp->isImpostor() && !single_avatar; + BOOL impostor = !LLPipeline::sImpostorRender && avatarp->isImpostor() && !single_avatar; if (( avatarp->isInMuteList() || impostor diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 96094dcf14..c1f1fc5783 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -1473,7 +1473,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); } @@ -1973,7 +1973,7 @@ void LLFloaterPreferenceGraphicsAdvanced::updateMaxNonImpostors() LLSliderCtrl* ctrl = getChild("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; } diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 6ade882258..e2a42a5dd3 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -4029,7 +4029,7 @@ void LLVOAvatar::computeUpdatePeriod() // impostor camera near clip plane mUpdatePeriod = 1; } - else if ( shouldImpostor(4) ) + else if ( shouldImpostor(4.0) ) { //background avatars are REALLY slow updating impostors mUpdatePeriod = 16; } @@ -4038,7 +4038,7 @@ void LLVOAvatar::computeUpdatePeriod() // Don't update cloud avatars too often mUpdatePeriod = 8; } - else if ( shouldImpostor(3) ) + else if ( shouldImpostor(3.0) ) { //back 25% of max visible avatars are slow updating impostors mUpdatePeriod = 8; } @@ -4046,7 +4046,7 @@ void LLVOAvatar::computeUpdatePeriod() { // stuff in between gets an update period based on pixel area mUpdatePeriod = llclamp((S32) sqrtf(impostor_area*4.f/mImpostorPixelArea), 2, 8); } - else + else // shouldImpostor() at some rank in range (1.0-3.0) { //nearby avatars, update the impostors more frequently. mUpdatePeriod = 4; @@ -10063,7 +10063,7 @@ BOOL LLVOAvatar::updateLOD() return FALSE; } - if (!LLPipeline::sImpostorRenderAVVO && isImpostor() && 0 != mDrawable->getNumFaces() && mDrawable->getFace(0)->hasGeometry()) + if (!LLPipeline::sImpostorRender && isImpostor() && 0 != mDrawable->getNumFaces() && mDrawable->getFace(0)->hasGeometry()) { return TRUE; } @@ -10253,7 +10253,6 @@ void LLVOAvatar::updateImpostors() for (std::vector::iterator iter = instances_copy.begin(); iter != instances_copy.end(); ++iter) { - // FIXME state spaghetti! Can we just use shouldImpostor() here? LLVOAvatar* avatar = (LLVOAvatar*) *iter; if (!avatar->isDead() && avatar->isVisible() @@ -10271,17 +10270,20 @@ void LLVOAvatar::updateImpostors() // virtual BOOL LLVOAvatar::isImpostor() { - // FIXME this doesn't seem to actually mean that the avatar is currently shown as an impostor, or should be. - // un-impostored avs have mUpdatePeriod 1. IMPOSTOR_PERIOD is 2. - //return sUseImpostors && (isVisuallyMuted() || (mUpdatePeriod >= IMPOSTOR_PERIOD)); - return (isVisuallyMuted() || (sUseImpostors && (mUpdatePeriod >= IMPOSTOR_PERIOD))) ? TRUE : FALSE; + return isVisuallyMuted() || (sUseImpostors && (mUpdatePeriod > 1)); } -BOOL LLVOAvatar::shouldImpostor(const U32 rank_factor) +BOOL LLVOAvatar::shouldImpostor(const F32 rank_factor) { - // FIXME sUseImpostors question - //return (!isSelf() && sUseImpostors && mVisibilityRank > (sMaxNonImpostors * rank_factor)); - return (!isSelf() && (sUseImpostors || isVisuallyMuted()) && mVisibilityRank > (sMaxNonImpostors * rank_factor)); + if (isSelf()) + { + return false; + } + if (isVisuallyMuted()) + { + return true; + } + return sUseImpostors && (mVisibilityRank > (sMaxNonImpostors * rank_factor)); } BOOL LLVOAvatar::needsImpostorUpdate() const @@ -10324,7 +10326,7 @@ void LLVOAvatar::getImpostorValues(LLVector4a* extents, LLVector3& angle, F32& d } // static -const U32 LLVOAvatar::IMPOSTORS_OFF = 66; /* Must equal the maximum allowed the RenderAvatarMaxNonImpostors +const U32 LLVOAvatar::NON_IMPOSTORS_MAX_SLIDER = 66; /* Must equal the maximum allowed the RenderAvatarMaxNonImpostors * slider in panel_preferences_graphics1.xml */ // static @@ -10333,7 +10335,7 @@ void LLVOAvatar::updateImpostorRendering(U32 newMaxNonImpostorsValue) U32 oldmax = sMaxNonImpostors; bool oldflg = sUseImpostors; - if (IMPOSTORS_OFF <= newMaxNonImpostorsValue) + if (NON_IMPOSTORS_MAX_SLIDER <= newMaxNonImpostorsValue) { sMaxNonImpostors = 0; } diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 7f816d6a2e..b76d6abacd 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -315,8 +315,8 @@ 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 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 F32 sRenderDistance; //distance at which avatars will render. static BOOL sShowAnimationDebug; // show animation debug info @@ -554,7 +554,7 @@ private: //-------------------------------------------------------------------- public: virtual BOOL isImpostor(); - BOOL shouldImpostor(const U32 rank_factor = 1); + BOOL shouldImpostor(const F32 rank_factor = 1.0); BOOL needsImpostorUpdate() const; const LLVector3& getImpostorOffset() const; const LLVector2& getImpostorDim() const; diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 4cbe5a29be..f518a2d466 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -340,7 +340,6 @@ bool LLPipeline::sRenderGlow = false; bool LLPipeline::sReflectionRender = false; bool LLPipeline::sDistortionRender = false; bool LLPipeline::sImpostorRender = false; -bool LLPipeline::sImpostorRenderAVVO = false; bool LLPipeline::sImpostorRenderAlphaDepthPass = false; bool LLPipeline::sUnderWaterRender = false; bool LLPipeline::sTextureBindTest = false; @@ -3077,7 +3076,7 @@ void LLPipeline::markVisible(LLDrawable *drawablep, LLCamera& camera) { LLVOAvatar* av = vobj->asAvatar(); if (av && - ((!sImpostorRenderAVVO && av->isImpostor()) //ignore impostor flag during impostor pass + ((!sImpostorRender && av->isImpostor()) //ignore impostor flag during impostor pass || av->isInMuteList() || (LLVOAvatar::AOA_JELLYDOLL == av->getOverallAppearance() && !av->needsImpostorUpdate()) )) { @@ -10921,7 +10920,6 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar) { LL_RECORD_BLOCK_TIME(FTM_IMPOSTOR_MARK_VISIBLE); markVisible(avatar->mDrawable, *viewer_camera); - sImpostorRenderAVVO = true; LLVOAvatar::attachment_map_t::iterator iter; for (iter = avatar->mAttachmentPoints.begin(); @@ -11161,7 +11159,6 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar) avatar->setImpostorDim(tdim); - sImpostorRenderAVVO = false; sUseOcclusion = occlusion; sReflectionRender = false; sImpostorRender = false; diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index 397c5ef9ff..600bdd9d06 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -590,7 +590,6 @@ public: static bool sReflectionRender; static bool sDistortionRender; static bool sImpostorRender; - static bool sImpostorRenderAVVO; static bool sImpostorRenderAlphaDepthPass; static bool sUnderWaterRender; static bool sRenderGlow; -- cgit v1.3 From c79e648aac9bb32cc1d49d39973b5e96f25828f0 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Wed, 4 Nov 2020 16:07:10 +0000 Subject: SL-14015 - possible fix for phantom animesh attachments on mac --- indra/newview/llcontrolavatar.cpp | 82 +++++++++++++++++++++----------------- indra/newview/llcontrolavatar.h | 4 ++ indra/newview/lldrawpoolavatar.cpp | 7 ++++ indra/newview/llvoavatar.cpp | 4 +- indra/newview/llvoavatar.h | 6 +++ 5 files changed, 64 insertions(+), 39 deletions(-) (limited to 'indra/newview/lldrawpoolavatar.cpp') diff --git a/indra/newview/llcontrolavatar.cpp b/indra/newview/llcontrolavatar.cpp index f732f369bd..fab249f988 100644 --- a/indra/newview/llcontrolavatar.cpp +++ b/indra/newview/llcontrolavatar.cpp @@ -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); @@ -365,28 +383,24 @@ bool LLControlAvatar::computeNeedsUpdate() computeUpdatePeriod(); // Animesh attachments are a special case. Should have the same update cadence as their attached parent avatar. - bool is_attachment = mRootVolp && mRootVolp->isAttachment(); // For attached animated objects - if (is_attachment) + LLVOAvatar *attached_av = getAttachedAvatar(); + if (attached_av) { - LLVOAvatar *attached_av = mRootVolp->getAvatarAncestor(); - 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) { - // 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; + mLastImpostorUpdateReason = 12; } + return mNeedsImpostorUpdate; } return LLVOAvatar::computeNeedsUpdate(); } @@ -665,29 +679,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(); } diff --git a/indra/newview/llcontrolavatar.h b/indra/newview/llcontrolavatar.h index 2c68850140..8e87299f3e 100644 --- a/indra/newview/llcontrolavatar.h +++ b/indra/newview/llcontrolavatar.h @@ -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(); diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index ff036e1934..e2ca9e4097 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -1526,6 +1526,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) diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index c5bf6ab307..bf03389310 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -761,8 +761,8 @@ std::string LLVOAvatar::avString() const } else { - std::string viz_string = LLVOAvatar::rezStatusToString(getRezzedStatus()); - return " Avatar '" + getFullname() + "' " + viz_string + " "; + std::string viz_string = LLVOAvatar::rezStatusToString(getRezzedStatus()); + return " Avatar '" + getFullname() + "' " + viz_string + " "; } } diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index b815b3b2cd..a30cbc73b7 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -132,6 +132,7 @@ protected: public: /*virtual*/ void updateGL(); /*virtual*/ LLVOAvatar* asAvatar(); + virtual U32 processUpdateMessage(LLMessageSystem *mesgsys, void **user_data, U32 block_num, @@ -253,6 +254,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]); -- cgit v1.3