private static BufferedTransform InterpolateValues(BufferedTransform first, BufferedTransform second, uint ticksAfterFirst) { float t = (float)ticksAfterFirst / (float)(second.PhysicsTick - first.PhysicsTick); return(new BufferedTransform { Position = Vector3.Lerp(first.Position, second.Position, t), Velocity = Vector3.Lerp(first.Velocity, second.Velocity, t), Orientation = Quaternion.Slerp(first.Orientation, second.Orientation, t), PhysicsTick = first.PhysicsTick + ticksAfterFirst }); }
protected override void OnUpdate() { for (var i = 0; i < transformUpdateData.Length; i++) { var transformUpdates = transformUpdateData.TransformUpdate[i].Updates; var lastTransformSnapshot = transformUpdateData.Transform[i]; var bufferLength = transformUpdateData.BufferedTransform[i].Length; if (bufferLength > 0) { lastTransformSnapshot = transformUpdateData.BufferedTransform[i][bufferLength - 1].transformUpdate; } foreach (var update in transformUpdates) { if (update.Location.HasValue) { lastTransformSnapshot.Location = update.Location.Value; } if (update.Rotation.HasValue) { lastTransformSnapshot.Rotation = update.Rotation.Value; } if (update.Tick.HasValue) { lastTransformSnapshot.Tick = update.Tick.Value; } var bufferedTransform = new BufferedTransform { transformUpdate = lastTransformSnapshot }; transformUpdateData.BufferedTransform[i].Add(bufferedTransform); } } }