diff --git a/public/xash3d_mathlib.h b/public/xash3d_mathlib.h index 55fe77ed..85cbdb37 100644 --- a/public/xash3d_mathlib.h +++ b/public/xash3d_mathlib.h @@ -22,6 +22,8 @@ GNU General Public License for more details. #endif #include "build.h" +#include "xash3d_types.h" +#include "const.h" #include "com_model.h" #include "studio.h" @@ -135,6 +137,42 @@ GNU General Public License for more details. #define PlaneDiff(point,plane) (((plane)->type < 3 ? (point)[(plane)->type] : DotProduct((point), (plane)->normal)) - (plane)->dist) #define bound( min, num, max ) ((num) >= (min) ? ((num) < (max) ? (num) : (max)) : (min)) +// horrible cast but helps not breaking strict aliasing in mathlib +// as union type punning should be fine in C but not in C++ +// so don't carry over this to C++ code +typedef union +{ + float fl; + uint32_t u; + int32_t i; +} float_bits_t; + +static inline uint32_t FloatAsUint( float v ) +{ + float_bits_t bits = { v }; + return bits.u; +} + +static inline int32_t FloatAsInt( float v ) +{ + float_bits_t bits = { v }; + return bits.i; +} + +static inline float IntAsFloat( int32_t i ) +{ + float_bits_t bits; + bits.i = i; + return bits.fl; +} + +static inline float UintAsFloat( uint32_t u ) +{ + float_bits_t bits; + bits.u = u; + return bits.fl; +} + float rsqrt( float number ); float anglemod( float a ); word FloatToHalf( float v );