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;
}