@@ -71,6 +71,7 @@ public void AddDeltaTime(float deltaTime)
7171 else
7272 {
7373 m_AverageDeltaTime += deltaTime ;
74+ m_AverageDeltaTime *= 0.5f ;
7475 }
7576 DeltaTime = Math . Min ( DeltaTime + m_AverageDeltaTime , TimeToTargetValue ) ;
7677 LerpT = TimeToTargetValue == 0.0f ? 1.0f : DeltaTime / TimeToTargetValue ;
@@ -97,7 +98,7 @@ public void Reset(T currentValue)
9798 CurrentValue = currentValue ;
9899 PreviousValue = currentValue ;
99100 // When reset, we consider ourselves to have already arrived at the target (even if no target is set)
100- LerpT = 1 .0f;
101+ LerpT = 0 .0f;
101102 EndTime = 0.0 ;
102103 StartTime = 0.0 ;
103104 ResetDelta ( ) ;
@@ -169,6 +170,11 @@ public void Reset(T currentValue)
169170 /// </summary>
170171 private T m_RateOfChange ;
171172
173+ /// <summary>
174+ /// Represents the predicted rate of change for the value being interpolated when smooth dampening is enabled.
175+ /// </summary>
176+ private T m_PredictedRateOfChange ;
177+
172178 private bool m_IsAngularValue ;
173179
174180 /// <summary>
@@ -225,8 +231,8 @@ private void InternalReset(T targetValue, double serverTime, bool isAngularValue
225231 /// <param name="maxDeltaTime">maximum time delta which defines the maximum time duration when consuming more than one item from the buffer</param>
226232 private void TryConsumeFromBuffer ( double renderTime , float minDeltaTime , float maxDeltaTime )
227233 {
228- if ( ! InterpolateState . Target . HasValue || ( InterpolateState . Target . Value . TimeSent <= renderTime &&
229- ( InterpolateState . TargetTimeAproximatelyReached ( ) || IsAproximately ( InterpolateState . CurrentValue , InterpolateState . Target . Value . Item ) ) ) )
234+ if ( ! InterpolateState . Target . HasValue || ( InterpolateState . Target . Value . TimeSent <= renderTime
235+ && ( InterpolateState . TargetTimeAproximatelyReached ( ) || IsAproximately ( InterpolateState . CurrentValue , InterpolateState . Target . Value . Item ) ) ) )
230236 {
231237 BufferedItem ? previousItem = null ;
232238 var startTime = 0.0 ;
@@ -309,7 +315,15 @@ public T Update(float deltaTime, double tickLatencyAsTime, float minDeltaTime, f
309315 if ( InterpolateState . Target . HasValue )
310316 {
311317 InterpolateState . AddDeltaTime ( deltaTime ) ;
312- InterpolateState . CurrentValue = SmoothDamp ( InterpolateState . CurrentValue , InterpolateState . Target . Value . Item , ref m_RateOfChange , InterpolateState . TimeToTargetValue , deltaTime ) ;
318+
319+ // Smooth dampen our current time
320+ var current = SmoothDamp ( InterpolateState . CurrentValue , InterpolateState . Target . Value . Item , ref m_RateOfChange , InterpolateState . TimeToTargetValue , InterpolateState . DeltaTime ) ;
321+ // Smooth dampen a predicted time based on our average delta time
322+ var predict = SmoothDamp ( InterpolateState . CurrentValue , InterpolateState . Target . Value . Item , ref m_PredictedRateOfChange , InterpolateState . TimeToTargetValue , InterpolateState . DeltaTime + InterpolateState . AverageDeltaTime ) ;
323+ // Split the difference between the two.
324+ // Note: Since smooth dampening cannot over shoot, both current and predict will eventually become the same or will be very close to the same.
325+ // Upon stopping motion, the final resing value should be a very close aproximation of the authority side.
326+ InterpolateState . CurrentValue = Interpolate ( current , predict , 0.5f ) ;
313327 }
314328 m_NbItemsReceivedThisFrame = 0 ;
315329 return InterpolateState . CurrentValue ;
@@ -381,15 +395,6 @@ private void TryConsumeFromBuffer(double renderTime, double serverTime)
381395 }
382396 }
383397 }
384- #endregion
385-
386- /// <summary>
387- /// Used for internal testing
388- /// </summary>
389- internal T UpdateInternal ( float deltaTime , NetworkTime serverTime )
390- {
391- return Update ( deltaTime , serverTime . TimeTicksAgo ( 1 ) . Time , serverTime . Time ) ;
392- }
393398
394399 /// <summary>
395400 /// Call to update the state of the interpolators using Lerp.
@@ -432,6 +437,15 @@ public T Update(float deltaTime, double renderTime, double serverTime)
432437 m_NbItemsReceivedThisFrame = 0 ;
433438 return InterpolateState . CurrentValue ;
434439 }
440+ #endregion
441+
442+ /// <summary>
443+ /// Used for internal testing
444+ /// </summary>
445+ internal T UpdateInternal ( float deltaTime , NetworkTime serverTime )
446+ {
447+ return Update ( deltaTime , serverTime . TimeTicksAgo ( 1 ) . Time , serverTime . Time ) ;
448+ }
435449
436450 /// <summary>
437451 /// Add measurements to be used during interpolation. These will be buffered before being made available to be displayed as "latest value".
0 commit comments