00001 /* 00002 File: Mat4.h 00003 00004 Function: Defines a 4 x 4 matrix. 00005 00006 Author(s): Andrew Willmott 00007 00008 Copyright: (c) 1995-2000, Andrew Willmott 00009 */ 00010 00011 #ifndef __Mat4__ 00012 #define __Mat4__ 00013 00014 #include "vl/VL.h" 00015 // Defines the actual type for TMat4 etc. 00016 #include "vl/Vec4.h" 00017 00018 00019 // --- Mat4 Class ------------------------------------------------------------- 00020 00021 class TVec3; 00022 00023 class TMat4 00024 { 00025 public: 00026 00027 // Constructors 00028 00029 inline TMat4(); 00030 TMat4(TMReal a, TMReal b, TMReal c, TMReal d, 00031 TMReal e, TMReal f, TMReal g, TMReal h, 00032 TMReal i, TMReal j, TMReal k, TMReal l, 00033 TMReal m, TMReal n, TMReal o, TMReal p); 00034 TMat4(const TMat4 &m); // Copy constructor 00035 TMat4(ZeroOrOne k); 00036 TMat4(Block k); 00037 00038 // Accessor functions 00039 inline Int Rows() const { return(4); }; 00040 inline Int Cols() const { return(4); }; 00041 00042 inline TMVec4 &operator [] (Int i); 00043 inline const TMVec4 &operator [] (Int i) const; 00044 00045 inline TMReal *Ref() const; // Return pointer to data 00046 00047 // Assignment operators 00048 TMat4 &operator = (const TMat4 &m); 00049 inline TMat4 &operator = (ZeroOrOne k); 00050 inline TMat4 &operator = (Block k); 00051 TMat4 &operator += (const TMat4 &m); 00052 TMat4 &operator -= (const TMat4 &m); 00053 TMat4 &operator *= (const TMat4 &m); 00054 TMat4 &operator *= (TMReal s); 00055 TMat4 &operator /= (TMReal s); 00056 00057 // Comparison operators 00058 Bool operator == (const TMat4 &m) const; // M == N? 00059 Bool operator != (const TMat4 &m) const; // M != N? 00060 00061 // Arithmetic operators 00062 TMat4 operator + (const TMat4 &m) const; // M + N 00063 TMat4 operator - (const TMat4 &m) const; // M - N 00064 TMat4 operator - () const; // -M 00065 TMat4 operator * (const TMat4 &m) const; // M * N 00066 TMat4 operator * (TMReal s) const; // M * s 00067 TMat4 operator / (TMReal s) const; // M / s 00068 00069 // Initialisers 00070 Void MakeZero(); // Zero matrix 00071 Void MakeDiag(TMReal k = vl_one); // I 00072 Void MakeBlock(TMReal k = vl_one); // all elts = k 00073 00074 // Homogeneous Transforms 00075 TMat4& MakeHRot(const TMVec3 &axis, Real theta); 00076 // Rotate by theta radians about axis 00077 TMat4& MakeHRot(const TQuaternion &q); // Rotate by quaternion 00078 TMat4& MakeHScale(const TMVec3 &s); // Scale by components of s 00079 00080 TMat4& MakeHTrans(const TMVec3 &t); // Translation by t 00081 00082 TMat4& Transpose(); // transpose in place 00083 TMat4& AddShift(const TMVec3 &t); // concat shift 00084 00085 // Private... 00086 protected: 00087 00088 TMVec4 row[4]; 00089 }; 00090 00091 00092 // --- Matrix operators ------------------------------------------------------- 00093 00094 TMVec4 operator * (const TMat4 &m, const TMVec4 &v); // m * v 00095 TMVec4 operator * (const TMVec4 &v, const TMat4 &m); // v * m 00096 TMVec4 &operator *= (TMVec4 &a, const TMat4 &m); // v *= m 00097 inline TMat4 operator * (TMReal s, const TMat4 &m); // s * m 00098 00099 TMat4 trans(const TMat4 &m); // Transpose 00100 TMReal trace(const TMat4 &m); // Trace 00101 TMat4 adj(const TMat4 &m); // Adjoint 00102 TMReal det(const TMat4 &m); // Determinant 00103 TMat4 inv(const TMat4 &m); // Inverse 00104 TMat4 oprod(const TMVec4 &a, const TMVec4 &b); 00105 // Outer product 00106 00107 // The xform functions help avoid dependence on whether row or column 00108 // vectors are used to represent points and vectors. 00109 inline TVec4 xform(const TMat4 &m, const TVec4 &v); // Transform of v by m 00110 inline TVec3 xform(const TMat4 &m, const TVec3 &v); // Hom. xform of v by m 00111 inline TMat4 xform(const TMat4 &m, const TMat4 &n); // Xform v -> m(n(v)) 00112 00113 ostream &operator << (ostream &s, const TMat4 &m); 00114 istream &operator >> (istream &s, TMat4 &m); 00115 00116 00117 // --- Inlines ---------------------------------------------------------------- 00118 00119 inline TMat4::TMat4() 00120 { 00121 } 00122 00123 inline TMVec4 &TMat4::operator [] (Int i) 00124 { 00125 CheckRange(i, 0, 4, "(Mat4::[i]) index out of range"); 00126 return(row[i]); 00127 } 00128 00129 inline const TMVec4 &TMat4::operator [] (Int i) const 00130 { 00131 CheckRange(i, 0, 4, "(Mat4::[i]) index out of range"); 00132 return(row[i]); 00133 } 00134 00135 inline TMReal *TMat4::Ref() const 00136 { 00137 return((TMReal *) row); 00138 } 00139 00140 inline TMat4::TMat4(ZeroOrOne k) 00141 { 00142 MakeDiag(k); 00143 } 00144 00145 inline TMat4::TMat4(Block k) 00146 { 00147 MakeBlock((ZeroOrOne) k); 00148 } 00149 00150 inline TMat4 &TMat4::operator = (ZeroOrOne k) 00151 { 00152 MakeDiag(k); 00153 00154 return(SELF); 00155 } 00156 00157 inline TMat4 &TMat4::operator = (Block k) 00158 { 00159 MakeBlock((ZeroOrOne) k); 00160 00161 return(SELF); 00162 } 00163 00164 inline TMat4 operator * (TMReal s, const TMat4 &m) 00165 { 00166 return(m * s); 00167 } 00168 00169 #ifdef VL_ROW_ORIENT 00170 inline TVec3 xform(const TMat4 &m, const TVec3 &v) 00171 { return(proj(TVec4(v, 1.0) * m)); } 00172 inline TVec4 xform(const TMat4 &m, const TVec4 &v) 00173 { return(v * m); } 00174 inline TMat4 xform(const TMat4 &m, const TMat4 &n) 00175 { return(n * m); } 00176 #else 00177 inline TVec3 xform(const TMat4 &m, const TVec3 &v) 00178 { return(proj(m * TVec4(v, 1.0))); } 00179 inline TVec4 xform(const TMat4 &m, const TVec4 &v) 00180 { return(m * v); } 00181 inline TMat4 xform(const TMat4 &m, const TMat4 &n) 00182 { return(m * n); } 00183 #endif 00184 00185 #endif