public static Quaternion ExtrapolateQuaternion(Quaternion cquat, Quaternion rquat, int recievedFrame, int entityFrame, PropertyExtrapolationSettings settings) { var r = rquat * Quaternion.Inverse(cquat); float d = System.Math.Min(settings.MaxFrames, (entityFrame + 1) - recievedFrame); float t = d / (float)System.Math.Max(1, settings.MaxFrames); float r_angle; Vector3 r_axis; r.ToAngleAxis(out r_angle, out r_axis); if (float.IsInfinity(r_axis.x) || float.IsNaN(r_axis.x)) { r_angle = 0; r_axis = Vector3.right; } else { if (r_angle > 180) { r_angle -= 360; } } return(Quaternion.AngleAxis((r_angle * t) % 360f, r_axis) * cquat); }
public void Settings_Extrapolation(PropertyExtrapolationSettings extrapolation) { Extrapolation = extrapolation; }
public static Vector3 ExtrapolateVector(Vector3 cpos, Vector3 rpos, Vector3 rvel, int recievedFrame, int entityFrame, PropertyExtrapolationSettings settings, ref bool snapped) { rvel *= AscensionNetwork.FrameDeltaTime; float d = System.Math.Min(settings.MaxFrames, (entityFrame + 1) - recievedFrame); float t = d / System.Math.Max(1, settings.MaxFrames); Vector3 p0 = cpos + (rvel); Vector3 p1 = rpos + (rvel * d); float sqrMag = (p1 - p0).sqrMagnitude; if ((settings.SnapMagnitude > 0) && sqrMag > (settings.SnapMagnitude * settings.SnapMagnitude)) { snapped = true; return(p1); } else { //TODO: implement error tolerance //if (rvel.sqrMagnitude < sqrMag) { // return p0; //} return(Vector3.Lerp(p0, p1, t)); } }