diff options
| -rw-r--r-- | indra/llcommon/indra_constants.h | 1 | ||||
| -rw-r--r-- | indra/newview/llpanelvolume.cpp | 8 | ||||
| -rw-r--r-- | indra/newview/llviewerjointattachment.cpp | 19 | ||||
| -rw-r--r-- | indra/newview/llviewerjointattachment.h | 1 | ||||
| -rw-r--r-- | indra/newview/llvoavatar.cpp | 29 | ||||
| -rw-r--r-- | indra/newview/llvoavatar.h | 5 | 
6 files changed, 55 insertions, 8 deletions
| diff --git a/indra/llcommon/indra_constants.h b/indra/llcommon/indra_constants.h index fda84aa5a8..99ad5f2473 100644 --- a/indra/llcommon/indra_constants.h +++ b/indra/llcommon/indra_constants.h @@ -154,6 +154,7 @@ const U8 SIM_ACCESS_MAX 	= SIM_ACCESS_ADULT;  // attachment constants  const S32 MAX_AGENT_ATTACHMENTS = 38; +const S32 MAX_AGENT_ANIMATED_OBJECT_ATTACHMENTS = 1;  const U8  ATTACHMENT_ADD = 0x80;  // god levels diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp index c5fbc1f71b..6a71da3918 100644 --- a/indra/newview/llpanelvolume.cpp +++ b/indra/newview/llpanelvolume.cpp @@ -78,6 +78,8 @@  #include "llviewercontrol.h"  #include "llmeshrepository.h" +#include "llvoavatarself.h" +  #include <boost/bind.hpp>  // "Features" Tab @@ -366,6 +368,12 @@ void LLPanelVolume::getState( )      if (root_volobjp && root_volobjp == volobjp)      {          enabled_animated_object_box = single_root_volume && root_volobjp && root_volobjp->canBeAnimatedObject() && editable;  +        if (enabled_animated_object_box && !is_animated_mesh &&  +            root_volobjp->isAttachment() && !gAgentAvatarp->canAttachMoreAnimatedObjects()) +        { +            // Turning this attachment animated would cause us to exceed the limit. +            enabled_animated_object_box = false; +        }      }      getChildView("Animated Mesh Checkbox Ctrl")->setEnabled(enabled_animated_object_box); diff --git a/indra/newview/llviewerjointattachment.cpp b/indra/newview/llviewerjointattachment.cpp index 66e392ac42..cf9243a871 100644 --- a/indra/newview/llviewerjointattachment.cpp +++ b/indra/newview/llviewerjointattachment.cpp @@ -357,6 +357,25 @@ void LLViewerJointAttachment::setOriginalPosition(LLVector3& position)  }  //----------------------------------------------------------------------------- +// getNumAnimatedObjects() +//----------------------------------------------------------------------------- +S32 LLViewerJointAttachment::getNumAnimatedObjects() const +{ +    S32 count = 0; +	for (attachedobjs_vec_t::const_iterator iter = mAttachedObjects.begin(); +		 iter != mAttachedObjects.end(); +		 ++iter) +	{ +        const LLViewerObject *attached_object = *iter; +        if (attached_object->isAnimatedObject()) +        { +            count++; +        } +    } +    return count; +} + +//-----------------------------------------------------------------------------  // clampObjectPosition()  //-----------------------------------------------------------------------------  void LLViewerJointAttachment::clampObjectPosition() diff --git a/indra/newview/llviewerjointattachment.h b/indra/newview/llviewerjointattachment.h index 9addafaee1..9641ab4208 100644 --- a/indra/newview/llviewerjointattachment.h +++ b/indra/newview/llviewerjointattachment.h @@ -77,6 +77,7 @@ public:  	S32 getGroup() const { return mGroup; }  	S32 getPieSlice() const { return mPieSlice; }  	S32	getNumObjects() const { return mAttachedObjects.size(); } +	S32	getNumAnimatedObjects() const;  	void clampObjectPosition(); diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 4664eeffc4..5e0c5d6858 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -6579,19 +6579,36 @@ U32 LLVOAvatar::getNumAttachments() const  //-----------------------------------------------------------------------------  // canAttachMoreObjects() +// Returns true if we can attach <n> more objects.  //----------------------------------------------------------------------------- -BOOL LLVOAvatar::canAttachMoreObjects() const +BOOL LLVOAvatar::canAttachMoreObjects(U32 n) const  { -	return (getNumAttachments() < MAX_AGENT_ATTACHMENTS); +	return (getNumAttachments() + n) <= MAX_AGENT_ATTACHMENTS;  }  //----------------------------------------------------------------------------- -// canAttachMoreObjects() -// Returns true if we can attach <n> more objects. +// getNumAnimatedObjectAttachments()  //----------------------------------------------------------------------------- -BOOL LLVOAvatar::canAttachMoreObjects(U32 n) const +U32 LLVOAvatar::getNumAnimatedObjectAttachments() const  { -	return (getNumAttachments() + n) <= MAX_AGENT_ATTACHMENTS; +	U32 num_attachments = 0; +	for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin(); +		 iter != mAttachmentPoints.end(); +		 ++iter) +	{ +		const LLViewerJointAttachment *attachment_pt = (*iter).second; +		num_attachments += attachment_pt->getNumAnimatedObjects(); +	} +	return num_attachments; +} + +//----------------------------------------------------------------------------- +// canAttachMoreAnimatedObjects() +// Returns true if we can attach <n> more animated objects. +//----------------------------------------------------------------------------- +BOOL LLVOAvatar::canAttachMoreAnimatedObjects(U32 n) const +{ +	return (getNumAnimatedObjectAttachments() + n) <= MAX_AGENT_ANIMATED_OBJECT_ATTACHMENTS;  }  //----------------------------------------------------------------------------- diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 1a39c3a3d9..1a87a62946 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -777,10 +777,11 @@ public:  	BOOL 				hasHUDAttachment() const;  	LLBBox 				getHUDBBox() const;  	void 				resetHUDAttachments(); -	BOOL				canAttachMoreObjects() const; -	BOOL				canAttachMoreObjects(U32 n) const; +	BOOL				canAttachMoreObjects(U32 n=1) const; +    BOOL				canAttachMoreAnimatedObjects(U32 n=1) const;  protected:  	U32					getNumAttachments() const; // O(N), not O(1) +	U32					getNumAnimatedObjectAttachments() const; // O(N), not O(1)  /**                    Wearables   **                                                                            ** | 
