mirror of
https://github.com/Mauler125/r5sdk.git
synced 2025-02-09 19:15:03 +01:00
75 lines
1.2 KiB
C++
75 lines
1.2 KiB
C++
|
#include "stdafx.h"
|
||
|
#include "Half.h"
|
||
|
|
||
|
namespace Math
|
||
|
{
|
||
|
Half::Half()
|
||
|
: Half(0.0f)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
Half::Half(float Value)
|
||
|
{
|
||
|
FloatBits v, s;
|
||
|
v.f = Value;
|
||
|
|
||
|
uint32_t sign = v.si & signN;
|
||
|
v.si ^= sign;
|
||
|
|
||
|
sign >>= shiftSign;
|
||
|
s.si = mulN;
|
||
|
|
||
|
s.si = (int32_t)(s.f * v.f);
|
||
|
v.si ^= (s.si ^ v.si) & -(minN > v.si);
|
||
|
v.si ^= (infN ^ v.si) & -((infN > v.si) & (v.si > maxN));
|
||
|
v.si ^= (nanN ^ v.si) & -((nanN > v.si) & (v.si > infN));
|
||
|
|
||
|
v.ui >>= shift;
|
||
|
v.si ^= ((v.si - maxD) ^ v.si) & -(v.si > maxC);
|
||
|
v.si ^= ((v.si - minD) ^ v.si) & -(v.si > subC);
|
||
|
|
||
|
this->Value = (v.ui | sign);
|
||
|
}
|
||
|
|
||
|
Half::Half(uint16_t Value)
|
||
|
: Value(Value)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
float Half::ToFloat()
|
||
|
{
|
||
|
FloatBits v, s;
|
||
|
v.ui = this->Value;
|
||
|
|
||
|
int32_t sign = v.si & signC;
|
||
|
v.si ^= sign;
|
||
|
sign <<= shiftSign;
|
||
|
v.si ^= ((v.si + minD) ^ v.si) & -(v.si > subC);
|
||
|
v.si ^= ((v.si + maxD) ^ v.si) & -(v.si > maxC);
|
||
|
|
||
|
s.si = mulC;
|
||
|
s.f *= v.si;
|
||
|
int32_t mask = -(norC > v.si);
|
||
|
v.si <<= shift;
|
||
|
v.si ^= (s.si ^ v.si) & mask;
|
||
|
v.si |= sign;
|
||
|
|
||
|
return v.f;
|
||
|
}
|
||
|
|
||
|
uint16_t Half::ToHalf()
|
||
|
{
|
||
|
return this->Value;
|
||
|
}
|
||
|
|
||
|
uint16_t Half::ToHalf(float Value)
|
||
|
{
|
||
|
return Half(Value).ToHalf();
|
||
|
}
|
||
|
|
||
|
float Half::ToFloat(uint16_t Value)
|
||
|
{
|
||
|
return Half(Value).ToFloat();
|
||
|
}
|
||
|
}
|