From 19ebe40974edc23b9ac00e80dc716e34cad5a65d Mon Sep 17 00:00:00 2001
From: "Brad Payne (Vir Linden)" <vir@lindenlab.com>
Date: Fri, 27 Apr 2018 14:50:28 +0100
Subject: [PATCH] MAINT-8559 - consistent management of control skeleton state
 with animated objects

---
 indra/newview/llcontrolavatar.cpp | 13 +++++++++++-
 indra/newview/llviewerobject.cpp  | 33 ++++++++++++++++---------------
 2 files changed, 29 insertions(+), 17 deletions(-)

diff --git a/indra/newview/llcontrolavatar.cpp b/indra/newview/llcontrolavatar.cpp
index e77c7615e9d..d655f2cd37c 100644
--- a/indra/newview/llcontrolavatar.cpp
+++ b/indra/newview/llcontrolavatar.cpp
@@ -240,6 +240,7 @@ void LLControlAvatar::updateDebugText()
         std::string active_string;
         std::string type_string;
         std::string lod_string;
+        std::string animated_object_flag_string;
         S32 total_tris = 0;
         S32 total_verts = 0;
         F32 est_tris = 0.f;
@@ -259,6 +260,15 @@ void LLControlAvatar::updateDebugText()
             lod_string += llformat("%d",volp->getLOD());
             if (volp && volp->mDrawable)
             {
+                bool is_animated_flag = volp->getExtendedMeshFlags() & LLExtendedMeshParams::ANIMATED_MESH_ENABLED_FLAG;
+                if (is_animated_flag)
+                {
+                    animated_object_flag_string += "1";
+                }
+                else
+                {
+                    animated_object_flag_string += "0";
+                }
                 if (volp->mDrawable->isActive())
                 {
                     active_string += "A";
@@ -269,7 +279,7 @@ void LLControlAvatar::updateDebugText()
                 }
                 if (volp->isRiggedMesh())
                 {
-                    // Rigged/animateable mesh
+                    // Rigged/animatable mesh
                     type_string += "R";
                 }
                 else if (volp->isMesh())
@@ -293,6 +303,7 @@ void LLControlAvatar::updateDebugText()
                               total_linkset_count, animated_volume_count, 
                               active_string.c_str(), (S32) isImpostor(), streaming_cost));
         addDebugText(llformat("types %s lods %s", type_string.c_str(), lod_string.c_str()));
+        addDebugText(llformat("flags %s", animated_object_flag_string.c_str()));
         addDebugText(llformat("tris %d (est %.1f, streaming %.1f), verts %d", total_tris, est_tris, est_streaming_tris, total_verts));
         addDebugText(llformat("pxarea %s rank %d", LLStringOps::getReadableNumber(getPixelArea()).c_str(), getVisibilityRank()));
 #if 0
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 5908d160e26..bde38029d07 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -2969,24 +2969,25 @@ LLControlAvatar *LLViewerObject::getControlAvatar() const
 void LLViewerObject::updateControlAvatar()
 {
     LLViewerObject *root = getRootEdit();
-    if (root->isAnimatedObject() && !root->getControlAvatar())
+    bool any_rigged_mesh = root->isRiggedMesh();
+    LLViewerObject::const_child_list_t& child_list = root->getChildren();
+    for (LLViewerObject::const_child_list_t::const_iterator iter = child_list.begin();
+         iter != child_list.end(); ++iter)
     {
-        bool any_rigged_mesh = root->isRiggedMesh();
-        LLViewerObject::const_child_list_t& child_list = root->getChildren();
-        for (LLViewerObject::const_child_list_t::const_iterator iter = child_list.begin();
-             iter != child_list.end(); ++iter)
-        {
-            const LLViewerObject* child = *iter;
-            any_rigged_mesh = any_rigged_mesh || child->isRiggedMesh();
-        }
-        if (any_rigged_mesh)
-        {
-            std::string vobj_name = llformat("Vol%p", root);
-            LL_DEBUGS("AnimatedObjects") << vobj_name << " calling linkControlAvatar()" << LL_ENDL;
-            root->linkControlAvatar();
-        }
+        const LLViewerObject* child = *iter;
+        any_rigged_mesh = any_rigged_mesh || child->isRiggedMesh();
+    }
+
+    bool has_control_avatar = getControlAvatar();
+    bool should_have_control_avatar = root->isAnimatedObject() && any_rigged_mesh;
+
+    if (should_have_control_avatar && !has_control_avatar)
+    {
+        std::string vobj_name = llformat("Vol%p", root);
+        LL_DEBUGS("AnimatedObjects") << vobj_name << " calling linkControlAvatar()" << LL_ENDL;
+        root->linkControlAvatar();
     }
-    if (!root->isAnimatedObject() && root->getControlAvatar())
+    if (!should_have_control_avatar && has_control_avatar)
     {
         std::string vobj_name = llformat("Vol%p", root);
         LL_DEBUGS("AnimatedObjects") << vobj_name << " calling unlinkControlAvatar()" << LL_ENDL;
-- 
GitLab