sgdk
|
Mathematical methods. More...
Go to the source code of this file.
Classes | |
struct | Vect2D_u16 |
2D Vector structure - u16 type. More... | |
struct | Vect2D_s16 |
2D Vector structure - s16 type. More... | |
struct | Vect2D_u32 |
2D Vector structure - u32 type. More... | |
struct | Vect2D_s32 |
2D Vector structure - s32 type. More... | |
struct | Vect2D_f16 |
2D Vector structure - f16 (fix16) type. More... | |
struct | Vect2D_f32 |
2D Vector structure - f32 (fix32) type. More... | |
struct | Mat2D_f16 |
2x2 Matrice structure - f16 (fix16) type. Internally uses 2 2D vectors. More... | |
struct | Mat2D_f32 |
2x2 Matrice structure - f32 (fix32) type. Internally uses 2 2D vectors. More... | |
struct | Vect3D_u16 |
3D Vector structure - u16 type. More... | |
struct | Vect3D_s16 |
3D Vector structure - s16 type. More... | |
struct | Vect3D_u32 |
3D Vector structure - u32 type. More... | |
struct | Vect3D_s32 |
3D Vector structure - s32 type. More... | |
struct | Vect3D_f16 |
3D Vector structure - f16 (fix16) type. More... | |
struct | Vect3D_f32 |
3D Vector structure - f32 (fix32) type. More... | |
struct | Mat3D_f16 |
3x3 Matrice structure - f16 (fix16) type. Internally uses 3 3D vectors. More... | |
struct | Mat3D_f32 |
3x3 Matrice structure - f32 (fix32) type. Internally uses 3 3D vectors. More... | |
struct | Vect4D_f16 |
4D Vector structure - f16 (fix16) type. More... | |
struct | Vect4D_f32 |
4D Vector structure - f32 (fix32) type. More... | |
struct | Mat4D_f16 |
4x4 Matrice structure - f16 (fix16) type. Internally uses 4 4D vectors. More... | |
struct | Mat4D_f32 |
4x4 Matrice structure - f32 (fix32) type. Internally uses 4 4D vectors. More... | |
Defines | |
#define | min(X, Y) (((X) < (Y))?(X):(Y)) |
Returns the lowest value between X an Y. | |
#define | max(X, Y) (((X) > (Y))?(X):(Y)) |
Returns the highest value between X an Y. | |
#define | clamp(X, L, H) (min(max((X), (L)), (H))) |
Returns L if X is less than L, H if X is greater than H or X if in between L and H. | |
#define | abs(X) (((X) < 0)?-(X):(X)) |
Returns the absolute value of X. | |
#define | PI 3.14159265358979323846 |
PI number (3,1415..) | |
#define | FIX32_INT_BITS 22 |
#define | FIX32_FRAC_BITS (32 - FIX32_INT_BITS) |
#define | FIX32_INT_MASK (((1 << FIX32_INT_BITS) - 1) << FIX32_FRAC_BITS) |
#define | FIX32_FRAC_MASK ((1 << FIX32_FRAC_BITS) - 1) |
#define | FIX32(value) ((fix32) ((value) * (1 << FIX32_FRAC_BITS))) |
Convert specified value to fix32. | |
#define | intToFix32(value) ((fix32) ((value) << FIX32_FRAC_BITS)) |
Convert integer to fix32. | |
#define | fix32ToInt(value) ((s32) ((value) >> FIX32_FRAC_BITS)) |
Convert fix32 to integer. | |
#define | fix32Round(value) ((fix32Frac(value) > FIX32(0.5))?fix32Int(value + FIX32(1)) + 1:fix32Int(value)) |
Round the specified value to nearest integer (fix32). | |
#define | fix32ToRoundedInt(value) ((fix32Frac(value) > FIX32(0.5))?fix32ToInt(value) + 1:fix32ToInt(value)) |
Round and convert the specified fix32 value to integer. | |
#define | fix32Frac(value) ((value) & FIX32_FRAC_MASK) |
Return fractional part of the specified value (fix32). | |
#define | fix32Int(value) ((value) & FIX32_INT_MASK) |
Return integer part of the specified value (fix32). | |
#define | fix32Add(val1, val2) ((val1) + (val2)) |
Compute and return the result of the addition of val1 and val2 (fix32). | |
#define | fix32Sub(val1, val2) ((val1) - (val2)) |
Compute and return the result of the substraction of val2 from val1 (fix32). | |
#define | fix32Neg(value) (0 - (value)) |
Return negate of specified value (fix32). | |
#define | fix32Mul(val1, val2) (((val1) >> (FIX32_FRAC_BITS / 2)) * ((val2) >> (FIX32_FRAC_BITS / 2))) |
Compute and return the result of the multiplication of val1 and val2 (fix32). WARNING: result can easily overflow so its recommended to stick with fix16 type for mul and div operations. | |
#define | fix32Div(val1, val2) (((val1) << (FIX32_FRAC_BITS / 2)) / ((val2) >> (FIX32_FRAC_BITS / 2))) |
Compute and return the result of the division of val1 by val2 (fix32). WARNING: result can easily overflow so its recommended to stick with fix16 type for mul and div operations. | |
#define | fix32Avg(val1, val2) (((val1) + (val2)) >> 1) |
Compute and return the result of the average of val1 by val2 (fix32). | |
#define | FIX16_INT_BITS 10 |
#define | FIX16_FRAC_BITS (16 - FIX16_INT_BITS) |
#define | FIX16_INT_MASK (((1 << FIX16_INT_BITS) - 1) << FIX16_FRAC_BITS) |
#define | FIX16_FRAC_MASK ((1 << FIX16_FRAC_BITS) - 1) |
#define | FIX16(value) ((fix16) ((value) * (1 << FIX16_FRAC_BITS))) |
Convert specified value to fix16. | |
#define | intToFix16(value) ((fix16) ((value) << FIX16_FRAC_BITS)) |
Convert integer to fix16. | |
#define | fix16ToInt(value) ((s16) ((value) >> FIX16_FRAC_BITS)) |
Convert fix16 to integer. | |
#define | fix16Round(value) ((fix16Frac(value) > FIX16(0.5))?fix16Int(value + FIX16(1)) + 1:fix16Int(value)) |
Round the specified value to nearest integer (fix16). | |
#define | fix16ToRoundedInt(value) ((fix16Frac(value) > FIX16(0.5))?fix16ToInt(value) + 1:fix16ToInt(value)) |
Round and convert the specified fix16 value to integer. | |
#define | fix16Frac(value) ((value) & FIX16_FRAC_MASK) |
Return fractional part of the specified value (fix16). | |
#define | fix16Int(value) ((value) & FIX16_INT_MASK) |
Return integer part of the specified value (fix16). | |
#define | fix16Add(val1, val2) ((val1) + (val2)) |
Compute and return the result of the addition of val1 and val2 (fix16). | |
#define | fix16Sub(val1, val2) ((val1) - (val2)) |
Compute and return the result of the substraction of val2 from val1 (fix16). | |
#define | fix16Neg(value) (0 - (value)) |
Return negate of specified value (fix16). | |
#define | fix16Mul(val1, val2) (muls(val1, val2) >> FIX16_FRAC_BITS) |
Compute and return the result of the multiplication of val1 and val2 (fix16). | |
#define | fix16Div(val1, val2) (divs(val1 << FIX16_FRAC_BITS, val2)) |
Compute and return the result of the division of val1 by val2 (fix16). | |
#define | fix16Avg(val1, val2) (((val1) + (val2)) >> 1) |
Compute and return the result of the average of val1 by val2 (fix16). | |
#define | fix16Log2(v) log2tab16[v] |
Compute and return the result of the Log2 of specified value (fix16). | |
#define | fix16Log10(v) log10tab16[v] |
Compute and return the result of the Log10 of specified value (fix16). | |
#define | fix16Sqrt(v) sqrttab16[v] |
Compute and return the result of the root square of specified value (fix16). | |
#define | fix32ToFix16(value) (((value) << FIX16_FRAC_BITS) >> FIX32_FRAC_BITS) |
Convert specified fix32 value to fix16. | |
#define | fix16ToFix32(value) (((value) << FIX32_FRAC_BITS) >> FIX16_FRAC_BITS) |
Convert specified fix16 value to fix32. | |
#define | sinFix32(value) sintab32[(value) & 1023] |
Compute sinus of specified value and return it as fix32. The input value is an integer defined as [0..1024] range corresponding to radian [0..2PI] range. | |
#define | cosFix32(value) sintab32[((value) + 256) & 1023] |
Compute cosinus of specified value and return it as fix32. The input value is an integer defined as [0..1024] range corresponding to radian [0..2PI] range. | |
#define | sinFix16(value) sintab16[(value) & 1023] |
Compute sinus of specified value and return it as fix16. The input value is an integer defined as [0..1024] range corresponding to radian [0..2PI] range. | |
#define | cosFix16(value) sintab16[((value) + 256) & 1023] |
Compute cosinus of specified value and return it as fix16. The input value is an integer defined as [0..1024] range corresponding to radian [0..2PI] range. | |
Typedefs | |
typedef Vect2D_u16 | V2u16 |
alias for Vect2D_u16 | |
typedef Vect2D_s16 | V2s16 |
alias for Vect2D_s16 | |
typedef Vect2D_u32 | V2u32 |
alias for Vect2D_u32 | |
typedef Vect2D_s32 | V2s32 |
alias for Vect2D_s32 | |
typedef Vect2D_f16 | V2f16 |
alias for Vect2D_f16 | |
typedef Vect2D_f32 | V2f32 |
alias for Vect2D_f32 | |
typedef Vect3D_u16 | V3u16 |
alias for Vect3D_u16 | |
typedef Vect3D_s16 | V3s16 |
alias for Vect3D_s16 | |
typedef Vect3D_u32 | V3u32 |
alias for Vect3D_u32 | |
typedef Vect3D_s32 | V3s32 |
alias for Vect3D_s32 | |
typedef Vect3D_f16 | V3f16 |
alias for Vect3D_f16 | |
typedef Vect3D_f32 | V3f32 |
alias for Vect3D_f32 | |
typedef Vect4D_f16 | V4f16 |
alias for Vect4D_f16 | |
typedef Vect4D_f32 | V4f32 |
alias for Vect4D_f32 | |
typedef Mat2D_f16 | M2f16 |
alias for Mat2D_f16 | |
typedef Mat2D_f32 | M2f32 |
alias for Mat2D_f32 | |
typedef Mat3D_f16 | M3f16 |
alias for Mat3D_f16 | |
typedef Mat3D_f32 | M3f32 |
alias for Mat3D_f32 | |
typedef Mat4D_f16 | M4f16 |
alias for Mat4D_f16 | |
typedef Mat4D_f32 | M4f32 |
alias for Mat4D_f32 | |
Functions | |
u32 | mulu (u16 op1, u16 op2) |
16x16=32 unsigned multiplication. Force GCC to use proper 68000 mulu instruction. | |
s32 | muls (s16 op1, s16 op2) |
16x16=32 signed multiplication. Force GCC to use proper 68000 muls instruction. | |
u16 | divu (u32 op1, u16 op2) |
Direct divu instruction (unsigned 32/16=16:16) access using inline assembly to process op1/op2 operation. | |
s16 | divs (s32 op1, s16 op2) |
Direct divs instruction (signed 32/16=16:16) access using inline assembly to process op1/op2 operation. | |
u16 | modu (u32 op1, u16 op2) |
Direct divu instruction (unsigned 32/16=16:16) access using inline assembly. | |
s16 | mods (s32 op1, s16 op2) |
Direct divs instruction (signed 32/16=16:16) access using inline assembly. | |
u32 | divmodu (u32 op1, u16 op2) |
Direct divu instruction (unsigned 32/16=16:16) access using inline assembly to process op1/op2 operation and op1op2 at same time. | |
s32 | divmods (s32 op1, s16 op2) |
Direct divs instruction (signed 32/16=16:16) access using inline assembly to process op1/op2 operation and op1op2 at same time. | |
u32 | intToBCD (u32 value) |
Binary to Decimal conversion. | |
u32 | distance_approx (s32 dx, s32 dy) |
u32 | getApproximatedDistance (s32 dx, s32 dy) |
Return euclidean distance approximation for specified vector. The returned distance is not 100% perfect but calculation is fast. | |
s32 | getApproximatedLog2 (s32 value) |
Return 16.16 fixed point *approximation* of log2 of the specified 16.16 fixed point value. Ex: getLog2(1 << 16) = 0 getLog2(12345 << 16) = ~9.5 (real value = ~13.6) | |
u16 | getLog2Int (u32 value) |
Return integer log2 of specified 32 bits unsigned value. Ex: getLog2Int(1024) = 10 getLog2Int(12345) = 13 | |
u32 | getNextPow2 (u32 value) |
Return next pow2 value which is greater than specified 32 bits unsigned value. Ex: getNextPow2(700) = 1024 getNextPow2(18) = 32 | |
Variables | |
const fix32 | sintab32 [1024] |
const fix16 | sintab16 [1024] |
const fix16 | log2tab16 [0x10000] |
const fix16 | log10tab16 [0x10000] |
const fix16 | sqrttab16 [0x10000] |
Mathematical methods.
This unit provides basic maths methods.
You can find a tutorial about how use maths with SGDK here.
#define FIX16 | ( | value | ) | ((fix16) ((value) * (1 << FIX16_FRAC_BITS))) |
Convert specified value to fix16.
EX:
f16 v = FIX16(-27.12);
#define FIX32 | ( | value | ) | ((fix32) ((value) * (1 << FIX32_FRAC_BITS))) |
Convert specified value to fix32.
EX:
f32 v = FIX32(34.567);
Direct divs instruction (signed 32/16=16:16) access using inline assembly to process op1/op2 operation and op1op2 at same time.
op1 | first operand - dividende (32 bit) |
op2 | second operand - divisor (16 bit) |
Direct divu instruction (unsigned 32/16=16:16) access using inline assembly to process op1/op2 operation and op1op2 at same time.
op1 | first operand - dividende (32 bit) |
op2 | second operand - divisor (16 bit) |
Direct divs instruction (signed 32/16=16:16) access using inline assembly to process op1/op2 operation.
op1 | first operand (32 bit) |
op2 | second operand (16 bit) |
Direct divu instruction (unsigned 32/16=16:16) access using inline assembly to process op1/op2 operation.
op1 | first operand - dividende (32 bit) |
op2 | second operand - divisor (16 bit) |
Return euclidean distance approximation for specified vector.
The returned distance is not 100% perfect but calculation is fast.
dx | delta X. |
dy | delta Y. |
Return 16.16 fixed point *approximation* of log2 of the specified 16.16 fixed point value. Ex:
getLog2(1 << 16) = 0
getLog2(12345 << 16) = ~9.5 (real value = ~13.6)
value | 16.16 fixed point value to return log2 of |
Return integer log2 of specified 32 bits unsigned value. Ex:
getLog2Int(1024) = 10
getLog2Int(12345) = 13
value | value to return log2 of |
Return next pow2 value which is greater than specified 32 bits unsigned value. Ex:
getNextPow2(700) = 1024
getNextPow2(18) = 32
value | value to return next pow2 |
Direct divs instruction (signed 32/16=16:16) access using inline assembly.
op1 | first operand (32 bit) |
op2 | second operand (16 bit) |
Direct divu instruction (unsigned 32/16=16:16) access using inline assembly.
op1 | first operand (32 bit) |
op2 | second operand (16 bit) |
16x16=32 signed multiplication. Force GCC to use proper 68000 muls instruction.
op1 | first operand |
op2 | second operand |