From 35783bcec241e228addb7ae19387e44c1bda6419 Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Wed, 17 Apr 2024 06:09:49 +0300 Subject: [PATCH] engine: common: net_encode: fix inaccuracy in DT_TIMEWINDOW_* encoding By avoiding double rounding, we get more accurate time on client when timebase gets rounded down and target time gets rounded up: ``` >>> round(123.1) - round(124.51) -2 >>> round(123.1 - 124.51) -1 ``` --- engine/common/net_encode.c | 47 ++++++++++++-------------------------- 1 file changed, 15 insertions(+), 32 deletions(-) diff --git a/engine/common/net_encode.c b/engine/common/net_encode.c index 42b8b4da..15726836 100644 --- a/engine/common/net_encode.c +++ b/engine/common/net_encode.c @@ -1034,33 +1034,17 @@ static qboolean Delta_CompareField( delta_t *pField, void *from, void *to, doubl } else if( pField->flags & DT_TIMEWINDOW_8 ) { - val_a = Q_rint((*(float *)((byte *)from + pField->offset )) * 100.0f ); - val_b = Q_rint((*(float *)((byte *)to + pField->offset )) * 100.0f ); - val_a -= Q_rint(timebase * 100.0); - val_b -= Q_rint(timebase * 100.0); - fromF = FloatAsInt( val_a ); - toF = FloatAsInt( val_b ); + val_a = *(float *)((byte *)from + pField->offset ); + val_b = *(float *)((byte *)to + pField->offset ); + fromF = Q_rint(( timebase - val_a ) * 100.0 ); + toF = Q_rint(( timebase - val_b ) * 100.0 ); } else if( pField->flags & DT_TIMEWINDOW_BIG ) { - val_a = (*(float *)((byte *)from + pField->offset )); - val_b = (*(float *)((byte *)to + pField->offset )); - - if( !Q_equal( pField->multiplier, 1.0f )) - { - val_a *= pField->multiplier; - val_b *= pField->multiplier; - val_a = (timebase * pField->multiplier) - val_a; - val_b = (timebase * pField->multiplier) - val_b; - } - else - { - val_a = timebase - val_a; - val_b = timebase - val_b; - } - - fromF = FloatAsInt( val_a ); - toF = FloatAsInt( val_b ); + val_a = *(float *)((byte *)from + pField->offset ); + val_b = *(float *)((byte *)to + pField->offset ); + fromF = Q_rint(( timebase - val_a ) * pField->multiplier ); + toF = Q_rint(( timebase - val_b ) * pField->multiplier ); } else if( pField->flags & DT_STRING ) { @@ -1144,6 +1128,7 @@ static qboolean Delta_WriteField( sizebuf_t *msg, delta_t *pField, void *from, v int signbit = FBitSet( pField->flags, DT_SIGNED ) ? 1 : 0; float flValue, flAngle; uint iValue; + int dt; const char *pStr; if( Delta_CompareField( pField, from, to, timebase )) @@ -1210,19 +1195,17 @@ static qboolean Delta_WriteField( sizebuf_t *msg, delta_t *pField, void *from, v } else if( pField->flags & DT_TIMEWINDOW_8 ) { - signbit = 1; // timewindow is always signed flValue = *(float *)((byte *)to + pField->offset ); - iValue = (int)Q_rint( timebase * 100.0 ) - (int)Q_rint( flValue * 100.0 ); - iValue = Delta_ClampIntegerField( pField, iValue, signbit, pField->bits ); - MSG_WriteBitLong( msg, iValue, pField->bits, signbit ); + dt = Q_rint(( timebase - flValue ) * 100.0 ); + dt = Delta_ClampIntegerField( pField, dt, 1, pField->bits ); + MSG_WriteSBitLong( msg, dt, pField->bits ); } else if( pField->flags & DT_TIMEWINDOW_BIG ) { - signbit = 1; // timewindow is always signed flValue = *(float *)((byte *)to + pField->offset ); - iValue = (int)Q_rint( timebase * pField->multiplier ) - (int)Q_rint( flValue * pField->multiplier ); - iValue = Delta_ClampIntegerField( pField, iValue, signbit, pField->bits ); - MSG_WriteBitLong( msg, iValue, pField->bits, signbit ); + dt = Q_rint(( timebase - flValue ) * pField->multiplier ); + dt = Delta_ClampIntegerField( pField, dt, 1, pField->bits ); + MSG_WriteSBitLong( msg, dt, pField->bits ); } else if( pField->flags & DT_STRING ) {