From a8e34e2899165141dcdf49ba541125567ece7a35 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Fri, 20 Jul 2018 21:27:18 +0100 Subject: [PATCH 1/4] MAINT-8863 - less verbose diagnostics, kept the fix. Make sure joint nums get rebuilt after invalid joints are scrubbed. --- indra/newview/llskinningutil.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/indra/newview/llskinningutil.cpp b/indra/newview/llskinningutil.cpp index 72252aebde..2bd70da01d 100644 --- a/indra/newview/llskinningutil.cpp +++ b/indra/newview/llskinningutil.cpp @@ -111,9 +111,10 @@ void LLSkinningUtil::scrubInvalidJoints(LLVOAvatar *avatar, LLMeshSkinInfo* skin // needed for handling of any legacy bad data. if (!avatar->getJoint(skin->mJointNames[j])) { - LL_DEBUGS("Avatar") << avatar->getFullname() << " mesh rigged to invalid joint" << skin->mJointNames[j] << LL_ENDL; + LL_DEBUGS("Avatar") << avatar->getFullname() << " mesh rigged to invalid joint " << skin->mJointNames[j] << LL_ENDL; LL_WARNS_ONCE("Avatar") << avatar->getFullname() << " mesh rigged to invalid joint" << skin->mJointNames[j] << LL_ENDL; skin->mJointNames[j] = "mPelvis"; + skin->mJointNumsInitialized = false; // force update after names change. } } skin->mInvalidJointsScrubbed = true; @@ -156,10 +157,11 @@ void LLSkinningUtil::initSkinningMatrixPalette( LL_WARNS_ONCE("Avatar") << avatar->getFullname() << " avatar build state: isBuilt() " << avatar->isBuilt() << " mInitFlags " << avatar->mInitFlags << LL_ENDL; +#if 0 dump_avatar_and_skin_state("initSkinningMatrixPalette joint not found", avatar, skin); +#endif } } - //dump_avatar_and_skin_state("initSkinningMatrixPalette finished OK", avatar, skin); } void LLSkinningUtil::checkSkinWeights(LLVector4a* weights, U32 num_vertices, const LLMeshSkinInfo* skin) @@ -280,14 +282,13 @@ void LLSkinningUtil::initJointNums(LLMeshSkinInfo* skin, LLVOAvatar *avatar) { LL_WARNS_ONCE("Avatar") << avatar->getFullname() << " unable to find joint " << skin->mJointNames[j] << LL_ENDL; LL_WARNS_ONCE("Avatar") << avatar->getFullname() << " avatar build state: isBuilt() " << avatar->isBuilt() << " mInitFlags " << avatar->mInitFlags << LL_ENDL; +#if 0 dump_avatar_and_skin_state("initJointNums joint not found", avatar, skin); +#endif } } } skin->mJointNumsInitialized = true; - LL_WARNS("Avatar") << avatar->getFullname() << " jointNums initialized, avatar built " << avatar->isBuilt() - << " mInitFlags " << avatar->mInitFlags - << " num joints " << skin->mJointNames.size() << LL_ENDL; } } From 91dfd7e06c8e1e5499ffd4137053b4b238b7eb45 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Tue, 31 Jul 2018 14:02:42 +0100 Subject: [PATCH 2/4] SL-944 - disabled a not-very-useful assert that greatly slows the RWD build --- indra/llcommon/llmemory.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/indra/llcommon/llmemory.h b/indra/llcommon/llmemory.h index 5b17d9e3a4..f04ae5f5cb 100644 --- a/indra/llcommon/llmemory.h +++ b/indra/llcommon/llmemory.h @@ -60,6 +60,12 @@ class LLMutex ; LL_COMMON_API void ll_assert_aligned_func(uintptr_t ptr,U32 alignment); #ifdef SHOW_ASSERT +// This is incredibly expensive - in profiling Windows RWD builds, 30% +// of CPU time was in aligment checks. +//#define ASSERT_ALIGNMENT +#endif + +#ifdef ASSERT_ALIGNMENT #define ll_assert_aligned(ptr,alignment) ll_assert_aligned_func(uintptr_t(ptr),((U32)alignment)) #else #define ll_assert_aligned(ptr,alignment) From 447aadc37b56190893bbd4e2f527a4683844024b Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Tue, 31 Jul 2018 21:57:42 +0100 Subject: [PATCH 3/4] SL-937 - use dynamic box for rigged mesh attached to normal avatar as well. Still has a 2x error in the radius calc, but gets radius using the dynamic box. --- indra/newview/lldrawable.cpp | 5 ++++- indra/newview/llvovolume.cpp | 10 ++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp index 6d9c2c5eb8..6f48b8a968 100644 --- a/indra/newview/lldrawable.cpp +++ b/indra/newview/lldrawable.cpp @@ -902,8 +902,11 @@ void LLDrawable::updateDistance(LLCamera& camera, bool force_update) } } + // MAINT-7926 Handle volumes in an animated object as a special case - if (volume->getAvatar() && volume->getAvatar()->isControlAvatar()) + // SL-937: add dynamic box handling for rigged mesh on regular avatars. + //if (volume->getAvatar() && volume->getAvatar()->isControlAvatar()) + if (volume->getAvatar()) { const LLVector3* av_box = volume->getAvatar()->getLastAnimExtents(); LLVector3d cam_pos = gAgent.getPosGlobalFromAgent(LLViewerCamera::getInstance()->getOrigin()); diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 61d82ec1cf..01b70088ab 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -1296,6 +1296,8 @@ BOOL LLVOVolume::calcLOD() } distance = avatar->mDrawable->mDistanceWRTCamera; + + if (avatar->isControlAvatar()) { // MAINT-7926 Handle volumes in an animated object as a special case @@ -1306,8 +1308,16 @@ BOOL LLVOVolume::calcLOD() } else { + // Volume in a rigged mesh attached to a regular avatar. +#if 0 // Note this isn't really a radius, so distance calcs are off by factor of 2 radius = avatar->getBinRadius(); +#else + // SL-937: add dynamic box handling for rigged mesh on regular avatars. + const LLVector3* box = avatar->getLastAnimExtents(); + LLVector3 diag = box[1] - box[0]; + radius = diag.magVec(); // preserve old BinRadius behavior - 2x off +#endif } if (distance <= 0.f || radius <= 0.f) { From ac889b1eeb7f9a00e7a6d1d9ba14c70d0c7a33fc Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Wed, 1 Aug 2018 21:16:33 +0100 Subject: [PATCH 4/4] SL-937 - added debug setting DebugObjectLODs to help track LOD calculations especially for rigged meshes --- indra/newview/app_settings/settings.xml | 11 +++++ indra/newview/llvovolume.cpp | 53 ++++++++++++++++++++++++- 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index b982f7bd48..4641d5775f 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -2193,6 +2193,17 @@ Value 0 + DebugObjectLODs + + Comment + Show info related to lod calculations for attached or animated objects + Persist + 1 + Type + Boolean + Value + 0 + AnimatedObjectsIgnoreLimits Comment diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 01b70088ab..8de97c711d 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -1272,6 +1272,46 @@ S32 LLVOVolume::computeLODDetail(F32 distance, F32 radius, F32 lod_factor) return cur_detail; } +std::string get_debug_object_lod_text(LLVOVolume *rootp) +{ + std::string cam_dist_string = ""; + cam_dist_string += LLStringOps::getReadableNumber(rootp->mLODDistance) + " "; + std::string lod_string = llformat("%d",rootp->getLOD()); + F32 lod_radius = rootp->mLODRadius; + S32 cam_dist_count = 0; + LLViewerObject::const_child_list_t& child_list = rootp->getChildren(); + for (LLViewerObject::const_child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); ++iter) + { + LLViewerObject *childp = *iter; + LLVOVolume *volp = dynamic_cast(childp); + if (volp) + { + lod_string += llformat("%d",volp->getLOD()); + if (volp->isRiggedMesh()) + { + // Rigged/animatable mesh. This is computed from the + // avatar dynamic box, so value from any vol will be + // the same. + lod_radius = volp->mLODRadius; + } + if (volp->mDrawable) + { + if (cam_dist_count < 4) + { + cam_dist_string += LLStringOps::getReadableNumber(volp->mLODDistance) + " "; + cam_dist_count++; + } + } + } + } + std::string result = llformat("lod_radius %s dists %s lods %s", + LLStringOps::getReadableNumber(lod_radius).c_str(), + cam_dist_string.c_str(), + lod_string.c_str()); + return result; +} + BOOL LLVOVolume::calcLOD() { if (mDrawable.isNull()) @@ -1341,8 +1381,17 @@ BOOL LLVOVolume::calcLOD() mLODDistance = distance; mLODRadius = radius; - - distance *= sDistanceFactor; + + if (gSavedSettings.getBOOL("DebugObjectLODs")) + { + if (getAvatar() && isRootEdit()) + { + std::string debug_object_text = get_debug_object_lod_text(this); + setDebugText(debug_object_text); + } + } + + distance *= sDistanceFactor; F32 rampDist = LLVOVolume::sLODFactor * 2;