| /*!**************************************************************************** | |
| @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) | |
| *****************************************************************************/ | |