public static float InterpolateFloat(ListExtended <NetworkStorage> frames, int offset, int frame, bool angle) { var f0 = frames.First; var p0 = f0.Values[offset].Float1; if ((frames.Count == 1) || (f0.Frame >= frame)) { return(p0); } else { var f1 = frames.Next(f0); var p1 = f1.Values[offset].Float1; NetAssert.True(f1.Frame > f0.Frame); NetAssert.True(f1.Frame > frame); int f0Frame = f0.Frame; if (f0Frame < (f1.Frame - Core.RemoteSendRate * 2)) { f0Frame = f1.Frame - Core.RemoteSendRate * 2; } float t = f1.Frame - f0Frame; float d = frame - f0Frame; return(angle ? Mathf.LerpAngle(p0, p1, d / t) : Mathf.Lerp(p0, p1, d / t)); } }
public static Quaternion InterpolateQuaternion(ListExtended <NetworkStorage> frames, int offset, int frame) { var f0 = frames.First; var p0 = f0.Values[offset].Quaternion; if (p0 == default(Quaternion)) { p0 = Quaternion.identity; } if ((frames.Count == 1) || (f0.Frame >= frame)) { return(p0); } else { var f1 = frames.Next(f0); var p1 = f1.Values[offset].Quaternion; if (p1 == default(Quaternion)) { p1 = Quaternion.identity; } NetAssert.True(f1.Frame > f0.Frame); NetAssert.True(f1.Frame > frame); int f0Frame = f0.Frame; if (f0Frame < (f1.Frame - Core.RemoteSendRate * 2)) { f0Frame = f1.Frame - Core.RemoteSendRate * 2; } float t = f1.Frame - f0Frame; float d = frame - f0Frame; return(Quaternion.Lerp(p0, p1, d / t)); } }
public static Vector3 InterpolateVector(ListExtended <NetworkStorage> frames, int offset, int frame, float snapLimit, ref bool snapped) { var f0 = frames.First; var p0 = f0.Values[offset].Vector3; if ((frames.Count == 1) || (f0.Frame >= frame)) { return(p0); } else { var f1 = frames.Next(f0); var p1 = f1.Values[offset].Vector3; NetAssert.True(f1.Frame > f0.Frame); NetAssert.True(f1.Frame > frame); if ((p0 - p1).sqrMagnitude > (snapLimit * snapLimit)) { snapped = true; return(p1); } else { int f0Frame = f0.Frame; if (f0Frame < (f1.Frame - Core.RemoteSendRate * 2)) { f0Frame = f1.Frame - Core.RemoteSendRate * 2; } float t = f1.Frame - f0Frame; float d = frame - f0Frame; return(Vector3.Lerp(p0, p1, d / t)); } } }