summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrad Payne (Vir Linden) <vir@lindenlab.com>2018-04-27 14:50:28 +0100
committerBrad Payne (Vir Linden) <vir@lindenlab.com>2018-04-27 14:50:28 +0100
commit19ebe40974edc23b9ac00e80dc716e34cad5a65d (patch)
tree006c35d933582cd9e8212052d6cd5090a97e7023
parent96c1790d92b7c1c019b164e0e51338b83c33e873 (diff)
MAINT-8559 - consistent management of control skeleton state with animated objects
-rw-r--r--indra/newview/llcontrolavatar.cpp13
-rw-r--r--indra/newview/llviewerobject.cpp33
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;