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