diff options
author | Brad Payne (Vir Linden) <vir@lindenlab.com> | 2018-10-08 16:16:56 +0100 |
---|---|---|
committer | Brad Payne (Vir Linden) <vir@lindenlab.com> | 2018-10-08 16:16:56 +0100 |
commit | 5bb57186350fe00ccdc3f28acc3a55861745e193 (patch) | |
tree | b29b0e4d6b48f24d8f154871b4a26c3fe4eac2c2 | |
parent | 2fc7dcf22f6c04614a5dfc09104e919220f30525 (diff) |
SL-9805 - optimization for avatar rigging info updates
-rw-r--r-- | indra/newview/llvoavatar.cpp | 33 | ||||
-rw-r--r-- | indra/newview/llvoavatar.h | 4 |
2 files changed, 27 insertions, 10 deletions
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index b49f22007b..85019d5ae0 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -1418,14 +1418,7 @@ void LLVOAvatar::calculateSpatialExtents(LLVector4a& newMin, LLVector4a& newMax) // Stretch bounding box by rigged mesh joint boxes if (box_detail>=3) { - // FIXME could try to cache unless something has changed about attached rigged meshes, - // but needs more logic based on volume states. - - //if (mRiggingInfoTab.needsUpdate()) - { - updateRiggingInfo(); - //mJointRiggingInfoTab.setNeedsUpdate(false); - } + updateRiggingInfo(); for (S32 joint_num = 0; joint_num < LL_CHARACTER_MAX_ANIMATED_JOINTS; joint_num++) { LLJoint *joint = getJoint(joint_num); @@ -9624,9 +9617,31 @@ void LLVOAvatar::getAssociatedVolumes(std::vector<LLVOVolume*>& volumes) void LLVOAvatar::updateRiggingInfo() { LL_DEBUGS("RigSpammish") << getFullname() << " updating rig tab" << LL_ENDL; - mJointRiggingInfoTab.clear(); std::vector<LLVOVolume*> volumes; getAssociatedVolumes(volumes); + + // Get current rigging info key + std::map<LLUUID,S32> curr_rigging_info_key; + for (std::vector<LLVOVolume*>::iterator it = volumes.begin(); it != volumes.end(); ++it) + { + LLVOVolume *vol = *it; + if (vol->isMesh() && vol->getVolume()) + { + const LLUUID& mesh_id = vol->getVolume()->getParams().getSculptID(); + S32 max_lod = llmax(vol->getLOD(), vol->mLastRiggingInfoLOD); + curr_rigging_info_key[mesh_id] = max_lod; + } + } + + // Check for key change, which indicates some change in volume composition or LOD. + if (curr_rigging_info_key == mLastRiggingInfoKey) + { + return; + } + + // Something changed. Update. + mLastRiggingInfoKey = curr_rigging_info_key; + mJointRiggingInfoTab.clear(); for (std::vector<LLVOVolume*>::iterator it = volumes.begin(); it != volumes.end(); ++it) { LLVOVolume *vol = *it; diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 985559f2d6..e6b1477758 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -220,7 +220,9 @@ public: // virtual void updateRiggingInfo(); - + // This encodes mesh id and LOD, so we can see whether display is up-to-date. + std::map<LLUUID,S32> mLastRiggingInfoKey; + std::set<LLUUID> mActiveOverrideMeshes; virtual void onActiveOverrideMeshesChanged(); |