From c2b428e3347eb41b0c05405e0c0041b2276a0730 Mon Sep 17 00:00:00 2001 From: Ansariel Date: Tue, 8 Nov 2016 16:49:05 +0100 Subject: [PATCH] Fix LL impostor hacking: * Don't render shadows for impostors * Show muted avatars as impostors (fix if RenderAvatarMaxNonImpostors = 0 = no limit) * No detailed attachment updates for muted avatars if using no impostors * Properly calculate update interval for muted avatars if using no impostors Changed LLVOAvatar::isImpostor() so it also returns if an avatar is an impostor in case RenderAvatarMaxNonImpostors = 0 = LLVOAvatar::sUseImpostors = FALSE is set, so we can get rid of some "isImpostor() || ((LLVOAvatar::AV_DO_NOT_RENDER == getVisualMuteSettings() || isInMuteList()) && !needsImpostorUpdate())" and replace it with "isImpostor() && !needsImpostorUpdate()" This additional check would be necessary to render an avatar as impostor in case it should never be rendered or it is muted, but LLVOAvatar::sUseImpostors is FALSE. The check for !needsImpostorUpdate() is still needed to fail the condition in case an impostor needs an update. For impostor updates, LLPipeline::generateImpostor() will temporarily set LLVOAvatar::sUseImpostors = FALSE, so the rendering pipeline doesn't skip parts needed to create a silhouette of the avatar. In that case, needsImpostorUpdate() will return TRUE. --- indra/newview/lldrawable.cpp | 10 ++++++-- indra/newview/lldrawpoolavatar.cpp | 21 +++++++++++----- indra/newview/llvoavatar.cpp | 39 ++++++++++++++++++++++++++---- indra/newview/pipeline.cpp | 9 ++++--- 4 files changed, 63 insertions(+), 16 deletions(-) diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp index fec8b3c008..6d52c2ce56 100644 --- a/indra/newview/lldrawable.cpp +++ b/indra/newview/lldrawable.cpp @@ -1393,7 +1393,10 @@ void LLSpatialBridge::setVisible(LLCamera& camera_in, std::vector* LLVOAvatar* avatarp = (LLVOAvatar*) objparent; if (avatarp->isVisible()) { - impostor = objparent->isAvatar() && ((LLVOAvatar*) objparent)->isImpostor(); + // Fix LL impostor hacking + //impostor = objparent->isAvatar() && ((LLVOAvatar*) objparent)->isImpostor(); + impostor = objparent->isAvatar() && avatarp->isImpostor() && !avatarp->needsImpostorUpdate(); + // loaded = objparent->isAvatar() && ((LLVOAvatar*) objparent)->isFullyLoaded(); } else @@ -1483,7 +1486,10 @@ void LLSpatialBridge::updateDistance(LLCamera& camera_in, bool force_update) if (parent && parent->getVObj()) { LLVOAvatar* av = parent->getVObj()->asAvatar(); - if (av && av->isImpostor()) + // Fix LL impostor hacking + //if (av && av->isImpostor()) + if (av && av->isImpostor() && !av->needsImpostorUpdate()) + // { return; } diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 2de041629f..377faad4df 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -490,8 +490,11 @@ void LLDrawPoolAvatar::renderShadow(S32 pass) BOOL impostor = avatarp->isImpostor(); if (impostor - && LLVOAvatar::AV_DO_NOT_RENDER != avatarp->getVisualMuteSettings() - && LLVOAvatar::AV_ALWAYS_RENDER != avatarp->getVisualMuteSettings()) + // Fix LL impostor hacking; No shadow for impostors + //&& LLVOAvatar::AV_DO_NOT_RENDER != avatarp->getVisualMuteSettings() + //&& LLVOAvatar::AV_ALWAYS_RENDER != avatarp->getVisualMuteSettings()) + ) + // { return; } @@ -1371,9 +1374,12 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass) BOOL impostor = avatarp->isImpostor() && !single_avatar; - if (( /*avatarp->isInMuteList() // Partially undo MAINT-5700: Draw imposter for muted avatars - ||*/ impostor - || (LLVOAvatar::AV_DO_NOT_RENDER == avatarp->getVisualMuteSettings() && !avatarp->needsImpostorUpdate()) ) && pass != 0) + // 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) + // { //don't draw anything but the impostor for impostored avatars return; } @@ -1390,7 +1396,10 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass) LLVOAvatar::sNumVisibleAvatars++; } - if (impostor || (LLVOAvatar::AV_DO_NOT_RENDER == avatarp->getVisualMuteSettings() && !avatarp->needsImpostorUpdate())) + // Fix LL impostor hacking + //if (impostor || (LLVOAvatar::AV_DO_NOT_RENDER == avatarp->getVisualMuteSettings() && !avatarp->needsImpostorUpdate())) + if (impostor && !avatarp->needsImpostorUpdate()) + // { if (LLPipeline::sRenderDeferred && !LLPipeline::sReflectionRender && avatarp->mImpostor.isComplete()) { diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 167c9c6625..7dd92684f4 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -2416,7 +2416,10 @@ void LLVOAvatar::idleUpdateMisc(bool detailed_update) BOOL visible = isVisible() || mNeedsAnimUpdate; // update attachments positions - if (detailed_update || !sUseImpostors) + // Fix LL impostor hacking; No detailed updates if muted when using no impostors + //if (detailed_update || !sUseImpostors) + if (detailed_update || (!sUseImpostors && !isInMuteList())) + // { LL_RECORD_BLOCK_TIME(FTM_ATTACHMENT_UPDATE); for (attachment_map_t::iterator iter = mAttachmentPoints.begin(); @@ -3809,7 +3812,10 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) //-------------------------------------------------------------------- bool visually_muted = isVisuallyMuted(); - if (visible && (!isSelf() || visually_muted) && !mIsDummy && sUseImpostors && !mNeedsAnimUpdate && !sFreezeCounter) + // Fix LL impostor hacking; Adjust update period for muted avatars if using no impostors + //if (visible && (!isSelf() || visually_muted) && !mIsDummy && sUseImpostors && !mNeedsAnimUpdate && !sFreezeCounter) + if (visible && (!isSelf() || visually_muted) && !mIsDummy && (sUseImpostors || isInMuteList()) && !mNeedsAnimUpdate && !sFreezeCounter) + // { const LLVector4a* ext = mDrawable->getSpatialExtents(); LLVector4a size; @@ -8988,7 +8994,10 @@ void LLVOAvatar::updateFreezeCounter(S32 counter) BOOL LLVOAvatar::updateLOD() { - if (isImpostor() && 0 != mDrawable->getNumFaces() && mDrawable->getFace(0)->hasGeometry()) + // Fix LL impostor hacking + //if (isImpostor() && 0 != mDrawable->getNumFaces() && mDrawable->getFace(0)->hasGeometry()) + if (isImpostor() && !needsImpostorUpdate() && 0 != mDrawable->getNumFaces() && mDrawable->getFace(0)->hasGeometry()) + // { return TRUE; } @@ -9036,7 +9045,10 @@ void LLVOAvatar::updateImpostors() LLVOAvatar* avatar = (LLVOAvatar*) *iter; if (!avatar->isDead() && avatar->isVisible() && ( - (avatar->isImpostor() || LLVOAvatar::AV_DO_NOT_RENDER == avatar->getVisualMuteSettings()) && avatar->needsImpostorUpdate()) + // Fix LL impostor hacking; Generate new impostor if update is needed + //(avatar->isImpostor() || LLVOAvatar::AV_DO_NOT_RENDER == avatar->getVisualMuteSettings()) && avatar->needsImpostorUpdate()) + avatar->isImpostor() && avatar->needsImpostorUpdate()) + // ) { avatar->calcMutedAVColor(); @@ -9049,7 +9061,24 @@ void LLVOAvatar::updateImpostors() BOOL LLVOAvatar::isImpostor() { - return sUseImpostors && (isVisuallyMuted() || (mUpdatePeriod >= IMPOSTOR_PERIOD)) ? TRUE : FALSE; + // Fix LL impostor hacking + // IMPORTANT: LLPipeline::generateImpostor() will set sUseImporstors = FALSE when generating + // an impostor. If checking for isImpostor() somewhere else to skip parts in the + // rendering process, an additional check for needsImpostorUpdate() needs to be + // done to determine if the particular part can really be skipped + // (mNeedsImpostorUpdate = FALSE) or is currently needed to generate the + // impostor (mNeedsImpostorUpdate = TRUE). + + //return sUseImpostors && (isVisuallyMuted() || (mUpdatePeriod >= IMPOSTOR_PERIOD)) ? TRUE : FALSE; + if (sUseImpostors) + { + return (isVisuallyMuted() || (mUpdatePeriod >= IMPOSTOR_PERIOD)); + } + else + { + return (LLVOAvatar::AV_DO_NOT_RENDER == getVisualMuteSettings() || isInMuteList()); + } + // } BOOL LLVOAvatar::shouldImpostor(const U32 rank_factor) const diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 483e4ed3bc..d26243191e 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -3194,9 +3194,12 @@ void LLPipeline::markVisible(LLDrawable *drawablep, LLCamera& camera) if (vobj) // this test may not be needed, see above { LLVOAvatar* av = vobj->asAvatar(); - if (av && (av->isImpostor() - //|| av->isInMuteList() // Partially undo MAINT-5700: Draw imposter for muted avatars - || (LLVOAvatar::AV_DO_NOT_RENDER == av->getVisualMuteSettings() && !av->needsImpostorUpdate()) )) + // 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()) + // { return; }