sgdk
maths.h File Reference

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]

Detailed Description

Mathematical methods.

Author:
Stephane Dallongeville
Date:
08/2011

This unit provides basic maths methods.
You can find a tutorial about how use maths with SGDK here.


Define Documentation

#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);


Function Documentation

u32 distance_approx ( s32  dx,
s32  dy 
)
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.

Parameters:
op1first operand - dividende (32 bit)
op2second operand - divisor (16 bit)
Returns:
16 bit (signed) result of the division in low 16 bit (0-15) and 16 bit (signed) result of the modulo operation in high 16 bit (16-31)
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.

Parameters:
op1first operand - dividende (32 bit)
op2second operand - divisor (16 bit)
Returns:
16 bit (unsigned) result of the division in low 16 bit (0-15) and 16 bit (unsigned) result of the modulo operation in high 16 bit (16-31)
s16 divs ( s32  op1,
s16  op2 
)

Direct divs instruction (signed 32/16=16:16) access using inline assembly to process op1/op2 operation.

Parameters:
op1first operand (32 bit)
op2second operand (16 bit)
Returns:
16 bit (signed) result of the division
u16 divu ( u32  op1,
u16  op2 
)

Direct divu instruction (unsigned 32/16=16:16) access using inline assembly to process op1/op2 operation.

Parameters:
op1first operand - dividende (32 bit)
op2second operand - divisor (16 bit)
Returns:
16 bit (unsigned) result of the division
u32 getApproximatedDistance ( s32  dx,
s32  dy 
)

Return euclidean distance approximation for specified vector.
The returned distance is not 100% perfect but calculation is fast.

Parameters:
dxdelta X.
dydelta Y.
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)

Parameters:
value16.16 fixed point value to return log2 of
u16 getLog2Int ( u32  value)

Return integer log2 of specified 32 bits unsigned value. Ex:
getLog2Int(1024) = 10
getLog2Int(12345) = 13

Parameters:
valuevalue to return log2 of
u32 getNextPow2 ( u32  value)

Return next pow2 value which is greater than specified 32 bits unsigned value. Ex:
getNextPow2(700) = 1024
getNextPow2(18) = 32

Parameters:
valuevalue to return next pow2
u32 intToBCD ( u32  value)

Binary to Decimal conversion.

Parameters:
valueValue to convert.
s16 mods ( s32  op1,
s16  op2 
)

Direct divs instruction (signed 32/16=16:16) access using inline assembly.

Parameters:
op1first operand (32 bit)
op2second operand (16 bit)
Returns:
16 bit (signed) modulo result of the division
u16 modu ( u32  op1,
u16  op2 
)

Direct divu instruction (unsigned 32/16=16:16) access using inline assembly.

Parameters:
op1first operand (32 bit)
op2second operand (16 bit)
Returns:
16 bit (unsigned) modulo result of the division
s32 muls ( s16  op1,
s16  op2 
)

16x16=32 signed multiplication. Force GCC to use proper 68000 muls instruction.

Parameters:
op1first operand
op2second operand
Returns:
32 bit (signed) result of multiply
u32 mulu ( u16  op1,
u16  op2 
)

16x16=32 unsigned multiplication. Force GCC to use proper 68000 mulu instruction.

Parameters:
op1first operand
op2second operand
Returns:
32 bit (unsigned) result of multiply
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Defines