Simple Vector Library 1.5 http://www.cs.cmu.edu/~ajw/doc/svl.html
Mat4.h@1:e25ff4b06ed2, 2016-01-05 (annotated)
- Committer:
- BartJanssens
- Date:
- Tue Jan 05 13:37:50 2016 +0000
- Revision:
- 1:e25ff4b06ed2
- Parent:
- 0:785cff1e5a7c
fixed va_list bug
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
BartJanssens | 0:785cff1e5a7c | 1 | /* |
BartJanssens | 0:785cff1e5a7c | 2 | File: Mat4.h |
BartJanssens | 0:785cff1e5a7c | 3 | |
BartJanssens | 0:785cff1e5a7c | 4 | Function: Defines a 4 x 4 matrix. |
BartJanssens | 0:785cff1e5a7c | 5 | |
BartJanssens | 0:785cff1e5a7c | 6 | Author(s): Andrew Willmott |
BartJanssens | 0:785cff1e5a7c | 7 | |
BartJanssens | 0:785cff1e5a7c | 8 | Copyright: (c) 1995-2001, Andrew Willmott |
BartJanssens | 0:785cff1e5a7c | 9 | */ |
BartJanssens | 0:785cff1e5a7c | 10 | |
BartJanssens | 0:785cff1e5a7c | 11 | #ifndef __Mat4__ |
BartJanssens | 0:785cff1e5a7c | 12 | #define __Mat4__ |
BartJanssens | 0:785cff1e5a7c | 13 | |
BartJanssens | 0:785cff1e5a7c | 14 | #include "Vec3.h" |
BartJanssens | 0:785cff1e5a7c | 15 | #include "Vec4.h" |
BartJanssens | 0:785cff1e5a7c | 16 | |
BartJanssens | 0:785cff1e5a7c | 17 | |
BartJanssens | 0:785cff1e5a7c | 18 | // --- Mat4 Class ------------------------------------------------------------- |
BartJanssens | 0:785cff1e5a7c | 19 | |
BartJanssens | 0:785cff1e5a7c | 20 | class Mat4 |
BartJanssens | 0:785cff1e5a7c | 21 | { |
BartJanssens | 0:785cff1e5a7c | 22 | public: |
BartJanssens | 0:785cff1e5a7c | 23 | |
BartJanssens | 0:785cff1e5a7c | 24 | // Constructors |
BartJanssens | 0:785cff1e5a7c | 25 | |
BartJanssens | 0:785cff1e5a7c | 26 | Mat4(); |
BartJanssens | 0:785cff1e5a7c | 27 | Mat4(Real a, Real b, Real c, Real d, |
BartJanssens | 0:785cff1e5a7c | 28 | Real e, Real f, Real g, Real h, |
BartJanssens | 0:785cff1e5a7c | 29 | Real i, Real j, Real k, Real l, |
BartJanssens | 0:785cff1e5a7c | 30 | Real m, Real n, Real o, Real p); |
BartJanssens | 0:785cff1e5a7c | 31 | Mat4(const Mat4 &m); |
BartJanssens | 0:785cff1e5a7c | 32 | Mat4(ZeroOrOne k); |
BartJanssens | 0:785cff1e5a7c | 33 | Mat4(Block k); |
BartJanssens | 0:785cff1e5a7c | 34 | |
BartJanssens | 0:785cff1e5a7c | 35 | // Accessor functions |
BartJanssens | 0:785cff1e5a7c | 36 | |
BartJanssens | 0:785cff1e5a7c | 37 | Int Rows() const { return(4); }; |
BartJanssens | 0:785cff1e5a7c | 38 | Int Cols() const { return(4); }; |
BartJanssens | 0:785cff1e5a7c | 39 | |
BartJanssens | 0:785cff1e5a7c | 40 | Vec4 &operator [] (Int i); |
BartJanssens | 0:785cff1e5a7c | 41 | const Vec4 &operator [] (Int i) const; |
BartJanssens | 0:785cff1e5a7c | 42 | |
BartJanssens | 0:785cff1e5a7c | 43 | Real *Ref() const; |
BartJanssens | 0:785cff1e5a7c | 44 | |
BartJanssens | 0:785cff1e5a7c | 45 | // Assignment operators |
BartJanssens | 0:785cff1e5a7c | 46 | |
BartJanssens | 0:785cff1e5a7c | 47 | Mat4 &operator = (const Mat4 &m); |
BartJanssens | 0:785cff1e5a7c | 48 | Mat4 &operator = (ZeroOrOne k); |
BartJanssens | 0:785cff1e5a7c | 49 | Mat4 &operator = (Block k); |
BartJanssens | 0:785cff1e5a7c | 50 | Mat4 &operator += (const Mat4 &m); |
BartJanssens | 0:785cff1e5a7c | 51 | Mat4 &operator -= (const Mat4 &m); |
BartJanssens | 0:785cff1e5a7c | 52 | Mat4 &operator *= (const Mat4 &m); |
BartJanssens | 0:785cff1e5a7c | 53 | Mat4 &operator *= (Real s); |
BartJanssens | 0:785cff1e5a7c | 54 | Mat4 &operator /= (Real s); |
BartJanssens | 0:785cff1e5a7c | 55 | |
BartJanssens | 0:785cff1e5a7c | 56 | // Comparison operators |
BartJanssens | 0:785cff1e5a7c | 57 | |
BartJanssens | 0:785cff1e5a7c | 58 | Bool operator == (const Mat4 &m) const; // M == N? |
BartJanssens | 0:785cff1e5a7c | 59 | Bool operator != (const Mat4 &m) const; // M != N? |
BartJanssens | 0:785cff1e5a7c | 60 | |
BartJanssens | 0:785cff1e5a7c | 61 | // Arithmetic operators |
BartJanssens | 0:785cff1e5a7c | 62 | |
BartJanssens | 0:785cff1e5a7c | 63 | Mat4 operator + (const Mat4 &m) const; // M + N |
BartJanssens | 0:785cff1e5a7c | 64 | Mat4 operator - (const Mat4 &m) const; // M - N |
BartJanssens | 0:785cff1e5a7c | 65 | Mat4 operator - () const; // -M |
BartJanssens | 0:785cff1e5a7c | 66 | Mat4 operator * (const Mat4 &m) const; // M * N |
BartJanssens | 0:785cff1e5a7c | 67 | Mat4 operator * (Real s) const; // M * s |
BartJanssens | 0:785cff1e5a7c | 68 | Mat4 operator / (Real s) const; // M / s |
BartJanssens | 0:785cff1e5a7c | 69 | |
BartJanssens | 0:785cff1e5a7c | 70 | // Initialisers |
BartJanssens | 0:785cff1e5a7c | 71 | |
BartJanssens | 0:785cff1e5a7c | 72 | Void MakeZero(); // Zero matrix |
BartJanssens | 0:785cff1e5a7c | 73 | Void MakeDiag(Real k = vl_one); // I |
BartJanssens | 0:785cff1e5a7c | 74 | Void MakeBlock(Real k = vl_one); // all elts = k |
BartJanssens | 0:785cff1e5a7c | 75 | |
BartJanssens | 0:785cff1e5a7c | 76 | // Homogeneous Transforms |
BartJanssens | 0:785cff1e5a7c | 77 | |
BartJanssens | 0:785cff1e5a7c | 78 | Mat4& MakeHRot(const Vec3 &axis, Real theta); |
BartJanssens | 0:785cff1e5a7c | 79 | // Rotate by theta radians about axis |
BartJanssens | 0:785cff1e5a7c | 80 | Mat4& MakeHRot(const Vec4 &q); // Rotate by quaternion |
BartJanssens | 0:785cff1e5a7c | 81 | Mat4& MakeHScale(const Vec3 &s); // Scale by components of s |
BartJanssens | 0:785cff1e5a7c | 82 | |
BartJanssens | 0:785cff1e5a7c | 83 | Mat4& MakeHTrans(const Vec3 &t); // Translation by t |
BartJanssens | 0:785cff1e5a7c | 84 | |
BartJanssens | 0:785cff1e5a7c | 85 | Mat4& Transpose(); // transpose in place |
BartJanssens | 0:785cff1e5a7c | 86 | Mat4& AddShift(const Vec3 &t); // Concatenate shift |
BartJanssens | 0:785cff1e5a7c | 87 | |
BartJanssens | 0:785cff1e5a7c | 88 | // Private... |
BartJanssens | 0:785cff1e5a7c | 89 | |
BartJanssens | 0:785cff1e5a7c | 90 | protected: |
BartJanssens | 0:785cff1e5a7c | 91 | |
BartJanssens | 0:785cff1e5a7c | 92 | Vec4 row[4]; |
BartJanssens | 0:785cff1e5a7c | 93 | }; |
BartJanssens | 0:785cff1e5a7c | 94 | |
BartJanssens | 0:785cff1e5a7c | 95 | |
BartJanssens | 0:785cff1e5a7c | 96 | // --- Matrix operators ------------------------------------------------------- |
BartJanssens | 0:785cff1e5a7c | 97 | |
BartJanssens | 0:785cff1e5a7c | 98 | Vec4 operator * (const Mat4 &m, const Vec4 &v); // m * v |
BartJanssens | 0:785cff1e5a7c | 99 | Vec4 operator * (const Vec4 &v, const Mat4 &m); // v * m |
BartJanssens | 0:785cff1e5a7c | 100 | Vec4 &operator *= (Vec4 &a, const Mat4 &m); // v *= m |
BartJanssens | 0:785cff1e5a7c | 101 | inline Mat4 operator * (Real s, const Mat4 &m); // s * m |
BartJanssens | 0:785cff1e5a7c | 102 | |
BartJanssens | 0:785cff1e5a7c | 103 | Mat4 trans(const Mat4 &m); // Transpose |
BartJanssens | 0:785cff1e5a7c | 104 | Real trace(const Mat4 &m); // Trace |
BartJanssens | 0:785cff1e5a7c | 105 | Mat4 adj(const Mat4 &m); // Adjoint |
BartJanssens | 0:785cff1e5a7c | 106 | Real det(const Mat4 &m); // Determinant |
BartJanssens | 0:785cff1e5a7c | 107 | Mat4 inv(const Mat4 &m); // Inverse |
BartJanssens | 0:785cff1e5a7c | 108 | Mat4 oprod(const Vec4 &a, const Vec4 &b); |
BartJanssens | 0:785cff1e5a7c | 109 | // Outer product |
BartJanssens | 0:785cff1e5a7c | 110 | |
BartJanssens | 0:785cff1e5a7c | 111 | // The xform functions help avoid dependence on whether row or column |
BartJanssens | 0:785cff1e5a7c | 112 | // vectors are used to represent points and vectors. |
BartJanssens | 0:785cff1e5a7c | 113 | inline Vec4 xform(const Mat4 &m, const Vec4 &v); // Transform of v by m |
BartJanssens | 0:785cff1e5a7c | 114 | inline Vec3 xform(const Mat4 &m, const Vec3 &v); // Hom. xform of v by m |
BartJanssens | 0:785cff1e5a7c | 115 | inline Mat4 xform(const Mat4 &m, const Mat4 &n); // Xform v -> m(n(v)) |
BartJanssens | 0:785cff1e5a7c | 116 | |
BartJanssens | 0:785cff1e5a7c | 117 | //std::ostream &operator << (std::ostream &s, const Mat4 &m); |
BartJanssens | 0:785cff1e5a7c | 118 | //std::istream &operator >> (std::istream &s, Mat4 &m); |
BartJanssens | 0:785cff1e5a7c | 119 | |
BartJanssens | 0:785cff1e5a7c | 120 | void printMat4(const Mat4 &m); |
BartJanssens | 0:785cff1e5a7c | 121 | |
BartJanssens | 0:785cff1e5a7c | 122 | // --- Inlines ---------------------------------------------------------------- |
BartJanssens | 0:785cff1e5a7c | 123 | |
BartJanssens | 0:785cff1e5a7c | 124 | inline Mat4::Mat4() |
BartJanssens | 0:785cff1e5a7c | 125 | { |
BartJanssens | 0:785cff1e5a7c | 126 | } |
BartJanssens | 0:785cff1e5a7c | 127 | |
BartJanssens | 0:785cff1e5a7c | 128 | inline Vec4 &Mat4::operator [] (Int i) |
BartJanssens | 0:785cff1e5a7c | 129 | { |
BartJanssens | 0:785cff1e5a7c | 130 | CheckRange(i, 0, 4, "(Mat4::[i]) index out of range"); |
BartJanssens | 0:785cff1e5a7c | 131 | return(row[i]); |
BartJanssens | 0:785cff1e5a7c | 132 | } |
BartJanssens | 0:785cff1e5a7c | 133 | |
BartJanssens | 0:785cff1e5a7c | 134 | inline const Vec4 &Mat4::operator [] (Int i) const |
BartJanssens | 0:785cff1e5a7c | 135 | { |
BartJanssens | 0:785cff1e5a7c | 136 | CheckRange(i, 0, 4, "(Mat4::[i]) index out of range"); |
BartJanssens | 0:785cff1e5a7c | 137 | return(row[i]); |
BartJanssens | 0:785cff1e5a7c | 138 | } |
BartJanssens | 0:785cff1e5a7c | 139 | |
BartJanssens | 0:785cff1e5a7c | 140 | inline Real *Mat4::Ref() const |
BartJanssens | 0:785cff1e5a7c | 141 | { |
BartJanssens | 0:785cff1e5a7c | 142 | return((Real *) row); |
BartJanssens | 0:785cff1e5a7c | 143 | } |
BartJanssens | 0:785cff1e5a7c | 144 | |
BartJanssens | 0:785cff1e5a7c | 145 | inline Mat4::Mat4(ZeroOrOne k) |
BartJanssens | 0:785cff1e5a7c | 146 | { |
BartJanssens | 0:785cff1e5a7c | 147 | MakeDiag(k); |
BartJanssens | 0:785cff1e5a7c | 148 | } |
BartJanssens | 0:785cff1e5a7c | 149 | |
BartJanssens | 0:785cff1e5a7c | 150 | inline Mat4::Mat4(Block k) |
BartJanssens | 0:785cff1e5a7c | 151 | { |
BartJanssens | 0:785cff1e5a7c | 152 | MakeBlock((ZeroOrOne) k); |
BartJanssens | 0:785cff1e5a7c | 153 | } |
BartJanssens | 0:785cff1e5a7c | 154 | |
BartJanssens | 0:785cff1e5a7c | 155 | inline Mat4 &Mat4::operator = (ZeroOrOne k) |
BartJanssens | 0:785cff1e5a7c | 156 | { |
BartJanssens | 0:785cff1e5a7c | 157 | MakeDiag(k); |
BartJanssens | 0:785cff1e5a7c | 158 | |
BartJanssens | 0:785cff1e5a7c | 159 | return(SELF); |
BartJanssens | 0:785cff1e5a7c | 160 | } |
BartJanssens | 0:785cff1e5a7c | 161 | |
BartJanssens | 0:785cff1e5a7c | 162 | inline Mat4 &Mat4::operator = (Block k) |
BartJanssens | 0:785cff1e5a7c | 163 | { |
BartJanssens | 0:785cff1e5a7c | 164 | MakeBlock((ZeroOrOne) k); |
BartJanssens | 0:785cff1e5a7c | 165 | |
BartJanssens | 0:785cff1e5a7c | 166 | return(SELF); |
BartJanssens | 0:785cff1e5a7c | 167 | } |
BartJanssens | 0:785cff1e5a7c | 168 | |
BartJanssens | 0:785cff1e5a7c | 169 | inline Mat4 operator * (Real s, const Mat4 &m) |
BartJanssens | 0:785cff1e5a7c | 170 | { |
BartJanssens | 0:785cff1e5a7c | 171 | return(m * s); |
BartJanssens | 0:785cff1e5a7c | 172 | } |
BartJanssens | 0:785cff1e5a7c | 173 | |
BartJanssens | 0:785cff1e5a7c | 174 | #ifdef VL_ROW_ORIENT |
BartJanssens | 0:785cff1e5a7c | 175 | inline Vec3 xform(const Mat4 &m, const Vec3 &v) |
BartJanssens | 0:785cff1e5a7c | 176 | { return(proj(Vec4(v, 1.0) * m)); } |
BartJanssens | 0:785cff1e5a7c | 177 | inline Vec4 xform(const Mat4 &m, const Vec4 &v) |
BartJanssens | 0:785cff1e5a7c | 178 | { return(v * m); } |
BartJanssens | 0:785cff1e5a7c | 179 | inline Mat4 xform(const Mat4 &m, const Mat4 &n) |
BartJanssens | 0:785cff1e5a7c | 180 | { return(n * m); } |
BartJanssens | 0:785cff1e5a7c | 181 | #else |
BartJanssens | 0:785cff1e5a7c | 182 | inline Vec3 xform(const Mat4 &m, const Vec3 &v) |
BartJanssens | 0:785cff1e5a7c | 183 | { return(proj(m * Vec4(v, 1.0))); } |
BartJanssens | 0:785cff1e5a7c | 184 | inline Vec4 xform(const Mat4 &m, const Vec4 &v) |
BartJanssens | 0:785cff1e5a7c | 185 | { return(m * v); } |
BartJanssens | 0:785cff1e5a7c | 186 | inline Mat4 xform(const Mat4 &m, const Mat4 &n) |
BartJanssens | 0:785cff1e5a7c | 187 | { return(m * n); } |
BartJanssens | 0:785cff1e5a7c | 188 | #endif |
BartJanssens | 0:785cff1e5a7c | 189 | |
BartJanssens | 0:785cff1e5a7c | 190 | #endif |