| /*!**************************************************************************** | 
 |  | 
 |  @file         PVRTMatrix.h | 
 |  @copyright    Copyright (c) Imagination Technologies Limited. | 
 |  @brief        Vector and Matrix functions for floating and fixed point math.  | 
 |  @details      The general matrix format used is directly compatible with, for | 
 |                example, both DirectX and OpenGL. | 
 |  | 
 | ******************************************************************************/ | 
 | #ifndef _PVRTMATRIX_H_ | 
 | #define _PVRTMATRIX_H_ | 
 |  | 
 | #include "PVRTGlobal.h" | 
 | /**************************************************************************** | 
 | ** Defines | 
 | ****************************************************************************/ | 
 | #define MAT00 0 | 
 | #define MAT01 1 | 
 | #define MAT02 2 | 
 | #define MAT03 3 | 
 | #define MAT10 4 | 
 | #define MAT11 5 | 
 | #define MAT12 6 | 
 | #define MAT13 7 | 
 | #define MAT20 8 | 
 | #define MAT21 9 | 
 | #define MAT22 10 | 
 | #define MAT23 11 | 
 | #define MAT30 12 | 
 | #define MAT31 13 | 
 | #define MAT32 14 | 
 | #define MAT33 15 | 
 |  | 
 | /**************************************************************************** | 
 | ** Typedefs | 
 | ****************************************************************************/ | 
 | /*!*************************************************************************** | 
 |  @brief     2D floating point vector | 
 | *****************************************************************************/ | 
 | typedef struct | 
 | { | 
 | 	float x;	/*!< x coordinate */ | 
 | 	float y;	/*!< y coordinate */ | 
 | } PVRTVECTOR2f; | 
 |  | 
 | /*!*************************************************************************** | 
 |  @brief     2D fixed point vector | 
 | *****************************************************************************/ | 
 | typedef struct | 
 | { | 
 | 	int x;	/*!< x coordinate */ | 
 | 	int y;	/*!< y coordinate */ | 
 | } PVRTVECTOR2x; | 
 |  | 
 | /*!*************************************************************************** | 
 |  @brief     3D floating point vector | 
 | *****************************************************************************/ | 
 | typedef struct | 
 | { | 
 | 	float x;	/*!< x coordinate */ | 
 | 	float y;	/*!< y coordinate */ | 
 | 	float z;	/*!< z coordinate */ | 
 | } PVRTVECTOR3f; | 
 |  | 
 | /*!*************************************************************************** | 
 |  @brief     3D fixed point vector | 
 | *****************************************************************************/ | 
 | typedef struct | 
 | { | 
 | 	int x;	/*!< x coordinate */ | 
 | 	int y;	/*!< y coordinate */ | 
 | 	int z;	/*!< z coordinate */ | 
 | } PVRTVECTOR3x; | 
 |  | 
 | /*!*************************************************************************** | 
 |  @brief     4D floating point vector | 
 | *****************************************************************************/ | 
 | typedef struct | 
 | { | 
 | 	float x;	/*!< x coordinate */ | 
 | 	float y;	/*!< y coordinate */ | 
 | 	float z;	/*!< z coordinate */ | 
 | 	float w;	/*!< w coordinate */ | 
 | } PVRTVECTOR4f; | 
 |  | 
 | /*!*************************************************************************** | 
 |  @brief     4D fixed point vector | 
 | *****************************************************************************/ | 
 | typedef struct | 
 | { | 
 | 	int x;	/*!< x coordinate */ | 
 | 	int y;	/*!< y coordinate */ | 
 | 	int z;	/*!< z coordinate */ | 
 | 	int w;	/*!< w coordinate */ | 
 | } PVRTVECTOR4x; | 
 |  | 
 | /*!*************************************************************************** | 
 |  @class     PVRTMATRIXf | 
 |  @brief     4x4 floating point matrix | 
 | *****************************************************************************/ | 
 | class PVRTMATRIXf | 
 | { | 
 | public: | 
 |     float* operator [] ( const int Row ) | 
 | 	{ | 
 | 		return &f[Row<<2]; | 
 | 	} | 
 | 	float f[16];	/*!< Array of float */ | 
 | }; | 
 |  | 
 | /*!*************************************************************************** | 
 |  @class     PVRTMATRIXx | 
 |  @brief     4x4 fixed point matrix | 
 | *****************************************************************************/ | 
 | class PVRTMATRIXx | 
 | { | 
 | public: | 
 |     int* operator [] ( const int Row ) | 
 | 	{ | 
 | 		return &f[Row<<2]; | 
 | 	} | 
 | 	int f[16]; | 
 | }; | 
 |  | 
 | /*!*************************************************************************** | 
 |  @class     PVRTMATRIX3f | 
 |  @brief     3x3 floating point matrix | 
 | *****************************************************************************/ | 
 |  | 
 | class PVRTMATRIX3f | 
 | { | 
 | public: | 
 |     float* operator [] ( const int Row ) | 
 | 	{ | 
 | 		return &f[Row*3]; | 
 | 	} | 
 | 	float f[9];	/*!< Array of float */ | 
 | }; | 
 |  | 
 | /*!*************************************************************************** | 
 |  @class     PVRTMATRIX3x | 
 |  @brief     3x3 fixed point matrix | 
 | *****************************************************************************/ | 
 | class PVRTMATRIX3x | 
 | { | 
 | public: | 
 |     int* operator [] ( const int Row ) | 
 | 	{ | 
 | 		return &f[Row*3]; | 
 | 	} | 
 | 	int f[9]; | 
 | }; | 
 |  | 
 |  | 
 | /**************************************************************************** | 
 | ** Float or fixed | 
 | ****************************************************************************/ | 
 | #ifdef PVRT_FIXED_POINT_ENABLE | 
 | 	typedef PVRTVECTOR2x		PVRTVECTOR2; | 
 | 	typedef PVRTVECTOR3x		PVRTVECTOR3; | 
 | 	typedef PVRTVECTOR4x		PVRTVECTOR4; | 
 | 	typedef PVRTMATRIX3x		PVRTMATRIX3; | 
 | 	typedef PVRTMATRIXx			PVRTMATRIX; | 
 | 	#define PVRTMatrixIdentity					PVRTMatrixIdentityX | 
 | 	#define PVRTMatrixMultiply					PVRTMatrixMultiplyX | 
 | 	#define PVRTMatrixTranslation				PVRTMatrixTranslationX | 
 | 	#define PVRTMatrixScaling					PVRTMatrixScalingX | 
 | 	#define PVRTMatrixRotationX					PVRTMatrixRotationXX | 
 | 	#define PVRTMatrixRotationY					PVRTMatrixRotationYX | 
 | 	#define PVRTMatrixRotationZ					PVRTMatrixRotationZX | 
 | 	#define PVRTMatrixTranspose					PVRTMatrixTransposeX | 
 | 	#define PVRTMatrixInverse					PVRTMatrixInverseX | 
 | 	#define PVRTMatrixInverseEx					PVRTMatrixInverseExX | 
 | 	#define PVRTMatrixLookAtLH					PVRTMatrixLookAtLHX | 
 | 	#define PVRTMatrixLookAtRH					PVRTMatrixLookAtRHX | 
 | 	#define PVRTMatrixPerspectiveFovLH			PVRTMatrixPerspectiveFovLHX | 
 | 	#define PVRTMatrixPerspectiveFovRH			PVRTMatrixPerspectiveFovRHX | 
 | 	#define PVRTMatrixOrthoLH					PVRTMatrixOrthoLHX | 
 | 	#define PVRTMatrixOrthoRH					PVRTMatrixOrthoRHX | 
 | 	#define PVRTMatrixVec3Lerp					PVRTMatrixVec3LerpX | 
 | 	#define PVRTMatrixVec3DotProduct			PVRTMatrixVec3DotProductX | 
 | 	#define PVRTMatrixVec3CrossProduct			PVRTMatrixVec3CrossProductX | 
 | 	#define PVRTMatrixVec3Normalize				PVRTMatrixVec3NormalizeX | 
 | 	#define PVRTMatrixVec3Length				PVRTMatrixVec3LengthX | 
 | 	#define PVRTMatrixLinearEqSolve				PVRTMatrixLinearEqSolveX | 
 | #else | 
 | 	typedef PVRTVECTOR2f		PVRTVECTOR2; | 
 | 	typedef PVRTVECTOR3f		PVRTVECTOR3; | 
 | 	typedef PVRTVECTOR4f		PVRTVECTOR4; | 
 | 	typedef PVRTMATRIX3f		PVRTMATRIX3; | 
 | 	typedef PVRTMATRIXf			PVRTMATRIX; | 
 | 	#define PVRTMatrixIdentity					PVRTMatrixIdentityF | 
 | 	#define PVRTMatrixMultiply					PVRTMatrixMultiplyF | 
 | 	#define PVRTMatrixTranslation				PVRTMatrixTranslationF | 
 | 	#define PVRTMatrixScaling					PVRTMatrixScalingF | 
 | 	#define PVRTMatrixRotationX					PVRTMatrixRotationXF | 
 | 	#define PVRTMatrixRotationY					PVRTMatrixRotationYF | 
 | 	#define PVRTMatrixRotationZ					PVRTMatrixRotationZF | 
 | 	#define PVRTMatrixTranspose					PVRTMatrixTransposeF | 
 | 	#define PVRTMatrixInverse					PVRTMatrixInverseF | 
 | 	#define PVRTMatrixInverseEx					PVRTMatrixInverseExF | 
 | 	#define PVRTMatrixLookAtLH					PVRTMatrixLookAtLHF | 
 | 	#define PVRTMatrixLookAtRH					PVRTMatrixLookAtRHF | 
 | 	#define PVRTMatrixPerspectiveFovLH			PVRTMatrixPerspectiveFovLHF | 
 | 	#define PVRTMatrixPerspectiveFovRH			PVRTMatrixPerspectiveFovRHF | 
 | 	#define PVRTMatrixOrthoLH					PVRTMatrixOrthoLHF | 
 | 	#define PVRTMatrixOrthoRH					PVRTMatrixOrthoRHF | 
 | 	#define PVRTMatrixVec3Lerp					PVRTMatrixVec3LerpF | 
 | 	#define PVRTMatrixVec3DotProduct			PVRTMatrixVec3DotProductF | 
 | 	#define PVRTMatrixVec3CrossProduct			PVRTMatrixVec3CrossProductF | 
 | 	#define PVRTMatrixVec3Normalize				PVRTMatrixVec3NormalizeF | 
 | 	#define PVRTMatrixVec3Length				PVRTMatrixVec3LengthF | 
 | 	#define PVRTMatrixLinearEqSolve				PVRTMatrixLinearEqSolveF | 
 | #endif | 
 |  | 
 | /**************************************************************************** | 
 | ** Functions | 
 | ****************************************************************************/ | 
 |  | 
 | /*!*************************************************************************** | 
 |  @fn      			PVRTMatrixIdentityF | 
 |  @param[out]			mOut	Set to identity | 
 |  @brief      		Reset matrix to identity matrix. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixIdentityF(PVRTMATRIXf &mOut); | 
 |  | 
 | /*!*************************************************************************** | 
 |  @fn      			PVRTMatrixIdentityX | 
 |  @param[out]			mOut	Set to identity | 
 |  @brief      		Reset matrix to identity matrix. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixIdentityX(PVRTMATRIXx &mOut); | 
 |  | 
 | /*!*************************************************************************** | 
 |  @fn      			PVRTMatrixMultiplyF | 
 |  @param[out]			mOut	Result of mA x mB | 
 |  @param[in]				mA		First operand | 
 |  @param[in]				mB		Second operand | 
 |  @brief      		Multiply mA by mB and assign the result to mOut | 
 | 					(mOut = p1 * p2). A copy of the result matrix is done in | 
 | 					the function because mOut can be a parameter mA or mB. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixMultiplyF( | 
 | 	PVRTMATRIXf			&mOut, | 
 | 	const PVRTMATRIXf	&mA, | 
 | 	const PVRTMATRIXf	&mB); | 
 | /*!*************************************************************************** | 
 |  @fn      			PVRTMatrixMultiplyX | 
 |  @param[out]			mOut	Result of mA x mB | 
 |  @param[in]				mA		First operand | 
 |  @param[in]				mB		Second operand | 
 |  @brief      		Multiply mA by mB and assign the result to mOut | 
 | 					(mOut = p1 * p2). A copy of the result matrix is done in | 
 | 					the function because mOut can be a parameter mA or mB. | 
 | 					The fixed-point shift could be performed after adding | 
 | 					all four intermediate results together however this might | 
 | 					cause some overflow issues. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixMultiplyX( | 
 | 	PVRTMATRIXx			&mOut, | 
 | 	const PVRTMATRIXx	&mA, | 
 | 	const PVRTMATRIXx	&mB); | 
 |  | 
 | /*!*************************************************************************** | 
 |  @fn           		PVRTMatrixTranslationF | 
 |  @param[out]			mOut	Translation matrix | 
 |  @param[in]				fX		X component of the translation | 
 |  @param[in]				fY		Y component of the translation | 
 |  @param[in]				fZ		Z component of the translation | 
 |  @brief      		Build a transaltion matrix mOut using fX, fY and fZ. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixTranslationF( | 
 | 	PVRTMATRIXf	&mOut, | 
 | 	const float	fX, | 
 | 	const float	fY, | 
 | 	const float	fZ); | 
 | /*!*************************************************************************** | 
 |  @fn        		PVRTMatrixTranslationX | 
 |  @param[out]			mOut	Translation matrix | 
 |  @param[in]				fX		X component of the translation | 
 |  @param[in]				fY		Y component of the translation | 
 |  @param[in]				fZ		Z component of the translation | 
 |  @brief      		Build a transaltion matrix mOut using fX, fY and fZ. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixTranslationX( | 
 | 	PVRTMATRIXx	&mOut, | 
 | 	const int	fX, | 
 | 	const int	fY, | 
 | 	const int	fZ); | 
 |  | 
 | /*!*************************************************************************** | 
 |  @fn           		PVRTMatrixScalingF | 
 |  @param[out]			mOut	Scale matrix | 
 |  @param[in]				fX		X component of the scaling | 
 |  @param[in]				fY		Y component of the scaling | 
 |  @param[in]				fZ		Z component of the scaling | 
 |  @brief      		Build a scale matrix mOut using fX, fY and fZ. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixScalingF( | 
 | 	PVRTMATRIXf	&mOut, | 
 | 	const float fX, | 
 | 	const float fY, | 
 | 	const float fZ); | 
 |  | 
 | /*!*************************************************************************** | 
 |  @fn           		PVRTMatrixScalingX | 
 |  @param[out]			mOut	Scale matrix | 
 |  @param[in]				fX		X component of the scaling | 
 |  @param[in]				fY		Y component of the scaling | 
 |  @param[in]				fZ		Z component of the scaling | 
 |  @brief      		Build a scale matrix mOut using fX, fY and fZ. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixScalingX( | 
 | 	PVRTMATRIXx	&mOut, | 
 | 	const int	fX, | 
 | 	const int	fY, | 
 | 	const int	fZ); | 
 |  | 
 | /*!*************************************************************************** | 
 |  @fn           		PVRTMatrixRotationXF | 
 |  @param[out]			mOut	Rotation matrix | 
 |  @param[in]				fAngle	Angle of the rotation | 
 |  @brief      		Create an X rotation matrix mOut. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixRotationXF( | 
 | 	PVRTMATRIXf	&mOut, | 
 | 	const float fAngle); | 
 |  | 
 | /*!*************************************************************************** | 
 |  @fn           		PVRTMatrixRotationXX | 
 |  @param[out]			mOut	Rotation matrix | 
 |  @param[in]				fAngle	Angle of the rotation | 
 |  @brief      		Create an X rotation matrix mOut. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixRotationXX( | 
 | 	PVRTMATRIXx	&mOut, | 
 | 	const int	fAngle); | 
 |  | 
 | /*!*************************************************************************** | 
 |  @fn           		PVRTMatrixRotationYF | 
 |  @param[out]			mOut	Rotation matrix | 
 |  @param[in]				fAngle	Angle of the rotation | 
 |  @brief      		Create an Y rotation matrix mOut. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixRotationYF( | 
 | 	PVRTMATRIXf	&mOut, | 
 | 	const float fAngle); | 
 |  | 
 | /*!*************************************************************************** | 
 |  @fn           		PVRTMatrixRotationYX | 
 |  @param[out]			mOut	Rotation matrix | 
 |  @param[in]				fAngle	Angle of the rotation | 
 |  @brief      		Create an Y rotation matrix mOut. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixRotationYX( | 
 | 	PVRTMATRIXx	&mOut, | 
 | 	const int	fAngle); | 
 |  | 
 | /*!*************************************************************************** | 
 |  @fn           		PVRTMatrixRotationZF | 
 |  @param[out]			mOut	Rotation matrix | 
 |  @param[in]				fAngle	Angle of the rotation | 
 |  @brief      		Create an Z rotation matrix mOut. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixRotationZF( | 
 | 	PVRTMATRIXf	&mOut, | 
 | 	const float fAngle); | 
 | /*!*************************************************************************** | 
 |  @fn           		PVRTMatrixRotationZX | 
 |  @param[out]			mOut	Rotation matrix | 
 |  @param[in]				fAngle	Angle of the rotation | 
 |  @brief      		Create an Z rotation matrix mOut. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixRotationZX( | 
 | 	PVRTMATRIXx	&mOut, | 
 | 	const int	fAngle); | 
 |  | 
 | /*!*************************************************************************** | 
 |  @fn           		PVRTMatrixTransposeF | 
 |  @param[out]			mOut	Transposed matrix | 
 |  @param[in]				mIn		Original matrix | 
 |  @brief      		Compute the transpose matrix of mIn. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixTransposeF( | 
 | 	PVRTMATRIXf			&mOut, | 
 | 	const PVRTMATRIXf	&mIn); | 
 | /*!*************************************************************************** | 
 |  @fn           		PVRTMatrixTransposeX | 
 |  @param[out]			mOut	Transposed matrix | 
 |  @param[in]				mIn		Original matrix | 
 |  @brief      		Compute the transpose matrix of mIn. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixTransposeX( | 
 | 	PVRTMATRIXx			&mOut, | 
 | 	const PVRTMATRIXx	&mIn); | 
 |  | 
 | /*!*************************************************************************** | 
 |  @fn      			PVRTMatrixInverseF | 
 |  @param[out]			mOut	Inversed matrix | 
 |  @param[in]				mIn		Original matrix | 
 |  @brief      		Compute the inverse matrix of mIn. | 
 | 					The matrix must be of the form : | 
 | 					A 0 | 
 | 					C 1 | 
 | 					Where A is a 3x3 matrix and C is a 1x3 matrix. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixInverseF( | 
 | 	PVRTMATRIXf			&mOut, | 
 | 	const PVRTMATRIXf	&mIn); | 
 | /*!*************************************************************************** | 
 |  @fn      			PVRTMatrixInverseX | 
 |  @param[out]			mOut	Inversed matrix | 
 |  @param[in]				mIn		Original matrix | 
 |  @brief      		Compute the inverse matrix of mIn. | 
 | 					The matrix must be of the form : | 
 | 					A 0 | 
 | 					C 1 | 
 | 					Where A is a 3x3 matrix and C is a 1x3 matrix. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixInverseX( | 
 | 	PVRTMATRIXx			&mOut, | 
 | 	const PVRTMATRIXx	&mIn); | 
 |  | 
 | /*!*************************************************************************** | 
 |  @fn      			PVRTMatrixInverseExF | 
 |  @param[out]			mOut	Inversed matrix | 
 |  @param[in]				mIn		Original matrix | 
 |  @brief      		Compute the inverse matrix of mIn. | 
 | 					Uses a linear equation solver and the knowledge that M.M^-1=I. | 
 | 					Use this fn to calculate the inverse of matrices that | 
 | 					PVRTMatrixInverse() cannot. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixInverseExF( | 
 | 	PVRTMATRIXf			&mOut, | 
 | 	const PVRTMATRIXf	&mIn); | 
 | /*!*************************************************************************** | 
 |  @fn      			PVRTMatrixInverseExX | 
 |  @param[out]			mOut	Inversed matrix | 
 |  @param[in]				mIn		Original matrix | 
 |  @brief      		Compute the inverse matrix of mIn. | 
 | 					Uses a linear equation solver and the knowledge that M.M^-1=I. | 
 | 					Use this fn to calculate the inverse of matrices that | 
 | 					PVRTMatrixInverse() cannot. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixInverseExX( | 
 | 	PVRTMATRIXx			&mOut, | 
 | 	const PVRTMATRIXx	&mIn); | 
 |  | 
 | /*!*************************************************************************** | 
 |  @fn      			PVRTMatrixLookAtLHF | 
 |  @param[out]			mOut	Look-at view matrix | 
 |  @param[in]				vEye	Position of the camera | 
 |  @param[in]				vAt		Point the camera is looking at | 
 |  @param[in]				vUp		Up direction for the camera | 
 |  @brief      		Create a look-at view matrix. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixLookAtLHF( | 
 | 	PVRTMATRIXf			&mOut, | 
 | 	const PVRTVECTOR3f	&vEye, | 
 | 	const PVRTVECTOR3f	&vAt, | 
 | 	const PVRTVECTOR3f	&vUp); | 
 | /*!*************************************************************************** | 
 |  @fn      			PVRTMatrixLookAtLHX | 
 |  @param[out]			mOut	Look-at view matrix | 
 |  @param[in]				vEye	Position of the camera | 
 |  @param[in]				vAt		Point the camera is looking at | 
 |  @param[in]				vUp		Up direction for the camera | 
 |  @brief      		Create a look-at view matrix. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixLookAtLHX( | 
 | 	PVRTMATRIXx			&mOut, | 
 | 	const PVRTVECTOR3x	&vEye, | 
 | 	const PVRTVECTOR3x	&vAt, | 
 | 	const PVRTVECTOR3x	&vUp); | 
 |  | 
 | /*!*************************************************************************** | 
 |  @fn      			PVRTMatrixLookAtRHF | 
 |  @param[out]			mOut	Look-at view matrix | 
 |  @param[in]				vEye	Position of the camera | 
 |  @param[in]				vAt		Point the camera is looking at | 
 |  @param[in]				vUp		Up direction for the camera | 
 |  @brief      		Create a look-at view matrix. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixLookAtRHF( | 
 | 	PVRTMATRIXf			&mOut, | 
 | 	const PVRTVECTOR3f	&vEye, | 
 | 	const PVRTVECTOR3f	&vAt, | 
 | 	const PVRTVECTOR3f	&vUp); | 
 | /*!*************************************************************************** | 
 |  @fn      			PVRTMatrixLookAtRHX | 
 |  @param[out]			mOut	Look-at view matrix | 
 |  @param[in]				vEye	Position of the camera | 
 |  @param[in]				vAt		Point the camera is looking at | 
 |  @param[in]				vUp		Up direction for the camera | 
 |  @brief      		Create a look-at view matrix. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixLookAtRHX( | 
 | 	PVRTMATRIXx			&mOut, | 
 | 	const PVRTVECTOR3x	&vEye, | 
 | 	const PVRTVECTOR3x	&vAt, | 
 | 	const PVRTVECTOR3x	&vUp); | 
 |  | 
 | /*!*************************************************************************** | 
 |  @fn      		PVRTMatrixPerspectiveFovLHF | 
 |  @param[out]		mOut		Perspective matrix | 
 |  @param[in]			fFOVy		Field of view | 
 |  @param[in]			fAspect		Aspect ratio | 
 |  @param[in]			fNear		Near clipping distance | 
 |  @param[in]			fFar		Far clipping distance | 
 |  @param[in]			bRotate		Should we rotate it ? (for upright screens) | 
 |  @brief      	Create a perspective matrix. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixPerspectiveFovLHF( | 
 | 	PVRTMATRIXf	&mOut, | 
 | 	const float	fFOVy, | 
 | 	const float	fAspect, | 
 | 	const float	fNear, | 
 | 	const float	fFar, | 
 | 	const bool  bRotate = false); | 
 | /*!*************************************************************************** | 
 |  @fn      		PVRTMatrixPerspectiveFovLHX | 
 |  @param[out]		mOut		Perspective matrix | 
 |  @param[in]			fFOVy		Field of view | 
 |  @param[in]			fAspect		Aspect ratio | 
 |  @param[in]			fNear		Near clipping distance | 
 |  @param[in]			fFar		Far clipping distance | 
 |  @param[in]			bRotate		Should we rotate it ? (for upright screens) | 
 |  @brief      	Create a perspective matrix. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixPerspectiveFovLHX( | 
 | 	PVRTMATRIXx	&mOut, | 
 | 	const int	fFOVy, | 
 | 	const int	fAspect, | 
 | 	const int	fNear, | 
 | 	const int	fFar, | 
 | 	const bool  bRotate = false); | 
 |  | 
 | /*!*************************************************************************** | 
 |  @fn      		PVRTMatrixPerspectiveFovRHF | 
 |  @param[out]		mOut		Perspective matrix | 
 |  @param[in]			fFOVy		Field of view | 
 |  @param[in]			fAspect		Aspect ratio | 
 |  @param[in]			fNear		Near clipping distance | 
 |  @param[in]			fFar		Far clipping distance | 
 |  @param[in]			bRotate		Should we rotate it ? (for upright screens) | 
 |  @brief      	Create a perspective matrix. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixPerspectiveFovRHF( | 
 | 	PVRTMATRIXf	&mOut, | 
 | 	const float	fFOVy, | 
 | 	const float	fAspect, | 
 | 	const float	fNear, | 
 | 	const float	fFar, | 
 | 	const bool  bRotate = false); | 
 | /*!*************************************************************************** | 
 |  @fn      		PVRTMatrixPerspectiveFovRHX | 
 |  @param[out]		mOut		Perspective matrix | 
 |  @param[in]			fFOVy		Field of view | 
 |  @param[in]			fAspect		Aspect ratio | 
 |  @param[in]			fNear		Near clipping distance | 
 |  @param[in]			fFar		Far clipping distance | 
 |  @param[in]			bRotate		Should we rotate it ? (for upright screens) | 
 |  @brief      	Create a perspective matrix. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixPerspectiveFovRHX( | 
 | 	PVRTMATRIXx	&mOut, | 
 | 	const int	fFOVy, | 
 | 	const int	fAspect, | 
 | 	const int	fNear, | 
 | 	const int	fFar, | 
 | 	const bool  bRotate = false); | 
 |  | 
 | /*!*************************************************************************** | 
 |  @fn      		PVRTMatrixOrthoLHF | 
 |  @param[out]		mOut		Orthographic matrix | 
 |  @param[in]			w			Width of the screen | 
 |  @param[in]			h			Height of the screen | 
 |  @param[in]			zn			Near clipping distance | 
 |  @param[in]			zf			Far clipping distance | 
 |  @param[in]			bRotate		Should we rotate it ? (for upright screens) | 
 |  @brief      	Create an orthographic matrix. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixOrthoLHF( | 
 | 	PVRTMATRIXf	&mOut, | 
 | 	const float w, | 
 | 	const float h, | 
 | 	const float zn, | 
 | 	const float zf, | 
 | 	const bool  bRotate = false); | 
 | /*!*************************************************************************** | 
 |  @fn      		PVRTMatrixOrthoLHX | 
 |  @param[out]		mOut		Orthographic matrix | 
 |  @param[in]			w			Width of the screen | 
 |  @param[in]			h			Height of the screen | 
 |  @param[in]			zn			Near clipping distance | 
 |  @param[in]			zf			Far clipping distance | 
 |  @param[in]			bRotate		Should we rotate it ? (for upright screens) | 
 |  @brief      	Create an orthographic matrix. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixOrthoLHX( | 
 | 	PVRTMATRIXx	&mOut, | 
 | 	const int	w, | 
 | 	const int	h, | 
 | 	const int	zn, | 
 | 	const int	zf, | 
 | 	const bool  bRotate = false); | 
 |  | 
 | /*!*************************************************************************** | 
 |  @fn      		PVRTMatrixOrthoRHF | 
 |  @param[out]		mOut		Orthographic matrix | 
 |  @param[in]			w			Width of the screen | 
 |  @param[in]			h			Height of the screen | 
 |  @param[in]			zn			Near clipping distance | 
 |  @param[in]			zf			Far clipping distance | 
 |  @param[in]			bRotate		Should we rotate it ? (for upright screens) | 
 |  @brief      	Create an orthographic matrix. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixOrthoRHF( | 
 | 	PVRTMATRIXf	&mOut, | 
 | 	const float w, | 
 | 	const float h, | 
 | 	const float zn, | 
 | 	const float zf, | 
 | 	const bool  bRotate = false); | 
 | /*!*************************************************************************** | 
 |  @fn      		PVRTMatrixOrthoRHX | 
 |  @param[out]		mOut		Orthographic matrix | 
 |  @param[in]			w			Width of the screen | 
 |  @param[in]			h			Height of the screen | 
 |  @param[in]			zn			Near clipping distance | 
 |  @param[in]			zf			Far clipping distance | 
 |  @param[in]			bRotate		Should we rotate it ? (for upright screens) | 
 |  @brief      	Create an orthographic matrix. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixOrthoRHX( | 
 | 	PVRTMATRIXx	&mOut, | 
 | 	const int	w, | 
 | 	const int	h, | 
 | 	const int	zn, | 
 | 	const int	zf, | 
 | 	const bool  bRotate = false); | 
 |  | 
 | /*!*************************************************************************** | 
 |  @fn      			PVRTMatrixVec3LerpF | 
 |  @param[out]			vOut	Result of the interpolation | 
 |  @param[in]				v1		First vector to interpolate from | 
 |  @param[in]				v2		Second vector to interpolate form | 
 |  @param[in]				s		Coefficient of interpolation | 
 |  @brief      		This function performs the linear interpolation based on | 
 | 					the following formula: V1 + s(V2-V1). | 
 | *****************************************************************************/ | 
 | void PVRTMatrixVec3LerpF( | 
 | 	PVRTVECTOR3f		&vOut, | 
 | 	const PVRTVECTOR3f	&v1, | 
 | 	const PVRTVECTOR3f	&v2, | 
 | 	const float			s); | 
 | /*!*************************************************************************** | 
 |  @fn      			PVRTMatrixVec3LerpX | 
 |  @param[out]			vOut	Result of the interpolation | 
 |  @param[in]				v1		First vector to interpolate from | 
 |  @param[in]				v2		Second vector to interpolate form | 
 |  @param[in]				s		Coefficient of interpolation | 
 |  @brief      		This function performs the linear interpolation based on | 
 | 					the following formula: V1 + s(V2-V1). | 
 | *****************************************************************************/ | 
 | void PVRTMatrixVec3LerpX( | 
 | 	PVRTVECTOR3x		&vOut, | 
 | 	const PVRTVECTOR3x	&v1, | 
 | 	const PVRTVECTOR3x	&v2, | 
 | 	const int			s); | 
 |  | 
 | /*!*************************************************************************** | 
 |  @fn      			PVRTMatrixVec3DotProductF | 
 |  @param[in]				v1		First vector | 
 |  @param[in]				v2		Second vector | 
 |  @return			Dot product of the two vectors. | 
 |  @brief      		This function performs the dot product of the two | 
 | 					supplied vectors. | 
 | *****************************************************************************/ | 
 | float PVRTMatrixVec3DotProductF( | 
 | 	const PVRTVECTOR3f	&v1, | 
 | 	const PVRTVECTOR3f	&v2); | 
 | /*!*************************************************************************** | 
 |  @fn      			PVRTMatrixVec3DotProductX | 
 |  @param[in]				v1		First vector | 
 |  @param[in]				v2		Second vector | 
 |  @return			Dot product of the two vectors. | 
 |  @brief      		This function performs the dot product of the two | 
 | 					supplied vectors. | 
 | 					A single >> 16 shift could be applied to the final accumulated | 
 | 					result however this runs the risk of overflow between the | 
 | 					results of the intermediate additions. | 
 | *****************************************************************************/ | 
 | int PVRTMatrixVec3DotProductX( | 
 | 	const PVRTVECTOR3x	&v1, | 
 | 	const PVRTVECTOR3x	&v2); | 
 |  | 
 | /*!*************************************************************************** | 
 |  @fn      			PVRTMatrixVec3CrossProductF | 
 |  @param[out]			vOut	Cross product of the two vectors | 
 |  @param[in]				v1		First vector | 
 |  @param[in]				v2		Second vector | 
 |  @brief      		This function performs the cross product of the two | 
 | 					supplied vectors. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixVec3CrossProductF( | 
 | 	PVRTVECTOR3f		&vOut, | 
 | 	const PVRTVECTOR3f	&v1, | 
 | 	const PVRTVECTOR3f	&v2); | 
 | /*!*************************************************************************** | 
 |  @fn      			PVRTMatrixVec3CrossProductX | 
 |  @param[out]			vOut	Cross product of the two vectors | 
 |  @param[in]				v1		First vector | 
 |  @param[in]				v2		Second vector | 
 |  @brief      		This function performs the cross product of the two | 
 | 					supplied vectors. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixVec3CrossProductX( | 
 | 	PVRTVECTOR3x		&vOut, | 
 | 	const PVRTVECTOR3x	&v1, | 
 | 	const PVRTVECTOR3x	&v2); | 
 |  | 
 | /*!*************************************************************************** | 
 |  @fn      			PVRTMatrixVec3NormalizeF | 
 |  @param[out]			vOut	Normalized vector | 
 |  @param[in]				vIn		Vector to normalize | 
 |  @brief      		Normalizes the supplied vector. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixVec3NormalizeF( | 
 | 	PVRTVECTOR3f		&vOut, | 
 | 	const PVRTVECTOR3f	&vIn); | 
 | /*!*************************************************************************** | 
 |  @fn      			PVRTMatrixVec3NormalizeX | 
 |  @param[out]			vOut	Normalized vector | 
 |  @param[in]				vIn		Vector to normalize | 
 |  @brief      		Normalizes the supplied vector. | 
 | 					The square root function is currently still performed | 
 | 					in floating-point. | 
 | 					Original vector is scaled down prior to be normalized in | 
 | 					order to avoid overflow issues. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixVec3NormalizeX( | 
 | 	PVRTVECTOR3x		&vOut, | 
 | 	const PVRTVECTOR3x	&vIn); | 
 | /*!*************************************************************************** | 
 |  @fn      			PVRTMatrixVec3LengthF | 
 |  @param[in]				vIn		Vector to get the length of | 
 |  @return			The length of the vector | 
 |   @brief      		Gets the length of the supplied vector. | 
 | *****************************************************************************/ | 
 | float PVRTMatrixVec3LengthF( | 
 | 	const PVRTVECTOR3f	&vIn); | 
 | /*!*************************************************************************** | 
 |  @fn      			PVRTMatrixVec3LengthX | 
 |  @param[in]				vIn		Vector to get the length of | 
 |  @return			The length of the vector | 
 |  @brief      		Gets the length of the supplied vector | 
 | *****************************************************************************/ | 
 | int PVRTMatrixVec3LengthX( | 
 | 	const PVRTVECTOR3x	&vIn); | 
 | /*!*************************************************************************** | 
 |  @fn      			PVRTMatrixLinearEqSolveF | 
 |  @param[in]				pSrc	2D array of floats. 4 Eq linear problem is 5x4 | 
 | 							matrix, constants in first column | 
 |  @param[in]				nCnt	Number of equations to solve | 
 |  @param[out]			pRes	Result | 
 |  @brief      		Solves 'nCnt' simultaneous equations of 'nCnt' variables. | 
 | 					pRes should be an array large enough to contain the | 
 | 					results: the values of the 'nCnt' variables. | 
 | 					This fn recursively uses Gaussian Elimination. | 
 | *****************************************************************************/ | 
 |  | 
 | void PVRTMatrixLinearEqSolveF( | 
 | 	float		* const pRes, | 
 | 	float		** const pSrc, | 
 | 	const int	nCnt); | 
 | /*!*************************************************************************** | 
 |  @fn      			PVRTMatrixLinearEqSolveX | 
 |  @param[in]				pSrc	2D array of floats. 4 Eq linear problem is 5x4 | 
 | 							matrix, constants in first column | 
 |  @param[in]				nCnt	Number of equations to solve | 
 |  @param[out]			pRes	Result | 
 |  @brief      		Solves 'nCnt' simultaneous equations of 'nCnt' variables. | 
 | 					pRes should be an array large enough to contain the | 
 | 					results: the values of the 'nCnt' variables. | 
 | 					This fn recursively uses Gaussian Elimination. | 
 | *****************************************************************************/ | 
 | void PVRTMatrixLinearEqSolveX( | 
 | 	int			* const pRes, | 
 | 	int			** const pSrc, | 
 | 	const int	nCnt); | 
 |  | 
 | #endif | 
 |  | 
 | /***************************************************************************** | 
 |  End of file (PVRTMatrix.h) | 
 | *****************************************************************************/ | 
 |  |