public void Init(NodeAddedEvent e, SingleNode <TransformTimeSmoothingComponent> node) { Transform transform = node.component.Transform; TransformTimeSmoothingDataComponent component = new TransformTimeSmoothingDataComponent { LastPosition = transform.position, LastRotation = transform.rotation, LerpFactor = 1f }; node.Entity.AddComponent(component); }
public void TransformSmoothCalculation(TransformTimeSmoothingEvent e, TimeSmoothingNode node) { bool flag = node.transformTimeSmoothing.UseCorrectionByFrameLeader && (Time.frameCount > this.lastFrame); Transform transform = node.transformTimeSmoothing.Transform; TransformTimeSmoothingDataComponent transformTimeSmoothingData = node.transformTimeSmoothingData; float smoothDeltaTime = Time.smoothDeltaTime; float num2 = Mathf.Clamp((float)(smoothDeltaTime / Time.deltaTime), (float)0.4f, (float)1f); if (num2 < transformTimeSmoothingData.LerpFactor) { transformTimeSmoothingData.LerpFactor = num2; } else { float num3 = (1.2f * smoothDeltaTime) * (1f - Mathf.Sqrt(transformTimeSmoothingData.LerpFactor)); transformTimeSmoothingData.LerpFactor = Mathf.Clamp((float)(transformTimeSmoothingData.LerpFactor + num3), (float)0.4f, (float)1f); } Vector3 v = Vector3.SlerpUnclamped(transformTimeSmoothingData.LastPosition, transform.position, transformTimeSmoothingData.LerpFactor); Quaternion rot = Quaternion.SlerpUnclamped(transformTimeSmoothingData.LastRotation, transform.rotation, transformTimeSmoothingData.LerpFactor); if (PhysicsUtil.IsValidVector3(v) && PhysicsUtil.IsValidQuaternion(rot)) { transform.SetPositionSafe(v); transform.SetRotationSafe(rot); } transformTimeSmoothingData.LastRotationDeltaAngle = Quaternion.Angle(transformTimeSmoothingData.LastRotation, transform.rotation); this.frameLeaderDeltaPosition = (transformTimeSmoothingData.LastPosition - transform.position).magnitude; float num4 = 1f; float num5 = 1f; if (node.transformTimeSmoothing.UseCorrectionByFrameLeader && !flag) { float num6 = 0.1f; if ((this.frameLeaderDeltaAngle > num6) && (transformTimeSmoothingData.LastRotationDeltaAngle > num6)) { num4 = Mathf.Abs((float)(((transformTimeSmoothingData.LastRotationDeltaAngle * (1f - transformTimeSmoothingData.LerpFactor)) + (this.frameLeaderDeltaAngle * transformTimeSmoothingData.LerpFactor)) / this.frameLeaderDeltaAngle)); } if (this.frameLeaderDeltaPosition > num6) { num5 = Mathf.Abs((float)(((this.frameLeaderDeltaPosition * (1f - transformTimeSmoothingData.LerpFactor)) + (this.frameLeaderDeltaPosition * transformTimeSmoothingData.LerpFactor)) / this.frameLeaderDeltaPosition)); } } float t = Mathf.Clamp((float)(transformTimeSmoothingData.LerpFactor * num5), (float)0.4f, (float)1.2f); float num8 = Mathf.Clamp((float)(transformTimeSmoothingData.LerpFactor * num4), (float)0.4f, (float)1.2f); v = Vector3.SlerpUnclamped(transformTimeSmoothingData.LastPosition, transform.position, t); rot = Quaternion.SlerpUnclamped(transformTimeSmoothingData.LastRotation, transform.rotation, num8); if (PhysicsUtil.IsValidVector3(v) && PhysicsUtil.IsValidQuaternion(rot)) { transform.SetPositionSafe(v); transform.SetRotationSafe(rot); } transformTimeSmoothingData.LastRotationDeltaAngle = Quaternion.Angle(transformTimeSmoothingData.LastRotation, transform.rotation); if (flag) { this.lastFrame = Time.frameCount; this.frameLeaderDeltaAngle = transformTimeSmoothingData.LastRotationDeltaAngle; this.frameLeaderDeltaPosition = (transformTimeSmoothingData.LastPosition - transform.position).magnitude; } transformTimeSmoothingData.LastPosition = transform.position; transformTimeSmoothingData.LastRotation = transform.rotation; }