diff options
| -rw-r--r-- | indra/llappearance/llavatarappearance.cpp | 21 | ||||
| -rw-r--r-- | indra/llappearance/llavatarappearancedefines.h | 2 | ||||
| -rwxr-xr-x | indra/newview/llvoavatar.cpp | 2 | 
3 files changed, 23 insertions, 2 deletions
| diff --git a/indra/llappearance/llavatarappearance.cpp b/indra/llappearance/llavatarappearance.cpp index 2d5744bb5e..37b7f7b14e 100644 --- a/indra/llappearance/llavatarappearance.cpp +++ b/indra/llappearance/llavatarappearance.cpp @@ -464,7 +464,7 @@ void LLAvatarAppearance::computeBodySize()  	F32 old_offset = mAvatarOffset.mV[VZ]; -	mAvatarOffset.mV[VZ] = getVisualParamWeight(11001); +	mAvatarOffset.mV[VZ] = getVisualParamWeight(AVATAR_HOVER);  	mPelvisToFoot = hip.mV[VZ] * pelvis_scale.mV[VZ] -  				 	knee.mV[VZ] * hip_scale.mV[VZ] - @@ -488,6 +488,25 @@ void LLAvatarAppearance::computeBodySize()  	mAvatarOffset.mV[VX] = 0.0f;  	mAvatarOffset.mV[VY] = 0.0f; +	// Certain configurations of avatars can force the overall height (with offset) to go negative. +	// Enforce a constraint to make sure we don't go below 0.1 meters. +	// Camera positioning and other things start to break down when your avatar is "walking" while being fully underground +	if (new_body_size.mV[VZ] + mAvatarOffset.mV[VZ] < 0.1f)  +	{ +		mAvatarOffset.mV[VZ] = -(new_body_size.mV[VZ] - 0.11f); // avoid floating point rounding making the above check continue to fail. + +		llassert(new_body_size.mV[VZ] + mAvatarOffset.mV[VZ] >= 0.1f); + +		if (mWearableData)  +		{ +			LLWearable* shape = mWearableData->getWearable(LLWearableType::WT_SHAPE, 0); +			if (shape)  +			{ +				shape->setVisualParamWeight(AVATAR_HOVER, mAvatarOffset.mV[VZ], false); +			} +		} +	} +  	if (new_body_size != mBodySize || old_offset != mAvatarOffset.mV[VZ])  	{  		mBodySize = new_body_size; diff --git a/indra/llappearance/llavatarappearancedefines.h b/indra/llappearance/llavatarappearancedefines.h index 496f85c107..8a1d2c4707 100644 --- a/indra/llappearance/llavatarappearancedefines.h +++ b/indra/llappearance/llavatarappearancedefines.h @@ -41,6 +41,8 @@ extern const S32 SCRATCH_TEX_WIDTH;  extern const S32 SCRATCH_TEX_HEIGHT;  extern const S32 IMPOSTOR_PERIOD; +static const U32 AVATAR_HOVER = 11001; +  //--------------------------------------------------------------------  // Enums  //-------------------------------------------------------------------- diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 725939dd3e..6d9c150c43 100755 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -3204,7 +3204,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)  		}  		root_pos = gAgent.getPosGlobalFromAgent(getRenderPosition()); -		root_pos.mdV[VZ] += getVisualParamWeight(11001); +		root_pos.mdV[VZ] += getVisualParamWeight(AVATAR_HOVER);  		resolveHeightGlobal(root_pos, ground_under_pelvis, normal); | 
