/*=========================================================================
*
* Matrix.h	- Matrix functions
*
* Version			1.0
* Revision date
*
*=======================================================================*/
#ifndef MATRIX_H
#define MATRIX_H 

//--- Includes --------------------------------------------------------

#include "MTH.h"

#include "typedef.h"

//--- Defines ---------------------------------------------------------

#define MLT_C_lMatrixIdentityFlag		0
#define MLT_C_lNotMatrixIdentityFlag	1
#define MLT_C_lMatrixRotatFlag			2
#define MLT_C_lMatrixScaleFlag			4
#define MLT_C_lMatrixTransFlag			8


//--- Structures ---------------------------------------------------------

typedef struct MLT_tdstMatrix_
{
  xString			sName;
  MTH_tdxReal		a9_xRotMatrix[3][3] ;
  MTH_tdxReal		a9_xScaleMatrix[3][3] ;
  MTH_tdxReal		a9_xTransformMatrix[3][3] ;
  MTH3D_tdstVector	stTranslation ;
  long lStateFlag;
} 
MLT_tdstMatrix;


//--- Functions ---------------------------------------------------------

extern  void 
MLT_xGetTranslationMatrix	( MLT_tdstMatrix	*p_stMatrix ,
                              MTH3D_tdstVector	*p_stTrs ) ;

extern  void 
MLT_xGetRotationMatrix		( MLT_tdstMatrix	*p_stMatrix ,
							  MTH3D_tdstVector	*p_stI ,
							  MTH3D_tdstVector	*p_stJ ,
							  MTH3D_tdstVector	*p_stK ) ;
extern  void 
MLT_xGetScaleMatrix			( MLT_tdstMatrix	*p_stMatrix ,
							  MTH3D_tdstVector	*p_stI ,
							  MTH3D_tdstVector	*p_stJ ,
							  MTH3D_tdstVector	*p_stK ) ;


extern  void 
MLT_xGetTransformMatrix		( MLT_tdstMatrix	*p_stMatrix ,
							  MTH3D_tdstVector	*p_stI ,
							  MTH3D_tdstVector	*p_stJ ,
							  MTH3D_tdstVector	*p_stK ) ;
extern  void 
MLT_xSetTranslationMatrix	( MLT_tdstMatrix	*p_stMatrix ,
							  MTH3D_tdstVector	*p_stTrs ) ;

extern  void 
MLT_xSetRotationMatrix		( MLT_tdstMatrix	*p_stMatrix ,
							  MTH3D_tdstVector	*p_stI ,
							  MTH3D_tdstVector	*p_stJ ,
							  MTH3D_tdstVector	*p_stK ) ;

extern  void 
MLT_xSetScaleMatrix			( MLT_tdstMatrix	*p_stMatrix ,
							  MTH3D_tdstVector	*p_stI ,
							  MTH3D_tdstVector	*p_stJ ,
							  MTH3D_tdstVector	*p_stK ) ;

extern  void 
MLT_xResetScaleMatrix		( MLT_tdstMatrix *p_stMatrix ) ;

extern  void 
MLT_xComputeTransformMatrix ( MLT_tdstMatrix *p_stMatrix ) ; 


extern  void 
MLT_xSetIdentityMatrix		( MLT_tdstMatrix *p_stMatrix ) ;

extern  void 
MLT_xNormalizeMatrix		( MLT_tdstMatrix *p_stMatrix ) ;

extern  void 
MLT_xInvertMatrix			( MLT_tdstMatrix *p_stDest , 
							  MLT_tdstMatrix *p_stSource );
extern  void 
MLT_xInvertIsoMatrix		( MLT_tdstMatrix *p_stDest ,
							  MLT_tdstMatrix *p_stSource ) ;

extern  void 
MLT_xMulMatrixVertex		( MTH3D_tdstVector	*p_stDest ,
							  MLT_tdstMatrix	*p_stMatrix ,
							  MTH3D_tdstVector	*p_stSource ) ;

extern  void 
MLT_xMulMatrixMatrix		( MLT_tdstMatrix *p_stDest ,
							  MLT_tdstMatrix *p_stA ,
							  MLT_tdstMatrix *p_stB ) ;

extern  void 
MLT_xTranspA9Matrix			( MTH_tdxReal p_xDest[3][3] ,
							  MTH_tdxReal p_xA[3][3] );

extern void 
MLT_xMulA9MatrixVertex		( MTH3D_tdstVector	*p_stDest ,
                              MTH_tdxReal		a9_xTable[3][3] ,
                              MTH3D_tdstVector	*p_stSource );
extern  void 
MLT_xMulA9MatrixMatrix		( MTH_tdxReal *p_xDest ,
							  MTH_tdxReal *p_xA ,
							  MTH_tdxReal *p_xB ) ;

extern  long 
MLT_lIsNotScaledMatrix		( MLT_tdstMatrix *p_stMatrix );

extern  long 
MLT_lIsIdentityMatrix		( MLT_tdstMatrix *p_stMatrix );


#endif //MATRIX_H

