A game about forced loneliness, made by TACStudios
at master 97 lines 3.7 kB view raw
1using System; 2using System.Runtime.CompilerServices; 3 4namespace UnityEngine.InputSystem.Utilities 5{ 6 internal static class NumberHelpers 7 { 8 [MethodImpl(MethodImplOptions.AggressiveInlining)] 9 public static int AlignToMultipleOf(this int number, int alignment) 10 { 11 var remainder = number % alignment; 12 if (remainder == 0) 13 return number; 14 15 return number + alignment - remainder; 16 } 17 18 [MethodImpl(MethodImplOptions.AggressiveInlining)] 19 public static long AlignToMultipleOf(this long number, long alignment) 20 { 21 var remainder = number % alignment; 22 if (remainder == 0) 23 return number; 24 25 return number + alignment - remainder; 26 } 27 28 [MethodImpl(MethodImplOptions.AggressiveInlining)] 29 public static uint AlignToMultipleOf(this uint number, uint alignment) 30 { 31 var remainder = number % alignment; 32 if (remainder == 0) 33 return number; 34 35 return number + alignment - remainder; 36 } 37 38 [MethodImpl(MethodImplOptions.AggressiveInlining)] 39 public static bool Approximately(double a, double b) 40 { 41 return Math.Abs(b - a) < Math.Max(1E-06 * Math.Max(Math.Abs(a), Math.Abs(b)), double.Epsilon * 8); 42 } 43 44 [MethodImpl(MethodImplOptions.AggressiveInlining)] 45 public static float IntToNormalizedFloat(int value, int minValue, int maxValue) 46 { 47 if (value <= minValue) 48 return 0.0f; 49 if (value >= maxValue) 50 return 1.0f; 51 // using double here because int.MaxValue is not representable in floats 52 // as int.MaxValue = 2147483647 will become 2147483648.0 when casted to a float 53 return (float)(((double)value - minValue) / ((double)maxValue - minValue)); 54 } 55 56 [MethodImpl(MethodImplOptions.AggressiveInlining)] 57 public static int NormalizedFloatToInt(float value, int intMinValue, int intMaxValue) 58 { 59 if (value <= 0.0f) 60 return intMinValue; 61 if (value >= 1.0f) 62 return intMaxValue; 63 return (int)(value * ((double)intMaxValue - intMinValue) + intMinValue); 64 } 65 66 [MethodImpl(MethodImplOptions.AggressiveInlining)] 67 public static float UIntToNormalizedFloat(uint value, uint minValue, uint maxValue) 68 { 69 if (value <= minValue) 70 return 0.0f; 71 if (value >= maxValue) 72 return 1.0f; 73 // using double here because uint.MaxValue is not representable in floats 74 return (float)(((double)value - minValue) / ((double)maxValue - minValue)); 75 } 76 77 [MethodImpl(MethodImplOptions.AggressiveInlining)] 78 public static uint NormalizedFloatToUInt(float value, uint uintMinValue, uint uintMaxValue) 79 { 80 if (value <= 0.0f) 81 return uintMinValue; 82 if (value >= 1.0f) 83 return uintMaxValue; 84 return (uint)(value * ((double)uintMaxValue - uintMinValue) + uintMinValue); 85 } 86 87 [MethodImpl(MethodImplOptions.AggressiveInlining)] 88 public static uint RemapUIntBitsToNormalizeFloatToUIntBits(uint value, uint inBitSize, uint outBitSize) 89 { 90 var inMaxValue = (uint)((1UL << (int)inBitSize) - 1); 91 var outMaxValue = (uint)((1UL << (int)outBitSize) - 1); 92 93 var normFloat = UIntToNormalizedFloat(value, 0, inMaxValue); 94 return NormalizedFloatToUInt(normFloat, 0, outMaxValue); 95 } 96 } 97}