diff options
| author | Oz Linden <oz@lindenlab.com> | 2011-06-30 19:20:25 -0400 | 
|---|---|---|
| committer | Oz Linden <oz@lindenlab.com> | 2011-06-30 19:20:25 -0400 | 
| commit | 6be68618c4b32082228d9c34083542017b84482f (patch) | |
| tree | 1911acccf2311b27868b80ed4e9f60562746eb0d | |
| parent | f07173a9689237bf2d8218600c15d6bf4d047cdc (diff) | |
| parent | a57a393bb9447778c5ea2baf969053cab8d06b68 (diff) | |
merge changes for sec-906
| -rw-r--r-- | indra/llcharacter/llkeyframemotion.cpp | 73 | ||||
| -rw-r--r-- | indra/llcharacter/llkeyframemotion.h | 2 | 
2 files changed, 66 insertions, 9 deletions
| diff --git a/indra/llcharacter/llkeyframemotion.cpp b/indra/llcharacter/llkeyframemotion.cpp index 9df033a4ca..c6f45bffa2 100644 --- a/indra/llcharacter/llkeyframemotion.cpp +++ b/indra/llcharacter/llkeyframemotion.cpp @@ -467,13 +467,15 @@ LLPointer<LLJointState>& LLKeyframeMotion::getJointState(U32 index)  }  //----------------------------------------------------------------------------- -// getJoin() +// getJoint()  //-----------------------------------------------------------------------------  LLJoint* LLKeyframeMotion::getJoint(U32 index)  {  	llassert_always (index < mJointStates.size());  	LLJoint* joint = mJointStates[index]->getJoint(); -	llassert_always (joint); +	 +	//Commented out 06-28-11 by Aura. +	//llassert_always (joint);  	return joint;  } @@ -821,7 +823,11 @@ void LLKeyframeMotion::initializeConstraint(JointConstraint* constraint)  	S32 joint_num;  	LLVector3 source_pos = mCharacter->getVolumePos(shared_data->mSourceConstraintVolume, shared_data->mSourceConstraintOffset);  	LLJoint* cur_joint = getJoint(shared_data->mJointStateIndices[0]); - +	if ( !cur_joint ) +	{ +		return; +	} +	  	F32 source_pos_offset = dist_vec(source_pos, cur_joint->getWorldPosition());  	constraint->mTotalLength = constraint->mJointLengths[0] = dist_vec(cur_joint->getParent()->getWorldPosition(), source_pos); @@ -872,6 +878,10 @@ void LLKeyframeMotion::activateConstraint(JointConstraint* constraint)  	for (joint_num = 1; joint_num < shared_data->mChainLength; joint_num++)  	{  		LLJoint* cur_joint = getJoint(shared_data->mJointStateIndices[joint_num]); +		if ( !cur_joint ) +		{ +			return; +		}  		constraint->mPositions[joint_num] = (cur_joint->getWorldPosition() - mPelvisp->getWorldPosition()) * ~mPelvisp->getWorldRotation();  	} @@ -932,6 +942,11 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8  	}  	LLJoint* root_joint = getJoint(shared_data->mJointStateIndices[shared_data->mChainLength]); +	if (! root_joint)  +	{ +		return; +	} +	  	LLVector3 root_pos = root_joint->getWorldPosition();  //	LLQuaternion root_rot =   	root_joint->getParent()->getWorldRotation(); @@ -943,6 +958,11 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8  	for (joint_num = 0; joint_num <= shared_data->mChainLength; joint_num++)  	{  		LLJoint* cur_joint = getJoint(shared_data->mJointStateIndices[joint_num]); +		if (!cur_joint) +		{ +			return; +		} +		  		if (joint_mask[cur_joint->getJointNum()] >= (0xff >> (7 - getPriority())))  		{  			// skip constraint @@ -1033,7 +1053,14 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8  	if (shared_data->mChainLength)  	{ -		LLQuaternion end_rot = getJoint(shared_data->mJointStateIndices[0])->getWorldRotation(); +		LLJoint* end_joint = getJoint(shared_data->mJointStateIndices[0]); +		 +		if (!end_joint) +		{ +			return; +		} +		 +		LLQuaternion end_rot = end_joint->getWorldRotation();  		// slam start and end of chain to the proper positions (rest of chain stays put)  		positions[0] = lerp(keyframe_source_pos, target_pos, weight); @@ -1042,7 +1069,14 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8  		// grab keyframe-specified positions of joints	  		for (joint_num = 1; joint_num < shared_data->mChainLength; joint_num++)  		{ -			LLVector3 kinematic_position = getJoint(shared_data->mJointStateIndices[joint_num])->getWorldPosition() +  +			LLJoint* cur_joint = getJoint(shared_data->mJointStateIndices[joint_num]); +			 +			if (!cur_joint) +			{ +				return; +			} +			 +			LLVector3 kinematic_position = cur_joint->getWorldPosition() +   				(source_to_target * constraint->mJointLengthFractions[joint_num]);  			// convert intermediate joint positions to world coordinates @@ -1088,7 +1122,17 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8  		for (joint_num = shared_data->mChainLength; joint_num > 0; joint_num--)  		{  			LLJoint* cur_joint = getJoint(shared_data->mJointStateIndices[joint_num]); +			 +			if (!cur_joint) +			{ +				return; +			}  			LLJoint* child_joint = getJoint(shared_data->mJointStateIndices[joint_num - 1]); +			if (!child_joint) +			{ +				return; +			} +			  			LLQuaternion parent_rot = cur_joint->getParent()->getWorldRotation();  			LLQuaternion cur_rot = cur_joint->getWorldRotation(); @@ -1122,7 +1166,6 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8  			cur_joint->setRotation(target_rot);  		} -		LLJoint* end_joint = getJoint(shared_data->mJointStateIndices[0]);  		LLQuaternion end_local_rot = end_rot * ~end_joint->getParent()->getWorldRotation();  		if (weight == 1.f) @@ -1150,7 +1193,13 @@ void LLKeyframeMotion::applyConstraint(JointConstraint* constraint, F32 time, U8  		//reset old joint rots  		for (joint_num = 0; joint_num <= shared_data->mChainLength; joint_num++)  		{ -			getJoint(shared_data->mJointStateIndices[joint_num])->setRotation(old_rots[joint_num]); +			LLJoint* cur_joint = getJoint(shared_data->mJointStateIndices[joint_num]); +			if (!cur_joint) +			{ +				return; +			} + +			cur_joint->setRotation(old_rots[joint_num]);  		}  	}  	// simple positional constraint (pelvis only) @@ -1775,7 +1824,15 @@ BOOL LLKeyframeMotion::deserialize(LLDataPacker& dp)  				constraintp->mJointStateIndices[i] = -1;  				for (U32 j = 0; j < mJointMotionList->getNumJointMotions(); j++)  				{ -					if(getJoint(j) == joint) +					LLJoint* constraint_joint = getJoint(j); +					 +					if ( !constraint_joint ) +					{ +						llwarns << "Invalid joint " << j << llendl; +						return FALSE; +					} +					 +					if(constraint_joint == joint)  					{  						constraintp->mJointStateIndices[i] = (S32)j;  						break; diff --git a/indra/llcharacter/llkeyframemotion.h b/indra/llcharacter/llkeyframemotion.h index 1fe9af40b3..b1422b2b90 100644 --- a/indra/llcharacter/llkeyframemotion.h +++ b/indra/llcharacter/llkeyframemotion.h @@ -70,7 +70,7 @@ public:  private:  	// private helper functions to wrap some asserts  	LLPointer<LLJointState>& getJointState(U32 index); -	LLJoint* getJoint(U32 index); +	LLJoint* getJoint(U32 index );  public:  	//------------------------------------------------------------------------- | 
