From e6739d80431091219b5b60b5b305d01a36bf8612 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Mon, 25 Jun 2018 15:35:25 +0100 Subject: MAINT-8765 - fixes for animated object attachment bounding boxes --- indra/newview/llvoavatar.cpp | 41 ++++++++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 7 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index fde3bf4eab..9b8af204cf 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -1334,6 +1334,14 @@ void LLVOAvatar::calculateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax) } + // Pad bounding box for starting joint, plus polymesh if + // applicable. Subsequent calcs should be accurate enough to not + // need padding. + LLVector4a padding(0.25); + newMin.sub(padding); + newMax.add(padding); + + //stretch bounding box by static attachments if (box_detail >= 2) { @@ -1356,6 +1364,22 @@ void LLVOAvatar::calculateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax) if (attached_object && !attached_object->isHUDAttachment()) { const LLVOVolume *vol = dynamic_cast(attached_object); + if (vol && vol->isAnimatedObject()) + { + // Animated objects already have a bounding box in their control av, use that. + // Could lag by a frame if there's no guarantee on order of processing for avatars. + LLControlAvatar *cav = vol->getControlAvatar(); + if (cav) + { + LLVector4a cav_min; + cav_min.load3(cav->mLastAnimExtents[0].mV); + LLVector4a cav_max; + cav_max.load3(cav->mLastAnimExtents[1].mV); + update_min_max(newMin,newMax,cav_min); + update_min_max(newMin,newMax,cav_max); + continue; + } + } if (vol && vol->isRiggedMesh()) { continue; @@ -1432,11 +1456,6 @@ void LLVOAvatar::calculateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax) } } - //pad bounding box - LLVector4a padding(0.1); - newMin.sub(padding); - newMax.add(padding); - // Update pixel area LLVector4a center, size; center.setAdd(newMin, newMax); @@ -9555,6 +9574,13 @@ void LLVOAvatar::getAssociatedVolumes(std::vector& volumes) if (volume) { volumes.push_back(volume); + if (volume->isAnimatedObject()) + { + // For animated object attachment, don't need + // the children. Will just get bounding box + // from the control avatar. + continue; + } } LLViewerObject::const_child_list_t& children = attached_object->getChildren(); for (LLViewerObject::const_child_list_t::const_iterator it = children.begin(); @@ -9568,12 +9594,13 @@ void LLVOAvatar::getAssociatedVolumes(std::vector& volumes) } } } - } + } + LLControlAvatar *control_av = dynamic_cast(this); if (control_av) { LLVOVolume *volp = control_av->mRootVolp; - if (volp && !volp->isAttachment()) + if (volp) { volumes.push_back(volp); LLViewerObject::const_child_list_t& children = volp->getChildren(); -- cgit v1.2.3