Simple Vector Library 1.5 http://www.cs.cmu.edu/~ajw/doc/svl.html

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?

UserRevisionLine numberNew contents of line
BartJanssens 0:785cff1e5a7c 1 /*
BartJanssens 0:785cff1e5a7c 2 File: Mat4.cpp
BartJanssens 0:785cff1e5a7c 3
BartJanssens 0:785cff1e5a7c 4 Function: Implements Mat4.h
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
BartJanssens 0:785cff1e5a7c 12 #include "Mat4.h"
BartJanssens 0:785cff1e5a7c 13 //#include <cctype>
BartJanssens 0:785cff1e5a7c 14 //#include <iomanip>
BartJanssens 0:785cff1e5a7c 15
BartJanssens 0:785cff1e5a7c 16
BartJanssens 0:785cff1e5a7c 17 Mat4::Mat4(Real a, Real b, Real c, Real d,
BartJanssens 0:785cff1e5a7c 18 Real e, Real f, Real g, Real h,
BartJanssens 0:785cff1e5a7c 19 Real i, Real j, Real k, Real l,
BartJanssens 0:785cff1e5a7c 20 Real m, Real n, Real o, Real p)
BartJanssens 0:785cff1e5a7c 21 {
BartJanssens 0:785cff1e5a7c 22 row[0][0] = a; row[0][1] = b; row[0][2] = c; row[0][3] = d;
BartJanssens 0:785cff1e5a7c 23 row[1][0] = e; row[1][1] = f; row[1][2] = g; row[1][3] = h;
BartJanssens 0:785cff1e5a7c 24 row[2][0] = i; row[2][1] = j; row[2][2] = k; row[2][3] = l;
BartJanssens 0:785cff1e5a7c 25 row[3][0] = m; row[3][1] = n; row[3][2] = o; row[3][3] = p;
BartJanssens 0:785cff1e5a7c 26 }
BartJanssens 0:785cff1e5a7c 27
BartJanssens 0:785cff1e5a7c 28 Mat4::Mat4(const Mat4 &m)
BartJanssens 0:785cff1e5a7c 29 {
BartJanssens 0:785cff1e5a7c 30 row[0] = m[0];
BartJanssens 0:785cff1e5a7c 31 row[1] = m[1];
BartJanssens 0:785cff1e5a7c 32 row[2] = m[2];
BartJanssens 0:785cff1e5a7c 33 row[3] = m[3];
BartJanssens 0:785cff1e5a7c 34 }
BartJanssens 0:785cff1e5a7c 35
BartJanssens 0:785cff1e5a7c 36
BartJanssens 0:785cff1e5a7c 37 Mat4 &Mat4::operator = (const Mat4 &m)
BartJanssens 0:785cff1e5a7c 38 {
BartJanssens 0:785cff1e5a7c 39 row[0] = m[0];
BartJanssens 0:785cff1e5a7c 40 row[1] = m[1];
BartJanssens 0:785cff1e5a7c 41 row[2] = m[2];
BartJanssens 0:785cff1e5a7c 42 row[3] = m[3];
BartJanssens 0:785cff1e5a7c 43
BartJanssens 0:785cff1e5a7c 44 return(SELF);
BartJanssens 0:785cff1e5a7c 45 }
BartJanssens 0:785cff1e5a7c 46
BartJanssens 0:785cff1e5a7c 47 Mat4 &Mat4::operator += (const Mat4 &m)
BartJanssens 0:785cff1e5a7c 48 {
BartJanssens 0:785cff1e5a7c 49 row[0] += m[0];
BartJanssens 0:785cff1e5a7c 50 row[1] += m[1];
BartJanssens 0:785cff1e5a7c 51 row[2] += m[2];
BartJanssens 0:785cff1e5a7c 52 row[3] += m[3];
BartJanssens 0:785cff1e5a7c 53
BartJanssens 0:785cff1e5a7c 54 return(SELF);
BartJanssens 0:785cff1e5a7c 55 }
BartJanssens 0:785cff1e5a7c 56
BartJanssens 0:785cff1e5a7c 57 Mat4 &Mat4::operator -= (const Mat4 &m)
BartJanssens 0:785cff1e5a7c 58 {
BartJanssens 0:785cff1e5a7c 59 row[0] -= m[0];
BartJanssens 0:785cff1e5a7c 60 row[1] -= m[1];
BartJanssens 0:785cff1e5a7c 61 row[2] -= m[2];
BartJanssens 0:785cff1e5a7c 62 row[3] -= m[3];
BartJanssens 0:785cff1e5a7c 63
BartJanssens 0:785cff1e5a7c 64 return(SELF);
BartJanssens 0:785cff1e5a7c 65 }
BartJanssens 0:785cff1e5a7c 66
BartJanssens 0:785cff1e5a7c 67 Mat4 &Mat4::operator *= (const Mat4 &m)
BartJanssens 0:785cff1e5a7c 68 {
BartJanssens 0:785cff1e5a7c 69 SELF = SELF * m;
BartJanssens 0:785cff1e5a7c 70
BartJanssens 0:785cff1e5a7c 71 return(SELF);
BartJanssens 0:785cff1e5a7c 72 }
BartJanssens 0:785cff1e5a7c 73
BartJanssens 0:785cff1e5a7c 74 Mat4 &Mat4::operator *= (Real s)
BartJanssens 0:785cff1e5a7c 75 {
BartJanssens 0:785cff1e5a7c 76 row[0] *= s;
BartJanssens 0:785cff1e5a7c 77 row[1] *= s;
BartJanssens 0:785cff1e5a7c 78 row[2] *= s;
BartJanssens 0:785cff1e5a7c 79 row[3] *= s;
BartJanssens 0:785cff1e5a7c 80
BartJanssens 0:785cff1e5a7c 81 return(SELF);
BartJanssens 0:785cff1e5a7c 82 }
BartJanssens 0:785cff1e5a7c 83
BartJanssens 0:785cff1e5a7c 84 Mat4 &Mat4::operator /= (Real s)
BartJanssens 0:785cff1e5a7c 85 {
BartJanssens 0:785cff1e5a7c 86 row[0] /= s;
BartJanssens 0:785cff1e5a7c 87 row[1] /= s;
BartJanssens 0:785cff1e5a7c 88 row[2] /= s;
BartJanssens 0:785cff1e5a7c 89 row[3] /= s;
BartJanssens 0:785cff1e5a7c 90
BartJanssens 0:785cff1e5a7c 91 return(SELF);
BartJanssens 0:785cff1e5a7c 92 }
BartJanssens 0:785cff1e5a7c 93
BartJanssens 0:785cff1e5a7c 94
BartJanssens 0:785cff1e5a7c 95 Bool Mat4::operator == (const Mat4 &m) const
BartJanssens 0:785cff1e5a7c 96 {
BartJanssens 0:785cff1e5a7c 97 return(row[0] == m[0] && row[1] == m[1] && row[2] == m[2] && row[3] == m[3]);
BartJanssens 0:785cff1e5a7c 98 }
BartJanssens 0:785cff1e5a7c 99
BartJanssens 0:785cff1e5a7c 100 Bool Mat4::operator != (const Mat4 &m) const
BartJanssens 0:785cff1e5a7c 101 {
BartJanssens 0:785cff1e5a7c 102 return(row[0] != m[0] || row[1] != m[1] || row[2] != m[2] || row[3] != m[3]);
BartJanssens 0:785cff1e5a7c 103 }
BartJanssens 0:785cff1e5a7c 104
BartJanssens 0:785cff1e5a7c 105
BartJanssens 0:785cff1e5a7c 106 Mat4 Mat4::operator + (const Mat4 &m) const
BartJanssens 0:785cff1e5a7c 107 {
BartJanssens 0:785cff1e5a7c 108 Mat4 result;
BartJanssens 0:785cff1e5a7c 109
BartJanssens 0:785cff1e5a7c 110 result[0] = row[0] + m[0];
BartJanssens 0:785cff1e5a7c 111 result[1] = row[1] + m[1];
BartJanssens 0:785cff1e5a7c 112 result[2] = row[2] + m[2];
BartJanssens 0:785cff1e5a7c 113 result[3] = row[3] + m[3];
BartJanssens 0:785cff1e5a7c 114
BartJanssens 0:785cff1e5a7c 115 return(result);
BartJanssens 0:785cff1e5a7c 116 }
BartJanssens 0:785cff1e5a7c 117
BartJanssens 0:785cff1e5a7c 118 Mat4 Mat4::operator - (const Mat4 &m) const
BartJanssens 0:785cff1e5a7c 119 {
BartJanssens 0:785cff1e5a7c 120 Mat4 result;
BartJanssens 0:785cff1e5a7c 121
BartJanssens 0:785cff1e5a7c 122 result[0] = row[0] - m[0];
BartJanssens 0:785cff1e5a7c 123 result[1] = row[1] - m[1];
BartJanssens 0:785cff1e5a7c 124 result[2] = row[2] - m[2];
BartJanssens 0:785cff1e5a7c 125 result[3] = row[3] - m[3];
BartJanssens 0:785cff1e5a7c 126
BartJanssens 0:785cff1e5a7c 127 return(result);
BartJanssens 0:785cff1e5a7c 128 }
BartJanssens 0:785cff1e5a7c 129
BartJanssens 0:785cff1e5a7c 130 Mat4 Mat4::operator - () const
BartJanssens 0:785cff1e5a7c 131 {
BartJanssens 0:785cff1e5a7c 132 Mat4 result;
BartJanssens 0:785cff1e5a7c 133
BartJanssens 0:785cff1e5a7c 134 result[0] = -row[0];
BartJanssens 0:785cff1e5a7c 135 result[1] = -row[1];
BartJanssens 0:785cff1e5a7c 136 result[2] = -row[2];
BartJanssens 0:785cff1e5a7c 137 result[3] = -row[3];
BartJanssens 0:785cff1e5a7c 138
BartJanssens 0:785cff1e5a7c 139 return(result);
BartJanssens 0:785cff1e5a7c 140 }
BartJanssens 0:785cff1e5a7c 141
BartJanssens 0:785cff1e5a7c 142 Mat4 Mat4::operator * (const Mat4 &m) const
BartJanssens 0:785cff1e5a7c 143 {
BartJanssens 0:785cff1e5a7c 144 #define N(x,y) row[x][y]
BartJanssens 0:785cff1e5a7c 145 #define M(x,y) m[x][y]
BartJanssens 0:785cff1e5a7c 146 #define R(x,y) result[x][y]
BartJanssens 0:785cff1e5a7c 147
BartJanssens 0:785cff1e5a7c 148 Mat4 result;
BartJanssens 0:785cff1e5a7c 149
BartJanssens 0:785cff1e5a7c 150 R(0,0) = N(0,0) * M(0,0) + N(0,1) * M(1,0) + N(0,2) * M(2,0) + N(0,3) * M(3,0);
BartJanssens 0:785cff1e5a7c 151 R(0,1) = N(0,0) * M(0,1) + N(0,1) * M(1,1) + N(0,2) * M(2,1) + N(0,3) * M(3,1);
BartJanssens 0:785cff1e5a7c 152 R(0,2) = N(0,0) * M(0,2) + N(0,1) * M(1,2) + N(0,2) * M(2,2) + N(0,3) * M(3,2);
BartJanssens 0:785cff1e5a7c 153 R(0,3) = N(0,0) * M(0,3) + N(0,1) * M(1,3) + N(0,2) * M(2,3) + N(0,3) * M(3,3);
BartJanssens 0:785cff1e5a7c 154
BartJanssens 0:785cff1e5a7c 155 R(1,0) = N(1,0) * M(0,0) + N(1,1) * M(1,0) + N(1,2) * M(2,0) + N(1,3) * M(3,0);
BartJanssens 0:785cff1e5a7c 156 R(1,1) = N(1,0) * M(0,1) + N(1,1) * M(1,1) + N(1,2) * M(2,1) + N(1,3) * M(3,1);
BartJanssens 0:785cff1e5a7c 157 R(1,2) = N(1,0) * M(0,2) + N(1,1) * M(1,2) + N(1,2) * M(2,2) + N(1,3) * M(3,2);
BartJanssens 0:785cff1e5a7c 158 R(1,3) = N(1,0) * M(0,3) + N(1,1) * M(1,3) + N(1,2) * M(2,3) + N(1,3) * M(3,3);
BartJanssens 0:785cff1e5a7c 159
BartJanssens 0:785cff1e5a7c 160 R(2,0) = N(2,0) * M(0,0) + N(2,1) * M(1,0) + N(2,2) * M(2,0) + N(2,3) * M(3,0);
BartJanssens 0:785cff1e5a7c 161 R(2,1) = N(2,0) * M(0,1) + N(2,1) * M(1,1) + N(2,2) * M(2,1) + N(2,3) * M(3,1);
BartJanssens 0:785cff1e5a7c 162 R(2,2) = N(2,0) * M(0,2) + N(2,1) * M(1,2) + N(2,2) * M(2,2) + N(2,3) * M(3,2);
BartJanssens 0:785cff1e5a7c 163 R(2,3) = N(2,0) * M(0,3) + N(2,1) * M(1,3) + N(2,2) * M(2,3) + N(2,3) * M(3,3);
BartJanssens 0:785cff1e5a7c 164
BartJanssens 0:785cff1e5a7c 165 R(3,0) = N(3,0) * M(0,0) + N(3,1) * M(1,0) + N(3,2) * M(2,0) + N(3,3) * M(3,0);
BartJanssens 0:785cff1e5a7c 166 R(3,1) = N(3,0) * M(0,1) + N(3,1) * M(1,1) + N(3,2) * M(2,1) + N(3,3) * M(3,1);
BartJanssens 0:785cff1e5a7c 167 R(3,2) = N(3,0) * M(0,2) + N(3,1) * M(1,2) + N(3,2) * M(2,2) + N(3,3) * M(3,2);
BartJanssens 0:785cff1e5a7c 168 R(3,3) = N(3,0) * M(0,3) + N(3,1) * M(1,3) + N(3,2) * M(2,3) + N(3,3) * M(3,3);
BartJanssens 0:785cff1e5a7c 169
BartJanssens 0:785cff1e5a7c 170 return(result);
BartJanssens 0:785cff1e5a7c 171
BartJanssens 0:785cff1e5a7c 172 #undef N
BartJanssens 0:785cff1e5a7c 173 #undef M
BartJanssens 0:785cff1e5a7c 174 #undef R
BartJanssens 0:785cff1e5a7c 175 }
BartJanssens 0:785cff1e5a7c 176
BartJanssens 0:785cff1e5a7c 177 Mat4 Mat4::operator * (Real s) const
BartJanssens 0:785cff1e5a7c 178 {
BartJanssens 0:785cff1e5a7c 179 Mat4 result;
BartJanssens 0:785cff1e5a7c 180
BartJanssens 0:785cff1e5a7c 181 result[0] = row[0] * s;
BartJanssens 0:785cff1e5a7c 182 result[1] = row[1] * s;
BartJanssens 0:785cff1e5a7c 183 result[2] = row[2] * s;
BartJanssens 0:785cff1e5a7c 184 result[3] = row[3] * s;
BartJanssens 0:785cff1e5a7c 185
BartJanssens 0:785cff1e5a7c 186 return(result);
BartJanssens 0:785cff1e5a7c 187 }
BartJanssens 0:785cff1e5a7c 188
BartJanssens 0:785cff1e5a7c 189 Mat4 Mat4::operator / (Real s) const
BartJanssens 0:785cff1e5a7c 190 {
BartJanssens 0:785cff1e5a7c 191 Mat4 result;
BartJanssens 0:785cff1e5a7c 192
BartJanssens 0:785cff1e5a7c 193 result[0] = row[0] / s;
BartJanssens 0:785cff1e5a7c 194 result[1] = row[1] / s;
BartJanssens 0:785cff1e5a7c 195 result[2] = row[2] / s;
BartJanssens 0:785cff1e5a7c 196 result[3] = row[3] / s;
BartJanssens 0:785cff1e5a7c 197
BartJanssens 0:785cff1e5a7c 198 return(result);
BartJanssens 0:785cff1e5a7c 199 }
BartJanssens 0:785cff1e5a7c 200
BartJanssens 0:785cff1e5a7c 201 Vec4 operator * (const Mat4 &m, const Vec4 &v) // m * v
BartJanssens 0:785cff1e5a7c 202 {
BartJanssens 0:785cff1e5a7c 203 Vec4 result;
BartJanssens 0:785cff1e5a7c 204
BartJanssens 0:785cff1e5a7c 205 result[0] = v[0] * m[0][0] + v[1] * m[0][1] + v[2] * m[0][2] + v[3] * m[0][3];
BartJanssens 0:785cff1e5a7c 206 result[1] = v[0] * m[1][0] + v[1] * m[1][1] + v[2] * m[1][2] + v[3] * m[1][3];
BartJanssens 0:785cff1e5a7c 207 result[2] = v[0] * m[2][0] + v[1] * m[2][1] + v[2] * m[2][2] + v[3] * m[2][3];
BartJanssens 0:785cff1e5a7c 208 result[3] = v[0] * m[3][0] + v[1] * m[3][1] + v[2] * m[3][2] + v[3] * m[3][3];
BartJanssens 0:785cff1e5a7c 209
BartJanssens 0:785cff1e5a7c 210 return(result);
BartJanssens 0:785cff1e5a7c 211 }
BartJanssens 0:785cff1e5a7c 212
BartJanssens 0:785cff1e5a7c 213 Vec4 operator * (const Vec4 &v, const Mat4 &m) // v * m
BartJanssens 0:785cff1e5a7c 214 {
BartJanssens 0:785cff1e5a7c 215 Vec4 result;
BartJanssens 0:785cff1e5a7c 216
BartJanssens 0:785cff1e5a7c 217 result[0] = v[0] * m[0][0] + v[1] * m[1][0] + v[2] * m[2][0] + v[3] * m[3][0];
BartJanssens 0:785cff1e5a7c 218 result[1] = v[0] * m[0][1] + v[1] * m[1][1] + v[2] * m[2][1] + v[3] * m[3][1];
BartJanssens 0:785cff1e5a7c 219 result[2] = v[0] * m[0][2] + v[1] * m[1][2] + v[2] * m[2][2] + v[3] * m[3][2];
BartJanssens 0:785cff1e5a7c 220 result[3] = v[0] * m[0][3] + v[1] * m[1][3] + v[2] * m[2][3] + v[3] * m[3][3];
BartJanssens 0:785cff1e5a7c 221
BartJanssens 0:785cff1e5a7c 222 return(result);
BartJanssens 0:785cff1e5a7c 223 }
BartJanssens 0:785cff1e5a7c 224
BartJanssens 0:785cff1e5a7c 225 Vec4 &operator *= (Vec4 &v, const Mat4 &m) // v *= m
BartJanssens 0:785cff1e5a7c 226 {
BartJanssens 0:785cff1e5a7c 227 Real t0, t1, t2;
BartJanssens 0:785cff1e5a7c 228
BartJanssens 0:785cff1e5a7c 229 t0 = v[0] * m[0][0] + v[1] * m[1][0] + v[2] * m[2][0] + v[3] * m[3][0];
BartJanssens 0:785cff1e5a7c 230 t1 = v[0] * m[0][1] + v[1] * m[1][1] + v[2] * m[2][1] + v[3] * m[3][1];
BartJanssens 0:785cff1e5a7c 231 t2 = v[0] * m[0][2] + v[1] * m[1][2] + v[2] * m[2][2] + v[3] * m[3][2];
BartJanssens 0:785cff1e5a7c 232 v[3] = v[0] * m[0][3] + v[1] * m[1][3] + v[2] * m[2][3] + v[3] * m[3][3];
BartJanssens 0:785cff1e5a7c 233 v[0] = t0;
BartJanssens 0:785cff1e5a7c 234 v[1] = t1;
BartJanssens 0:785cff1e5a7c 235 v[2] = t2;
BartJanssens 0:785cff1e5a7c 236
BartJanssens 0:785cff1e5a7c 237 return(v);
BartJanssens 0:785cff1e5a7c 238 }
BartJanssens 0:785cff1e5a7c 239
BartJanssens 0:785cff1e5a7c 240 Mat4 trans(const Mat4 &m)
BartJanssens 0:785cff1e5a7c 241 {
BartJanssens 0:785cff1e5a7c 242 #define M(x,y) m[x][y]
BartJanssens 0:785cff1e5a7c 243 #define R(x,y) result[x][y]
BartJanssens 0:785cff1e5a7c 244
BartJanssens 0:785cff1e5a7c 245 Mat4 result;
BartJanssens 0:785cff1e5a7c 246
BartJanssens 0:785cff1e5a7c 247 R(0,0) = M(0,0); R(0,1) = M(1,0); R(0,2) = M(2,0); R(0,3) = M(3,0);
BartJanssens 0:785cff1e5a7c 248 R(1,0) = M(0,1); R(1,1) = M(1,1); R(1,2) = M(2,1); R(1,3) = M(3,1);
BartJanssens 0:785cff1e5a7c 249 R(2,0) = M(0,2); R(2,1) = M(1,2); R(2,2) = M(2,2); R(2,3) = M(3,2);
BartJanssens 0:785cff1e5a7c 250 R(3,0) = M(0,3); R(3,1) = M(1,3); R(3,2) = M(2,3); R(3,3) = M(3,3);
BartJanssens 0:785cff1e5a7c 251
BartJanssens 0:785cff1e5a7c 252 return(result);
BartJanssens 0:785cff1e5a7c 253
BartJanssens 0:785cff1e5a7c 254 #undef M
BartJanssens 0:785cff1e5a7c 255 #undef R
BartJanssens 0:785cff1e5a7c 256 }
BartJanssens 0:785cff1e5a7c 257
BartJanssens 0:785cff1e5a7c 258 Mat4 adj(const Mat4 &m)
BartJanssens 0:785cff1e5a7c 259 {
BartJanssens 0:785cff1e5a7c 260 Mat4 result;
BartJanssens 0:785cff1e5a7c 261
BartJanssens 0:785cff1e5a7c 262 result[0] = cross(m[1], m[2], m[3]);
BartJanssens 0:785cff1e5a7c 263 result[1] = -cross(m[0], m[2], m[3]);
BartJanssens 0:785cff1e5a7c 264 result[2] = cross(m[0], m[1], m[3]);
BartJanssens 0:785cff1e5a7c 265 result[3] = -cross(m[0], m[1], m[2]);
BartJanssens 0:785cff1e5a7c 266
BartJanssens 0:785cff1e5a7c 267 return(result);
BartJanssens 0:785cff1e5a7c 268 }
BartJanssens 0:785cff1e5a7c 269
BartJanssens 0:785cff1e5a7c 270 Real trace(const Mat4 &m)
BartJanssens 0:785cff1e5a7c 271 {
BartJanssens 0:785cff1e5a7c 272 return(m[0][0] + m[1][1] + m[2][2] + m[3][3]);
BartJanssens 0:785cff1e5a7c 273 }
BartJanssens 0:785cff1e5a7c 274
BartJanssens 0:785cff1e5a7c 275 Real det(const Mat4 &m)
BartJanssens 0:785cff1e5a7c 276 {
BartJanssens 0:785cff1e5a7c 277 return(dot(m[0], cross(m[1], m[2], m[3])));
BartJanssens 0:785cff1e5a7c 278 }
BartJanssens 0:785cff1e5a7c 279
BartJanssens 0:785cff1e5a7c 280 Mat4 inv(const Mat4 &m)
BartJanssens 0:785cff1e5a7c 281 {
BartJanssens 0:785cff1e5a7c 282 Real mDet;
BartJanssens 0:785cff1e5a7c 283 Mat4 adjoint;
BartJanssens 0:785cff1e5a7c 284 Mat4 result;
BartJanssens 0:785cff1e5a7c 285
BartJanssens 0:785cff1e5a7c 286 adjoint = adj(m); // Find the adjoint
BartJanssens 0:785cff1e5a7c 287 mDet = dot(adjoint[0], m[0]);
BartJanssens 0:785cff1e5a7c 288
BartJanssens 0:785cff1e5a7c 289 Assert(mDet != 0, "(Mat4::inv) matrix is non-singular");
BartJanssens 0:785cff1e5a7c 290
BartJanssens 0:785cff1e5a7c 291 result = trans(adjoint);
BartJanssens 0:785cff1e5a7c 292 result /= mDet;
BartJanssens 0:785cff1e5a7c 293
BartJanssens 0:785cff1e5a7c 294 return(result);
BartJanssens 0:785cff1e5a7c 295 }
BartJanssens 0:785cff1e5a7c 296
BartJanssens 0:785cff1e5a7c 297 Mat4 oprod(const Vec4 &a, const Vec4 &b)
BartJanssens 0:785cff1e5a7c 298 // returns outerproduct of a and b: a * trans(b)
BartJanssens 0:785cff1e5a7c 299 {
BartJanssens 0:785cff1e5a7c 300 Mat4 result;
BartJanssens 0:785cff1e5a7c 301
BartJanssens 0:785cff1e5a7c 302 result[0] = a[0] * b;
BartJanssens 0:785cff1e5a7c 303 result[1] = a[1] * b;
BartJanssens 0:785cff1e5a7c 304 result[2] = a[2] * b;
BartJanssens 0:785cff1e5a7c 305 result[3] = a[3] * b;
BartJanssens 0:785cff1e5a7c 306
BartJanssens 0:785cff1e5a7c 307 return(result);
BartJanssens 0:785cff1e5a7c 308 }
BartJanssens 0:785cff1e5a7c 309
BartJanssens 0:785cff1e5a7c 310 Void Mat4::MakeZero()
BartJanssens 0:785cff1e5a7c 311 {
BartJanssens 0:785cff1e5a7c 312 Int i;
BartJanssens 0:785cff1e5a7c 313
BartJanssens 0:785cff1e5a7c 314 for (i = 0; i < 16; i++)
BartJanssens 0:785cff1e5a7c 315 ((Real *) row)[i] = vl_zero;
BartJanssens 0:785cff1e5a7c 316 }
BartJanssens 0:785cff1e5a7c 317
BartJanssens 0:785cff1e5a7c 318 Void Mat4::MakeDiag(Real k)
BartJanssens 0:785cff1e5a7c 319 // default argument is vl_one
BartJanssens 0:785cff1e5a7c 320 {
BartJanssens 0:785cff1e5a7c 321 Int i, j;
BartJanssens 0:785cff1e5a7c 322
BartJanssens 0:785cff1e5a7c 323 for (i = 0; i < 4; i++)
BartJanssens 0:785cff1e5a7c 324 for (j = 0; j < 4; j++)
BartJanssens 0:785cff1e5a7c 325 if (i == j)
BartJanssens 0:785cff1e5a7c 326 row[i][j] = k;
BartJanssens 0:785cff1e5a7c 327 else
BartJanssens 0:785cff1e5a7c 328 row[i][j] = vl_zero;
BartJanssens 0:785cff1e5a7c 329 }
BartJanssens 0:785cff1e5a7c 330
BartJanssens 0:785cff1e5a7c 331 Void Mat4::MakeBlock(Real k)
BartJanssens 0:785cff1e5a7c 332 {
BartJanssens 0:785cff1e5a7c 333 Int i;
BartJanssens 0:785cff1e5a7c 334
BartJanssens 0:785cff1e5a7c 335 for (i = 0; i < 16; i++) {
BartJanssens 0:785cff1e5a7c 336 //printf("i = %d k = %f\r\n",i,k);
BartJanssens 0:785cff1e5a7c 337 ((Real *) row)[i] = k;
BartJanssens 0:785cff1e5a7c 338 }
BartJanssens 0:785cff1e5a7c 339 }
BartJanssens 0:785cff1e5a7c 340
BartJanssens 0:785cff1e5a7c 341 void printMat4(const Mat4 &m)
BartJanssens 0:785cff1e5a7c 342 {
BartJanssens 0:785cff1e5a7c 343 printf("[");
BartJanssens 0:785cff1e5a7c 344 printVec4(m[0]);
BartJanssens 0:785cff1e5a7c 345 printf("\r\n");
BartJanssens 0:785cff1e5a7c 346 printVec4(m[1]);
BartJanssens 0:785cff1e5a7c 347 printf("\r\n");
BartJanssens 0:785cff1e5a7c 348 printVec4(m[2]);
BartJanssens 0:785cff1e5a7c 349 printf("\r\n");
BartJanssens 0:785cff1e5a7c 350 printVec4(m[3]);
BartJanssens 0:785cff1e5a7c 351 printf("]\r\n");
BartJanssens 0:785cff1e5a7c 352 }
BartJanssens 0:785cff1e5a7c 353
BartJanssens 0:785cff1e5a7c 354 /*
BartJanssens 0:785cff1e5a7c 355 ostream &operator << (ostream &s, const Mat4 &m)
BartJanssens 0:785cff1e5a7c 356 {
BartJanssens 0:785cff1e5a7c 357 Int w = s.width();
BartJanssens 0:785cff1e5a7c 358
BartJanssens 0:785cff1e5a7c 359 return(s << '[' << m[0] << "\r\n" << setw(w) << m[1] << "\r\n"
BartJanssens 0:785cff1e5a7c 360 << setw(w) << m[2] << "\r\n" << setw(w) << m[3] << ']' << "\r\n");
BartJanssens 0:785cff1e5a7c 361 }
BartJanssens 0:785cff1e5a7c 362
BartJanssens 0:785cff1e5a7c 363 istream &operator >> (istream &s, Mat4 &m)
BartJanssens 0:785cff1e5a7c 364 {
BartJanssens 0:785cff1e5a7c 365 Mat4 result;
BartJanssens 0:785cff1e5a7c 366 Char c;
BartJanssens 0:785cff1e5a7c 367
BartJanssens 0:785cff1e5a7c 368 // Expected format: [[1 2 3] [4 5 6] [7 8 9]]
BartJanssens 0:785cff1e5a7c 369 // Each vector is a column of the matrix.
BartJanssens 0:785cff1e5a7c 370
BartJanssens 0:785cff1e5a7c 371 while (s >> c && isspace(c)) // ignore leading white space
BartJanssens 0:785cff1e5a7c 372 ;
BartJanssens 0:785cff1e5a7c 373
BartJanssens 0:785cff1e5a7c 374 if (c == '[')
BartJanssens 0:785cff1e5a7c 375 {
BartJanssens 0:785cff1e5a7c 376 s >> result[0] >> result[1] >> result[2] >> result[3];
BartJanssens 0:785cff1e5a7c 377
BartJanssens 0:785cff1e5a7c 378 if (!s)
BartJanssens 0:785cff1e5a7c 379 {
BartJanssens 0:785cff1e5a7c 380 cerr << "Expected number while reading matrix\n";
BartJanssens 0:785cff1e5a7c 381 return(s);
BartJanssens 0:785cff1e5a7c 382 }
BartJanssens 0:785cff1e5a7c 383
BartJanssens 0:785cff1e5a7c 384 while (s >> c && isspace(c))
BartJanssens 0:785cff1e5a7c 385 ;
BartJanssens 0:785cff1e5a7c 386
BartJanssens 0:785cff1e5a7c 387 if (c != ']')
BartJanssens 0:785cff1e5a7c 388 {
BartJanssens 0:785cff1e5a7c 389 s.clear(ios::failbit);
BartJanssens 0:785cff1e5a7c 390 cerr << "Expected ']' while reading matrix\n";
BartJanssens 0:785cff1e5a7c 391 return(s);
BartJanssens 0:785cff1e5a7c 392 }
BartJanssens 0:785cff1e5a7c 393 }
BartJanssens 0:785cff1e5a7c 394 else
BartJanssens 0:785cff1e5a7c 395 {
BartJanssens 0:785cff1e5a7c 396 s.clear(ios::failbit);
BartJanssens 0:785cff1e5a7c 397 cerr << "Expected '[' while reading matrix\n";
BartJanssens 0:785cff1e5a7c 398 return(s);
BartJanssens 0:785cff1e5a7c 399 }
BartJanssens 0:785cff1e5a7c 400
BartJanssens 0:785cff1e5a7c 401 m = result;
BartJanssens 0:785cff1e5a7c 402 return(s);
BartJanssens 0:785cff1e5a7c 403 }
BartJanssens 0:785cff1e5a7c 404 */
BartJanssens 0:785cff1e5a7c 405
BartJanssens 0:785cff1e5a7c 406
BartJanssens 0:785cff1e5a7c 407 Mat4& Mat4::MakeHRot(const Vec4 &q)
BartJanssens 0:785cff1e5a7c 408 {
BartJanssens 0:785cff1e5a7c 409 Real i2 = 2 * q[1],
BartJanssens 0:785cff1e5a7c 410 j2 = 2 * q[2],
BartJanssens 0:785cff1e5a7c 411 k2 = 2 * q[3],
BartJanssens 0:785cff1e5a7c 412 ij = i2 * q[2],
BartJanssens 0:785cff1e5a7c 413 ik = i2 * q[3],
BartJanssens 0:785cff1e5a7c 414 jk = j2 * q[3],
BartJanssens 0:785cff1e5a7c 415 ri = i2 * q[0],
BartJanssens 0:785cff1e5a7c 416 rj = j2 * q[0],
BartJanssens 0:785cff1e5a7c 417 rk = k2 * q[0];
BartJanssens 0:785cff1e5a7c 418
BartJanssens 0:785cff1e5a7c 419 MakeDiag();
BartJanssens 0:785cff1e5a7c 420
BartJanssens 0:785cff1e5a7c 421 i2 *= q[1];
BartJanssens 0:785cff1e5a7c 422 j2 *= q[2];
BartJanssens 0:785cff1e5a7c 423 k2 *= q[3];
BartJanssens 0:785cff1e5a7c 424
BartJanssens 0:785cff1e5a7c 425 #if VL_ROW_ORIENT
BartJanssens 0:785cff1e5a7c 426 row[0][0] = 1 - j2 - k2; row[0][1] = ij + rk ; row[0][2] = ik - rj;
BartJanssens 0:785cff1e5a7c 427 row[1][0] = ij - rk ; row[1][1] = 1 - i2- k2; row[1][2] = jk + ri;
BartJanssens 0:785cff1e5a7c 428 row[2][0] = ik + rj ; row[2][1] = jk - ri ; row[2][2] = 1 - i2 - j2;
BartJanssens 0:785cff1e5a7c 429 #else
BartJanssens 0:785cff1e5a7c 430 row[0][0] = 1 - j2 - k2; row[0][1] = ij - rk ; row[0][2] = ik + rj;
BartJanssens 0:785cff1e5a7c 431 row[1][0] = ij + rk ; row[1][1] = 1 - i2- k2; row[1][2] = jk - ri;
BartJanssens 0:785cff1e5a7c 432 row[2][0] = ik - rj ; row[2][1] = jk + ri ; row[2][2] = 1 - i2 - j2;
BartJanssens 0:785cff1e5a7c 433 #endif
BartJanssens 0:785cff1e5a7c 434
BartJanssens 0:785cff1e5a7c 435 return(SELF);
BartJanssens 0:785cff1e5a7c 436 }
BartJanssens 0:785cff1e5a7c 437
BartJanssens 0:785cff1e5a7c 438 Mat4& Mat4::MakeHRot(const Vec3 &axis, Real theta)
BartJanssens 0:785cff1e5a7c 439 {
BartJanssens 0:785cff1e5a7c 440 Real s;
BartJanssens 0:785cff1e5a7c 441 Vec4 q;
BartJanssens 0:785cff1e5a7c 442
BartJanssens 0:785cff1e5a7c 443 theta /= 2.0;
BartJanssens 0:785cff1e5a7c 444 s = sin(theta);
BartJanssens 0:785cff1e5a7c 445
BartJanssens 0:785cff1e5a7c 446 q[1] = s * axis[0];
BartJanssens 0:785cff1e5a7c 447 q[2] = s * axis[1];
BartJanssens 0:785cff1e5a7c 448 q[3] = s * axis[2];
BartJanssens 0:785cff1e5a7c 449 q[0] = cos(theta);
BartJanssens 0:785cff1e5a7c 450
BartJanssens 0:785cff1e5a7c 451 MakeHRot(q);
BartJanssens 0:785cff1e5a7c 452
BartJanssens 0:785cff1e5a7c 453 return(SELF);
BartJanssens 0:785cff1e5a7c 454 }
BartJanssens 0:785cff1e5a7c 455
BartJanssens 0:785cff1e5a7c 456 Mat4& Mat4::MakeHScale(const Vec3 &s)
BartJanssens 0:785cff1e5a7c 457 {
BartJanssens 0:785cff1e5a7c 458 MakeDiag();
BartJanssens 0:785cff1e5a7c 459
BartJanssens 0:785cff1e5a7c 460 row[0][0] = s[0];
BartJanssens 0:785cff1e5a7c 461 row[1][1] = s[1];
BartJanssens 0:785cff1e5a7c 462 row[2][2] = s[2];
BartJanssens 0:785cff1e5a7c 463
BartJanssens 0:785cff1e5a7c 464 return(SELF);
BartJanssens 0:785cff1e5a7c 465 }
BartJanssens 0:785cff1e5a7c 466
BartJanssens 0:785cff1e5a7c 467 Mat4& Mat4::MakeHTrans(const Vec3 &t)
BartJanssens 0:785cff1e5a7c 468 {
BartJanssens 0:785cff1e5a7c 469 MakeDiag();
BartJanssens 0:785cff1e5a7c 470
BartJanssens 0:785cff1e5a7c 471 #ifdef VL_ROW_ORIENT
BartJanssens 0:785cff1e5a7c 472 row[3][0] = t[0];
BartJanssens 0:785cff1e5a7c 473 row[3][1] = t[1];
BartJanssens 0:785cff1e5a7c 474 row[3][2] = t[2];
BartJanssens 0:785cff1e5a7c 475 #else
BartJanssens 0:785cff1e5a7c 476 row[0][3] = t[0];
BartJanssens 0:785cff1e5a7c 477 row[1][3] = t[1];
BartJanssens 0:785cff1e5a7c 478 row[2][3] = t[2];
BartJanssens 0:785cff1e5a7c 479 #endif
BartJanssens 0:785cff1e5a7c 480
BartJanssens 0:785cff1e5a7c 481 return(SELF);
BartJanssens 0:785cff1e5a7c 482 }
BartJanssens 0:785cff1e5a7c 483
BartJanssens 0:785cff1e5a7c 484 Mat4& Mat4::Transpose()
BartJanssens 0:785cff1e5a7c 485 {
BartJanssens 0:785cff1e5a7c 486 row[0][1] = row[1][0]; row[0][2] = row[2][0]; row[0][3] = row[3][0];
BartJanssens 0:785cff1e5a7c 487 row[1][0] = row[0][1]; row[1][2] = row[2][1]; row[1][3] = row[3][1];
BartJanssens 0:785cff1e5a7c 488 row[2][0] = row[0][2]; row[2][1] = row[1][2]; row[2][3] = row[3][2];
BartJanssens 0:785cff1e5a7c 489 row[3][0] = row[0][3]; row[3][1] = row[1][3]; row[3][2] = row[2][3];
BartJanssens 0:785cff1e5a7c 490
BartJanssens 0:785cff1e5a7c 491 return(SELF);
BartJanssens 0:785cff1e5a7c 492 }
BartJanssens 0:785cff1e5a7c 493
BartJanssens 0:785cff1e5a7c 494 Mat4& Mat4::AddShift(const Vec3 &t)
BartJanssens 0:785cff1e5a7c 495 {
BartJanssens 0:785cff1e5a7c 496 #ifdef VL_ROW_ORIENT
BartJanssens 0:785cff1e5a7c 497 row[3][0] += t[0];
BartJanssens 0:785cff1e5a7c 498 row[3][1] += t[1];
BartJanssens 0:785cff1e5a7c 499 row[3][2] += t[2];
BartJanssens 0:785cff1e5a7c 500 #else
BartJanssens 0:785cff1e5a7c 501 row[0][3] += t[0];
BartJanssens 0:785cff1e5a7c 502 row[1][3] += t[1];
BartJanssens 0:785cff1e5a7c 503 row[2][3] += t[2];
BartJanssens 0:785cff1e5a7c 504 #endif
BartJanssens 0:785cff1e5a7c 505
BartJanssens 0:785cff1e5a7c 506 return(SELF);
BartJanssens 0:785cff1e5a7c 507 }