void _UpperSolve_PresolveBaseCenterLegTransform( out Vector3 centerLegPos, out Matrix3x3 centerLegBasis )
{
Assert( _internalValues != null && _internalValues.continuousSolverEnabled );
var temp = _solverInternal;
var cache = _solverCaches;
Assert( temp != null );
Assert( cache != null );
_GetBaseCenterLegTransform( out centerLegPos, out centerLegBasis );
if( _legBones == null || !_legBones[0].transformIsAlive || !_legBones[1].transformIsAlive ) {
return;
}
if( cache.limbLegPull[0] <= IKEpsilon && cache.limbLegPull[1] <= IKEpsilon ) {
return; // Pull nothing.
}
Vector3 legPos0, legPos1;
SAFBIKMatMultVecPreSubAdd( out legPos0, ref centerLegBasis, ref _legBones[0]._defaultPosition, ref _defaultCenterLegPos, ref centerLegPos );
SAFBIKMatMultVecPreSubAdd( out legPos1, ref centerLegBasis, ref _legBones[1]._defaultPosition, ref _defaultCenterLegPos, ref centerLegPos );
bool isLimited = false;
isLimited |= temp.legs.SolveTargetBeginPos( 0, ref legPos0 );
isLimited |= temp.legs.SolveTargetBeginPos( 1, ref legPos1 );
if( isLimited ) {
Vector3 vecX = centerLegBasis.column0 * _defaultCenterLegHalfLen;
centerLegPos = Vector3.Lerp( legPos0 + vecX, legPos1 - vecX, cache.limbLegRate );
}
}