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

Solve() public method

public Solve ( ) : bool
return bool
			public bool Solve()
			{
				bool isEffectorEnabled = _IsEffectorEnabled();
				if( !isEffectorEnabled && !_settings.bodyIK.forceSolveEnabled ) {
					return false;
				}

				_SyncDisplacement();

				if( !_PrepareSolverInternal() ) {
					return false;
				}

				var temp = _solverInternal;

				if( !_internalValues.resetTransforms ) {
					if( temp.spinePos != null ) {
						for( int i = 0; i != _spineBones.Length; ++i ) {
							if( _spineBones[i] != null ) {
								temp.spinePos[i] = _spineBones[i].worldPosition;
							}
						}
					}
					if( _neckBone != null ) {
						temp.neckPos = _neckBone.worldPosition;
					}
					if( _headBone != null ) {
						temp.headPos = _headBone.worldPosition;
					}
					if( temp.shoulderPos != null ) {
						for( int i = 0; i < 2; ++i ) {
							temp.shoulderPos[i] = _shoulderBones[i].worldPosition;
						}
					}
					if( temp.armPos != null ) {
						for( int i = 0; i != 2; ++i ) {
							temp.armPos[i] = _armBones[i].worldPosition;
						}
					}
					if( temp.legPos != null ) {
						for( int i = 0; i != 2; ++i ) {
							temp.legPos[i] = _legBones[i].worldPosition;
						}
					}

					temp.SetDirtyVariables();
				}

				if( _internalValues.resetTransforms ) {
					_ResetTransforms();
				} else if( _internalValues.animatorEnabled ) {
					_PresolveHips();
				}

				if( !_internalValues.resetTransforms ) {
					if( _settings.bodyIK.shoulderSolveEnabled ) {
						_ResetShoulderTransform();
					}
				}

				// Arms, Legs (Need calls after _ResetTransform() / _PresolveHips() / _ResetShoulderTransform().)
				// (Using temp.armPos[] / temp.legPos[])
				_solverInternal.arms.Prepare( _elbowEffectors, _wristEffectors );
				_solverInternal.legs.Prepare( _kneeEffectors, _footEffectors );

#if SAFULLBODYIK_DEBUG
				bool _isVisibleWorldTransform = true;
				_internalValues.UpdateDebugValue( "_isVisibleWorldTransform", ref _isVisibleWorldTransform );
#endif

				if( _settings.bodyIK.lowerSolveEnabled ) {
					_LowerSolve( true );
				}

				if( _settings.bodyIK.upperSolveEnabled ) {
					_UpperSolve();
				}

				if( _settings.bodyIK.lowerSolveEnabled ) {
					_LowerSolve( false );
				}

				if( _settings.bodyIK.shoulderSolveEnabled ) {
					_ShoulderResolve();
				}

				if( _settings.bodyIK.computeWorldTransform ) {
					_ComputeWorldTransform();
				}

#if SAFULLBODYIK_DEBUG
				if( _isVisibleWorldTransform ) {
					_internalValues.AddDebugPoint( temp.centerLegPos );
					if( temp.spinePos != null ) {
						for( int i = 0; i < temp.spinePos.Length; ++i ) {
							_internalValues.AddDebugPoint( temp.spinePos[i] );
						}
					}
					_internalValues.AddDebugPoint( temp.neckPos );
					for( int i = 0; i < 2; ++i ) {
						if( temp.shoulderPos != null ) {
							_internalValues.AddDebugPoint( temp.shoulderPos[i] );
						}
						_internalValues.AddDebugPoint( temp.armPos[i] );
						_internalValues.AddDebugPoint( temp.legPos[i] );
					}
				}
#endif

				return true;
			}