From 7691780825940364e3faa7a682490f51491d44dc Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Thu, 25 May 2017 11:11:02 +0100 Subject: SL-694 - Added extra param field for flags related to extended mesh functionality. Currently this is just one bit to flag an object as able to animate --- indra/newview/llviewerobject.cpp | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 1d6daed9cc..030c0ca9f6 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -5458,6 +5458,11 @@ LLViewerObject::ExtraParameter* LLViewerObject::createNewParameterEntry(U16 para new_block = new LLLightImageParams(); break; } + case LLNetworkData::PARAMS_EXTENDED_MESH: + { + new_block = new LLExtendedMeshParams(); + break; + } default: { LL_INFOS() << "Unknown param type." << LL_ENDL; -- cgit v1.2.3 From c9baf4c66157c601cc4d4e325c7843b3bf9a0cad Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Wed, 7 Jun 2017 14:23:49 +0100 Subject: SL-691,SL-694 - viewer can animate objects based on server messaging. First end-to-end demo for animated objects. --- indra/newview/llviewerobject.cpp | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 030c0ca9f6..ff808ba079 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -60,6 +60,7 @@ #include "llbbox.h" #include "llbox.h" #include "llcylinder.h" +#include "llcontrolavatar.h" #include "lldrawable.h" #include "llface.h" #include "llfloaterproperties.h" @@ -138,7 +139,7 @@ const F32 PHYSICS_TIMESTEP = 1.f / 45.f; static LLTrace::BlockTimerStatHandle FTM_CREATE_OBJECT("Create Object"); // static -LLViewerObject *LLViewerObject::createObject(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp) +LLViewerObject *LLViewerObject::createObject(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp, S32 flags) { LLViewerObject *res = NULL; LL_RECORD_BLOCK_TIME(FTM_CREATE_OBJECT); @@ -166,6 +167,12 @@ LLViewerObject *LLViewerObject::createObject(const LLUUID &id, const LLPCode pco } res = gAgentAvatarp; } + else if (flags & CO_FLAG_CONTROL_AVATAR) + { + LLControlAvatar *avatar = new LLControlAvatar(id, pcode, regionp); + avatar->initInstance(); + res = avatar; + } else { LLVOAvatar *avatar = new LLVOAvatar(id, pcode, regionp); @@ -235,6 +242,7 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe mText(), mHudText(""), mHudTextColor(LLColor4::white), + mControlAvatar(NULL), mLastInterpUpdateSecs(0.f), mLastMessageUpdateSecs(0.f), mLatestRecvPacketID(0), @@ -259,7 +267,7 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe mRotTime(0.f), mAngularVelocityRot(), mPreviousRotation(), - mState(0), + mAttachmentState(0), mMedia(NULL), mClickAction(0), mObjectCost(0), @@ -369,11 +377,18 @@ void LLViewerObject::markDead() ((LLViewerObject *)getParent())->removeChild(this); } LLUUID mesh_id; + // FIXME AXON - need to do this for control avatars too if (av && LLVOAvatar::getRiggedMeshID(this,mesh_id)) { // This case is needed for indirectly attached mesh objects. av->resetJointsOnDetach(mesh_id); } + if (mControlAvatar) + { + LLControlAvatar *av = mControlAvatar; + mControlAvatar = NULL; + av->markDead(); + } // Mark itself as dead mDead = TRUE; @@ -1378,7 +1393,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, U8 state; mesgsys->getU8Fast(_PREHASH_ObjectData, _PREHASH_State, state, block_num ); - mState = state; + mAttachmentState = state; // ...new objects that should come in selected need to be added to the selected list mCreateSelected = ((flags & FLAGS_CREATE_SELECTED) != 0); @@ -1648,7 +1663,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, U8 state; mesgsys->getU8Fast(_PREHASH_ObjectData, _PREHASH_State, state, block_num ); - mState = state; + mAttachmentState = state; break; } @@ -1671,7 +1686,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, U8 state; dp->unpackU8(state, "State"); - mState = state; + mAttachmentState = state; switch(update_type) { @@ -3857,7 +3872,7 @@ const LLVector3 LLViewerObject::getRenderPosition() const if (mDrawable.notNull() && mDrawable->isState(LLDrawable::RIGGED)) { LLVOAvatar* avatar = getAvatar(); - if (avatar) + if (avatar && !mControlAvatar) { return avatar->getPositionAgent(); } @@ -3993,6 +4008,10 @@ void LLViewerObject::setPosition(const LLVector3 &pos, BOOL damped) // position caches need to be up to date on root objects updatePositionCaches(); } + if (mControlAvatar) + { + mControlAvatar->matchTransform(dynamic_cast(this)); + } } void LLViewerObject::setPositionGlobal(const LLVector3d &pos_global, BOOL damped) @@ -6358,6 +6377,10 @@ const std::string& LLViewerObject::getAttachmentItemName() const //virtual LLVOAvatar* LLViewerObject::getAvatar() const { + if (mControlAvatar) + { + return mControlAvatar; + } if (isAttachment()) { LLViewerObject* vobj = (LLViewerObject*) getParent(); -- cgit v1.2.3 From 4907e437c1a9523e3b3d098403da8c780c6345f9 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Tue, 20 Jun 2017 15:04:11 +0100 Subject: SL-731 - control avatar has pointer back to associated volume. Can use this link to find associated inventory item name for an animation in debug display. --- indra/newview/llviewerobject.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index ff808ba079..f1c7cfae0d 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -4010,7 +4010,7 @@ void LLViewerObject::setPosition(const LLVector3 &pos, BOOL damped) } if (mControlAvatar) { - mControlAvatar->matchTransform(dynamic_cast(this)); + mControlAvatar->matchVolumeTransform(); } } -- cgit v1.2.3 From b6aedb116f60b9e4823f61b945b3f374d9267c1d Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Tue, 27 Jun 2017 14:15:42 +0100 Subject: SL-722 - in progress on managing animated object state with linksets --- indra/newview/llviewerobject.cpp | 65 ++++++++++++++++++++++++++++++++++------ 1 file changed, 56 insertions(+), 9 deletions(-) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index f1c7cfae0d..bd0e864f80 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -383,11 +383,9 @@ void LLViewerObject::markDead() // This case is needed for indirectly attached mesh objects. av->resetJointsOnDetach(mesh_id); } - if (mControlAvatar) + if (getControlAvatar()) { - LLControlAvatar *av = mControlAvatar; - mControlAvatar = NULL; - av->markDead(); + unlinkControlAvatar(); } // Mark itself as dead @@ -2917,6 +2915,55 @@ void LLViewerObject::fetchInventoryFromServer() } } +LLControlAvatar *LLViewerObject::getControlAvatar() +{ + return getRootEdit()->mControlAvatar.get(); +} + +LLControlAvatar *LLViewerObject::getControlAvatar() const +{ + return getRootEdit()->mControlAvatar.get(); +} + +void LLViewerObject::linkControlAvatar() +{ + if (!getControlAvatar() && isRootEdit()) + { + LLVOVolume *volp = dynamic_cast(this); + if (!volp) + { + LL_WARNS() << "called with null or non-volume object" << LL_ENDL; + return; + } + mControlAvatar = LLControlAvatar::createControlAvatar(volp); + } + if (getControlAvatar()) + { + getControlAvatar()->addAttachmentOverridesForObject(this); + } + else + { + LL_WARNS() << "no control avatar found!" << LL_ENDL; + } +} + +void LLViewerObject::unlinkControlAvatar() +{ + if (getControlAvatar()) + { + getControlAvatar()->resetJointsOnDetach(this); + } + if (isRootEdit()) + { + // This will remove the entire linkset from the control avatar + LLControlAvatar *av = mControlAvatar; + mControlAvatar = NULL; + av->markDead(); + } + // For non-root prims, removing from the linkset will + // automatically remove the control avatar connection. +} + struct LLFilenameAndTask { LLUUID mTaskID; @@ -3872,7 +3919,7 @@ const LLVector3 LLViewerObject::getRenderPosition() const if (mDrawable.notNull() && mDrawable->isState(LLDrawable::RIGGED)) { LLVOAvatar* avatar = getAvatar(); - if (avatar && !mControlAvatar) + if (avatar && !getControlAvatar()) { return avatar->getPositionAgent(); } @@ -4008,9 +4055,9 @@ void LLViewerObject::setPosition(const LLVector3 &pos, BOOL damped) // position caches need to be up to date on root objects updatePositionCaches(); } - if (mControlAvatar) + if (getControlAvatar() && isRootEdit()) { - mControlAvatar->matchVolumeTransform(); + getControlAvatar()->matchVolumeTransform(); } } @@ -6377,9 +6424,9 @@ const std::string& LLViewerObject::getAttachmentItemName() const //virtual LLVOAvatar* LLViewerObject::getAvatar() const { - if (mControlAvatar) + if (getControlAvatar()) { - return mControlAvatar; + return getControlAvatar(); } if (isAttachment()) { -- cgit v1.2.3 From 7af46e7fe37552175c46a9366e9574bb9c716a68 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Tue, 27 Jun 2017 20:24:15 +0100 Subject: SL-722 - defer markDead() for LLControlAvatar when unlinking. Fixes asset crash in pipeline. Also added various checks for mDrawable null in llvoavatar.cpp. --- indra/newview/llviewerobject.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index bd0e864f80..06efb1bc3a 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -2958,7 +2958,7 @@ void LLViewerObject::unlinkControlAvatar() // This will remove the entire linkset from the control avatar LLControlAvatar *av = mControlAvatar; mControlAvatar = NULL; - av->markDead(); + av->markForDeath(); } // For non-root prims, removing from the linkset will // automatically remove the control avatar connection. -- cgit v1.2.3 From c2280848e1714329172ea4c0881993aa62f3cd8f Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Wed, 28 Jun 2017 22:17:28 +0100 Subject: SL-722 - work on support for animated object state when linkset-altering operations take place --- indra/newview/llviewerobject.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 06efb1bc3a..9a6153d3e6 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -377,7 +377,6 @@ void LLViewerObject::markDead() ((LLViewerObject *)getParent())->removeChild(this); } LLUUID mesh_id; - // FIXME AXON - need to do this for control avatars too if (av && LLVOAvatar::getRiggedMeshID(this,mesh_id)) { // This case is needed for indirectly attached mesh objects. -- cgit v1.2.3 From a09cc5f4bb9ccf93db7233d0b1fd0142803b2f23 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Fri, 30 Jun 2017 20:49:23 +0100 Subject: SL-731 - added a hook for debug text specific to control avatars. Also renamed resetJointsOnDetach to removeAttachmentOverridesForObject to make the connection to addAttachmentOverridesForObject more obvious. --- indra/newview/llviewerobject.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 9a6153d3e6..c6051650cf 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -371,17 +371,19 @@ void LLViewerObject::markDead() //LL_INFOS() << "Marking self " << mLocalID << " as dead." << LL_ENDL; // Root object of this hierarchy unlinks itself. - LLVOAvatar *av = getAvatarAncestor(); if (getParent()) { ((LLViewerObject *)getParent())->removeChild(this); } LLUUID mesh_id; - if (av && LLVOAvatar::getRiggedMeshID(this,mesh_id)) - { - // This case is needed for indirectly attached mesh objects. - av->resetJointsOnDetach(mesh_id); - } + { + LLVOAvatar *av = getAvatar(); + if (av && LLVOAvatar::getRiggedMeshID(this,mesh_id)) + { + // This case is needed for indirectly attached mesh objects. + av->removeAttachmentOverridesForObject(mesh_id); + } + } if (getControlAvatar()) { unlinkControlAvatar(); @@ -2950,7 +2952,7 @@ void LLViewerObject::unlinkControlAvatar() { if (getControlAvatar()) { - getControlAvatar()->resetJointsOnDetach(this); + getControlAvatar()->removeAttachmentOverridesForObject(this); } if (isRootEdit()) { @@ -5187,6 +5189,7 @@ LLVOAvatar* LLViewerObject::asAvatar() // If this object is directly or indirectly parented by an avatar, return it. LLVOAvatar* LLViewerObject::getAvatarAncestor() { + LL_ERRS("AXON") << "this method has been targetted for termination. Use getAvatar()." << LL_ENDL; LLViewerObject *pobj = (LLViewerObject*) getParent(); while (pobj) { -- 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/llviewerobject.cpp | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index c6051650cf..cb9f9e0455 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -2965,6 +2965,12 @@ void LLViewerObject::unlinkControlAvatar() // automatically remove the control avatar connection. } +// virtual +bool LLViewerObject::isAnimatedObject() const +{ + return false; +} + struct LLFilenameAndTask { LLUUID mTaskID; -- cgit v1.2.3 From 30880e062afa0671b166f161ae7c109bfd37d38f Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Fri, 21 Jul 2017 20:01:40 +0100 Subject: SL-751, SL-691 - test lsl scripts update, better syncing between skeleton and drawable --- indra/newview/llviewerobject.cpp | 4 ---- 1 file changed, 4 deletions(-) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index cb9f9e0455..e2fbac023a 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -4062,10 +4062,6 @@ void LLViewerObject::setPosition(const LLVector3 &pos, BOOL damped) // position caches need to be up to date on root objects updatePositionCaches(); } - if (getControlAvatar() && isRootEdit()) - { - getControlAvatar()->matchVolumeTransform(); - } } void LLViewerObject::setPositionGlobal(const LLVector3d &pos_global, BOOL damped) -- cgit v1.2.3 From 2aa890da0bd8b42493745daa736c5ed9451bbf91 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Fri, 8 Sep 2017 16:05:49 +0100 Subject: SL-718 - better support for transforms of animated attachments --- indra/newview/llviewerobject.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index e2fbac023a..34e7bc0fad 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -5188,10 +5188,15 @@ LLVOAvatar* LLViewerObject::asAvatar() return NULL; } -// If this object is directly or indirectly parented by an avatar, return it. +// If this object is directly or indirectly parented by an avatar, +// return it. Normally getAvatar() is the correct function to call; +// it will give the avatar used for skinning. The exception is with +// animated objects that are also attachments; in that case, +// getAvatar() will return the control avatar, used for skinning, and +// getAvatarAncestor will return the avatar to which the object is +// attached. LLVOAvatar* LLViewerObject::getAvatarAncestor() { - LL_ERRS("AXON") << "this method has been targetted for termination. Use getAvatar()." << LL_ENDL; LLViewerObject *pobj = (LLViewerObject*) getParent(); while (pobj) { -- 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/llviewerobject.cpp | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 34e7bc0fad..0140a63e73 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -3580,6 +3580,38 @@ F32 LLViewerObject::getLinksetPhysicsCost() return mLinksetPhysicsCost; } +F32 LLViewerObject::recursiveGetEstTrianglesHigh() const +{ + F32 est_tris = getEstTrianglesHigh(); + for (child_list_t::const_iterator iter = mChildList.begin(); + iter != mChildList.end(); iter++) + { + const LLViewerObject* child = *iter; + est_tris += child->recursiveGetEstTrianglesHigh(); + } + return est_tris; +} + +S32 LLViewerObject::getAnimatedObjectMaxTris() const +{ + S32 max_tris = 0; + LLSD features; + if (getRegion()) + { + getRegion()->getSimulatorFeatures(features); + if (features.has("AnimatedObjects")) + { + max_tris = features["AnimatedObjects"]["AnimatedObjectMaxTris"].asInteger(); + } + } + return max_tris; +} + +F32 LLViewerObject::getEstTrianglesHigh() const +{ + return 0.f; +} + F32 LLViewerObject::getStreamingCost(S32* bytes, S32* visible_bytes, F32* unscaled_value) const { return 0.f; @@ -3698,7 +3730,6 @@ void LLViewerObject::boostTexturePriority(BOOL boost_children /* = TRUE */) } } - void LLViewerObject::setLineWidthForWindowSize(S32 window_width) { if (window_width < 700) -- cgit v1.2.3 From 108fe6234488d9a383dea0be327af403487135f3 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Thu, 28 Sep 2017 19:06:36 +0100 Subject: SL-761, SL-718 - transform matrix munging for skeletons of animated object attachments, to allow editing to work correctly --- indra/newview/llviewerobject.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 0140a63e73..99c68dab10 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -3981,7 +3981,7 @@ const LLVector3 LLViewerObject::getPivotPositionAgent() const const LLQuaternion LLViewerObject::getRenderRotation() const { LLQuaternion ret; - if (mDrawable.notNull() && mDrawable->isState(LLDrawable::RIGGED)) + if (mDrawable.notNull() && mDrawable->isState(LLDrawable::RIGGED) && !isAnimatedObject()) { return ret; } -- 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/llviewerobject.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 99c68dab10..616db8ae2f 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -3580,14 +3580,14 @@ F32 LLViewerObject::getLinksetPhysicsCost() return mLinksetPhysicsCost; } -F32 LLViewerObject::recursiveGetEstTrianglesHigh() const +F32 LLViewerObject::recursiveGetEstTrianglesMax() const { - F32 est_tris = getEstTrianglesHigh(); + F32 est_tris = getEstTrianglesMax(); for (child_list_t::const_iterator iter = mChildList.begin(); iter != mChildList.end(); iter++) { const LLViewerObject* child = *iter; - est_tris += child->recursiveGetEstTrianglesHigh(); + est_tris += child->recursiveGetEstTrianglesMax(); } return est_tris; } @@ -3607,7 +3607,7 @@ S32 LLViewerObject::getAnimatedObjectMaxTris() const return max_tris; } -F32 LLViewerObject::getEstTrianglesHigh() const +F32 LLViewerObject::getEstTrianglesMax() const { return 0.f; } -- cgit v1.2.3 From 217df36656fb1a3d309fa0b42de192c369309211 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Mon, 2 Oct 2017 21:52:24 +0100 Subject: SL-808 - updated ARC display to largely work with animated objects. Gives some triangle information that we may or may not ultimately keep. Surface area calcs still not working --- indra/newview/llviewerobject.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 616db8ae2f..94e1390c42 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -3627,6 +3627,22 @@ U32 LLViewerObject::getHighLODTriangleCount() return 0; } +U32 LLViewerObject::recursiveGetTriangleCount(S32* vcount) const +{ + S32 total_tris = getTriangleCount(vcount); + LLViewerObject::const_child_list_t& child_list = getChildren(); + for (LLViewerObject::const_child_list_t::const_iterator iter = child_list.begin(); + iter != child_list.end(); ++iter) + { + LLViewerObject* childp = *iter; + if (childp) + { + total_tris += childp->getTriangleCount(vcount); + } + } + return total_tris; +} + void LLViewerObject::updateSpatialExtents(LLVector4a& newMin, LLVector4a &newMax) { LLVector4a center; -- cgit v1.2.3 From 36c44242133697611216375c94d637ef88cd66cc Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Tue, 3 Oct 2017 22:26:00 +0100 Subject: SL-808 - more work on arc display. area calculations still have some issues, especially for animated objects. --- indra/newview/llviewerobject.cpp | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 94e1390c42..17e3d68c72 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -3643,6 +3643,42 @@ U32 LLViewerObject::recursiveGetTriangleCount(S32* vcount) const return total_tris; } +// This is using the stored surface area for each volume (which +// defaults to 1.0 for the case of everything except a sculpt) and +// then scaling it linearly based on the largest dimension in the +// prim's scale. Should revisit at some point. +F32 LLViewerObject::recursiveGetScaledSurfaceArea() const +{ + F32 area = 0.f; + const LLDrawable* drawable = mDrawable; + if (drawable) + { + const LLVOVolume* volume = drawable->getVOVolume(); + if (volume) + { + if (volume->getVolume()) + { + const LLVector3& scale = volume->getScale(); + area += volume->getVolume()->getSurfaceArea() * llmax(llmax(scale.mV[0], scale.mV[1]), scale.mV[2]); + } + LLViewerObject::const_child_list_t children = volume->getChildren(); + for (LLViewerObject::const_child_list_t::const_iterator child_iter = children.begin(); + child_iter != children.end(); + ++child_iter) + { + LLViewerObject* child_obj = *child_iter; + LLVOVolume *child = dynamic_cast( child_obj ); + if (child && child->getVolume()) + { + const LLVector3& scale = child->getScale(); + area += child->getVolume()->getSurfaceArea() * llmax(llmax(scale.mV[0], scale.mV[1]), scale.mV[2]); + } + } + } + } + return area; +} + void LLViewerObject::updateSpatialExtents(LLVector4a& newMin, LLVector4a &newMax) { LLVector4a center; -- cgit v1.2.3 From 20b7f4684c8182a02422160ad3c5b6102dc8f997 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Wed, 4 Oct 2017 19:52:11 +0100 Subject: MAINT-7867 - changed simulator feature query so we're only looking in the agent's region. This assumes that all regions will have the same settings, which is normally a safe assumption. --- indra/newview/llviewerobject.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 17e3d68c72..0a05a96f09 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -3596,9 +3596,9 @@ S32 LLViewerObject::getAnimatedObjectMaxTris() const { S32 max_tris = 0; LLSD features; - if (getRegion()) + if (gAgent.getRegion()) { - getRegion()->getSimulatorFeatures(features); + gAgent.getRegion()->getSimulatorFeatures(features); if (features.has("AnimatedObjects")) { max_tris = features["AnimatedObjects"]["AnimatedObjectMaxTris"].asInteger(); -- cgit v1.2.3 From ef0e3bfdd92bb5faea633a14487f123dfeb2f5f1 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Fri, 27 Oct 2017 21:27:36 +0100 Subject: SL-731, SL-779 - more diagnostics for DebugAnimatedObjects, fixed a problem with recursiveMarkForUpdate --- indra/newview/llviewerobject.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 8e50f2dc08..b17d83486f 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -6020,6 +6020,17 @@ void LLViewerObject::updateVolume(const LLVolumeParams& volume_params) } } +void LLViewerObject::recursiveMarkForUpdate(BOOL priority) +{ + for (LLViewerObject::child_list_t::iterator iter = mChildList.begin(); + iter != mChildList.end(); iter++) + { + LLViewerObject* child = *iter; + child->markForUpdate(priority); + } + markForUpdate(priority); +} + void LLViewerObject::markForUpdate(BOOL priority) { if (mDrawable.notNull()) -- cgit v1.2.3 From e8fe39f33266c96797ca976978b24bf9cd778f8c Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Mon, 6 Nov 2017 14:02:38 +0000 Subject: SL-830 - more diagnostics and possible fixes around corrupted graphics state --- indra/newview/llviewerobject.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index b17d83486f..404a771571 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -688,6 +688,18 @@ void LLViewerObject::setNameValueList(const std::string& name_value_list) } } +BOOL LLViewerObject::isAnySelected() const +{ + bool any_selected = isSelected(); + for (child_list_t::const_iterator iter = mChildList.begin(); + iter != mChildList.end(); iter++) + { + const LLViewerObject* child = *iter; + any_selected = any_selected || child->isSelected(); + } + return any_selected; +} + void LLViewerObject::setSelected(BOOL sel) { mUserSelected = sel; -- cgit v1.2.3 From 625344a8e318b24b7d96a9bb9fa2da23166b991f Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Wed, 8 Nov 2017 20:38:26 +0000 Subject: Added debug setting AnimatedObjectIgnoreLimits for server testing --- indra/newview/llviewerobject.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 404a771571..42f6b081e5 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -3607,13 +3607,21 @@ F32 LLViewerObject::recursiveGetEstTrianglesMax() const S32 LLViewerObject::getAnimatedObjectMaxTris() const { S32 max_tris = 0; - LLSD features; - if (gAgent.getRegion()) + // AXON remove after server testing done + if (gSavedSettings.getBOOL("AnimatedObjectsIgnoreLimits")) { - gAgent.getRegion()->getSimulatorFeatures(features); - if (features.has("AnimatedObjects")) + max_tris = S32_MAX; + } + else + { + if (gAgent.getRegion()) { - max_tris = features["AnimatedObjects"]["AnimatedObjectMaxTris"].asInteger(); + LLSD features; + gAgent.getRegion()->getSimulatorFeatures(features); + if (features.has("AnimatedObjects")) + { + max_tris = features["AnimatedObjects"]["AnimatedObjectMaxTris"].asInteger(); + } } } return max_tris; -- cgit v1.2.3 From 07e925d279b6c52c0cf352173dfb81fd1740d651 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Thu, 9 Nov 2017 16:48:04 +0000 Subject: MAINT-7913, MAINT-7817 - fix for animesh attachment corruption after teleporting to a different simulator. Turns out the control avatar (skeleton) was getting caught up in the cleanup for the original region --- indra/newview/llviewerobject.cpp | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 42f6b081e5..e49c37be5e 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -6102,6 +6102,11 @@ void LLViewerObject::setRegion(LLViewerRegion *regionp) child->setRegion(regionp); } + if (mControlAvatar) + { + mControlAvatar->setRegion(regionp); + } + setChanged(MOVED | SILHOUETTE); updateDrawable(FALSE); } -- cgit v1.2.3 From bb48fae5ceb577118cad436e7b0abe72f33ba031 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Thu, 9 Nov 2017 18:29:34 +0000 Subject: SL-786 - control avatar deletion --- indra/newview/llviewerobject.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index e49c37be5e..3435217fa4 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -2969,9 +2969,11 @@ void LLViewerObject::unlinkControlAvatar() if (isRootEdit()) { // This will remove the entire linkset from the control avatar - LLControlAvatar *av = mControlAvatar; - mControlAvatar = NULL; - av->markForDeath(); + if (mControlAvatar) + { + mControlAvatar->markForDeath(); + mControlAvatar = NULL; + } } // For non-root prims, removing from the linkset will // automatically remove the control avatar connection. -- 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/llviewerobject.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 3435217fa4..7d370aff35 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -3609,7 +3609,7 @@ F32 LLViewerObject::recursiveGetEstTrianglesMax() const S32 LLViewerObject::getAnimatedObjectMaxTris() const { S32 max_tris = 0; - // AXON remove after server testing done + // AXON REMOVE AFTER SERVER TESTING DONE if (gSavedSettings.getBOOL("AnimatedObjectsIgnoreLimits")) { max_tris = S32_MAX; -- 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/llviewerobject.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 7d370aff35..6fff3b0afd 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -3609,8 +3609,7 @@ F32 LLViewerObject::recursiveGetEstTrianglesMax() const S32 LLViewerObject::getAnimatedObjectMaxTris() const { S32 max_tris = 0; - // AXON REMOVE AFTER SERVER TESTING DONE - if (gSavedSettings.getBOOL("AnimatedObjectsIgnoreLimits")) + if (gSavedSettings.getBOOL("AnimatedObjectsIgnoreLimits")) // AXON REMOVE AFTER SERVER TESTING DONE { max_tris = S32_MAX; } -- cgit v1.2.3 From 4b439ff968a934c127cd685b54bcc206e467a948 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Mon, 4 Dec 2017 11:15:47 +0000 Subject: SL-704 - made avatar hierarchy more consistent by adding lluiavatar for viewer-local avs used in upload previews --- indra/newview/llviewerobject.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 2e4c995be4..915b4348b4 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -70,6 +70,7 @@ #include "llselectmgr.h" #include "llrendersphere.h" #include "lltooldraganddrop.h" +#include "lluiavatar.h" #include "llviewercamera.h" #include "llviewertexturelist.h" #include "llviewerinventory.h" @@ -169,10 +170,16 @@ LLViewerObject *LLViewerObject::createObject(const LLUUID &id, const LLPCode pco } else if (flags & CO_FLAG_CONTROL_AVATAR) { - LLControlAvatar *avatar = new LLControlAvatar(id, pcode, regionp); - avatar->initInstance(); - res = avatar; + LLControlAvatar *control_avatar = new LLControlAvatar(id, pcode, regionp); + control_avatar->initInstance(); + res = control_avatar; } + else if (flags & CO_FLAG_UI_AVATAR) + { + LLUIAvatar *ui_avatar = new LLUIAvatar(id, pcode, regionp); + ui_avatar->initInstance(); + res = ui_avatar; + } else { LLVOAvatar *avatar = new LLVOAvatar(id, pcode, regionp); -- cgit v1.2.3 From 095dd1b800d82a0fc97177a6fb668ddc72943613 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Thu, 21 Dec 2017 20:03:56 +0000 Subject: SL-859 - create control avatar if needed when animation request received --- indra/newview/llviewerobject.cpp | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 915b4348b4..fdfc54b67e 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -2947,6 +2947,34 @@ LLControlAvatar *LLViewerObject::getControlAvatar() const return getRootEdit()->mControlAvatar.get(); } +void LLViewerObject::updateControlAvatar() +{ + LLViewerObject *root = getRootEdit(); + if (root->isAnimatedObject() && !root->getControlAvatar()) + { + bool any_mesh = root->isMesh(); + 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_mesh = any_mesh || child->isMesh(); + } + if (any_mesh) + { + std::string vobj_name = llformat("Vol%u", (U32) root); + LL_DEBUGS("AnimatedObjects") << vobj_name << " calling linkControlAvatar()" << LL_ENDL; + root->linkControlAvatar(); + } + } + if (!root->isAnimatedObject() && root->getControlAvatar()) + { + std::string vobj_name = llformat("Vol%u", (U32) root); + LL_DEBUGS("AnimatedObjects") << vobj_name << " calling unlinkControlAvatar()" << LL_ENDL; + root->unlinkControlAvatar(); + } +} + void LLViewerObject::linkControlAvatar() { if (!getControlAvatar() && isRootEdit()) -- cgit v1.2.3 From 500aaa16ff2aa35b318176fd01cfaba47376f5a5 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Fri, 12 Jan 2018 15:34:44 +0000 Subject: MAINT-8145 - reduce zoom lag by updating joint position overrides less often, no longer done in rebuildGeom() --- indra/newview/llviewerobject.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index fdfc54b67e..147aa1b713 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -388,7 +388,7 @@ void LLViewerObject::markDead() if (av && LLVOAvatar::getRiggedMeshID(this,mesh_id)) { // This case is needed for indirectly attached mesh objects. - av->removeAttachmentOverridesForObject(mesh_id); + av->rebuildAttachmentOverrides(); } } if (getControlAvatar()) @@ -2989,7 +2989,7 @@ void LLViewerObject::linkControlAvatar() } if (getControlAvatar()) { - getControlAvatar()->addAttachmentOverridesForObject(this); + getControlAvatar()->rebuildAttachmentOverrides(); } else { @@ -3001,7 +3001,7 @@ void LLViewerObject::unlinkControlAvatar() { if (getControlAvatar()) { - getControlAvatar()->removeAttachmentOverridesForObject(this); + getControlAvatar()->rebuildAttachmentOverrides(); } if (isRootEdit()) { -- cgit v1.2.3 From b57ac03b395c7637be7a224ecaefe96afef2ed10 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Wed, 17 Jan 2018 17:59:01 +0000 Subject: Fix for 64-bit pointers in some llformat statements --- indra/newview/llviewerobject.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index c2922182d4..ee67f5062e 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -2962,14 +2962,14 @@ void LLViewerObject::updateControlAvatar() } if (any_mesh) { - std::string vobj_name = llformat("Vol%u", (U32) root); + std::string vobj_name = llformat("Vol%p", root); LL_DEBUGS("AnimatedObjects") << vobj_name << " calling linkControlAvatar()" << LL_ENDL; root->linkControlAvatar(); } } if (!root->isAnimatedObject() && root->getControlAvatar()) { - std::string vobj_name = llformat("Vol%u", (U32) root); + std::string vobj_name = llformat("Vol%p", root); LL_DEBUGS("AnimatedObjects") << vobj_name << " calling unlinkControlAvatar()" << LL_ENDL; root->unlinkControlAvatar(); } -- cgit v1.2.3 From 26add5700d88338b94ce891892948998b0468131 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Mon, 22 Jan 2018 22:08:06 +0000 Subject: MAINT-8159 - animation state management during link/unlink commands --- indra/newview/llviewerobject.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index ee67f5062e..0d515b28d0 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -879,9 +879,18 @@ void LLViewerObject::addChild(LLViewerObject *childp) if(childp->setParent(this)) { mChildList.push_back(childp); + childp->afterReparent(); } } +void LLViewerObject::onReparent(LLViewerObject *old_parent, LLViewerObject *new_parent) +{ +} + +void LLViewerObject::afterReparent() +{ +} + void LLViewerObject::removeChild(LLViewerObject *childp) { for (child_list_t::iterator i = mChildList.begin(); i != mChildList.end(); ++i) @@ -2990,6 +2999,7 @@ void LLViewerObject::linkControlAvatar() if (getControlAvatar()) { getControlAvatar()->rebuildAttachmentOverrides(); + getControlAvatar()->updateAnimations(); } else { -- cgit v1.2.3 From 3a8b1bf1e4b30e8efb1fe161706c8d5f41fccad8 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Mon, 29 Jan 2018 16:35:56 +0000 Subject: SL-859 - exceptionally verbose logging of object state updates, likely temporary --- indra/newview/llviewerobject.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 0d515b28d0..5e88f9635f 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -105,6 +105,7 @@ #include "llfloaterperms.h" #include "llvocache.h" #include "llcleanup.h" +#include "llcallstack.h" //#define DEBUG_UPDATE_TYPE @@ -142,6 +143,9 @@ static LLTrace::BlockTimerStatHandle FTM_CREATE_OBJECT("Create Object"); // static LLViewerObject *LLViewerObject::createObject(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp, S32 flags) { + LL_DEBUGS("AnimatedObjects") << "creating " << id << LL_ENDL; + dumpStack("AnimatedObjectsStack"); + LLViewerObject *res = NULL; LL_RECORD_BLOCK_TIME(FTM_CREATE_OBJECT); @@ -1107,6 +1111,9 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, { LL_DEBUGS_ONCE("SceneLoadTiming") << "Received viewer object data" << LL_ENDL; + LL_DEBUGS("AnimatedObjects") << " mesgsys " << mesgsys << " dp " << dp << " id " << getID() << " update_type " << (S32) update_type << LL_ENDL; + dumpStack("AnimatedObjectsStack"); + U32 retval = 0x0; // If region is removed from the list it is also deleted. @@ -1161,10 +1168,10 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, F32 time_dilation = 1.f; if(mesgsys != NULL) { - U16 time_dilation16; - mesgsys->getU16Fast(_PREHASH_RegionData, _PREHASH_TimeDilation, time_dilation16); - time_dilation = ((F32) time_dilation16) / 65535.f; - mRegionp->setTimeDilation(time_dilation); + U16 time_dilation16; + mesgsys->getU16Fast(_PREHASH_RegionData, _PREHASH_TimeDilation, time_dilation16); + time_dilation = ((F32) time_dilation16) / 65535.f; + mRegionp->setTimeDilation(time_dilation); } // this will be used to determine if we've really changed position -- cgit v1.2.3 From 9af10a84cf0671d04e844299456d4bc48d1dec45 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Fri, 2 Feb 2018 20:32:43 +0000 Subject: MAINT-8239 - problems with some instances failing to load some joint positions. Added DumpXML and Reset Skeleton support for animated objects when debugging. --- indra/newview/llviewerobject.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 5e88f9635f..b0379bf9f7 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -143,8 +143,8 @@ static LLTrace::BlockTimerStatHandle FTM_CREATE_OBJECT("Create Object"); // static LLViewerObject *LLViewerObject::createObject(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp, S32 flags) { - LL_DEBUGS("AnimatedObjects") << "creating " << id << LL_ENDL; - dumpStack("AnimatedObjectsStack"); + LL_DEBUGS("ObjectUpdate") << "creating " << id << LL_ENDL; + dumpStack("ObjectUpdateStack"); LLViewerObject *res = NULL; LL_RECORD_BLOCK_TIME(FTM_CREATE_OBJECT); @@ -1111,8 +1111,8 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, { LL_DEBUGS_ONCE("SceneLoadTiming") << "Received viewer object data" << LL_ENDL; - LL_DEBUGS("AnimatedObjects") << " mesgsys " << mesgsys << " dp " << dp << " id " << getID() << " update_type " << (S32) update_type << LL_ENDL; - dumpStack("AnimatedObjectsStack"); + LL_DEBUGS("ObjectUpdate") << " mesgsys " << mesgsys << " dp " << dp << " id " << getID() << " update_type " << (S32) update_type << LL_ENDL; + dumpStack("ObjectUpdateStack"); U32 retval = 0x0; @@ -3002,6 +3002,9 @@ void LLViewerObject::linkControlAvatar() return; } mControlAvatar = LLControlAvatar::createControlAvatar(volp); + LL_DEBUGS("AnimatedObjects") << volp->getID() + << " created control av for " + << (S32) (1+volp->numChildren()) << " prims" << LL_ENDL; } if (getControlAvatar()) { -- cgit v1.2.3 From a3fd0801c3030ff9a5a6761c9618f381aa965983 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Mon, 26 Mar 2018 20:59:37 +0100 Subject: SL-897 - display for DebugAnimatedObjects now includes streaming cost triangle count --- indra/newview/llviewerobject.cpp | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 531f9a9527..f606abedf5 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -3692,6 +3692,11 @@ F32 LLViewerObject::getEstTrianglesMax() const return 0.f; } +F32 LLViewerObject::getEstTrianglesStreamingCost() const +{ + return 0.f; +} + F32 LLViewerObject::getStreamingCost(S32* bytes, S32* visible_bytes, F32* unscaled_value) const { return 0.f; -- cgit v1.2.3 From 501351915ce2df618241c5f6923cc0c0a869fdcd Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Thu, 5 Apr 2018 16:45:06 +0100 Subject: SL-902 - always display animesh rigged meshes in non-static form, when skeleton is available --- indra/newview/llviewerobject.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index f606abedf5..9446e5ddac 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -3012,6 +3012,7 @@ void LLViewerObject::linkControlAvatar() { getControlAvatar()->rebuildAttachmentOverrides(); getControlAvatar()->updateAnimations(); + getControlAvatar()->mPlaying = true; } else { -- cgit v1.2.3 From f7134144a6ed8f5710d02a84ad3ad5dc29cb0bd5 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Fri, 13 Apr 2018 14:28:19 +0100 Subject: MAINT-8239 - joint offsets --- indra/newview/llviewerobject.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 9446e5ddac..72cb1d4cf6 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -394,7 +394,7 @@ void LLViewerObject::markDead() if (av && LLVOAvatar::getRiggedMeshID(this,mesh_id)) { // This case is needed for indirectly attached mesh objects. - av->rebuildAttachmentOverrides(); + av->updateAttachmentOverrides(); } } if (getControlAvatar()) @@ -3010,7 +3010,7 @@ void LLViewerObject::linkControlAvatar() } if (getControlAvatar()) { - getControlAvatar()->rebuildAttachmentOverrides(); + getControlAvatar()->updateAttachmentOverrides(); getControlAvatar()->updateAnimations(); getControlAvatar()->mPlaying = true; } @@ -3024,7 +3024,7 @@ void LLViewerObject::unlinkControlAvatar() { if (getControlAvatar()) { - getControlAvatar()->rebuildAttachmentOverrides(); + getControlAvatar()->updateAttachmentOverrides(); } if (isRootEdit()) { -- 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/llviewerobject.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 72cb1d4cf6..32a1ccd852 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -106,6 +106,7 @@ #include "llvocache.h" #include "llcleanup.h" #include "llcallstack.h" +#include "llmeshrepository.h" //#define DEBUG_UPDATE_TYPE @@ -3698,11 +3699,19 @@ F32 LLViewerObject::getEstTrianglesStreamingCost() const return 0.f; } -F32 LLViewerObject::getStreamingCost(S32* bytes, S32* visible_bytes, F32* unscaled_value) const +// virtual +F32 LLViewerObject::getStreamingCost() const { return 0.f; } +// virtual +bool LLViewerObject::getCostData(LLMeshCostData& costs) const +{ + costs = LLMeshCostData(); + return false; +} + U32 LLViewerObject::getTriangleCount(S32* vcount) const { return 0; -- cgit v1.2.3 From 96c1790d92b7c1c019b164e0e51338b83c33e873 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Thu, 26 Apr 2018 20:55:59 +0100 Subject: MAINT-8559 - create control avatar only when linkset contains a rigged mesh --- indra/newview/llviewerobject.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 32a1ccd852..5908d160e2 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -2971,15 +2971,15 @@ void LLViewerObject::updateControlAvatar() LLViewerObject *root = getRootEdit(); if (root->isAnimatedObject() && !root->getControlAvatar()) { - bool any_mesh = root->isMesh(); + 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_mesh = any_mesh || child->isMesh(); + any_rigged_mesh = any_rigged_mesh || child->isRiggedMesh(); } - if (any_mesh) + if (any_rigged_mesh) { std::string vobj_name = llformat("Vol%p", root); LL_DEBUGS("AnimatedObjects") << vobj_name << " calling linkControlAvatar()" << LL_ENDL; -- cgit v1.2.3 From 19ebe40974edc23b9ac00e80dc716e34cad5a65d Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Fri, 27 Apr 2018 14:50:28 +0100 Subject: MAINT-8559 - consistent management of control skeleton state with animated objects --- indra/newview/llviewerobject.cpp | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 5908d160e2..bde38029d0 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -2969,24 +2969,25 @@ LLControlAvatar *LLViewerObject::getControlAvatar() const void LLViewerObject::updateControlAvatar() { LLViewerObject *root = getRootEdit(); - if (root->isAnimatedObject() && !root->getControlAvatar()) + 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 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(); - } - if (any_rigged_mesh) - { - std::string vobj_name = llformat("Vol%p", root); - LL_DEBUGS("AnimatedObjects") << vobj_name << " calling linkControlAvatar()" << LL_ENDL; - root->linkControlAvatar(); - } + const LLViewerObject* child = *iter; + any_rigged_mesh = any_rigged_mesh || child->isRiggedMesh(); + } + + bool has_control_avatar = getControlAvatar(); + bool should_have_control_avatar = root->isAnimatedObject() && any_rigged_mesh; + + if (should_have_control_avatar && !has_control_avatar) + { + std::string vobj_name = llformat("Vol%p", root); + LL_DEBUGS("AnimatedObjects") << vobj_name << " calling linkControlAvatar()" << LL_ENDL; + root->linkControlAvatar(); } - if (!root->isAnimatedObject() && root->getControlAvatar()) + if (!should_have_control_avatar && has_control_avatar) { std::string vobj_name = llformat("Vol%p", root); LL_DEBUGS("AnimatedObjects") << vobj_name << " calling unlinkControlAvatar()" << LL_ENDL; -- cgit v1.2.3 From 09f40ee736f43781d5048cdd6883b8801a9ef448 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Fri, 27 Apr 2018 20:16:16 +0100 Subject: MAINT-8575 - ignore sitting avatars when totalling tris for animated objects --- indra/newview/llviewerobject.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index bde38029d0..11d64ab13a 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -3663,7 +3663,10 @@ F32 LLViewerObject::recursiveGetEstTrianglesMax() const iter != mChildList.end(); iter++) { const LLViewerObject* child = *iter; - est_tris += child->recursiveGetEstTrianglesMax(); + if (!child->isAvatar()) + { + est_tris += child->recursiveGetEstTrianglesMax(); + } } return est_tris; } -- cgit v1.2.3 From 0dc944bd4a9aa48582ee0196a55c2759806acc64 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Mon, 30 Apr 2018 14:15:21 +0100 Subject: SL-908 - more reliable mesh highlighting --- indra/newview/llviewerobject.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 11d64ab13a..1cd50e3400 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -3010,11 +3010,20 @@ void LLViewerObject::linkControlAvatar() << " created control av for " << (S32) (1+volp->numChildren()) << " prims" << LL_ENDL; } - if (getControlAvatar()) + LLControlAvatar *cav = getControlAvatar(); + if (cav) { - getControlAvatar()->updateAttachmentOverrides(); - getControlAvatar()->updateAnimations(); - getControlAvatar()->mPlaying = true; + cav->updateAttachmentOverrides(); + cav->updateAnimations(); + if (!cav->mPlaying) + { + cav->mPlaying = true; + if (!cav->mRootVolp->isAnySelected()) + { + cav->updateVolumeGeom(); + cav->mRootVolp->recursiveMarkForUpdate(TRUE); + } + } } else { -- cgit v1.2.3 From 7ed17b5c2c11b9e57316c87b29524b88edb8f762 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Thu, 3 May 2018 22:42:02 +0100 Subject: MAINT-8608, MAINT-8539, MAINT-8615 - changes to make object animation info more persistent, tolerant to race conditions during initialization --- indra/newview/llviewerobject.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'indra/newview/llviewerobject.cpp') 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 { -- cgit v1.2.3 From 2f209465dc1adc33b2135d685a88190e83952012 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Fri, 4 May 2018 15:04:42 +0100 Subject: MAINT-8608 - more on animation updates --- indra/newview/llviewerobject.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'indra/newview/llviewerobject.cpp') 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 { -- cgit v1.2.3 From 2a48816717087e07eb3f3855798c5dd71f541ee5 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Fri, 4 May 2018 21:18:13 +0100 Subject: MAINT-8608, MAINT-8539, MAINT-8615 - more animation state management - less log spam, more docs --- indra/newview/llviewerobject.cpp | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) (limited to 'indra/newview/llviewerobject.cpp') 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 { -- cgit v1.2.3 From 1d6b24fcc219f504c13e771a220112a60c3a85e8 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Thu, 14 Jun 2018 20:06:32 +0100 Subject: MAINT-8653 - enforce z-height offset for animated mesh objects --- indra/newview/llviewerobject.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 5ca6b25a18..29b2a217cc 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -4137,8 +4137,20 @@ const LLVector3 LLViewerObject::getRenderPosition() const { if (mDrawable.notNull() && mDrawable->isState(LLDrawable::RIGGED)) { + LLControlAvatar *cav = getControlAvatar(); + if (isRoot() && cav) + { + F32 fixup; + if ( cav->hasPelvisFixup( fixup) ) + { + //Apply a pelvis fixup (as defined by the avs skin) + LLVector3 pos = mDrawable->getPositionAgent(); + pos[VZ] += fixup; + return pos; + } + } LLVOAvatar* avatar = getAvatar(); - if (avatar && !getControlAvatar()) + if ((avatar) && !getControlAvatar()) { return avatar->getPositionAgent(); } -- cgit v1.2.3 From 56458152aca5a25663377fc9dde087de78bfb412 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Wed, 8 Aug 2018 22:11:32 +0100 Subject: SL-704 - code cleanup, mostly old AXON comments. --- indra/newview/llviewerobject.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index a731a39bd6..f963f8a0c8 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -3720,7 +3720,7 @@ F32 LLViewerObject::recursiveGetEstTrianglesMax() const S32 LLViewerObject::getAnimatedObjectMaxTris() const { S32 max_tris = 0; - if (gSavedSettings.getBOOL("AnimatedObjectsIgnoreLimits")) // AXON REMOVE AFTER SERVER TESTING DONE + if (gSavedSettings.getBOOL("AnimatedObjectsIgnoreLimits")) { max_tris = S32_MAX; } -- cgit v1.2.3 From 963945b3ab258ea445e1d9757fc5a89ce397ff7b Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Tue, 25 Sep 2018 16:39:26 +0100 Subject: SL-1291 - fixed some issues with selection highlighting of objects rezzed while in build mode. Not clear whether this addresses the original issue, which isn't reproing --- indra/newview/llviewerobject.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'indra/newview/llviewerobject.cpp') diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index f963f8a0c8..dcd09f66c7 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -3015,6 +3015,10 @@ void LLViewerObject::updateControlAvatar() if (getControlAvatar()) { getControlAvatar()->updateAnimations(); + if (isSelected()) + { + LLSelectMgr::getInstance()->pauseAssociatedAvatars(); + } } } @@ -3040,7 +3044,7 @@ void LLViewerObject::linkControlAvatar() if (!cav->mPlaying) { cav->mPlaying = true; - if (!cav->mRootVolp->isAnySelected()) + //if (!cav->mRootVolp->isAnySelected()) { cav->updateVolumeGeom(); cav->mRootVolp->recursiveMarkForUpdate(TRUE); -- cgit v1.2.3