@@ -36,7 +36,6 @@ internal struct CurrentState
3636 public float DeltaTime ;
3737 public float LerpT ;
3838
39- public T TargetValue ;
4039 public T CurrentValue ;
4140 public T PreviousValue ;
4241
@@ -45,23 +44,18 @@ internal struct CurrentState
4544 public float AverageDeltaTime => m_AverageDeltaTime ;
4645 public float FinalTimeToTarget => TimeToTargetValue - DeltaTime ;
4746
48- public bool AddDeltaTime ( float deltaTime )
47+ public void AddDeltaTime ( float deltaTime )
4948 {
5049 if ( m_AverageDeltaTime == 0.0f )
5150 {
5251 m_AverageDeltaTime = deltaTime ;
5352 }
5453 else
5554 {
56- // Gradually adjust our delta time to keep this
57- // value more consistent
58- m_AverageDeltaTime = 3.0f * m_AverageDeltaTime ;
5955 m_AverageDeltaTime += deltaTime ;
60- m_AverageDeltaTime *= 0.25f ;
6156 }
6257 DeltaTime = Math . Max ( DeltaTime + m_AverageDeltaTime , TimeToTargetValue ) ;
6358 LerpT = DeltaTime / TimeToTargetValue ;
64- return FinalTimeToTarget <= m_AverageDeltaTime ;
6559 }
6660
6761 public bool TargetTimeAproximatelyReached ( )
@@ -70,15 +64,14 @@ public bool TargetTimeAproximatelyReached()
7064 {
7165 return false ;
7266 }
73- return ( m_AverageDeltaTime * 0.3333333f ) >= FinalTimeToTarget ;
67+ return m_AverageDeltaTime >= FinalTimeToTarget ;
7468 }
7569
7670 public void Reset ( T currentValue )
7771 {
7872 Target = null ;
7973 CurrentValue = currentValue ;
8074 PreviousValue = currentValue ;
81- TargetValue = currentValue ;
8275 // When reset, we consider ourselves to have already arrived at the target (even if no target is set)
8376 LerpT = 1.0f ;
8477 RelativeTime = 0.0 ;
@@ -147,22 +140,6 @@ public void Reset(T currentValue)
147140 private bool m_IsAngularValue ;
148141 protected bool IsAngularValue => m_IsAngularValue ;
149142
150- internal void ConvertTransformSpace ( Transform transform , bool inLocalSpace )
151- {
152- var count = m_Buffer . Count ;
153- for ( int i = 0 ; i < count ; i ++ )
154- {
155- var entry = m_Buffer . Dequeue ( ) ;
156- entry . Item = OnConvertTransformSpace ( transform , entry . Item , inLocalSpace ) ;
157- m_Buffer . Enqueue ( entry ) ;
158- }
159- InterpolateState . CurrentValue = OnConvertTransformSpace ( transform , InterpolateState . CurrentValue , inLocalSpace ) ;
160- var end = InterpolateState . Target . Value ;
161- end . Item = OnConvertTransformSpace ( transform , end . Item , inLocalSpace ) ;
162- InterpolateState . Target = end ;
163- InLocalSpace = inLocalSpace ;
164- }
165-
166143 /// <summary>
167144 /// Resets interpolator to the defaults.
168145 /// </summary>
@@ -187,7 +164,7 @@ public void Clear()
187164 /// <param name="serverTime">The current server time</param>
188165 /// <param name="useSmoothDampening">Defaults to true and is the recommened way to achieve a smoother interpolation between buffer item values.</param>
189166 /// <param name="isAngularValue">When rotation is expressed as Euler values (i.e. Vector3 and/or float) this helps determine what kind of smooth dampening to use.</param>
190- public void ResetTo ( T targetValue , double serverTime , bool useSmoothDampening = true , bool isAngularValue = false )
167+ public void ResetTo ( T targetValue , double serverTime , bool isAngularValue = false )
191168 {
192169#if UNITY_EDITOR
193170 m_Name = GetType ( ) . Name ;
@@ -198,8 +175,6 @@ public void ResetTo(T targetValue, double serverTime, bool useSmoothDampening =
198175 InterpolateState . Reset ( targetValue ) ;
199176 // TODO: If we get single lerping working, then m_CurrentInterpValue is no longer needed.
200177 m_CurrentInterpValue = targetValue ;
201-
202- m_UseSmoothDamening = useSmoothDampening ;
203178 m_IsAngularValue = isAngularValue ;
204179
205180 // Add the first measurement for our baseline
@@ -212,12 +187,16 @@ public void ResetTo(T targetValue, double serverTime, bool useSmoothDampening =
212187 /// <param name="renderTime">render time: the time in "ticks ago" relative to the current tick latency</param>
213188 /// <param name="minDeltaTime">minimum time delta (defaults to tick frequency)</param>
214189 /// <param name="maxDeltaTime">maximum time delta which defines the maximum time duration when consuming more than one item from the buffer</param>
215- private void TryConsumeFromBuffer ( double renderTime , float minDeltaTime , float maxDeltaTime )
190+ private void TryConsumeFromBuffer ( double renderTime , float minDeltaTime , float maxDeltaTime , bool isSmoothed = false )
216191 {
217- if ( ! InterpolateState . Target . HasValue ||
218- ( InterpolateState . Target . Value . TimeSent <= renderTime &&
219- ( InterpolateState . TargetTimeAproximatelyReached ( ) ||
220- IsAproximately ( InterpolateState . CurrentValue , InterpolateState . Target . Value . Item ) ) ) )
192+ var canGetNextItem = true ;
193+
194+ if ( isSmoothed && InterpolateState . Target . HasValue )
195+ {
196+ canGetNextItem = InterpolateState . TargetTimeAproximatelyReached ( ) || IsAproximately ( InterpolateState . CurrentValue , InterpolateState . Target . Value . Item ) ;
197+ }
198+
199+ if ( ! InterpolateState . Target . HasValue || ( InterpolateState . Target . Value . TimeSent <= renderTime && canGetNextItem ) )
221200 {
222201 BufferedItem ? previousItem = null ;
223202 var startTime = 0.0 ;
@@ -260,7 +239,14 @@ private void TryConsumeFromBuffer(double renderTime, float minDeltaTime, float m
260239 }
261240 // TODO: We might consider creating yet another queue to add these items to and assure that the time is accelerated
262241 // for each item as opposed to losing the resolution of the values.
263- InterpolateState . TimeToTargetValue = Mathf . Clamp ( ( float ) ( target . TimeSent - startTime ) , minDeltaTime , maxDeltaTime ) ;
242+ if ( isSmoothed )
243+ {
244+ InterpolateState . TimeToTargetValue = Mathf . Clamp ( ( float ) ( target . TimeSent - startTime ) , minDeltaTime , maxDeltaTime ) ;
245+ }
246+ else
247+ {
248+ InterpolateState . TimeToTargetValue = ( float ) ( target . TimeSent - startTime ) ;
249+ }
264250 InterpolateState . Target = target ;
265251 }
266252 InterpolateState . DeltaTime = 0.0f ;
@@ -299,12 +285,12 @@ internal T UpdateInternal(float deltaTime, NetworkTime serverTime)
299285 /// <returns>The newly interpolated value of type 'T'</returns>
300286 public T Update ( float deltaTime , double tickLatencyAsTime , float minDeltaTime , float maxDeltaTime )
301287 {
302- TryConsumeFromBuffer ( tickLatencyAsTime , minDeltaTime , maxDeltaTime ) ;
288+ TryConsumeFromBuffer ( tickLatencyAsTime , minDeltaTime , maxDeltaTime , true ) ;
303289 // Only interpolate when there is a start and end point and we have not already reached the end value
304290 if ( InterpolateState . Target . HasValue )
305291 {
306292 InterpolateState . AddDeltaTime ( deltaTime ) ;
307- InterpolateState . CurrentValue = SmoothDamp ( InterpolateState . CurrentValue , InterpolateState . Target . Value . Item , ref m_RateOfChange , InterpolateState . TimeToTargetValue , InterpolateState . DeltaTime , 10000.0f ) ;
293+ InterpolateState . CurrentValue = SmoothDamp ( InterpolateState . CurrentValue , InterpolateState . Target . Value . Item , ref m_RateOfChange , InterpolateState . TimeToTargetValue , deltaTime ) ;
308294 }
309295 m_NbItemsReceivedThisFrame = 0 ;
310296 return InterpolateState . CurrentValue ;
@@ -439,6 +425,22 @@ protected internal virtual T OnConvertTransformSpace(Transform transform, T item
439425 return default ;
440426 }
441427
428+ internal void ConvertTransformSpace ( Transform transform , bool inLocalSpace )
429+ {
430+ var count = m_Buffer . Count ;
431+ for ( int i = 0 ; i < count ; i ++ )
432+ {
433+ var entry = m_Buffer . Dequeue ( ) ;
434+ entry . Item = OnConvertTransformSpace ( transform , entry . Item , inLocalSpace ) ;
435+ m_Buffer . Enqueue ( entry ) ;
436+ }
437+ InterpolateState . CurrentValue = OnConvertTransformSpace ( transform , InterpolateState . CurrentValue , inLocalSpace ) ;
438+ var end = InterpolateState . Target . Value ;
439+ end . Item = OnConvertTransformSpace ( transform , end . Item , inLocalSpace ) ;
440+ InterpolateState . Target = end ;
441+ InLocalSpace = inLocalSpace ;
442+ }
443+
442444 // TODO: Collect data points so a single buffered linear interpolator can provide additional data points
443445 // to be visualized in RNSM.
444446 #region DEBUG_LOGGING
0 commit comments