/*
* Presolving, applying offset
* */
public void OnPreSolve()
{
positionWeight = Mathf.Clamp(positionWeight, 0f, 1f);
rotationWeight = Mathf.Clamp(rotationWeight, 0f, 1f);
maintainRelativePositionWeight = Mathf.Clamp(maintainRelativePositionWeight, 0f, 1f);
// Calculating weights
posW = positionWeight * solver.GetIKPositionWeight();
rotW = rotationWeight * solver.GetIKPositionWeight();
node.effectorPositionWeight = posW;
node.effectorRotationWeight = rotW;
node.solverRotation = rotation;
if (float.IsInfinity(positionOffset.x) ||
float.IsInfinity(positionOffset.y) ||
float.IsInfinity(positionOffset.z)
)
{
Debug.LogError("Invalid IKEffector.positionOffset (contains Infinity)! Please make sure not to set IKEffector.positionOffset to infinite values.", bone);
}
if (float.IsNaN(positionOffset.x) ||
float.IsNaN(positionOffset.y) ||
float.IsNaN(positionOffset.z)
)
{
Debug.LogError("Invalid IKEffector.positionOffset (contains NaN)! Please make sure not to set IKEffector.positionOffset to NaN values.", bone);
}
if (positionOffset.sqrMagnitude > 10000000000f)
{
Debug.LogError("Additive effector positionOffset detected in Full Body IK (extremely large value). Make sure you are not circularily adding to effector positionOffset each frame.", bone);
}
node.offset += positionOffset * solver.GetIKPositionWeight();
if (effectChildNodes)
{
for (int i = 0; i < childNodes.Length; i++)
{
localPositions[i] = childNodes[i].transform.position - node.transform.position;
childNodes[i].offset += positionOffset * solver.GetIKPositionWeight();
}
}
// Relative to Plane
if (usePlaneNodes && maintainRelativePositionWeight > 0f)
{
animatedPlaneRotation = Quaternion.LookRotation(planeNode2.transform.position - planeNode1.transform.position, planeNode3.transform.position - planeNode1.transform.position);;
}
}