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; }