| /*!**************************************************************************** |
| |
| @file PVRTQuaternion.h |
| @copyright Copyright (c) Imagination Technologies Limited. |
| @brief Quaternion functions for floating and fixed point math. |
| |
| ******************************************************************************/ |
| #ifndef _PVRTQUATERNION_H_ |
| #define _PVRTQUATERNION_H_ |
| |
| #include "PVRTGlobal.h" |
| #include "PVRTMatrix.h" |
| |
| /**************************************************************************** |
| ** Typedefs |
| ****************************************************************************/ |
| /*!*************************************************************************** |
| @brief Floating point Quaternion |
| *****************************************************************************/ |
| typedef struct |
| { |
| float x; /*!< x coordinate */ |
| float y; /*!< y coordinate */ |
| float z; /*!< z coordinate */ |
| float w; /*!< w coordinate */ |
| } PVRTQUATERNIONf; |
| /*!*************************************************************************** |
| @brief Fixed point Quaternion |
| *****************************************************************************/ |
| typedef struct |
| { |
| int x; /*!< x coordinate */ |
| int y; /*!< y coordinate */ |
| int z; /*!< z coordinate */ |
| int w; /*!< w coordinate */ |
| } PVRTQUATERNIONx; |
| |
| /**************************************************************************** |
| ** Float or fixed |
| ****************************************************************************/ |
| #ifdef PVRT_FIXED_POINT_ENABLE |
| typedef PVRTQUATERNIONx PVRTQUATERNION; |
| #define PVRTMatrixQuaternionIdentity PVRTMatrixQuaternionIdentityX |
| #define PVRTMatrixQuaternionRotationAxis PVRTMatrixQuaternionRotationAxisX |
| #define PVRTMatrixQuaternionToAxisAngle PVRTMatrixQuaternionToAxisAngleX |
| #define PVRTMatrixQuaternionSlerp PVRTMatrixQuaternionSlerpX |
| #define PVRTMatrixQuaternionNormalize PVRTMatrixQuaternionNormalizeX |
| #define PVRTMatrixRotationQuaternion PVRTMatrixRotationQuaternionX |
| #define PVRTMatrixQuaternionMultiply PVRTMatrixQuaternionMultiplyX |
| #else |
| typedef PVRTQUATERNIONf PVRTQUATERNION; |
| #define PVRTMatrixQuaternionIdentity PVRTMatrixQuaternionIdentityF |
| #define PVRTMatrixQuaternionRotationAxis PVRTMatrixQuaternionRotationAxisF |
| #define PVRTMatrixQuaternionToAxisAngle PVRTMatrixQuaternionToAxisAngleF |
| #define PVRTMatrixQuaternionSlerp PVRTMatrixQuaternionSlerpF |
| #define PVRTMatrixQuaternionNormalize PVRTMatrixQuaternionNormalizeF |
| #define PVRTMatrixRotationQuaternion PVRTMatrixRotationQuaternionF |
| #define PVRTMatrixQuaternionMultiply PVRTMatrixQuaternionMultiplyF |
| #endif |
| |
| /**************************************************************************** |
| ** Functions |
| ****************************************************************************/ |
| |
| /*!*************************************************************************** |
| @fn PVRTMatrixQuaternionIdentityF |
| @param[out] qOut Identity quaternion |
| @brief Sets the quaternion to (0, 0, 0, 1), the identity quaternion. |
| *****************************************************************************/ |
| void PVRTMatrixQuaternionIdentityF( |
| PVRTQUATERNIONf &qOut); |
| |
| /*!*************************************************************************** |
| @fn PVRTMatrixQuaternionIdentityX |
| @param[out] qOut Identity quaternion |
| @brief Sets the quaternion to (0, 0, 0, 1), the identity quaternion. |
| *****************************************************************************/ |
| void PVRTMatrixQuaternionIdentityX( |
| PVRTQUATERNIONx &qOut); |
| |
| /*!*************************************************************************** |
| @fn PVRTMatrixQuaternionRotationAxisF |
| @param[out] qOut Rotation quaternion |
| @param[in] vAxis Axis to rotate around |
| @param[in] fAngle Angle to rotate |
| @brief Create quaternion corresponding to a rotation of fAngle |
| radians around submitted vector. |
| *****************************************************************************/ |
| void PVRTMatrixQuaternionRotationAxisF( |
| PVRTQUATERNIONf &qOut, |
| const PVRTVECTOR3f &vAxis, |
| const float fAngle); |
| |
| /*!*************************************************************************** |
| @fn PVRTMatrixQuaternionRotationAxisX |
| @param[out] qOut Rotation quaternion |
| @param[in] vAxis Axis to rotate around |
| @param[in] fAngle Angle to rotate |
| @brief Create quaternion corresponding to a rotation of fAngle |
| radians around submitted vector. |
| *****************************************************************************/ |
| void PVRTMatrixQuaternionRotationAxisX( |
| PVRTQUATERNIONx &qOut, |
| const PVRTVECTOR3x &vAxis, |
| const int fAngle); |
| |
| |
| /*!*************************************************************************** |
| @fn PVRTMatrixQuaternionToAxisAngleF |
| @param[in] qIn Quaternion to transform |
| @param[out] vAxis Axis of rotation |
| @param[out] fAngle Angle of rotation |
| @brief Convert a quaternion to an axis and angle. Expects a unit |
| quaternion. |
| *****************************************************************************/ |
| void PVRTMatrixQuaternionToAxisAngleF( |
| const PVRTQUATERNIONf &qIn, |
| PVRTVECTOR3f &vAxis, |
| float &fAngle); |
| |
| /*!*************************************************************************** |
| @fn PVRTMatrixQuaternionToAxisAngleX |
| @param[in] qIn Quaternion to transform |
| @param[out] vAxis Axis of rotation |
| @param[out] fAngle Angle of rotation |
| @brief Convert a quaternion to an axis and angle. Expects a unit |
| quaternion. |
| *****************************************************************************/ |
| void PVRTMatrixQuaternionToAxisAngleX( |
| const PVRTQUATERNIONx &qIn, |
| PVRTVECTOR3x &vAxis, |
| int &fAngle); |
| |
| /*!*************************************************************************** |
| @fn PVRTMatrixQuaternionSlerpF |
| @param[out] qOut Result of the interpolation |
| @param[in] qA First quaternion to interpolate from |
| @param[in] qB Second quaternion to interpolate from |
| @param[in] t Coefficient of interpolation |
| @brief Perform a Spherical Linear intERPolation between quaternion A |
| and quaternion B at time t. t must be between 0.0f and 1.0f |
| *****************************************************************************/ |
| void PVRTMatrixQuaternionSlerpF( |
| PVRTQUATERNIONf &qOut, |
| const PVRTQUATERNIONf &qA, |
| const PVRTQUATERNIONf &qB, |
| const float t); |
| |
| /*!*************************************************************************** |
| @fn PVRTMatrixQuaternionSlerpX |
| @param[out] qOut Result of the interpolation |
| @param[in] qA First quaternion to interpolate from |
| @param[in] qB Second quaternion to interpolate from |
| @param[in] t Coefficient of interpolation |
| @brief Perform a Spherical Linear intERPolation between quaternion A |
| and quaternion B at time t. t must be between 0.0f and 1.0f |
| Requires input quaternions to be normalized |
| *****************************************************************************/ |
| void PVRTMatrixQuaternionSlerpX( |
| PVRTQUATERNIONx &qOut, |
| const PVRTQUATERNIONx &qA, |
| const PVRTQUATERNIONx &qB, |
| const int t); |
| |
| /*!*************************************************************************** |
| @fn PVRTMatrixQuaternionNormalizeF |
| @param[in,out] quat Vector to normalize |
| @brief Normalize quaternion. |
| *****************************************************************************/ |
| void PVRTMatrixQuaternionNormalizeF(PVRTQUATERNIONf &quat); |
| |
| /*!*************************************************************************** |
| @fn PVRTMatrixQuaternionNormalizeX |
| @param[in,out] quat Vector to normalize |
| @brief Normalize quaternion. |
| Original quaternion is scaled down prior to be normalized in |
| order to avoid overflow issues. |
| *****************************************************************************/ |
| void PVRTMatrixQuaternionNormalizeX(PVRTQUATERNIONx &quat); |
| |
| /*!*************************************************************************** |
| @fn PVRTMatrixRotationQuaternionF |
| @param[out] mOut Resulting rotation matrix |
| @param[in] quat Quaternion to transform |
| @brief Create rotation matrix from submitted quaternion. |
| Assuming the quaternion is of the form [X Y Z W]: |
| |
| | 2 2 | |
| | 1 - 2Y - 2Z 2XY - 2ZW 2XZ + 2YW 0 | |
| | | |
| | 2 2 | |
| M = | 2XY + 2ZW 1 - 2X - 2Z 2YZ - 2XW 0 | |
| | | |
| | 2 2 | |
| | 2XZ - 2YW 2YZ + 2XW 1 - 2X - 2Y 0 | |
| | | |
| | 0 0 0 1 | |
| *****************************************************************************/ |
| void PVRTMatrixRotationQuaternionF( |
| PVRTMATRIXf &mOut, |
| const PVRTQUATERNIONf &quat); |
| |
| /*!*************************************************************************** |
| @fn PVRTMatrixRotationQuaternionX |
| @param[out] mOut Resulting rotation matrix |
| @param[in] quat Quaternion to transform |
| @brief Create rotation matrix from submitted quaternion. |
| Assuming the quaternion is of the form [X Y Z W]: |
| |
| | 2 2 | |
| | 1 - 2Y - 2Z 2XY - 2ZW 2XZ + 2YW 0 | |
| | | |
| | 2 2 | |
| M = | 2XY + 2ZW 1 - 2X - 2Z 2YZ - 2XW 0 | |
| | | |
| | 2 2 | |
| | 2XZ - 2YW 2YZ + 2XW 1 - 2X - 2Y 0 | |
| | | |
| | 0 0 0 1 | |
| *****************************************************************************/ |
| void PVRTMatrixRotationQuaternionX( |
| PVRTMATRIXx &mOut, |
| const PVRTQUATERNIONx &quat); |
| |
| /*!*************************************************************************** |
| @fn PVRTMatrixQuaternionMultiplyF |
| @param[out] qOut Resulting quaternion |
| @param[in] qA First quaternion to multiply |
| @param[in] qB Second quaternion to multiply |
| @brief Multiply quaternion A with quaternion B and return the |
| result in qOut. |
| *****************************************************************************/ |
| void PVRTMatrixQuaternionMultiplyF( |
| PVRTQUATERNIONf &qOut, |
| const PVRTQUATERNIONf &qA, |
| const PVRTQUATERNIONf &qB); |
| |
| /*!*************************************************************************** |
| @fn PVRTMatrixQuaternionMultiplyX |
| @param[out] qOut Resulting quaternion |
| @param[in] qA First quaternion to multiply |
| @param[in] qB Second quaternion to multiply |
| @brief Multiply quaternion A with quaternion B and return the |
| result in qOut. |
| Input quaternions must be normalized. |
| *****************************************************************************/ |
| void PVRTMatrixQuaternionMultiplyX( |
| PVRTQUATERNIONx &qOut, |
| const PVRTQUATERNIONx &qA, |
| const PVRTQUATERNIONx &qB); |
| |
| #endif |
| |
| /***************************************************************************** |
| End of file (PVRTQuaternion.h) |
| *****************************************************************************/ |
| |