public void ProcessAnimation(AnimationStream stream) { float w = jobWeight.Get(stream); if (w > 0f) { for (int i = 0; i < chain.Length; ++i) { var handle = chain[i]; linkPositions[i] = handle.GetPosition(stream); chain[i] = handle; } int tipIndex = chain.Length - 1; if (AnimationRuntimeUtils.SolveFABRIK(ref linkPositions, ref linkLengths, target.GetPosition(stream) + targetOffset.translation, cache.GetRaw(toleranceIdx), maxReach, (int)cache.GetRaw(maxIterationsIdx))) { var chainRWeight = chainRotationWeight.Get(stream) * w; for (int i = 0; i < tipIndex; ++i) { var prevDir = chain[i + 1].GetPosition(stream) - chain[i].GetPosition(stream); var newDir = linkPositions[i + 1] - linkPositions[i]; var rot = chain[i].GetRotation(stream); chain[i].SetRotation(stream, Quaternion.Lerp(rot, QuaternionExt.FromToRotation(prevDir, newDir) * rot, chainRWeight)); } } chain[tipIndex].SetRotation( stream, Quaternion.Lerp( chain[tipIndex].GetRotation(stream), target.GetRotation(stream) * targetOffset.rotation, tipRotationWeight.Get(stream) * w ) ); } else { for (int i = 0; i < chain.Length; ++i) { AnimationRuntimeUtils.PassThrough(stream, chain[i]); } } }
public void ProcessAnimation(AnimationStream stream) { float jobWeight = stream.GetInputWeight(0); if (jobWeight > 0f) { for (int i = 0; i < chain.Length; ++i) { linkPositions[i] = chain[i].GetPosition(stream); } int tipIndex = chain.Length - 1; if (AnimationRuntimeUtils.SolveFABRIK(linkPositions, linkLengths, target.GetPosition(stream) + targetOffset.translation, cache.GetRaw(toleranceIdx), maxReach, (int)cache.GetRaw(maxIterationsIdx))) { var chainRWeight = cache.GetRaw(chainRotationWeightIdx) * jobWeight; for (int i = 0; i < tipIndex; ++i) { var prevDir = chain[i + 1].GetPosition(stream) - chain[i].GetPosition(stream); var newDir = linkPositions[i + 1] - linkPositions[i]; chain[i].SetRotation(stream, QuaternionExt.FromToRotation(prevDir, newDir) * chain[i].GetRotation(stream)); } } chain[tipIndex].SetRotation( stream, Quaternion.Lerp( chain[tipIndex].GetRotation(stream), target.GetRotation(stream) * targetOffset.rotation, cache.GetRaw(tipRotationWeightIdx) * jobWeight ) ); } else { for (int i = 0; i < chain.Length; ++i) { AnimationRuntimeUtils.PassThrough(stream, chain[i]); } } }