From 99effd37ab6cc6611f75cdca9146cc3c46a86482 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Thu, 13 Jul 2017 20:50:38 +0100 Subject: SL-714 - pause animations when animated objects are right clicked, generate rigged volume for wireframe. --- indra/newview/llselectmgr.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'indra/newview/llselectmgr.cpp') diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 983a7ca1ae..4a12d03f74 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -46,6 +46,7 @@ #include "llundo.h" #include "lluuid.h" #include "llvolume.h" +#include "llcontrolavatar.h" #include "message.h" #include "object_flags.h" #include "llquaternion.h" @@ -6660,7 +6661,15 @@ void LLSelectMgr::updateSelectionCenter() } else { - mPauseRequest = NULL; + LLVOVolume *volp = dynamic_cast(object); + if (volp && volp->isAnimatedObject() && volp->getControlAvatar()) + { + mPauseRequest = volp->getControlAvatar()->requestPause(); + } + else + { + mPauseRequest = NULL; + } } if (mSelectedObjects->mSelectType != SELECT_TYPE_HUD && isAgentAvatarValid()) -- cgit v1.2.3 From c4bc677a407049e406bde925df1537f157bda0c3 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Mon, 17 Jul 2017 21:02:16 +0100 Subject: SL-714 - pause associated avatar when an animated object is selected. Handles the possibility that multiple avatars need to be paused. --- indra/newview/llselectmgr.cpp | 63 +++++++++++++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 20 deletions(-) (limited to 'indra/newview/llselectmgr.cpp') diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 4a12d03f74..7bf60d6ffb 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -6629,7 +6629,10 @@ S32 get_family_count(LLViewerObject *parent) //----------------------------------------------------------------------------- // updateSelectionCenter -//----------------------------------------------------------------------------- +// +// FIXME this is a grab bag of functionality only some of which has to do +// with the selection center +// ----------------------------------------------------------------------------- void LLSelectMgr::updateSelectionCenter() { const F32 MOVE_SELECTION_THRESHOLD = 1.f; // Movement threshold in meters for updating selection @@ -6647,31 +6650,12 @@ void LLSelectMgr::updateSelectionCenter() mSelectionCenterGlobal.clearVec(); mShowSelection = FALSE; mSelectionBBox = LLBBox(); - mPauseRequest = NULL; resetAgentHUDZoom(); - } else { mSelectedObjects->mSelectType = getSelectTypeForObject(object); - if (mSelectedObjects->mSelectType == SELECT_TYPE_ATTACHMENT && isAgentAvatarValid() && object->getParent() != NULL) - { - mPauseRequest = gAgentAvatarp->requestPause(); - } - else - { - LLVOVolume *volp = dynamic_cast(object); - if (volp && volp->isAnimatedObject() && volp->getControlAvatar()) - { - mPauseRequest = volp->getControlAvatar()->requestPause(); - } - else - { - mPauseRequest = NULL; - } - } - if (mSelectedObjects->mSelectType != SELECT_TYPE_HUD && isAgentAvatarValid()) { // reset hud ZOOM @@ -6748,6 +6732,45 @@ void LLSelectMgr::updateSelectionCenter() { gEditMenuHandler = NULL; } + + pauseAssociatedAvatars(); +} + +//----------------------------------------------------------------------------- +// pauseAssociatedAvatars +// +// If the selection includes an attachment or an animated object, the +// associated avatars should pause their animations until they are no +// longer selected. +//----------------------------------------------------------------------------- +void LLSelectMgr::pauseAssociatedAvatars() +{ + mPauseRequests.clear(); + + for (LLObjectSelection::iterator iter = mSelectedObjects->begin(); + iter != mSelectedObjects->end(); iter++) + { + LLSelectNode* node = *iter; + LLViewerObject* object = node->getObject(); + if (!object) + continue; + + mSelectedObjects->mSelectType = getSelectTypeForObject(object); + + if (mSelectedObjects->mSelectType == SELECT_TYPE_ATTACHMENT && + isAgentAvatarValid() && object->getParent() != NULL) + { + mPauseRequests.push_back(gAgentAvatarp->requestPause()); + } + else + { + LLVOVolume *volp = dynamic_cast(object); + if (volp && volp->isAnimatedObject() && volp->getControlAvatar()) + { + mPauseRequests.push_back(volp->getControlAvatar()->requestPause()); + } + } + } } void LLSelectMgr::updatePointAt() -- cgit v1.2.3 From 5610444d6450d5eb2e203be527116fe01d2d436a Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Wed, 19 Jul 2017 22:21:08 +0100 Subject: SL-714 - fixes to get wireframes to display consistently when right-clicking on animated objects. --- indra/newview/llselectmgr.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'indra/newview/llselectmgr.cpp') diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 7bf60d6ffb..b6b7d5265b 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -6764,10 +6764,9 @@ void LLSelectMgr::pauseAssociatedAvatars() } else { - LLVOVolume *volp = dynamic_cast(object); - if (volp && volp->isAnimatedObject() && volp->getControlAvatar()) + if (object && object->isAnimatedObject() && object->getControlAvatar()) { - mPauseRequests.push_back(volp->getControlAvatar()->requestPause()); + mPauseRequests.push_back(object->getControlAvatar()->requestPause()); } } } -- cgit v1.2.3 From 72010fba4d07c768b0f5edd5dc56bf89a98a9985 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Fri, 4 Aug 2017 16:20:04 +0100 Subject: SL-718 - bug fixes for animated objects as attachments: Pause all associated avatars when selecting/editing. Don't apply joint positions to the attached avatar on login. --- indra/newview/llselectmgr.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'indra/newview/llselectmgr.cpp') diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index b6b7d5265b..3e8d8883e0 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -6760,12 +6760,27 @@ void LLSelectMgr::pauseAssociatedAvatars() if (mSelectedObjects->mSelectType == SELECT_TYPE_ATTACHMENT && isAgentAvatarValid() && object->getParent() != NULL) { - mPauseRequests.push_back(gAgentAvatarp->requestPause()); + if (object->isAnimatedObject()) + { + // Is an animated object attachment. + // Pause both the control avatar and the avatar it's attached to. + if (object->getControlAvatar()) + { + mPauseRequests.push_back(object->getControlAvatar()->requestPause()); + } + mPauseRequests.push_back(gAgentAvatarp->requestPause()); + } + else + { + // Is a regular attachment. Pause the avatar it's attached to. + mPauseRequests.push_back(gAgentAvatarp->requestPause()); + } } else { if (object && object->isAnimatedObject() && object->getControlAvatar()) { + // Is a non-attached animated object. Pause the control avatar. mPauseRequests.push_back(object->getControlAvatar()->requestPause()); } } -- cgit v1.2.3 From a6068419e7fe1a5a0eda007b2e989769c0a92262 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Fri, 22 Sep 2017 18:04:03 +0100 Subject: SL-794, SL-790 - viewer-side enforcement in UI for various animated object limits that are also enforced on the server. --- indra/newview/llselectmgr.cpp | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'indra/newview/llselectmgr.cpp') diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 3e8d8883e0..d3f240ac91 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -663,6 +663,10 @@ void LLSelectMgr::confirmUnlinkObjects(const LLSD& notification, const LLSD& res // otherwise. this allows the handle_link method to more finely check // the selection and give an error message when the uer has a // reasonable expectation for the link to work, but it will fail. +// +// AXON - additional check that if the selection includes at least one +// animated object, the total mesh triangle count cannot exceed the +// designated limit. bool LLSelectMgr::enableLinkObjects() { bool new_value = false; @@ -687,6 +691,10 @@ bool LLSelectMgr::enableLinkObjects() new_value = LLSelectMgr::getInstance()->getSelection()->applyToRootObjects(&func, firstonly); } } + if (!LLSelectMgr::getInstance()->getSelection()->checkAnimatedObjectEstTris()) + { + new_value = false; + } return new_value; } @@ -7421,6 +7429,27 @@ bool LLObjectSelection::applyToObjects(LLSelectedObjectFunctor* func) return result; } +bool LLObjectSelection::checkAnimatedObjectEstTris() +{ + F32 est_tris = 0; + F32 max_tris = 0; + S32 anim_count = 0; + for (root_iterator iter = root_begin(); iter != root_end(); ) + { + root_iterator nextiter = iter++; + LLViewerObject* object = (*nextiter)->getObject(); + if (!object) + continue; + if (object->isAnimatedObject()) + { + anim_count++; + } + est_tris += object->recursiveGetEstTrianglesHigh(); + max_tris = llmax((F32)max_tris,(F32)object->getAnimatedObjectMaxTris()); + } + return anim_count==0 || est_tris <= max_tris; +} + bool LLObjectSelection::applyToRootObjects(LLSelectedObjectFunctor* func, bool firstonly) { bool result = firstonly ? false : true; -- cgit v1.2.3 From 853924c7efd5c1d067c237d5a44c44db313745e9 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Fri, 29 Sep 2017 19:08:41 +0100 Subject: SL-794 - use largest LOD for est tri count, instead of trusting that it's always the high LOD --- indra/newview/llselectmgr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/newview/llselectmgr.cpp') diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index d3f240ac91..81fd228997 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -7444,7 +7444,7 @@ bool LLObjectSelection::checkAnimatedObjectEstTris() { anim_count++; } - est_tris += object->recursiveGetEstTrianglesHigh(); + est_tris += object->recursiveGetEstTrianglesMax(); max_tris = llmax((F32)max_tris,(F32)object->getAnimatedObjectMaxTris()); } return anim_count==0 || est_tris <= max_tris; -- cgit v1.2.3 From ae40b68ba7fb9ea9c308c0dcb01d19e3d218aeaa Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Wed, 1 Nov 2017 22:07:42 +0100 Subject: SL-830, SL-831 - no linking if any of the roots is animated object. isAnimatedObject() just uses check against extended mesh flag of the root. On select, LLVOVolume marks whole linkset for update if animated object. --- indra/newview/llselectmgr.cpp | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) (limited to 'indra/newview/llselectmgr.cpp') diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 81fd228997..e8b2d1ec8c 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -691,7 +691,7 @@ bool LLSelectMgr::enableLinkObjects() new_value = LLSelectMgr::getInstance()->getSelection()->applyToRootObjects(&func, firstonly); } } - if (!LLSelectMgr::getInstance()->getSelection()->checkAnimatedObjectEstTris()) + if (!LLSelectMgr::getInstance()->getSelection()->checkAnimatedObjectLinkable()) { new_value = false; } @@ -7434,10 +7434,9 @@ bool LLObjectSelection::checkAnimatedObjectEstTris() F32 est_tris = 0; F32 max_tris = 0; S32 anim_count = 0; - for (root_iterator iter = root_begin(); iter != root_end(); ) + for (root_iterator iter = root_begin(); iter != root_end(); ++iter) { - root_iterator nextiter = iter++; - LLViewerObject* object = (*nextiter)->getObject(); + LLViewerObject* object = (*iter)->getObject(); if (!object) continue; if (object->isAnimatedObject()) @@ -7450,6 +7449,20 @@ bool LLObjectSelection::checkAnimatedObjectEstTris() return anim_count==0 || est_tris <= max_tris; } +bool LLObjectSelection::checkAnimatedObjectLinkable() +{ + // Can't link if any of the roots is currently an animated object + for (root_iterator iter = root_begin(); iter != root_end(); ++iter) + { + LLViewerObject* objectp = (*iter)->getObject(); + if (objectp && objectp->isAnimatedObject()) + { + return false; + } + } + return true; +} + bool LLObjectSelection::applyToRootObjects(LLSelectedObjectFunctor* func, bool firstonly) { bool result = firstonly ? false : true; -- cgit v1.2.3 From c7a0b25977a5ca30fc1726370f6363349ff9f836 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Wed, 8 Nov 2017 19:56:09 +0000 Subject: SL-831 - animesh objects are not required to have any tris. If they have no tris, we don't bother making a control avatar for them. --- indra/newview/llselectmgr.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'indra/newview/llselectmgr.cpp') diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index e8b2d1ec8c..f666f447cb 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -691,7 +691,7 @@ bool LLSelectMgr::enableLinkObjects() new_value = LLSelectMgr::getInstance()->getSelection()->applyToRootObjects(&func, firstonly); } } - if (!LLSelectMgr::getInstance()->getSelection()->checkAnimatedObjectLinkable()) + if (!LLSelectMgr::getInstance()->getSelection()->checkAnimatedObjectEstTris()) { new_value = false; } @@ -7451,6 +7451,7 @@ bool LLObjectSelection::checkAnimatedObjectEstTris() bool LLObjectSelection::checkAnimatedObjectLinkable() { + LL_ERRS() << "Not using this restriction" << LL_ENDL; // Can't link if any of the roots is currently an animated object for (root_iterator iter = root_begin(); iter != root_end(); ++iter) { -- cgit v1.2.3 From 2f1b75f03e8066b54d9dae16ab29095752c4ee8a Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Thu, 16 Nov 2017 19:24:53 +0000 Subject: SL-704 - first pass cleaning up comments. Also added LLControlAvatar::initInstance() as a potential hook for optimizations. --- indra/newview/llselectmgr.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'indra/newview/llselectmgr.cpp') diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index f666f447cb..473d7e5b5f 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -664,9 +664,9 @@ void LLSelectMgr::confirmUnlinkObjects(const LLSD& notification, const LLSD& res // the selection and give an error message when the uer has a // reasonable expectation for the link to work, but it will fail. // -// AXON - additional check that if the selection includes at least one -// animated object, the total mesh triangle count cannot exceed the -// designated limit. +// For animated objects, there's additional check that if the +// selection includes at least one animated object, the total mesh +// triangle count cannot exceed the designated limit. bool LLSelectMgr::enableLinkObjects() { bool new_value = false; -- cgit v1.2.3 From 64e5cfc05452993bf15a31d9d4a0deeb1414edf0 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Thu, 16 Nov 2017 20:00:38 +0000 Subject: SL-704 - more cleanup, including releaseMeshData() for control avatars, which don't need mesh data. --- indra/newview/llselectmgr.cpp | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) (limited to 'indra/newview/llselectmgr.cpp') diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 473d7e5b5f..2e489fbc09 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -691,7 +691,7 @@ bool LLSelectMgr::enableLinkObjects() new_value = LLSelectMgr::getInstance()->getSelection()->applyToRootObjects(&func, firstonly); } } - if (!LLSelectMgr::getInstance()->getSelection()->checkAnimatedObjectEstTris()) + if (!LLSelectMgr::getInstance()->getSelection()->checkAnimatedObjectLinkable()) { new_value = false; } @@ -7451,17 +7451,7 @@ bool LLObjectSelection::checkAnimatedObjectEstTris() bool LLObjectSelection::checkAnimatedObjectLinkable() { - LL_ERRS() << "Not using this restriction" << LL_ENDL; - // Can't link if any of the roots is currently an animated object - for (root_iterator iter = root_begin(); iter != root_end(); ++iter) - { - LLViewerObject* objectp = (*iter)->getObject(); - if (objectp && objectp->isAnimatedObject()) - { - return false; - } - } - return true; + return checkAnimatedObjectEstTris(); } bool LLObjectSelection::applyToRootObjects(LLSelectedObjectFunctor* func, bool firstonly) -- cgit v1.2.3 From 7d91a263a8a634b0148fcd9b1a3af28f7b58ca1c Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Wed, 25 Apr 2018 17:10:21 +0100 Subject: MAINT-8549 - more on animesh ARC and associated refactoring --- indra/newview/llselectmgr.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'indra/newview/llselectmgr.cpp') diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index d29a06f7e5..ce5fc7a71e 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -7252,10 +7252,16 @@ F32 LLObjectSelection::getSelectedObjectStreamingCost(S32* total_bytes, S32* vis if (object) { - S32 bytes = 0; - S32 visible = 0; - cost += object->getStreamingCost(&bytes, &visible); + cost += object->getStreamingCost(); + S32 bytes = 0; + S32 visible = 0; + LLMeshCostData costs; + if (object->getCostData(costs)) + { + bytes = costs.getSizeTotal(); + visible = costs.getSizeByLOD(object->getLOD()); + } if (total_bytes) { *total_bytes += bytes; -- cgit v1.2.3