// UnrealFixedPoint Copyright Kevin Poretti #pragma once #include "CoreMinimal.h" #include "Fixed.generated.h" /** * */ USTRUCT(BlueprintType) struct UNREALFIXEDPOINT_API FFixed { GENERATED_BODY() public: // 48 bits for the whole portion, 16 bits for the fractional portion static constexpr uint8 DecimalBitPosition = 16; FFixed() : Data(0) { } // int types <> FFixed conversions FORCEINLINE FFixed(int64 A) { Data = A << DecimalBitPosition; } FORCEINLINE operator int64() const { return Data >> DecimalBitPosition; } /* int8 int16 FORCEINLINE operator uint8() */ // floating point types <> FFixed conversions FORCEINLINE FFixed(float A) { Data = static_cast(A * (1 << DecimalBitPosition) + (A >= 0 ? 0.5 : -0.5)); } FORCEINLINE operator float() const { return static_cast(Data) / (1 << DecimalBitPosition); } FORCEINLINE FFixed(double A) { Data = static_cast(A * (1 << DecimalBitPosition) + (A >= 0 ? 0.5 : -0.5)); } FORCEINLINE operator double() const { return static_cast(Data) / (1 << DecimalBitPosition); } // Arithmetic FFixed operator+(const FFixed& Other) const { return Data + Other.Data; } FFixed operator+=(const FFixed& Other) { Data += Other.Data; return Data; } FFixed operator-(const FFixed& Other) const { return Data - Other.Data; } FFixed operator-=(const FFixed& Other) { Data -= Other.Data; return Data; } // Other overloads FFixed operator=(const FFixed& Other) { Data = Other.Data; return Data; } FFixed operator-() const { return -Data; } private: int64 Data; }; namespace FFixedMath { }