diff options
| author | Brad Payne (Vir Linden) <vir@lindenlab.com> | 2018-04-27 14:50:28 +0100 | 
|---|---|---|
| committer | Brad Payne (Vir Linden) <vir@lindenlab.com> | 2018-04-27 14:50:28 +0100 | 
| commit | 19ebe40974edc23b9ac00e80dc716e34cad5a65d (patch) | |
| tree | 006c35d933582cd9e8212052d6cd5090a97e7023 /indra | |
| parent | 96c1790d92b7c1c019b164e0e51338b83c33e873 (diff) | |
MAINT-8559 - consistent management of control skeleton state with animated objects
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/newview/llcontrolavatar.cpp | 13 | ||||
| -rw-r--r-- | 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 e77c7615e9..d655f2cd37 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 5908d160e2..bde38029d0 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; | 
