diff --git a/Assets/FishNet/Runtime/Serializing/Helping/Quaternion32Compression.cs b/Assets/FishNet/Runtime/Serializing/Helping/Quaternion32Compression.cs index 341ec9a0..86bbae7d 100644 --- a/Assets/FishNet/Runtime/Serializing/Helping/Quaternion32Compression.cs +++ b/Assets/FishNet/Runtime/Serializing/Helping/Quaternion32Compression.cs @@ -118,11 +118,9 @@ private static uint ScaleToUint(float v) private static float ScaleToFloat(uint v) { - float unscaled = v * Maximum / IntScale; - - if (unscaled > Maximum) - unscaled -= Maximum * 2; - return unscaled; + // Values above IntScale are two's-complement negatives produced by ScaleToUint's mask. + int signed = v > IntScale ? (int)v - (IntMask + 1) : (int)v; + return signed * Maximum / IntScale; } /// diff --git a/Assets/FishNet/Runtime/Serializing/Helping/Quaternion64Compression.cs b/Assets/FishNet/Runtime/Serializing/Helping/Quaternion64Compression.cs index c29a0cd4..70113f56 100644 --- a/Assets/FishNet/Runtime/Serializing/Helping/Quaternion64Compression.cs +++ b/Assets/FishNet/Runtime/Serializing/Helping/Quaternion64Compression.cs @@ -111,20 +111,16 @@ private static ulong ScaleToUint_L(float v) private static float ScaleToFloat_H(ulong v) { - float unscaled = v * Maximum / IntScale_H; - - if (unscaled > Maximum) - unscaled -= Maximum * 2; - return unscaled; + // Values above IntScale are two's-complement negatives produced by ScaleToUint's mask. + long signed = v > IntScale_H ? (long)v - (IntMask_H + 1) : (long)v; + return signed * Maximum / IntScale_H; } private static float ScaleToFloat_L(ulong v) { - float unscaled = v * Maximum / IntScale_L; - - if (unscaled > Maximum) - unscaled -= Maximum * 2; - return unscaled; + // Values above IntScale are two's-complement negatives produced by ScaleToUint's mask. + long signed = v > IntScale_L ? (long)v - (IntMask_L + 1) : (long)v; + return signed * Maximum / IntScale_L; } public static Quaternion Decompress(ulong compressed)