@@ -118,10 +118,10 @@ internal struct CurrentState
118118
119119 public double StartTime ;
120120 public double EndTime ;
121- public float TimeToTargetValue ;
122- public float DeltaTime ;
123- public float DeltaTimePredict ;
124- public float MaxDeltaTime ;
121+ public double TimeToTargetValue ;
122+ public double DeltaTime ;
123+ public double DeltaTimePredict ;
124+ public double MaxDeltaTime ;
125125 public float LerpT ;
126126 public float LerpTPredict ;
127127 public bool TargetReached ;
@@ -130,11 +130,13 @@ internal struct CurrentState
130130 public T PreviousValue ;
131131 public T PredictValue ;
132132 public T PredictTarget ;
133+ public T Phase1Value ;
134+ public T Phase2Value ;
133135
134136 private float m_AverageDeltaTime ;
135137
136138 public float AverageDeltaTime => m_AverageDeltaTime ;
137- public float FinalTimeToTarget => Mathf . Max ( 0.0f , TimeToTargetValue - DeltaTime ) ;
139+ public double FinalTimeToTarget => Math . Max ( 0.0 , TimeToTargetValue - DeltaTime ) ;
138140
139141 public void AddDeltaTime ( float deltaTime )
140142 {
@@ -147,20 +149,22 @@ public void AddDeltaTime(float deltaTime)
147149 m_AverageDeltaTime += deltaTime ;
148150 m_AverageDeltaTime *= 0.5f ;
149151 }
150- DeltaTime = Math . Min ( DeltaTime + m_AverageDeltaTime , TimeToTargetValue ) ;
151- DeltaTimePredict = Math . Min ( DeltaTime + DeltaTimePredict , TimeToTargetValue + MaxDeltaTime ) ;
152- LerpT = TimeToTargetValue == 0.0f ? 1.0f : DeltaTime / TimeToTargetValue ;
152+ DeltaTime = Math . Min ( DeltaTime + deltaTime , TimeToTargetValue ) ;
153+ DeltaTimePredict = Math . Min ( DeltaTime + deltaTime , TimeToTargetValue + MaxDeltaTime ) ;
154+ //DeltaTime = Math.Min(DeltaTime + m_AverageDeltaTime, TimeToTargetValue);
155+ //DeltaTimePredict = Math.Min(DeltaTimePredict + m_AverageDeltaTime, TimeToTargetValue + MaxDeltaTime);
156+ LerpT = ( float ) ( TimeToTargetValue == 0.0 ? 1.0 : DeltaTime / TimeToTargetValue ) ;
153157 if ( PredictingNext )
154158 {
155- LerpTPredict = TimeToTargetValue == 0.0f ? 1.0f : DeltaTimePredict / TimeToTargetValue ;
159+ LerpTPredict = ( float ) ( TimeToTargetValue == 0.0 ? 1.0 : DeltaTimePredict / TimeToTargetValue ) ;
156160 }
157161 else
158162 {
159163 LerpTPredict = LerpT ;
160164 }
161165 }
162166
163- public void SetTimeToTarget ( float timeToTarget )
167+ public void SetTimeToTarget ( double timeToTarget )
164168 {
165169 DeltaTimePredict = 0.0f ;
166170 LerpTPredict = 0.0f ;
@@ -191,6 +195,8 @@ public void Reset(T currentValue)
191195 PreviousValue = currentValue ;
192196 PredictValue = currentValue ;
193197 PredictTarget = currentValue ;
198+ Phase1Value = currentValue ;
199+ Phase2Value = currentValue ;
194200 TargetReached = false ;
195201 PredictingNext = false ;
196202 LerpT = 0.0f ;
@@ -304,7 +310,7 @@ private void InternalReset(T targetValue, double serverTime, bool isAngularValue
304310 /// <param name="renderTime">render time: the time in "ticks ago" relative to the current tick latency</param>
305311 /// <param name="minDeltaTime">minimum time delta (defaults to tick frequency)</param>
306312 /// <param name="maxDeltaTime">maximum time delta which defines the maximum time duration when consuming more than one item from the buffer</param>
307- private void TryConsumeFromBuffer ( double renderTime , float minDeltaTime , float maxDeltaTime , bool isPredictedLerp )
313+ private void TryConsumeFromBuffer ( double renderTime , double minDeltaTime , double maxDeltaTime , bool isPredictedLerp )
308314 {
309315 BufferedItem ? previousItem = null ;
310316 var startTime = 0.0 ;
@@ -348,6 +354,8 @@ private void TryConsumeFromBuffer(double renderTime, float minDeltaTime, float m
348354 alreadyHasBufferItem = true ;
349355 InterpolateState . PredictValue = InterpolateState . CurrentValue ;
350356 InterpolateState . PreviousValue = InterpolateState . CurrentValue ;
357+ InterpolateState . Phase1Value = InterpolateState . CurrentValue ;
358+ InterpolateState . Phase2Value = InterpolateState . CurrentValue ;
351359 InterpolateState . SetTimeToTarget ( minDeltaTime ) ;
352360 InterpolateState . TimeToTargetValue = minDeltaTime ;
353361 startTime = InterpolateState . Target . Value . TimeSent ;
@@ -363,17 +371,19 @@ private void TryConsumeFromBuffer(double renderTime, float minDeltaTime, float m
363371 InterpolateState . TargetReached = false ;
364372 InterpolateState . PredictingNext = false ;
365373 startTime = InterpolateState . Target . Value . TimeSent ;
374+ InterpolateState . Phase1Value = InterpolateState . PreviousValue ;
375+ InterpolateState . Phase2Value = InterpolateState . PredictValue ;
366376 InterpolateState . PredictTarget = target . Item ;
367377 InterpolateState . MaxDeltaTime = maxDeltaTime ;
368- if ( m_BufferQueue . TryPeek ( out BufferedItem lookAheadItem ) )
369- {
370- InterpolateState . PredictTarget = Interpolate ( target . Item , lookAheadItem . Item , InterpolateState . AverageDeltaTime ) ;
371- InterpolateState . PredictingNext = true ;
372- }
378+ }
379+ if ( m_BufferQueue . TryPeek ( out BufferedItem lookAheadItem ) )
380+ {
381+ InterpolateState . PredictTarget = Interpolate ( target . Item , lookAheadItem . Item , InterpolateState . AverageDeltaTime ) ;
382+ InterpolateState . PredictingNext = true ;
373383 }
374384 // TODO: We might consider creating yet another queue to add these items to and assure that the time is accelerated
375385 // for each item as opposed to losing the resolution of the values.
376- var timeToTarget = Mathf . Clamp ( ( float ) ( target . TimeSent - startTime ) , minDeltaTime , maxDeltaTime ) ;
386+ var timeToTarget = Math . Clamp ( ( float ) ( target . TimeSent - startTime ) , minDeltaTime , maxDeltaTime ) ;
377387 InterpolateState . SetTimeToTarget ( timeToTarget ) ;
378388 InterpolateState . Target = target ;
379389 }
@@ -415,7 +425,7 @@ internal void ResetCurrentState()
415425 /// <param name="isLerpAndExtrapolate">Determines whether to use smooth dampening or extrapolation.</param>
416426 /// <param name="lerpSmoothing">Determines if lerp smoothing is enabled for this instance.</param>
417427 /// <returns>The newly interpolated value of type 'T'</returns>
418- internal T Update ( float deltaTime , double tickLatencyAsTime , float minDeltaTime , float maxDeltaTime , bool isLerpAndExtrapolate , bool lerpSmoothing )
428+ internal T Update ( float deltaTime , double tickLatencyAsTime , double minDeltaTime , double maxDeltaTime , bool isLerpAndExtrapolate , bool lerpSmoothing )
419429 {
420430 TryConsumeFromBuffer ( tickLatencyAsTime , minDeltaTime , maxDeltaTime , isLerpAndExtrapolate ) ;
421431 // Only begin interpolation when there is a start and end point
@@ -429,27 +439,36 @@ internal T Update(float deltaTime, double tickLatencyAsTime, float minDeltaTime,
429439 // SmoothDampen or LerpExtrapolateBlend
430440 if ( ! isLerpAndExtrapolate )
431441 {
432- InterpolateState . PreviousValue = SmoothDamp ( InterpolateState . PreviousValue , InterpolateState . Target . Value . Item , ref m_RateOfChange , InterpolateState . TimeToTargetValue , InterpolateState . DeltaTime ) ;
433- var predictedTime = InterpolateState . PredictingNext ? InterpolateState . DeltaTime : Mathf . Min ( InterpolateState . TimeToTargetValue , InterpolateState . DeltaTime + InterpolateState . AverageDeltaTime ) ;
434- InterpolateState . PredictValue = SmoothDamp ( InterpolateState . PredictValue , InterpolateState . PredictTarget , ref m_PredictedRateOfChange , InterpolateState . TimeToTargetValue , predictedTime ) ;
442+ //InterpolateState.PreviousValue = SmoothDamp(InterpolateState.PreviousValue, InterpolateState.Target.Value.Item, ref m_RateOfChange, (float)InterpolateState.TimeToTargetValue, (float)InterpolateState.DeltaTime);
443+ //var predictedTime = InterpolateState.PredictingNext ? InterpolateState.DeltaTime : Math.Min(InterpolateState.TimeToTargetValue, InterpolateState.DeltaTime + InterpolateState.AverageDeltaTime);
444+ //InterpolateState.PredictValue = SmoothDamp(InterpolateState.PredictValue, InterpolateState.PredictTarget, ref m_PredictedRateOfChange, (float)InterpolateState.TimeToTargetValue, (float)predictedTime);
445+ InterpolateState . Phase1Value = SmoothDamp ( InterpolateState . CurrentValue , InterpolateState . Target . Value . Item , ref m_RateOfChange , ( float ) InterpolateState . TimeToTargetValue , ( float ) InterpolateState . DeltaTime ) ;
446+ var predictedTime = InterpolateState . PredictingNext ? InterpolateState . DeltaTime : Math . Min ( InterpolateState . TimeToTargetValue , InterpolateState . DeltaTime + InterpolateState . AverageDeltaTime ) ;
447+ InterpolateState . PredictValue = SmoothDamp ( InterpolateState . Phase1Value , InterpolateState . Target . Value . Item , ref m_PredictedRateOfChange , ( float ) InterpolateState . TimeToTargetValue , ( float ) predictedTime ) ;
448+ // Determine if smooth dampening is enabled to get our lerp "t" time
449+ var timeDelta = lerpSmoothing ? deltaTime / MaximumInterpolationTime : deltaTime ;
450+ // Lerp between the PreviousValue and PredictedValue using the calculated time delta
451+ InterpolateState . CurrentValue = Interpolate ( InterpolateState . PreviousValue , InterpolateState . PredictValue , timeDelta ) ;
435452 }
436453 else
437454 {
438- InterpolateState . PreviousValue = Interpolate ( InterpolateState . PreviousValue , InterpolateState . Target . Value . Item , InterpolateState . LerpT ) ;
439- InterpolateState . PredictValue = InterpolateUnclamped ( InterpolateState . PredictValue , InterpolateState . Target . Value . Item , InterpolateState . LerpTPredict ) ;
440- }
455+ InterpolateState . PreviousValue = Interpolate ( InterpolateState . Phase1Value , InterpolateState . Target . Value . Item , InterpolateState . LerpT ) ;
441456
442- // Lerp between the PreviousValue and PredictedValue (extrapolated) using this frame's delta time
443- var targetValue = Interpolate ( InterpolateState . PreviousValue , InterpolateState . PredictValue , deltaTime ) ;
444- if ( lerpSmoothing )
445- {
446- // If lerp smoothing is enabled, then smooth current value towards the target value
447- InterpolateState . CurrentValue = Interpolate ( InterpolateState . CurrentValue , targetValue , deltaTime / MaximumInterpolationTime ) ;
448- }
449- else
450- {
451- // Otherwise, just assign the target value.
452- InterpolateState . CurrentValue = targetValue ;
457+ // Note: InterpolateState.LerpTPredict is clamped to LerpT if we have no next target
458+ InterpolateState . PredictValue = InterpolateUnclamped ( InterpolateState . Phase2Value , InterpolateState . Target . Value . Item , InterpolateState . LerpTPredict ) ;
459+
460+ // Lerp between the PreviousValue and PredictedValue using this frame's delta time
461+ var targetValue = Interpolate ( InterpolateState . PreviousValue , InterpolateState . PredictValue , deltaTime ) ;
462+ if ( lerpSmoothing )
463+ {
464+ // If lerp smoothing is enabled, then smooth current value towards the target value
465+ InterpolateState . CurrentValue = Interpolate ( InterpolateState . CurrentValue , targetValue , deltaTime / MaximumInterpolationTime ) ;
466+ }
467+ else
468+ {
469+ // Otherwise, just assign the target value.
470+ InterpolateState . CurrentValue = targetValue ;
471+ }
453472 }
454473 }
455474 }
0 commit comments