bool _UpperSolve_PreTranslate2( out Vector3 translate, ref CachedRate01 translateRate, ref CachedRate01 stableRate, ref Vector3 stableCenterLegPos )
{
// If resetTransform = false, contain targetBeginPos to default transform or modify _UpperSolve_Translate()
// Memo: Prepare SolveTargetBeginPosRated().
translate = Vector3.zero;
Assert( _hipsEffector != null );
if( _hipsEffector.positionEnabled &&
_hipsEffector.positionWeight <= IKEpsilon &&
_hipsEffector.pull >= 1.0f - IKEpsilon ) {
return false; // Always locked.
}
var temp = _solverInternal;
Assert( temp != null );
bool continuousSolverEnabled = _internalValues.continuousSolverEnabled;
bool translateEnabled = (continuousSolverEnabled && stableRate.isGreater0);
if( temp.targetCenterArmEnabled ) {
translate = temp.targetCenterArmPos - temp.currentCenterArmPos;
translateEnabled = true;
}
if( translateEnabled ) {
if( translateRate.isLess1 ) {
translate *= translateRate.value;
}
if( continuousSolverEnabled && stableRate.isGreater0 ) {
Vector3 extraTranslate = stableCenterLegPos - temp.centerLegPos;
translate = Vector3.Lerp( translate, extraTranslate, stableRate.value );
}
if( _hipsEffector.positionEnabled && _hipsEffector.pull > IKEpsilon ) {
Vector3 extraTranslate = _hipsEffector._hidden_worldPosition - temp.centerLegPos;
translate = Vector3.Lerp( translate, extraTranslate, _hipsEffector.pull );
}
return true;
}
return false;
}