-
Notifications
You must be signed in to change notification settings - Fork 2
/
BitReader.Float.Extensions.cs
77 lines (64 loc) · 2.13 KB
/
BitReader.Float.Extensions.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
using System.Runtime.CompilerServices;
using NetCode.Limits;
namespace NetCode;
public static class BitReaderFloatExtensions
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static float ReadFloat(this BitReader reader)
{
#if NETSTANDARD2_0
return BitConverterNetstandard20.Int32BitsToSingle(reader.ReadInt());
#else
return BitConverter.Int32BitsToSingle(reader.ReadInt());
#endif
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static float ReadFloat(this BitReader reader, float min, float max, float precision)
{
var result = reader.ReadFloat(new FloatLimit(min, max, precision));
return result;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static float ReadFloat(this BitReader reader, FloatLimit limit)
{
uint integerValue = reader.ReadBits(limit.BitCount);
float normalizedValue = integerValue / (float)limit.MaxIntegerValue;
return normalizedValue * limit.Delta + limit.Min;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static float ReadFloat(this BitReader reader, float baseline)
{
var isChanged = reader.ReadBool();
if (isChanged)
{
return reader.ReadFloat();
}
return baseline;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static float ReadFloat(this BitReader reader, float baseline, FloatLimit limit)
{
var isChanged = reader.ReadBool();
if (isChanged)
{
return reader.ReadFloat(limit);
}
return baseline;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static float ReadFloat(this BitReader reader, float baseline, FloatLimit limit, FloatLimit diffLimit)
{
var isChanged = reader.ReadBool();
if (isChanged)
{
var isDiff = reader.ReadBool();
if (isDiff)
{
var diff = reader.ReadFloat(diffLimit);
return baseline + diff;
}
return reader.ReadFloat(limit);
}
return baseline;
}
}