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