www.pudn.com > Gimcrack-v0.0051-Source.zip > matrix.h


// 4x4 Matrix class 
// Handles matrices 
 
#ifndef _MATRIX_H_ 
#define _MATRIX_H_ 
#include "math.h" 
#include "vector.h" 
 
class GcMatrix4; 
 
class GcMatrix3 
{ 
	public: 
		GcMatrix3(); 
				 
		float &		operator[](int i); 
		GcMatrix3 &	operator=(const float * m ); 
		GcMatrix3 & operator=(const GcMatrix4 & m ); 
		GcMatrix3 &	operator*=( const GcMatrix3 & m ); 
		GcMatrix3	operator*( const GcMatrix3 & m ) const; 
		GcVector3	operator*( const GcVector3 & v ) const; 
		GcVector4	operator*( const GcVector4 & v ) const; 
		GcMatrix3	operator+( const GcMatrix3 & m ); 
		GcMatrix3	operator-( const GcMatrix3 & m ); 
		operator const float*() const; 
		operator float*(); 
 
 
		GcMatrix3 &	BuildFromEuler( const GcVector3 & angles ); 
		GcMatrix3 &	BuildFromEuler( const GcVector4 & angles ); 
		int			ConvertToEuler( GcVector3 & angles ) const; 
		int			ConvertToEuler( GcVector4 & angles ) const; 
		GcMatrix3 &	Transpose(); 
		GcMatrix3 &	SetIdentity(); 
		GcMatrix3 &	Translate( const GcVector3 & v ); 
		GcMatrix3 &	Translate( const GcVector4 & v ); 
		GcMatrix3 &	SetTranslation( const GcVector3 & v ); 
		GcMatrix3 &	SetTranslation( const GcVector4 & v ); 
		GcVector3	GetTranslation() const { return GcVector3( array[12], array[13], array[14] ); } 
		GcVector3	Axis( int i ) const; 
		GcVector3	XAxis() const { return GcVector3( array[0], array[4], array[8] ); } 
		GcVector3	YAxis() const { return GcVector3( array[1], array[5], array[9] ); } 
		GcVector3	ZAxis() const { return GcVector3( array[2], array[6], array[10] ); } 
 
		//GcVector4	GetTranslation() { return GcVector4( array[12], array[13], array[14], array[15] ); } 
		//GcVector4 &	Transform( GcVector3 &v ) const; 
		//GcVector4 &	Transform( GcVector4 &v ) const; 
 
	//protected: 
		float m_matrix[9]; 
	 
		union 
	    { 
		    struct 
			{ 
				float	a00, a10, a20, 
						a01, a11, a21, 
						a02, a12, a22; 
			}; 
			float array[9]; 
		}; 
 
 
}; 
 
class GcMatrix4 
{ 
	public: 
		GcMatrix4(); 
				 
		float &		operator[](int i); 
		GcMatrix4 &	operator=(const float * m ); 
		GcMatrix4 &	operator*=( const GcMatrix4 & m ); 
		GcMatrix4	operator*( const GcMatrix4 & m ) const; 
		GcVector3	operator*( const GcVector3 & v ) const; 
		GcVector4	operator*( const GcVector4 & v ) const; 
		GcMatrix4	operator+( const GcMatrix4 & m ); 
		GcMatrix4	operator-( const GcMatrix4 & m ); 
		operator const float*() const; 
		operator float*(); 
 
 
		GcMatrix4 &	BuildFromEuler( const GcVector3 & angles ); 
		GcMatrix4 &	BuildFromEuler( const GcVector4 & angles ); 
		int			ConvertToEuler( GcVector3 & angles ) const; 
		int			ConvertToEuler( GcVector4 & angles ) const; 
		GcMatrix4 &	Transpose(); 
		GcMatrix4 &	SetIdentity(); 
		GcMatrix4 &	Translate( const GcVector3 & v ); 
		GcMatrix4 &	Translate( const GcVector4 & v ); 
		GcMatrix4 &	SetTranslation( const GcVector3 & v ); 
		GcMatrix4 &	SetTranslation( const GcVector4 & v ); 
		GcVector3	GetTranslation() const { return GcVector3( array[12], array[13], array[14] ); } 
		GcVector3	Axis( int i ) const; 
		GcVector3	XAxis() const { return GcVector3( array[0], array[4], array[8] ); } 
		GcVector3	YAxis() const { return GcVector3( array[1], array[5], array[9] ); } 
		GcVector3	ZAxis() const { return GcVector3( array[2], array[6], array[10] ); } 
 
		//GcVector4	GetTranslation() { return GcVector4( array[12], array[13], array[14], array[15] ); } 
		//GcVector4 &	Transform( GcVector3 &v ) const; 
		//GcVector4 &	Transform( GcVector4 &v ) const; 
 
	//protected: 
		float m_matrix[16]; 
	 
		union 
	    { 
		    struct 
			{ 
				float	a00, a10, a20, a30, 
						a01, a11, a21, a31, 
						a02, a12, a22, a32, 
						a03, a13, a23, a33; 
			}; 
			float array[16]; 
		}; 
}; 
 
typedef GcMatrix3 Matrix3; 
typedef GcMatrix4 Matrix4; 
 
#endif // _MATRIX_H_