citro3d
|
Implementations of matrix, vector, and quaternion operations. More...
Data Structures | |
struct | C3D_FVec |
Float vector. More... | |
struct | C3D_Mtx |
Row-major 4x4 matrix. More... | |
Macros | |
#define | M_TAU (6.28318530717958647692528676655900576) |
#define | M_PI (M_TAU/2) |
#define | C3D_Angle(_angle) ((_angle)*M_TAU) |
Convert an angle from revolutions to radians. More... | |
#define | C3D_AngleFromDegrees(_angle) ((_angle)*M_TAU/360.0f) |
Convert an angle from degrees to radians. More... | |
#define | C3D_AspectRatioTop (400.0f / 240.0f) |
Aspect ratio for 3DS top screen. | |
#define | C3D_AspectRatioBot (320.0f / 240.0f) |
Aspect ratio for 3DS bottom screen. | |
Typedefs | |
typedef C3D_FVec | C3D_FQuat |
Float quaternion. See C3D_FVec. | |
Vector Math | |
static C3D_FVec | FVec4_New (float x, float y, float z, float w) |
Create a new FVec4. More... | |
static C3D_FVec | FVec4_Add (C3D_FVec lhs, C3D_FVec rhs) |
Add two FVec4s. More... | |
static C3D_FVec | FVec4_Subtract (C3D_FVec lhs, C3D_FVec rhs) |
Subtract two FVec4s. More... | |
static C3D_FVec | FVec4_Negate (C3D_FVec v) |
Negate a FVec4. More... | |
static C3D_FVec | FVec4_Scale (C3D_FVec v, float s) |
Scale a FVec4. More... | |
static C3D_FVec | FVec4_PerspDivide (C3D_FVec v) |
Perspective divide. More... | |
static float | FVec4_Dot (C3D_FVec lhs, C3D_FVec rhs) |
Dot product of two FVec4s. More... | |
static float | FVec4_Magnitude (C3D_FVec v) |
Magnitude of a FVec4. More... | |
static C3D_FVec | FVec4_Normalize (C3D_FVec v) |
Normalize a FVec4. More... | |
static C3D_FVec | FVec3_New (float x, float y, float z) |
Create a new FVec3. More... | |
static float | FVec3_Dot (C3D_FVec lhs, C3D_FVec rhs) |
Dot product of two FVec3s. More... | |
static float | FVec3_Magnitude (C3D_FVec v) |
Magnitude of a FVec3. More... | |
static C3D_FVec | FVec3_Normalize (C3D_FVec v) |
Normalize a FVec3. More... | |
static C3D_FVec | FVec3_Add (C3D_FVec lhs, C3D_FVec rhs) |
Add two FVec3s. More... | |
static C3D_FVec | FVec3_Subtract (C3D_FVec lhs, C3D_FVec rhs) |
Subtract two FVec3s. More... | |
static float | FVec3_Distance (C3D_FVec lhs, C3D_FVec rhs) |
Distance between two 3D points. More... | |
static C3D_FVec | FVec3_Scale (C3D_FVec v, float s) |
Scale a FVec3. More... | |
static C3D_FVec | FVec3_Negate (C3D_FVec v) |
Negate a FVec3. More... | |
static C3D_FVec | FVec3_Cross (C3D_FVec lhs, C3D_FVec rhs) |
Cross product of two FVec3s. More... | |
Matrix Math | |
| |
static void | Mtx_Zeros (C3D_Mtx *out) |
Zero matrix. More... | |
static void | Mtx_Copy (C3D_Mtx *out, const C3D_Mtx *in) |
Copy a matrix. More... | |
static void | Mtx_Diagonal (C3D_Mtx *out, float x, float y, float z, float w) |
Creates a matrix with the diagonal using the given parameters. More... | |
static void | Mtx_Identity (C3D_Mtx *out) |
Identity matrix. More... | |
void | Mtx_Transpose (C3D_Mtx *out) |
Transposes the matrix. Row => Column, and vice versa. More... | |
static void | Mtx_Add (C3D_Mtx *out, const C3D_Mtx *lhs, const C3D_Mtx *rhs) |
Matrix addition. More... | |
static void | Mtx_Subtract (C3D_Mtx *out, const C3D_Mtx *lhs, const C3D_Mtx *rhs) |
Matrix subtraction. More... | |
void | Mtx_Multiply (C3D_Mtx *out, const C3D_Mtx *a, const C3D_Mtx *b) |
Multiply two matrices. More... | |
float | Mtx_Inverse (C3D_Mtx *out) |
Inverse a matrix. More... | |
C3D_FVec | Mtx_MultiplyFVec3 (const C3D_Mtx *mtx, C3D_FVec v) |
Multiply 3x3 matrix by a FVec3. More... | |
C3D_FVec | Mtx_MultiplyFVec4 (const C3D_Mtx *mtx, C3D_FVec v) |
Multiply 4x4 matrix by a FVec4. More... | |
static C3D_FVec | Mtx_MultiplyFVecH (const C3D_Mtx *mtx, C3D_FVec v) |
Multiply 4x3 matrix by a FVec3. More... | |
void | Mtx_FromQuat (C3D_Mtx *m, C3D_FQuat q) |
Get 4x4 matrix equivalent to Quaternion. More... | |
3D Transformation Matrix Math | |
| |
void | Mtx_Translate (C3D_Mtx *mtx, float x, float y, float z, bool bRightSide) |
3D translation More... | |
void | Mtx_Scale (C3D_Mtx *mtx, float x, float y, float z) |
3D Scale More... | |
void | Mtx_Rotate (C3D_Mtx *mtx, C3D_FVec axis, float angle, bool bRightSide) |
3D Rotation More... | |
void | Mtx_RotateX (C3D_Mtx *mtx, float angle, bool bRightSide) |
3D Rotation about the X axis More... | |
void | Mtx_RotateY (C3D_Mtx *mtx, float angle, bool bRightSide) |
3D Rotation about the Y axis More... | |
void | Mtx_RotateZ (C3D_Mtx *mtx, float angle, bool bRightSide) |
3D Rotation about the Z axis More... | |
3D Projection Matrix Math | |
void | Mtx_Ortho (C3D_Mtx *mtx, float left, float right, float bottom, float top, float near, float far, bool isLeftHanded) |
Orthogonal projection. More... | |
void | Mtx_Persp (C3D_Mtx *mtx, float fovy, float aspect, float near, float far, bool isLeftHanded) |
Perspective projection. More... | |
void | Mtx_PerspStereo (C3D_Mtx *mtx, float fovy, float aspect, float near, float far, float iod, float screen, bool isLeftHanded) |
Stereo perspective projection. More... | |
void | Mtx_OrthoTilt (C3D_Mtx *mtx, float left, float right, float bottom, float top, float near, float far, bool isLeftHanded) |
Orthogonal projection, tilted to account for the 3DS screen rotation. More... | |
void | Mtx_PerspTilt (C3D_Mtx *mtx, float fovy, float aspect, float near, float far, bool isLeftHanded) |
Perspective projection, tilted to account for the 3DS screen rotation. More... | |
void | Mtx_PerspStereoTilt (C3D_Mtx *mtx, float fovy, float aspect, float near, float far, float iod, float screen, bool isLeftHanded) |
Stereo perspective projection, tilted to account for the 3DS screen rotation. More... | |
void | Mtx_LookAt (C3D_Mtx *out, C3D_FVec cameraPosition, C3D_FVec cameraTarget, C3D_FVec cameraUpVector, bool isLeftHanded) |
Look-At matrix, based on DirectX implementation. More... | |
Quaternion Math | |
C3D_FQuat | Quat_Multiply (C3D_FQuat lhs, C3D_FQuat rhs) |
Multiply two Quaternions. More... | |
C3D_FQuat | Quat_Pow (C3D_FQuat q, float p) |
Raise Quaternion to a power. More... | |
C3D_FVec | Quat_CrossFVec3 (C3D_FQuat q, C3D_FVec v) |
Cross product of Quaternion and FVec3. More... | |
C3D_FQuat | Quat_Rotate (C3D_FQuat q, C3D_FVec axis, float r, bool bRightSide) |
3D Rotation More... | |
C3D_FQuat | Quat_RotateX (C3D_FQuat q, float r, bool bRightSide) |
3D Rotation about the X axis More... | |
C3D_FQuat | Quat_RotateY (C3D_FQuat q, float r, bool bRightSide) |
3D Rotation about the Y axis More... | |
C3D_FQuat | Quat_RotateZ (C3D_FQuat q, float r, bool bRightSide) |
3D Rotation about the Z axis More... | |
C3D_FQuat | Quat_FromMtx (const C3D_Mtx *m) |
Get Quaternion equivalent to 4x4 matrix. More... | |
static C3D_FQuat | Quat_Identity (void) |
Identity Quaternion. More... | |
static C3D_FQuat | Quat_Conjugate (C3D_FQuat q) |
Quaternion conjugate. More... | |
static C3D_FQuat | Quat_Inverse (C3D_FQuat q) |
Quaternion inverse. More... | |
static C3D_FVec | FVec3_CrossQuat (C3D_FVec v, C3D_FQuat q) |
Cross product of FVec3 and Quaternion. More... | |
C3D_FQuat | Quat_FromPitchYawRoll (float pitch, float yaw, float roll, bool bRightSide) |
Converting Pitch, Yaw, and Roll to Quaternion equivalent. More... | |
C3D_FQuat | Quat_LookAt (C3D_FVec source, C3D_FVec target, C3D_FVec forwardVector, C3D_FVec upVector) |
Quaternion Look-At. More... | |
C3D_FQuat | Quat_FromAxisAngle (C3D_FVec axis, float angle) |
Quaternion, created from a given axis and angle in radians. More... | |
#define | Quat_New(i, j, k, r) FVec4_New(i,j,k,r) |
Create a new Quaternion. More... | |
#define | Quat_Negate(q) FVec4_Negate(q) |
Negate a Quaternion. More... | |
#define | Quat_Add(lhs, rhs) FVec4_Add(lhs,rhs) |
Add two Quaternions. More... | |
#define | Quat_Subtract(lhs, rhs) FVec4_Subtract(lhs,rhs) |
Subtract two Quaternions. More... | |
#define | Quat_Scale(q, s) FVec4_Scale(q,s) |
Scale a Quaternion. More... | |
#define | Quat_Normalize(q) FVec4_Normalize(q) |
Normalize a Quaternion. More... | |
#define | Quat_Dot(lhs, rhs) FVec4_Dot(lhs,rhs) |
Dot product of two Quaternions. More... | |
Implementations of matrix, vector, and quaternion operations.
#define C3D_Angle | ( | _angle | ) | ((_angle)*M_TAU) |
Convert an angle from revolutions to radians.
[in] | _angle | Proportion of a full revolution |
#define C3D_AngleFromDegrees | ( | _angle | ) | ((_angle)*M_TAU/360.0f) |
Convert an angle from degrees to radians.
[in] | _angle | Angle in degrees |
#define M_TAU (6.28318530717958647692528676655900576) |
The one true circumference-to-radius ratio. See http://tauday.com/tau-manifesto
#define Quat_Add | ( | lhs, | |
rhs | |||
) | FVec4_Add(lhs,rhs) |
Add two Quaternions.
[in] | lhs | Augend |
[in] | rhs | Addend |
#define Quat_Dot | ( | lhs, | |
rhs | |||
) | FVec4_Dot(lhs,rhs) |
Dot product of two Quaternions.
[in] | lhs | Left-side Quaternion |
[in] | rhs | Right-side Quaternion |
#define Quat_Negate | ( | q | ) | FVec4_Negate(q) |
Negate a Quaternion.
Quat_Scale(v, -1)
[in] | q | Quaternion to negate |
#define Quat_New | ( | i, | |
j, | |||
k, | |||
r | |||
) | FVec4_New(i,j,k,r) |
Create a new Quaternion.
[in] | i | I-component |
[in] | j | J-component |
[in] | k | K-component |
[in] | r | Real component |
#define Quat_Normalize | ( | q | ) | FVec4_Normalize(q) |
Normalize a Quaternion.
[in] | q | Quaternion to normalize |
#define Quat_Scale | ( | q, | |
s | |||
) | FVec4_Scale(q,s) |
Scale a Quaternion.
[in] | q | Quaternion to scale |
[in] | s | Scale factor |
#define Quat_Subtract | ( | lhs, | |
rhs | |||
) | FVec4_Subtract(lhs,rhs) |
Subtract two Quaternions.
[in] | lhs | Minuend |
[in] | rhs | Subtrahend |
Add two FVec3s.
[in] | lhs | Augend |
[in] | rhs | Addend |
Cross product of two FVec3s.
[in] | lhs | Left-side FVec3 |
[in] | rhs | Right-side FVec3 |
Cross product of FVec3 and Quaternion.
[in] | v | Base FVec3 |
[in] | q | Quaternion to cross |
Distance between two 3D points.
[in] | lhs | Relative origin |
[in] | rhs | Relative point of interest |
Dot product of two FVec3s.
[in] | lhs | Left-side FVec3 |
[in] | rhs | Right-side FVec3 |
|
inlinestatic |
Magnitude of a FVec3.
[in] | v | Vector |
Negate a FVec3.
FVec3_Scale(v, -1)
[in] | v | Vector to negate |
|
inlinestatic |
Create a new FVec3.
[in] | x | X-component |
[in] | y | Y-component |
[in] | z | Z-component |
Normalize a FVec3.
[in] | v | FVec3 to normalize |
Scale a FVec3.
[in] | v | Vector to scale |
[in] | s | Scale factor |
Subtract two FVec3s.
[in] | lhs | Minuend |
[in] | rhs | Subtrahend |
Add two FVec4s.
[in] | lhs | Augend |
[in] | rhs | Addend |
Dot product of two FVec4s.
[in] | lhs | Left-side FVec4 |
[in] | rhs | Right-side FVec4 |
|
inlinestatic |
Magnitude of a FVec4.
[in] | v | Vector |
Negate a FVec4.
FVec4_Scale(v, -1)
[in] | v | Vector to negate |
|
inlinestatic |
Create a new FVec4.
[in] | x | X-component |
[in] | y | Y-component |
[in] | z | Z-component |
[in] | w | W-component |
Normalize a FVec4.
[in] | v | FVec4 to normalize |
Perspective divide.
[in] | v | Vector to divide |
Scale a FVec4.
[in] | v | Vector to scale |
[in] | s | Scale factor |
Subtract two FVec4s.
[in] | lhs | Minuend |
[in] | rhs | Subtrahend |
Matrix addition.
[out] | out | Output matrix. |
[in] | lhs | Left matrix. |
[in] | rhs | Right matrix. |
Copy a matrix.
[out] | out | Output matrix |
[in] | in | Input matrix |
|
inlinestatic |
Creates a matrix with the diagonal using the given parameters.
[out] | out | Output matrix. |
[in] | x | The X component. |
[in] | y | The Y component. |
[in] | z | The Z component. |
[in] | w | The W component. |
Get 4x4 matrix equivalent to Quaternion.
[out] | m | Output matrix |
[in] | q | Input Quaternion |
|
inlinestatic |
Identity matrix.
[out] | out | Matrix to fill |
float Mtx_Inverse | ( | C3D_Mtx * | out | ) |
Inverse a matrix.
[in,out] | out | Matrix to inverse |
0.0f | Degenerate matrix (no inverse) |
void Mtx_LookAt | ( | C3D_Mtx * | out, |
C3D_FVec | cameraPosition, | ||
C3D_FVec | cameraTarget, | ||
C3D_FVec | cameraUpVector, | ||
bool | isLeftHanded | ||
) |
Look-At matrix, based on DirectX implementation.
[out] | out | Output matrix. |
[in] | cameraPosition | Position of the intended camera in 3D space. |
[in] | cameraTarget | Position of the intended target the camera is supposed to face in 3D space. |
[in] | cameraUpVector | The vector that points straight up depending on the camera's "Up" direction. |
[in] | isLeftHanded | Whether to build a LH projection |
Multiply two matrices.
[out] | out | Output matrix |
[in] | a | Multiplicand |
[in] | b | Multiplier |
Multiply 3x3 matrix by a FVec3.
[in] | mtx | Matrix |
[in] | v | Vector |
Multiply 4x4 matrix by a FVec4.
[in] | mtx | Matrix |
[in] | v | Vector |
Multiply 4x3 matrix by a FVec3.
[in] | mtx | Matrix |
[in] | v | Vector |
void Mtx_Ortho | ( | C3D_Mtx * | mtx, |
float | left, | ||
float | right, | ||
float | bottom, | ||
float | top, | ||
float | near, | ||
float | far, | ||
bool | isLeftHanded | ||
) |
Orthogonal projection.
[out] | mtx | Output matrix |
[in] | left | Left clip plane (X=left) |
[in] | right | Right clip plane (X=right) |
[in] | bottom | Bottom clip plane (Y=bottom) |
[in] | top | Top clip plane (Y=top) |
[in] | near | Near clip plane (Z=near) |
[in] | far | Far clip plane (Z=far) |
[in] | isLeftHanded | Whether to build a LH projection |
void Mtx_OrthoTilt | ( | C3D_Mtx * | mtx, |
float | left, | ||
float | right, | ||
float | bottom, | ||
float | top, | ||
float | near, | ||
float | far, | ||
bool | isLeftHanded | ||
) |
Orthogonal projection, tilted to account for the 3DS screen rotation.
[out] | mtx | Output matrix |
[in] | left | Left clip plane (X=left) |
[in] | right | Right clip plane (X=right) |
[in] | bottom | Bottom clip plane (Y=bottom) |
[in] | top | Top clip plane (Y=top) |
[in] | near | Near clip plane (Z=near) |
[in] | far | Far clip plane (Z=far) |
[in] | isLeftHanded | Whether to build a LH projection |
void Mtx_Persp | ( | C3D_Mtx * | mtx, |
float | fovy, | ||
float | aspect, | ||
float | near, | ||
float | far, | ||
bool | isLeftHanded | ||
) |
Perspective projection.
[out] | mtx | Output matrix |
[in] | fovy | Vertical field of view in radians |
[in] | aspect | Aspect ration of projection plane (width/height) |
[in] | near | Near clip plane (Z=near) |
[in] | far | Far clip plane (Z=far) |
[in] | isLeftHanded | Whether to build a LH projection |
void Mtx_PerspStereo | ( | C3D_Mtx * | mtx, |
float | fovy, | ||
float | aspect, | ||
float | near, | ||
float | far, | ||
float | iod, | ||
float | screen, | ||
bool | isLeftHanded | ||
) |
Stereo perspective projection.
[out] | mtx | Output matrix |
[in] | fovy | Vertical field of view in radians |
[in] | aspect | Aspect ration of projection plane (width/height) |
[in] | near | Near clip plane (Z=near) |
[in] | far | Far clip plane (Z=far) |
[in] | iod | Interocular distance |
[in] | screen | Focal length |
[in] | isLeftHanded | Whether to build a LH projection |
void Mtx_PerspStereoTilt | ( | C3D_Mtx * | mtx, |
float | fovy, | ||
float | aspect, | ||
float | near, | ||
float | far, | ||
float | iod, | ||
float | screen, | ||
bool | isLeftHanded | ||
) |
Stereo perspective projection, tilted to account for the 3DS screen rotation.
[out] | mtx | Output matrix |
[in] | fovy | Vertical field of view in radians |
[in] | aspect | Aspect ration of projection plane (width/height) |
[in] | near | Near clip plane (Z=near) |
[in] | far | Far clip plane (Z=far) |
[in] | iod | Interocular distance |
[in] | screen | Focal length |
[in] | isLeftHanded | Whether to build a LH projection |
void Mtx_PerspTilt | ( | C3D_Mtx * | mtx, |
float | fovy, | ||
float | aspect, | ||
float | near, | ||
float | far, | ||
bool | isLeftHanded | ||
) |
Perspective projection, tilted to account for the 3DS screen rotation.
[out] | mtx | Output matrix |
[in] | fovy | Vertical field of view in radians |
[in] | aspect | Aspect ration of projection plane (width/height) |
[in] | near | Near clip plane (Z=near) |
[in] | far | Far clip plane (Z=far) |
[in] | isLeftHanded | Whether to build a LH projection |
3D Rotation
[in,out] | mtx | Matrix to rotate |
[in] | axis | Axis about which to rotate |
[in] | angle | Radians to rotate |
[in] | bRightSide | Whether to transform from the right side |
void Mtx_RotateX | ( | C3D_Mtx * | mtx, |
float | angle, | ||
bool | bRightSide | ||
) |
3D Rotation about the X axis
[in,out] | mtx | Matrix to rotate |
[in] | angle | Radians to rotate |
[in] | bRightSide | Whether to transform from the right side |
void Mtx_RotateY | ( | C3D_Mtx * | mtx, |
float | angle, | ||
bool | bRightSide | ||
) |
3D Rotation about the Y axis
[in,out] | mtx | Matrix to rotate |
[in] | angle | Radians to rotate |
[in] | bRightSide | Whether to transform from the right side |
void Mtx_RotateZ | ( | C3D_Mtx * | mtx, |
float | angle, | ||
bool | bRightSide | ||
) |
3D Rotation about the Z axis
[in,out] | mtx | Matrix to rotate |
[in] | angle | Radians to rotate |
[in] | bRightSide | Whether to transform from the right side |
void Mtx_Scale | ( | C3D_Mtx * | mtx, |
float | x, | ||
float | y, | ||
float | z | ||
) |
3D Scale
[in,out] | mtx | Matrix to scale |
[in] | x | X component to scale |
[in] | y | Y component to scale |
[in] | z | Z component to scale |
Matrix subtraction.
[out] | out | Output matrix. |
[in] | lhs | Left matrix. |
[in] | rhs | Right matrix. |
void Mtx_Translate | ( | C3D_Mtx * | mtx, |
float | x, | ||
float | y, | ||
float | z, | ||
bool | bRightSide | ||
) |
3D translation
[in,out] | mtx | Matrix to translate |
[in] | x | X component to translate |
[in] | y | Y component to translate |
[in] | z | Z component to translate |
[in] | bRightSide | Whether to transform from the right side |
void Mtx_Transpose | ( | C3D_Mtx * | out | ) |
Transposes the matrix. Row => Column, and vice versa.
[in,out] | out | Output matrix. |
|
inlinestatic |
Zero matrix.
[out] | out | Matrix to zero |
Quaternion conjugate.
[in] | q | Quaternion of which to get conjugate |
Cross product of Quaternion and FVec3.
[in] | q | Base Quaternion |
[in] | v | Vector to cross |
Quaternion, created from a given axis and angle in radians.
[in] | axis | C3D_FVec The axis to rotate around at. |
[in] | angle | float The angle to rotate. Unit: Radians |
Get Quaternion equivalent to 4x4 matrix.
[in] | m | Input Matrix |
C3D_FQuat Quat_FromPitchYawRoll | ( | float | pitch, |
float | yaw, | ||
float | roll, | ||
bool | bRightSide | ||
) |
Converting Pitch, Yaw, and Roll to Quaternion equivalent.
[in] | pitch | The pitch angle in radians. |
[in] | yaw | The yaw angle in radians. |
[in] | roll | The roll angle in radians. |
[in] | bRightSide | Whether to transform from the right side |
|
inlinestatic |
Identity Quaternion.
Quaternion inverse.
Quat_Pow(v, -1)
[in] | q | Quaternion of which to get inverse |
Multiply two Quaternions.
[in] | lhs | Multiplicand |
[in] | rhs | Multiplier |
Raise Quaternion to a power.
[in] | q | Base Quaternion |
[in] | p | Power |
3D Rotation
[in] | q | Quaternion to rotate |
[in] | axis | Axis about which to rotate |
[in] | r | Radians to rotate |
[in] | bRightSide | Whether to transform from the right side |
3D Rotation about the X axis
[in] | q | Quaternion to rotate |
[in] | r | Radians to rotate |
[in] | bRightSide | Whether to transform from the right side |
3D Rotation about the Y axis
[in] | q | Quaternion to rotate |
[in] | r | Radians to rotate |
[in] | bRightSide | Whether to transform from the right side |