Conversions, assignment, and addition/subtraction
This commit is contained in:
parent
1b9a3b684f
commit
ef5545f5bd
@ -18,6 +18,15 @@ This library aims to closely match the interface and functionality of the existi
|
||||
- [ ] Fixed point version of FRotator
|
||||
- [ ] FFixedRotator class implementation
|
||||
- [ ] Corresponding FMath and UKismetMathLibrary utility functions
|
||||
- [ ] Blueprints
|
||||
- [ ] Expose fixed arithmatic as pure Blueprint nodes
|
||||
- [ ] Ability to edit fixed nums with float sliders/input fields
|
||||
- [ ] Automatically do float <> fixed conversion when tweaking fixed point numbers in the editor
|
||||
- [ ] Plugin config
|
||||
- [ ] Configure how fixed nums are shown in editor when exposed as UPROPERTY (as floats only, as float and underlying int, as underlying int only)
|
||||
- [ ] Handling errors and edge cases
|
||||
- [ ] Overflow
|
||||
- [ ] Infinity
|
||||
|
||||
### What is fixed point math?
|
||||
|
||||
|
3
Source/UnrealFixedPoint/Private/Fixed.cpp
Normal file
3
Source/UnrealFixedPoint/Private/Fixed.cpp
Normal file
@ -0,0 +1,3 @@
|
||||
// UnrealFixedPoint Copyright Kevin Poretti
|
||||
|
||||
#include "Fixed.h"
|
57
Source/UnrealFixedPoint/Public/Fixed.h
Normal file
57
Source/UnrealFixedPoint/Public/Fixed.h
Normal file
@ -0,0 +1,57 @@
|
||||
// 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<int64>(A * (1 << DecimalBitPosition) + (A >= 0 ? 0.5 : -0.5)); }
|
||||
FORCEINLINE operator float() const { return static_cast<float>(Data) / (1 << DecimalBitPosition); }
|
||||
|
||||
FORCEINLINE FFixed(double A) { Data = static_cast<int64>(A * (1 << DecimalBitPosition) + (A >= 0 ? 0.5 : -0.5)); }
|
||||
FORCEINLINE operator double() const { return static_cast<double>(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
|
||||
{
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user