diff options
| author | Kelly Washington <kelly@lindenlab.com> | 2013-01-24 13:21:45 -0800 | 
|---|---|---|
| committer | Kelly Washington <kelly@lindenlab.com> | 2013-01-24 13:21:45 -0800 | 
| commit | aee0766f35d724bfddc4be6b6f0b100467f3b1f4 (patch) | |
| tree | 736093b09a29932474a9423912254e22b162dc10 /indra/newview | |
| parent | da9442b3238ca25b11932fd6d437964ab2f5be7b (diff) | |
MAINT-2275 Child prims are "left behind" by animated, moving (physical) linksets
* A fix that doesn't break doors. Reverst MAINT-2247
Diffstat (limited to 'indra/newview')
| -rw-r--r-- | indra/newview/lldrawable.cpp | 62 | 
1 files changed, 31 insertions, 31 deletions
| diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp index d394ce5b21..b15ffec9e3 100644 --- a/indra/newview/lldrawable.cpp +++ b/indra/newview/lldrawable.cpp @@ -517,45 +517,45 @@ F32 LLDrawable::updateXform(BOOL undamped)  	F32 dist_squared = 0.f;  	F32 camdist2 = (mDistanceWRTCamera * mDistanceWRTCamera); -	if (isVisible()) +	if (damped && isVisible())  	{ -		if (damped) -		{ -			F32 lerp_amt = llclamp(LLCriticalDamp::getInterpolant(OBJECT_DAMPING_TIME_CONSTANT), 0.f, 1.f); -			LLVector3 new_pos = lerp(old_pos, target_pos, lerp_amt); -			dist_squared = dist_vec_squared(new_pos, target_pos); +		F32 lerp_amt = llclamp(LLCriticalDamp::getInterpolant(OBJECT_DAMPING_TIME_CONSTANT), 0.f, 1.f); +		LLVector3 new_pos = lerp(old_pos, target_pos, lerp_amt); +		dist_squared = dist_vec_squared(new_pos, target_pos); -			LLQuaternion new_rot = nlerp(lerp_amt, old_rot, target_rot); -			dist_squared += (1.f - dot(new_rot, target_rot)) * 10.f; +		LLQuaternion new_rot = nlerp(lerp_amt, old_rot, target_rot); +		// FIXME: This can be negative! It is be possible for some rots to 'cancel out' pos or size changes. +		dist_squared += (1.f - dot(new_rot, target_rot)) * 10.f; -			LLVector3 new_scale = lerp(old_scale, target_scale, lerp_amt); -			dist_squared += dist_vec_squared(new_scale, target_scale); +		LLVector3 new_scale = lerp(old_scale, target_scale, lerp_amt); +		dist_squared += dist_vec_squared(new_scale, target_scale); -			if ((dist_squared >= MIN_INTERPOLATE_DISTANCE_SQUARED * camdist2) && -				(dist_squared <= MAX_INTERPOLATE_DISTANCE_SQUARED)) -			{ -				// interpolate -				target_pos = new_pos; -				target_rot = new_rot; -				target_scale = new_scale; -			} -			else if (mVObjp->getAngularVelocity().isExactlyZero()) -			{ -				// snap to final position (only if no target omega is applied) -				dist_squared = 0.0f; -				if (getVOVolume() && !isRoot()) -				{ //child prim snapping to some position, needs a rebuild -					gPipeline.markRebuild(this, LLDrawable::REBUILD_POSITION, TRUE); -				} -			} +		if ((dist_squared >= MIN_INTERPOLATE_DISTANCE_SQUARED * camdist2) && +			(dist_squared <= MAX_INTERPOLATE_DISTANCE_SQUARED)) +		{ +			// interpolate +			target_pos = new_pos; +			target_rot = new_rot; +			target_scale = new_scale;  		} -		else +		else if (mVObjp->getAngularVelocity().isExactlyZero())  		{ -			dist_squared = dist_vec_squared(old_pos, target_pos); -			dist_squared += (1.f - dot(old_rot, target_rot)) * 10.f; -			dist_squared += dist_vec_squared(old_scale, target_scale); +			// snap to final position (only if no target omega is applied) +			dist_squared = 0.0f; +			if (getVOVolume() && !isRoot()) +			{ //child prim snapping to some position, needs a rebuild +				gPipeline.markRebuild(this, LLDrawable::REBUILD_POSITION, TRUE); +			}  		}  	} +	else +	{ +		dist_squared = dist_vec_squared(old_pos, target_pos); + +		// The following "makes sense" and fixes MAINT-2247 but causes MAINT-2275 +		//dist_squared += (1.f - dot(old_rot, target_rot)) * 10.f; +		//dist_squared += dist_vec_squared(old_scale, target_scale); +	}  	LLVector3 vec = mCurrentScale-target_scale; | 
