summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrad Payne (Vir Linden) <vir@lindenlab.com>2018-05-03 22:42:02 +0100
committerBrad Payne (Vir Linden) <vir@lindenlab.com>2018-05-03 22:42:02 +0100
commit7ed17b5c2c11b9e57316c87b29524b88edb8f762 (patch)
treed9f513fe93fc86f7adab8d297082d3c715178e8e
parent0608bce54bc818774a38403e2252e25fb54d7ed6 (diff)
MAINT-8608, MAINT-8539, MAINT-8615 - changes to make object animation info more persistent, tolerant to race conditions during initialization
-rw-r--r--indra/newview/llcontrolavatar.cpp7
-rw-r--r--indra/newview/llcontrolavatar.h14
-rw-r--r--indra/newview/llviewermessage.cpp28
-rw-r--r--indra/newview/llviewerobject.cpp1
-rw-r--r--indra/newview/llvovolume.h2
5 files changed, 33 insertions, 19 deletions
diff --git a/indra/newview/llcontrolavatar.cpp b/indra/newview/llcontrolavatar.cpp
index d655f2cd37..f298a8884b 100644
--- a/indra/newview/llcontrolavatar.cpp
+++ b/indra/newview/llcontrolavatar.cpp
@@ -367,8 +367,9 @@ void LLControlAvatar::updateAnimations()
for (std::vector<LLVOVolume*>::iterator vol_it = volumes.begin(); vol_it != volumes.end(); ++vol_it)
{
LLVOVolume *volp = *vol_it;
- for (std::map<LLUUID,S32>::iterator anim_it = volp->mObjectSignaledAnimations.begin();
- anim_it != volp->mObjectSignaledAnimations.end();
+ signaled_animation_map_t& signaled_animations = LLObjectSignaledAnimationMap::instance().getMap()[volp->getID()];
+ for (std::map<LLUUID,S32>::iterator anim_it = signaled_animations.begin();
+ anim_it != signaled_animations.end();
++anim_it)
{
std::map<LLUUID,S32>::iterator found_anim_it = anims.find(anim_it->first);
@@ -384,7 +385,7 @@ void LLControlAvatar::updateAnimations()
}
}
}
- if (!mPlaying && anims.size()>0)
+ if (!mPlaying)
{
mPlaying = true;
if (!mRootVolp->isAnySelected())
diff --git a/indra/newview/llcontrolavatar.h b/indra/newview/llcontrolavatar.h
index f45de25d81..02244769b9 100644
--- a/indra/newview/llcontrolavatar.h
+++ b/indra/newview/llcontrolavatar.h
@@ -82,4 +82,18 @@ public:
};
+typedef std::map<LLUUID, S32> signaled_animation_map_t;
+typedef std::map<LLUUID, signaled_animation_map_t> object_signaled_animation_map_t;
+
+// Stores information about previously requested animations, by object id.
+class LLObjectSignaledAnimationMap: public LLSingleton<LLObjectSignaledAnimationMap>
+{
+ LLSINGLETON_EMPTY_CTOR(LLObjectSignaledAnimationMap);
+
+public:
+ object_signaled_animation_map_t mMap;
+
+ object_signaled_animation_map_t& getMap() { return mMap; }
+};
+
#endif //LL_CONTROLAVATAR_H
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 05494b74f7..e8db01efed 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -5075,6 +5075,7 @@ void process_avatar_animation(LLMessageSystem *mesgsys, void **user_data)
}
}
+
// AXON make logging less spammy after issues resolved, before release.
void process_object_animation(LLMessageSystem *mesgsys, void **user_data)
{
@@ -5085,6 +5086,19 @@ void process_object_animation(LLMessageSystem *mesgsys, void **user_data)
mesgsys->getUUIDFast(_PREHASH_Sender, _PREHASH_ID, uuid);
LL_INFOS("AnimatedObjects") << "Received animation state for object " << uuid << LL_ENDL;
+
+ signaled_animation_map_t signaled_anims;
+ S32 num_blocks = mesgsys->getNumberOfBlocksFast(_PREHASH_AnimationList);
+ LL_INFOS("AnimatedObjects") << "processing object animation requests, num_blocks " << num_blocks << " uuid " << uuid << LL_ENDL;
+ for( S32 i = 0; i < num_blocks; i++ )
+ {
+ mesgsys->getUUIDFast(_PREHASH_AnimationList, _PREHASH_AnimID, animation_id, i);
+ mesgsys->getS32Fast(_PREHASH_AnimationList, _PREHASH_AnimSequenceID, anim_sequence_id, i);
+ signaled_anims[animation_id] = anim_sequence_id;
+ LL_INFOS("AnimatedObjects") << "added signaled_anims animation request for object "
+ << uuid << " animation id " << animation_id << LL_ENDL;
+ }
+ LLObjectSignaledAnimationMap::instance().getMap()[uuid] = signaled_anims;
LLViewerObject *objp = gObjectList.findObject(uuid);
if (!objp)
@@ -5114,9 +5128,6 @@ void process_object_animation(LLMessageSystem *mesgsys, void **user_data)
return;
}
- S32 num_blocks = mesgsys->getNumberOfBlocksFast(_PREHASH_AnimationList);
- LL_INFOS("AnimatedObjects") << "processing object animation requests, num_blocks " << num_blocks << " uuid " << uuid << LL_ENDL;
-
if (!avatarp->mPlaying)
{
avatarp->mPlaying = true;
@@ -5127,17 +5138,6 @@ void process_object_animation(LLMessageSystem *mesgsys, void **user_data)
}
}
- volp->mObjectSignaledAnimations.clear();
-
- for( S32 i = 0; i < num_blocks; i++ )
- {
- mesgsys->getUUIDFast(_PREHASH_AnimationList, _PREHASH_AnimID, animation_id, i);
- mesgsys->getS32Fast(_PREHASH_AnimationList, _PREHASH_AnimSequenceID, anim_sequence_id, i);
- volp->mObjectSignaledAnimations[animation_id] = anim_sequence_id;
- LL_INFOS("AnimatedObjects") << "added object animation request for object "
- << uuid << " animation id " << animation_id << LL_ENDL;
- }
-
avatarp->updateAnimations();
}
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 1cd50e3400..166fc04ad0 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -3024,6 +3024,7 @@ void LLViewerObject::linkControlAvatar()
cav->mRootVolp->recursiveMarkForUpdate(TRUE);
}
}
+ cav->updateAnimations();
}
else
{
diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h
index 3ffb7c140a..952c94db0e 100644
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -282,8 +282,6 @@ public:
virtual void onReparent(LLViewerObject *old_parent, LLViewerObject *new_parent);
virtual void afterReparent();
- std::map<LLUUID, S32> mObjectSignaledAnimations; // requested state of Animation name/value
-
// Functions that deal with media, or media navigation
// Update this object's media data with the given media data array