diff options
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/newview/llvoavatar.cpp | 17 | ||||
| -rw-r--r-- | indra/newview/llvoavatar.h | 4 | 
2 files changed, 20 insertions, 1 deletions
| diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 493e9cf392..dee19032f1 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -817,6 +817,7 @@ LLVOAvatar::~LLVOAvatar()  	lldebugs << "LLVOAvatar Destructor (0x" << this << ") id:" << mID << llendl;  	mRoot.removeAllChildren(); +	mJointMap.clear();  	deleteAndClearArray(mSkeleton);  	deleteAndClearArray(mCollisionVolumes); @@ -1934,6 +1935,7 @@ void LLVOAvatar::buildCharacter()  	// remove all of mRoot's children  	//-------------------------------------------------------------------------  	mRoot.removeAllChildren(); +	mJointMap.clear();  	mIsBuilt = FALSE;  	//------------------------------------------------------------------------- @@ -5137,7 +5139,20 @@ const LLUUID& LLVOAvatar::getID() const  // RN: avatar joints are multi-rooted to include screen-based attachments  LLJoint *LLVOAvatar::getJoint( const std::string &name )  { -	LLJoint* jointp = mRoot.findJoint(name); +	joint_map_t::iterator iter = mJointMap.find(name); + +	LLJoint* jointp = NULL; + +	if (iter == mJointMap.end()) +	{ //search for joint and cache found joint in lookup table +		LLJoint* jointp = mRoot.findJoint(name); +		mJointMap[name] = jointp; +	} +	else +	{ //return cached pointer +		jointp = iter->second; +	} +  	return jointp;  } diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 4081a1408d..f5692bb52f 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -366,6 +366,10 @@ public:  	LLVector3			mHeadOffset; // current head position  	LLViewerJoint		mRoot; + +	typedef std::map<std::string, LLJoint*> joint_map_t; +	joint_map_t			mJointMap; +  protected:  	static BOOL			parseSkeletonFile(const std::string& filename);  	void				buildCharacter(); | 
