00001
00002
00003
00006
00007
00008
00009
00010
00011
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
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
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
00083
00084
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
00149 static float TAC_CALL GetDeterminant(const Mat33& m33Value);
00150 float GetDeterminant() const;
00151
00152
00153 void Invert();
00154 static Mat33 TAC_CALL GetInverse(const Mat33& m33Value);
00155 Mat33 GetInverse() const;
00156
00157
00158 void Orthogonalise();
00159 bool IsOrthogonal() const;
00160
00161
00162 void SetToIdentity();
00163 static Mat33 TAC_CALL GetIdentity();
00164
00165
00166 void Transpose();
00167 static Mat33 TAC_CALL GetTranspose(const Mat33& m33Value);
00168 Mat33 GetTranspose() const;
00169
00170
00171 void TransposeAsInvert();
00172 static Mat33 TAC_CALL GetTransposeAsInverse(const Mat33& m33Value);
00173 Mat33 GetTransposeAsInverse() const;
00174
00175
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.