From 0608bce54bc818774a38403e2252e25fb54d7ed6 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Wed, 2 May 2018 21:33:46 +0100 Subject: [PATCH 1/7] MAINT-8608 - more detailed logging of issues with object animation requests. --- indra/newview/llviewermessage.cpp | 17 +++++++++-------- indra/newview/llvovolume.cpp | 2 +- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 16d306f997..05494b74f7 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) { LLUUID animation_id; @@ -5083,25 +5084,25 @@ void process_object_animation(LLMessageSystem *mesgsys, void **user_data) mesgsys->getUUIDFast(_PREHASH_Sender, _PREHASH_ID, uuid); - LL_DEBUGS("AnimatedObjects") << "Received animation state for object " << uuid << LL_ENDL; + LL_INFOS("AnimatedObjects") << "Received animation state for object " << uuid << LL_ENDL; LLViewerObject *objp = gObjectList.findObject(uuid); if (!objp) { - LL_WARNS("Messaging") << "Received animation state for unknown object " << uuid << LL_ENDL; + LL_WARNS("AnimatedObjects") << "Received animation state for unknown object " << uuid << LL_ENDL; return; } LLVOVolume *volp = dynamic_cast(objp); if (!volp) { - LL_WARNS("Messaging") << "Received animation state for non-volume object " << uuid << LL_ENDL; + LL_WARNS("AnimatedObjects") << "Received animation state for non-volume object " << uuid << LL_ENDL; return; } if (!volp->isAnimatedObject()) { - LL_WARNS("Messaging") << "Received animation state for non-animated object " << uuid << LL_ENDL; + LL_WARNS("AnimatedObjects") << "Received animation state for non-animated object " << uuid << LL_ENDL; return; } @@ -5109,12 +5110,12 @@ void process_object_animation(LLMessageSystem *mesgsys, void **user_data) LLControlAvatar *avatarp = volp->getControlAvatar(); if (!avatarp) { - LL_WARNS("Messaging") << "Received animation request for object with no control avatar, ignoring" << LL_ENDL; + LL_WARNS("AnimatedObjects") << "Received animation request for object with no control avatar, ignoring " << uuid << LL_ENDL; return; } S32 num_blocks = mesgsys->getNumberOfBlocksFast(_PREHASH_AnimationList); - LL_DEBUGS("AnimatedObjects") << "processing object animation requests, num_blocks " << num_blocks << LL_ENDL; + LL_INFOS("AnimatedObjects") << "processing object animation requests, num_blocks " << num_blocks << " uuid " << uuid << LL_ENDL; if (!avatarp->mPlaying) { @@ -5133,8 +5134,8 @@ void process_object_animation(LLMessageSystem *mesgsys, void **user_data) 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_DEBUGS("AnimatedObjects") << "got object animation request for object " - << uuid << " animation id " << animation_id << LL_ENDL; + LL_INFOS("AnimatedObjects") << "added object animation request for object " + << uuid << " animation id " << animation_id << LL_ENDL; } avatarp->updateAnimations(); diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 91ef64cb4b..e08379af09 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -3696,7 +3696,7 @@ U32 LLVOVolume::getRenderCost(texture_cost_t &textures) const { if (isAnimatedObject() && isRiggedMesh()) { - // AXON Scaling here is to make animated object vs + // Scaling here is to make animated object vs // non-animated object ARC proportional to the // corresponding calculations for streaming cost. num_triangles = (ANIMATED_OBJECT_COST_PER_KTRI * 0.001 * costs.getEstTrisForStreamingCost())/0.06; From 7ed17b5c2c11b9e57316c87b29524b88edb8f762 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Thu, 3 May 2018 22:42:02 +0100 Subject: [PATCH 2/7] MAINT-8608, MAINT-8539, MAINT-8615 - changes to make object animation info more persistent, tolerant to race conditions during initialization --- indra/newview/llcontrolavatar.cpp | 7 ++++--- indra/newview/llcontrolavatar.h | 14 ++++++++++++++ indra/newview/llviewermessage.cpp | 28 ++++++++++++++-------------- indra/newview/llviewerobject.cpp | 1 + indra/newview/llvovolume.h | 2 -- 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::iterator vol_it = volumes.begin(); vol_it != volumes.end(); ++vol_it) { LLVOVolume *volp = *vol_it; - for (std::map::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::iterator anim_it = signaled_animations.begin(); + anim_it != signaled_animations.end(); ++anim_it) { std::map::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 signaled_animation_map_t; +typedef std::map object_signaled_animation_map_t; + +// Stores information about previously requested animations, by object id. +class LLObjectSignaledAnimationMap: public LLSingleton +{ + 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 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 From 2f209465dc1adc33b2135d685a88190e83952012 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Fri, 4 May 2018 15:04:42 +0100 Subject: [PATCH 3/7] MAINT-8608 - more on animation updates --- indra/newview/llcontrolavatar.cpp | 2 ++ indra/newview/llviewerobject.cpp | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/indra/newview/llcontrolavatar.cpp b/indra/newview/llcontrolavatar.cpp index f298a8884b..c977f3784f 100644 --- a/indra/newview/llcontrolavatar.cpp +++ b/indra/newview/llcontrolavatar.cpp @@ -367,6 +367,7 @@ void LLControlAvatar::updateAnimations() for (std::vector::iterator vol_it = volumes.begin(); vol_it != volumes.end(); ++vol_it) { LLVOVolume *volp = *vol_it; + LL_INFOS("AnimatedObjects") << "updating anim for vol " << volp->getID() << " root " << mRootVolp->getID() << LL_ENDL; signaled_animation_map_t& signaled_animations = LLObjectSignaledAnimationMap::instance().getMap()[volp->getID()]; for (std::map::iterator anim_it = signaled_animations.begin(); anim_it != signaled_animations.end(); @@ -383,6 +384,7 @@ void LLControlAvatar::updateAnimations() // Animation not already present, use this sequence id. anims[anim_it->first] = anim_it->second; } + LL_INFOS("AnimatedObjects") << "found anim for vol " << volp->getID() << " anim " << anim_it->first << " root " << mRootVolp->getID() << LL_ENDL; } } if (!mPlaying) diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 166fc04ad0..725f48f091 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -2993,6 +2993,10 @@ void LLViewerObject::updateControlAvatar() LL_DEBUGS("AnimatedObjects") << vobj_name << " calling unlinkControlAvatar()" << LL_ENDL; root->unlinkControlAvatar(); } + if (getControlAvatar()) + { + getControlAvatar()->updateAnimations(); + } } void LLViewerObject::linkControlAvatar() @@ -3024,7 +3028,7 @@ void LLViewerObject::linkControlAvatar() cav->mRootVolp->recursiveMarkForUpdate(TRUE); } } - cav->updateAnimations(); + //cav->updateAnimations(); } else { From 2a48816717087e07eb3f3855798c5dd71f541ee5 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Fri, 4 May 2018 21:18:13 +0100 Subject: [PATCH 4/7] MAINT-8608, MAINT-8539, MAINT-8615 - more animation state management - less log spam, more docs --- indra/newview/llcontrolavatar.cpp | 6 +++--- indra/newview/llviewermessage.cpp | 14 ++++++------ indra/newview/llviewerobject.cpp | 36 ++++++++++++++++++++++--------- 3 files changed, 36 insertions(+), 20 deletions(-) diff --git a/indra/newview/llcontrolavatar.cpp b/indra/newview/llcontrolavatar.cpp index c977f3784f..5a1add258c 100644 --- a/indra/newview/llcontrolavatar.cpp +++ b/indra/newview/llcontrolavatar.cpp @@ -355,7 +355,7 @@ void LLControlAvatar::updateAnimations() { if (!mRootVolp) { - LL_WARNS_ONCE("AnimatedObjects") << "No root vol" << LL_ENDL; + LL_WARNS_ONCE("AnimatedObjectsNotify") << "No root vol" << LL_ENDL; return; } @@ -367,7 +367,7 @@ void LLControlAvatar::updateAnimations() for (std::vector::iterator vol_it = volumes.begin(); vol_it != volumes.end(); ++vol_it) { LLVOVolume *volp = *vol_it; - LL_INFOS("AnimatedObjects") << "updating anim for vol " << volp->getID() << " root " << mRootVolp->getID() << LL_ENDL; + //LL_INFOS("AnimatedObjects") << "updating anim for vol " << volp->getID() << " root " << mRootVolp->getID() << LL_ENDL; signaled_animation_map_t& signaled_animations = LLObjectSignaledAnimationMap::instance().getMap()[volp->getID()]; for (std::map::iterator anim_it = signaled_animations.begin(); anim_it != signaled_animations.end(); @@ -384,7 +384,7 @@ void LLControlAvatar::updateAnimations() // Animation not already present, use this sequence id. anims[anim_it->first] = anim_it->second; } - LL_INFOS("AnimatedObjects") << "found anim for vol " << volp->getID() << " anim " << anim_it->first << " root " << mRootVolp->getID() << LL_ENDL; + LL_DEBUGS("AnimatedObjectsNotify") << "found anim for vol " << volp->getID() << " anim " << anim_it->first << " root " << mRootVolp->getID() << LL_ENDL; } } if (!mPlaying) diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index e8db01efed..ba3e9e6993 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -5085,17 +5085,17 @@ 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; + LL_DEBUGS("AnimatedObjectsNotify") << "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; + LL_DEBUGS("AnimatedObjectsNotify") << "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 " + LL_DEBUGS("AnimatedObjectsNotify") << "added signaled_anims animation request for object " << uuid << " animation id " << animation_id << LL_ENDL; } LLObjectSignaledAnimationMap::instance().getMap()[uuid] = signaled_anims; @@ -5103,20 +5103,20 @@ void process_object_animation(LLMessageSystem *mesgsys, void **user_data) LLViewerObject *objp = gObjectList.findObject(uuid); if (!objp) { - LL_WARNS("AnimatedObjects") << "Received animation state for unknown object " << uuid << LL_ENDL; + LL_DEBUGS("AnimatedObjectsNotify") << "Received animation state for unknown object " << uuid << LL_ENDL; return; } LLVOVolume *volp = dynamic_cast(objp); if (!volp) { - LL_WARNS("AnimatedObjects") << "Received animation state for non-volume object " << uuid << LL_ENDL; + LL_DEBUGS("AnimatedObjectsNotify") << "Received animation state for non-volume object " << uuid << LL_ENDL; return; } if (!volp->isAnimatedObject()) { - LL_WARNS("AnimatedObjects") << "Received animation state for non-animated object " << uuid << LL_ENDL; + LL_DEBUGS("AnimatedObjectsNotify") << "Received animation state for non-animated object " << uuid << LL_ENDL; return; } @@ -5124,7 +5124,7 @@ void process_object_animation(LLMessageSystem *mesgsys, void **user_data) LLControlAvatar *avatarp = volp->getControlAvatar(); if (!avatarp) { - LL_WARNS("AnimatedObjects") << "Received animation request for object with no control avatar, ignoring " << uuid << LL_ENDL; + LL_DEBUGS("AnimatedObjectsNotify") << "Received animation request for object with no control avatar, ignoring " << uuid << LL_ENDL; return; } diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 725f48f091..1f23286dac 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -2966,20 +2966,38 @@ LLControlAvatar *LLViewerObject::getControlAvatar() const return getRootEdit()->mControlAvatar.get(); } +// Manage the control avatar state of a given object. +// Any object can be flagged as animated, but for performance reasons +// we don't want to incur the overhead of managing a control avatar +// unless this would have some user-visible consequence. That is, +// there should be at least one rigged mesh in the linkset. Operations +// that change the state of a linkset, such as linking or unlinking +// prims, can also mean that a control avatar needs to be added or +// removed. At the end, if there is a control avatar, we make sure +// that its animation state is current. void LLViewerObject::updateControlAvatar() { LLViewerObject *root = getRootEdit(); - 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 is_animated_object = root->isAnimatedObject(); + bool has_control_avatar = getControlAvatar(); + if (!is_animated_object && !has_control_avatar) { - const LLViewerObject* child = *iter; - any_rigged_mesh = any_rigged_mesh || child->isRiggedMesh(); + return; } - bool has_control_avatar = getControlAvatar(); - bool should_have_control_avatar = root->isAnimatedObject() && any_rigged_mesh; + bool should_have_control_avatar = false; + if (is_animated_object) + { + 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(); + } + should_have_control_avatar = is_animated_object && any_rigged_mesh; + } if (should_have_control_avatar && !has_control_avatar) { @@ -3018,7 +3036,6 @@ void LLViewerObject::linkControlAvatar() if (cav) { cav->updateAttachmentOverrides(); - cav->updateAnimations(); if (!cav->mPlaying) { cav->mPlaying = true; @@ -3028,7 +3045,6 @@ void LLViewerObject::linkControlAvatar() cav->mRootVolp->recursiveMarkForUpdate(TRUE); } } - //cav->updateAnimations(); } else { From 86def9880a59293b06fc1d5dd4a68ce0b85963c4 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Thu, 10 May 2018 14:32:33 +0100 Subject: [PATCH 5/7] MAINT-7867 - additional cap fetch logging --- indra/newview/llviewerregion.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index efaa327af6..3fce30b030 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -242,6 +242,8 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCoro(U64 regionHandle) LL_WARNS("AppInit", "Capabilities") << "Attempting to get capabilities for region that no longer exists!" << LL_ENDL; return; // this error condition is not recoverable. } + LL_DEBUGS("AppInit", "Capabilities") << "requesting seed caps for handle " << regionHandle + << " name " << regionp->getName() << LL_ENDL; std::string url = regionp->getCapability("Seed"); if (url.empty()) @@ -270,7 +272,8 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCoro(U64 regionHandle) buildCapabilityNames(capabilityNames); LL_INFOS("AppInit", "Capabilities") << "Requesting seed from " << url - << " (attempt #" << mSeedCapAttempts + 1 << ")" << LL_ENDL; + << " region name " << regionp->getName() + << " (attempt #" << mSeedCapAttempts + 1 << ")" << LL_ENDL; regionp = NULL; result = httpAdapter->postAndSuspend(httpRequest, url, capabilityNames); @@ -317,6 +320,8 @@ void LLViewerRegionImpl::requestBaseCapabilitiesCoro(U64 regionHandle) #endif regionp->setCapabilitiesReceived(true); + LL_DEBUGS("AppInit", "Capabilities") << "received caps for handle " << regionHandle + << " region name " << regionp->getName() << LL_ENDL; if (STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState()) { From b42b0a9fb9b9aa777c73729f3313a0f1584def86 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Mon, 14 May 2018 14:15:10 +0100 Subject: [PATCH 6/7] MAINT-8554 - disabled joint position clamping for now --- indra/llcharacter/lljoint.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/indra/llcharacter/lljoint.cpp b/indra/llcharacter/lljoint.cpp index 9d10f53bed..07fcd99701 100644 --- a/indra/llcharacter/lljoint.cpp +++ b/indra/llcharacter/lljoint.cpp @@ -435,6 +435,7 @@ void LLJoint::addAttachmentPosOverride( const LLVector3& pos, const LLUUID& mesh // return; //} +#if 0 // AXON MAINT-8554 - this may be overly restrictive for large models LLVector3 constrained_pos = LLVector3(llclamp(pos[0],-LL_MAX_PELVIS_OFFSET, LL_MAX_PELVIS_OFFSET), llclamp(pos[1],-LL_MAX_PELVIS_OFFSET, LL_MAX_PELVIS_OFFSET), llclamp(pos[2],-LL_MAX_PELVIS_OFFSET, LL_MAX_PELVIS_OFFSET)); @@ -443,6 +444,9 @@ void LLJoint::addAttachmentPosOverride( const LLVector3& pos, const LLUUID& mesh LL_DEBUGS("Avatar") << mesh_id << " joint " << getName() << " attachment pos override constrained to " << constrained_pos << " was " << pos << LL_ENDL; } +#else + LLVector3 constrained_pos = pos; +#endif LLVector3 before_pos; LLUUID before_mesh_id; From 75ff54e56abb3e5e3854605e110af941e94df1a8 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Tue, 15 May 2018 18:17:27 +0100 Subject: [PATCH 7/7] MAINT-8652 - joint positions not applied right away for observers of animated objects --- indra/newview/llvovolume.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index e08379af09..e74d20a8ef 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -5166,6 +5166,8 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) bool is_mesh = vobj->isMesh(); F32 est_tris = vobj->getEstTrianglesMax(); + vobj->updateControlAvatar(); + LL_DEBUGS("AnimatedObjectsLinkset") << vobj_name << " rebuilding, isAttachment: " << (U32) vobj->isAttachment() << " is_mesh " << is_mesh << " est_tris " << est_tris @@ -5199,8 +5201,6 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) rigged = rigged || (vobj->isAnimatedObject() && vobj->isRiggedMesh() && vobj->getControlAvatar() && vobj->getControlAvatar()->mPlaying); - vobj->updateControlAvatar(); - bool bake_sunlight = LLPipeline::sBakeSunlight && drawablep->isStatic(); bool any_rigged_face = false;