SA.FullBodyIK.BodyIK._UpperSolve_PresolveBaseCenterLegTransform C# (CSharp) Method

_UpperSolve_PresolveBaseCenterLegTransform() private method

private _UpperSolve_PresolveBaseCenterLegTransform ( Vector3 &centerLegPos, Matrix3x3 &centerLegBasis ) : void
centerLegPos UnityEngine.Vector3
centerLegBasis Matrix3x3
return void
			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 );
				}
			}