public void ProcessAnimation(AnimationStream stream) { jobWeight.Set(stream, 1f); var drivenPos = driven.GetLocalPosition(stream); var offset = drivenOffset.Get(stream); var lPos = drivenPos - offset; var parentTx = new AffineTransform(); if (drivenParent.IsValid(stream)) { drivenParent.GetGlobalTR(stream, out Vector3 parentWPos, out Quaternion parentWRot); parentTx = new AffineTransform(parentWPos, parentWRot); } var wPos = parentTx.Transform(lPos); for (int i = 0; i < sourceTransforms.Length; ++i) { sourceWeights[i].SetFloat(stream, 1f); ReadWriteTransformHandle sourceTransform = sourceTransforms[i]; sourceTransform.SetPosition(stream, wPos - sourceOffsets[i]); // Required to update handles with binding info. sourceTransforms[i] = sourceTransform; } }
/// <summary> /// Defines what to do when processing the animation. /// </summary> /// <param name="stream">The animation stream to work on.</param> public void ProcessAnimation(AnimationStream stream) { jobWeight.Set(stream, 1f); var drivenLocalTx = new AffineTransform(driven.GetLocalPosition(stream), driven.GetLocalRotation(stream)); var parentTx = new AffineTransform(); // Convert accumTx to local space if (drivenParent.IsValid(stream)) { drivenParent.GetGlobalTR(stream, out Vector3 parentWPos, out Quaternion parentWRot); parentTx = new AffineTransform(parentWPos, parentWRot); } var drivenTx = parentTx * drivenLocalTx; for (int i = 0; i < sourceTransforms.Length; ++i) { sourceWeights[i].SetFloat(stream, 1f); var sourceTransform = sourceTransforms[i]; sourceTransform.GetGlobalTR(stream, out var sourcePosition, out var sourceRotation); var result = drivenTx; result *= sourceOffsets[i]; sourceTransform.SetGlobalTR(stream, result.translation, result.rotation); sourceTransforms[i] = sourceTransform; } }
/// <summary> /// Defines what to do when processing the animation. /// </summary> /// <param name="stream">The animation stream to work on.</param> public void ProcessAnimation(AnimationStream stream) { float w = jobWeight.Get(stream); float streamDt = Mathf.Abs(stream.deltaTime); driven.GetGlobalTR(stream, out Vector3 drivenPos, out Quaternion drivenRot); if (w > 0f && streamDt > 0f) { source.GetGlobalTR(stream, out Vector3 sourcePos, out Quaternion sourceRot); var sourceTx = new AffineTransform(sourcePos, sourceRot); var targetTx = sourceTx * localBindTx; targetTx.translation = Vector3.Lerp(drivenPos, targetTx.translation, w); targetTx.rotation = Quaternion.Lerp(drivenRot, targetTx.rotation, w); var dampPosW = AnimationRuntimeUtils.Square(1f - dampPosition.Get(stream)); var dampRotW = AnimationRuntimeUtils.Square(1f - dampRotation.Get(stream)); bool doAimAjustements = Vector3.Dot(aimBindAxis, aimBindAxis) > 0f; while (streamDt > 0f) { float factoredDt = k_DampFactor * Mathf.Min(k_FixedDt, streamDt); prevDrivenTx.translation += (targetTx.translation - prevDrivenTx.translation) * dampPosW * factoredDt; prevDrivenTx.rotation *= Quaternion.Lerp( Quaternion.identity, Quaternion.Inverse(prevDrivenTx.rotation) * targetTx.rotation, dampRotW * factoredDt ); if (doAimAjustements) { var fromDir = prevDrivenTx.rotation * aimBindAxis; var toDir = sourceTx.translation - prevDrivenTx.translation; prevDrivenTx.rotation = Quaternion.AngleAxis(Vector3.Angle(fromDir, toDir), Vector3.Cross(fromDir, toDir).normalized) * prevDrivenTx.rotation; } streamDt -= k_FixedDt; } driven.SetGlobalTR(stream, prevDrivenTx.translation, prevDrivenTx.rotation); } else { prevDrivenTx.Set(drivenPos, drivenRot); AnimationRuntimeUtils.PassThrough(stream, driven); } }
/// <summary> /// Defines what to do when processing the animation. /// </summary> /// <param name="stream">The animation stream to work on.</param> public void ProcessAnimation(AnimationStream stream) { jobWeight.Set(stream, 1f); tip.GetGlobalTR(stream, out var tipPosition, out var tipRotation); target.GetGlobalTR(stream, out var targetPosition, out var targetRotation); var positionWeight = targetPositionWeight.Get(stream); targetPosition = (positionWeight > 0f) ? tipPosition + targetOffset.translation : targetPosition; var rotationWeight = targetRotationWeight.Get(stream); targetRotation = (rotationWeight > 0f) ? tipRotation * targetOffset.rotation : targetRotation; target.SetGlobalTR(stream, targetPosition, targetRotation); if (hint.IsValid(stream)) { var rootPosition = root.GetPosition(stream); var midPosition = mid.GetPosition(stream); var ac = tipPosition - rootPosition; var ab = midPosition - rootPosition; var bc = tipPosition - midPosition; float abLen = ab.magnitude; float bcLen = bc.magnitude; var acSqrMag = Vector3.Dot(ac, ac); var projectionPoint = rootPosition; if (acSqrMag > k_SqrEpsilon) { projectionPoint += Vector3.Dot(ab / acSqrMag, ac) * ac; } var poleVectorDirection = midPosition - projectionPoint; var weight = hintWeight.Get(stream); var hintPosition = hint.GetPosition(stream); var scale = abLen + bcLen; hintPosition = (weight > 0f) ? projectionPoint + (poleVectorDirection.normalized * scale) : hintPosition; hint.SetPosition(stream, hintPosition); } }