summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/newview/app_settings/logcontrol.xml1
-rw-r--r--indra/newview/llcontrolavatar.cpp64
-rw-r--r--indra/newview/llcontrolavatar.h3
-rw-r--r--indra/newview/llviewermessage.cpp13
-rw-r--r--indra/newview/llvoavatar.cpp1
-rw-r--r--indra/newview/llvovolume.h5
-rw-r--r--scripts/testing/lsl/cycle_object_animations.lsl6
7 files changed, 82 insertions, 11 deletions
diff --git a/indra/newview/app_settings/logcontrol.xml b/indra/newview/app_settings/logcontrol.xml
index ecd7c4bc36..ddd07dba80 100644
--- a/indra/newview/app_settings/logcontrol.xml
+++ b/indra/newview/app_settings/logcontrol.xml
@@ -50,6 +50,7 @@
</array>
<key>tags</key>
<array>
+ <string>AXON</string>
<!-- sample entry for debugging specific items
<string>Avatar</string>
<string>Inventory</string>
diff --git a/indra/newview/llcontrolavatar.cpp b/indra/newview/llcontrolavatar.cpp
index bd99f66459..f18d1c636a 100644
--- a/indra/newview/llcontrolavatar.cpp
+++ b/indra/newview/llcontrolavatar.cpp
@@ -190,3 +190,67 @@ void LLControlAvatar::updateDebugText()
LLVOAvatar::updateDebugText();
}
+
+void LLControlAvatar::getAnimatedVolumes(std::vector<LLVOVolume*>& volumes)
+{
+ if (!mRootVolp)
+ {
+ return;
+ }
+
+ volumes.push_back(mRootVolp);
+
+ LLViewerObject::const_child_list_t& child_list = mRootVolp->getChildren();
+ for (LLViewerObject::const_child_list_t::const_iterator iter = child_list.begin();
+ iter != child_list.end(); ++iter)
+ {
+ LLViewerObject* childp = *iter;
+ LLVOVolume *child_volp = dynamic_cast<LLVOVolume*>(childp);
+ if (child_volp && child_volp->isAnimatedObject())
+ {
+ volumes.push_back(child_volp);
+ }
+ }
+}
+
+// This is called after an associated object receives an animation
+// message. Combine the signaled animations for all associated objects
+// and process any resulting state changes.
+void LLControlAvatar::updateAnimations()
+{
+ if (!mRootVolp)
+ {
+ LL_WARNS("AXON") << "No root vol" << LL_ENDL;
+ return;
+ }
+
+ std::vector<LLVOVolume*> volumes;
+ getAnimatedVolumes(volumes);
+
+ // Rebuild mSignaledAnimations from the associated volumes.
+ std::map<LLUUID, S32> anims;
+ 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();
+ ++anim_it)
+ {
+ std::map<LLUUID,S32>::iterator found_anim_it = anims.find(anim_it->first);
+ if (found_anim_it != anims.end())
+ {
+ // Animation already present, use the larger sequence id
+ anims[anim_it->first] = llmax(found_anim_it->second, anim_it->second);
+ }
+ else
+ {
+ // Animation not already present, use this sequence id.
+ anims[anim_it->first] = anim_it->second;
+ }
+ }
+ }
+ mSignaledAnimations = anims;
+
+ LL_DEBUGS("AXON") << "process animation state changes here" << LL_ENDL;
+ processAnimationStateChanges();
+}
diff --git a/indra/newview/llcontrolavatar.h b/indra/newview/llcontrolavatar.h
index fc7b4aa06d..1be2d58441 100644
--- a/indra/newview/llcontrolavatar.h
+++ b/indra/newview/llcontrolavatar.h
@@ -51,6 +51,9 @@ public:
void markForDeath();
virtual void idleUpdate(LLAgent &agent, const F64 &time);
+
+ void getAnimatedVolumes(std::vector<LLVOVolume*>& volumes);
+ void updateAnimations();
virtual void updateDebugText();
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 227c6afcb0..ba4c632586 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -5112,22 +5112,19 @@ void process_object_animation(LLMessageSystem *mesgsys, void **user_data)
avatarp->mPlaying = true;
avatarp->updateVolumeGeom();
}
- avatarp->mSignaledAnimations.clear();
+
+ 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);
- avatarp->mSignaledAnimations[animation_id] = anim_sequence_id;
+ volp->mObjectSignaledAnimations[animation_id] = anim_sequence_id;
LL_DEBUGS("AXON") << "got object animation request for object "
- << uuid << " animation id " << animation_id << LL_ENDL;
+ << uuid << " animation id " << animation_id << LL_ENDL;
}
- if (num_blocks >= 0)
- {
- LL_DEBUGS("AXON") << "process animation state changes here" << LL_ENDL;
- avatarp->processAnimationStateChanges();
- }
+ avatarp->updateAnimations();
}
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 9a1629fbfb..b202f1b848 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -721,6 +721,7 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
mCurrentGesticulationLevel = 0;
+
mRuthTimer.reset();
mRuthDebugTimer.reset();
mDebugExistenceTimer.reset();
diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h
index 27a51d100f..3c0c9facb1 100644
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -274,6 +274,11 @@ public:
bool isAnimatedObjectStateConsistent() const;
void updateAnimatedObjectState(LLViewerObject *old_parent, LLViewerObject *new_parent);
+ // AXON For animated objects, we need to track animations requested
+ // per-object, then reconcile those to manage the control avatar
+ // animation state.
+ 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
diff --git a/scripts/testing/lsl/cycle_object_animations.lsl b/scripts/testing/lsl/cycle_object_animations.lsl
index 95fa99a191..79c8ff4151 100644
--- a/scripts/testing/lsl/cycle_object_animations.lsl
+++ b/scripts/testing/lsl/cycle_object_animations.lsl
@@ -9,17 +9,17 @@ cycle_animations()
ItemName = llGetInventoryName(INVENTORY_ANIMATION, count);
if (NowPlaying != "")
{
- llSay(0, "Stopping " + NowPlaying);
+ //llSay(0, "Stopping " + NowPlaying);
llStopObjectAnimation(NowPlaying);
}
- llSay(0, "Starting " + ItemName);
+ //llSay(0, "Starting " + ItemName);
llStartObjectAnimation(ItemName);
NowPlaying = ItemName;
llSleep(10);
}
if (NowPlaying != "")
{
- llSay(0, "Stopping " + NowPlaying);
+ //llSay(0, "Stopping " + NowPlaying);
llStopObjectAnimation(NowPlaying);
llSleep(10);
}