True Axis Physics SDK 1.2.0.1 Beta Documentation
www.trueaxis.com

Matrix.h

Go to the documentation of this file.
00001 //---------------------------------------------------------------------------------
00002 // File Name: Matrix.h
00003 // Description:
00006 //
00007 // Copyright (C) 2004 - 2006 True Axis Pty Ltd, Australia. 
00008 // All Rights Reserved.
00009 //
00010 // History:
00011 //      Created File.
00012 //---------------------------------------------------------------------------------
00013 
00014 #ifndef TA_MATRIX_H
00015 #define TA_MATRIX_H
00016 
00017 #ifndef TA_VECTOR_H
00018 #include "Vector.h"
00019 #endif // TA_VECTOR_H
00020 
00021 TA_OBFUSCATION_SKIP_PASS_2
00022 
00023 struct D3DXMATRIX;
00024 
00025 namespace TA
00026 {
00027 
00028 struct EulerAngles;
00029 
00030 struct TACOMMON_CLASS Mat33
00031 {
00032 public:
00033 TA_OBFUSCATION_RESERVED_FULL_ON
00034 
00035     // No hungarian m_ here for ease of use.
00036     Vec3 v3X;
00037     Vec3 v3Y;
00038     Vec3 v3Z;   
00039 
00040 TA_OBFUSCATION_RESERVED_FULL_OFF
00041 TA_OBFUSCATION_RESERVED_ON
00042 
00043     enum RotationAxis
00044     {
00045         ROTATION_AXIS_X = 0,
00046         ROTATION_AXIS_Y,
00047         ROTATION_AXIS_Z,
00048     };
00049 
00051 
00052     Mat33();
00053     //Mat33(const float* );
00054     Mat33(const Mat33& m33Value);
00055     Mat33(
00056         float f11, float f12, float f13,
00057         float f21, float f22, float f23,
00058         float f31, float f32, float f33);
00059     explicit Mat33(const EulerAngles& eulerAngles) { Initialise(eulerAngles); }
00060     Mat33(const Vec3& v3Axis, float fAngle) { Initialise(v3Axis, fAngle); }
00061     Mat33(RotationAxis eRotationAxis, float fAngle) { Initialise(eRotationAxis, fAngle); }
00062 
00063     void Initialise(const EulerAngles& eulerAngles);
00064     void Initialise(const Vec3& v3Axis, float fAngle);
00065     void Initialise(RotationAxis eRotationAxis, float fAngle);
00066     void SetToLookDownVector(const Vec3& v3Vector);
00067     void SetToLookAt(const Vec3& v3Vector, const Vec3& v3UpVector);
00068     void Interpolate(const Mat33& m33A, const Mat33& m33B, float fT);
00069 
00070     void Initialise(D3DXMATRIX* pD3DMatrix);
00071     void GetAsD3DMatrix(D3DXMATRIX* pD3DMatrix) const;
00073 
00075 
00076     float& operator () (int nRow, int nCol);
00077     float  operator () (int nRow, int nCol) const;
00078     Vec3& operator [] (int nRow);
00079     const Vec3&  operator [] (int nRow) const;
00081 
00082     // casting operators
00083 /*  explicit operator float* ();
00084     explicit operator const float* () const;*/
00085 
00087 
00088     Mat33& operator *= (const Mat33& m33Value);
00089     Mat33& operator /= (const Mat33& m33Value);
00090     Mat33& operator += (const Mat33& m33Value);
00091     Mat33& operator -= (const Mat33& m33Value);
00092     Mat33& operator *= (float fValue);
00093     Mat33& operator /= (float fValue);
00095 
00097 
00098     const Mat33& operator + () const;
00099     Mat33 operator - () const;
00101 
00103 
00104     Mat33 operator * (const Mat33& m33Value) const;
00105     Mat33 operator / (const Mat33& m33Value) const;
00106     Mat33 operator + (const Mat33& m33Value) const;
00107     Mat33 operator - (const Mat33& m33Value) const;
00108     Mat33 operator * (float fValue) const;
00109     Mat33 operator / (float fValue) const;
00111 
00112     friend Mat33 operator * (float fValue, const Mat33& m33Value);
00113     friend Vec3 TA_FAST_CALL operator * (const Vec3& v3A, const Mat33& m33B);
00114     friend Vec3 operator / (const Vec3& v3A, const Mat33& m33B);
00115     friend Vec3& operator *= (Vec3& v3A, const Mat33& m33B);
00116     friend Vec3& operator /= (Vec3& v3A, const Mat33& m33B);
00117 
00119 
00120     bool operator == (const Mat33& m33Value) const;
00121     bool operator != (const Mat33& m33Value) const;
00123 
00124     float& M11() { return v3X.x; }
00125     float& M12() { return v3X.y; }
00126     float& M13() { return v3X.z; }
00127 
00128     float& M21() { return v3Y.x; }
00129     float& M22() { return v3Y.y; }
00130     float& M23() { return v3Y.z; }
00131 
00132     float& M31() { return v3Z.x; }
00133     float& M32() { return v3Z.y; }
00134     float& M33() { return v3Z.z; }
00135 
00136     const float& M11() const { return v3X.x; }
00137     const float& M12() const { return v3X.y; }
00138     const float& M13() const { return v3X.z; }
00139 
00140     const float& M21() const { return v3Y.x; }
00141     const float& M22() const { return v3Y.y; }
00142     const float& M23() const { return v3Y.z; }
00143 
00144     const float& M31() const { return v3Z.x; }
00145     const float& M32() const { return v3Z.y; }
00146     const float& M33() const { return v3Z.z; }
00147 
00148     //Determinant
00149     static float TAC_CALL GetDeterminant(const Mat33& m33Value);
00150     float GetDeterminant() const;
00151 
00152     // Invert
00153     void Invert();
00154     static Mat33 TAC_CALL GetInverse(const Mat33& m33Value);
00155     Mat33 GetInverse() const;
00156 
00157     // Orthogonalise
00158     void Orthogonalise();
00159     bool IsOrthogonal() const;
00160 
00161     // Identity
00162     void SetToIdentity();
00163     static Mat33 TAC_CALL GetIdentity();
00164 
00165     // Transpose
00166     void Transpose();
00167     static Mat33 TAC_CALL GetTranspose(const Mat33& m33Value);
00168     Mat33 GetTranspose() const;
00169 
00170     // Transpose as a fast invert. Only works if the matrix is orthogonal. Asserts on failure in debug.
00171     void TransposeAsInvert();
00172     static Mat33 TAC_CALL GetTransposeAsInverse(const Mat33& m33Value);
00173     Mat33 GetTransposeAsInverse() const;
00174     
00175     //float GetRotationAbout(const Vec3& v3Axis) const;
00176     void GetRotationAxisAndMagnitude(Vec3& v3Axis, float& fAngle) const;
00177 
00178     void PreRotate(RotationAxis eRotationAxis, float fAngle);
00179 
00180     static void TA_FAST_CALL Mul(const Mat33& m33A, const Mat33& m33B, Mat33& m33Dst);
00181     static void TA_FAST_CALL MulInPlace(Mat33& m33A, const Mat33& m33B);
00182     static void TA_FAST_CALL MulByTranspose(const Mat33& m33A, const Mat33& m33B, Mat33& m33Dst);
00183     static void TA_FAST_CALL MulByTransposeInPlace(Mat33& m33A, const Mat33& m33B);
00184     static void TA_FAST_CALL MulByTranspose(const Vec3& v3A, const Mat33& m33B, Vec3& v3Dst);
00185 
00186 TA_OBFUSCATION_RESERVED_OFF
00187 };
00188 
00189 TA_OBFUSCATION_RESERVED_FULL_ON
00190 const Mat33 k_m33Identity(
00191     1.0f, 0.0f, 0.0f,
00192     0.0f, 1.0f, 0.0f,
00193     0.0f, 0.0f, 1.0f);
00194 TA_OBFUSCATION_RESERVED_FULL_OFF
00195 
00196 };
00197 
00198 #include "Matrix.inl"
00199 
00200 
00201 #endif // TA_MATRIX_H
00202 


© Copyright 2004-2006 TRUE AXIS PTY LTD Australia. All rights reserved.