162 inline Real* operator [] (
size_t iRow )
168 inline const Real *operator [] (
size_t iRow )
const
177 r.
m[0][0] = m[0][0] * m2.
m[0][0] + m[0][1] * m2.
m[1][0] + m[0][2] * m2.
m[2][0] + m[0][3] * m2.
m[3][0];
178 r.
m[0][1] = m[0][0] * m2.
m[0][1] + m[0][1] * m2.
m[1][1] + m[0][2] * m2.
m[2][1] + m[0][3] * m2.
m[3][1];
179 r.
m[0][2] = m[0][0] * m2.
m[0][2] + m[0][1] * m2.
m[1][2] + m[0][2] * m2.
m[2][2] + m[0][3] * m2.
m[3][2];
180 r.
m[0][3] = m[0][0] * m2.
m[0][3] + m[0][1] * m2.
m[1][3] + m[0][2] * m2.
m[2][3] + m[0][3] * m2.
m[3][3];
182 r.
m[1][0] = m[1][0] * m2.
m[0][0] + m[1][1] * m2.
m[1][0] + m[1][2] * m2.
m[2][0] + m[1][3] * m2.
m[3][0];
183 r.
m[1][1] = m[1][0] * m2.
m[0][1] + m[1][1] * m2.
m[1][1] + m[1][2] * m2.
m[2][1] + m[1][3] * m2.
m[3][1];
184 r.
m[1][2] = m[1][0] * m2.
m[0][2] + m[1][1] * m2.
m[1][2] + m[1][2] * m2.
m[2][2] + m[1][3] * m2.
m[3][2];
185 r.
m[1][3] = m[1][0] * m2.
m[0][3] + m[1][1] * m2.
m[1][3] + m[1][2] * m2.
m[2][3] + m[1][3] * m2.
m[3][3];
187 r.
m[2][0] = m[2][0] * m2.
m[0][0] + m[2][1] * m2.
m[1][0] + m[2][2] * m2.
m[2][0] + m[2][3] * m2.
m[3][0];
188 r.
m[2][1] = m[2][0] * m2.
m[0][1] + m[2][1] * m2.
m[1][1] + m[2][2] * m2.
m[2][1] + m[2][3] * m2.
m[3][1];
189 r.
m[2][2] = m[2][0] * m2.
m[0][2] + m[2][1] * m2.
m[1][2] + m[2][2] * m2.
m[2][2] + m[2][3] * m2.
m[3][2];
190 r.
m[2][3] = m[2][0] * m2.
m[0][3] + m[2][1] * m2.
m[1][3] + m[2][2] * m2.
m[2][3] + m[2][3] * m2.
m[3][3];
192 r.
m[3][0] = m[3][0] * m2.
m[0][0] + m[3][1] * m2.
m[1][0] + m[3][2] * m2.
m[2][0] + m[3][3] * m2.
m[3][0];
193 r.
m[3][1] = m[3][0] * m2.
m[0][1] + m[3][1] * m2.
m[1][1] + m[3][2] * m2.
m[2][1] + m[3][3] * m2.
m[3][1];
194 r.
m[3][2] = m[3][0] * m2.
m[0][2] + m[3][1] * m2.
m[1][2] + m[3][2] * m2.
m[2][2] + m[3][3] * m2.
m[3][2];
195 r.
m[3][3] = m[3][0] * m2.
m[0][3] + m[3][1] * m2.
m[1][3] + m[3][2] * m2.
m[2][3] + m[3][3] * m2.
m[3][3];
204 return concatenate( m2 );
220 Real fInvW = 1.0f / ( m[3][0] * v.
x + m[3][1] * v.
y + m[3][2] * v.
z + m[3][3] );
222 r.
x = ( m[0][0] * v.
x + m[0][1] * v.
y + m[0][2] * v.
z + m[0][3] ) * fInvW;
223 r.
y = ( m[1][0] * v.
x + m[1][1] * v.
y + m[1][2] * v.
z + m[1][3] ) * fInvW;
224 r.
z = ( m[2][0] * v.
x + m[2][1] * v.
y + m[2][2] * v.
z + m[2][3] ) * fInvW;
231 m[0][0] * v.
x + m[0][1] * v.
y + m[0][2] * v.
z + m[0][3] * v.
w,
232 m[1][0] * v.
x + m[1][1] * v.
y + m[1][2] * v.
z + m[1][3] * v.
w,
233 m[2][0] * v.
x + m[2][1] * v.
y + m[2][2] * v.
z + m[2][3] * v.
w,
234 m[3][0] * v.
x + m[3][1] * v.
y + m[3][2] * v.
z + m[3][3] * v.
w
258 r.
m[0][0] = m[0][0] + m2.
m[0][0];
259 r.
m[0][1] = m[0][1] + m2.
m[0][1];
260 r.
m[0][2] = m[0][2] + m2.
m[0][2];
261 r.
m[0][3] = m[0][3] + m2.
m[0][3];
263 r.
m[1][0] = m[1][0] + m2.
m[1][0];
264 r.
m[1][1] = m[1][1] + m2.
m[1][1];
265 r.
m[1][2] = m[1][2] + m2.
m[1][2];
266 r.
m[1][3] = m[1][3] + m2.
m[1][3];
268 r.
m[2][0] = m[2][0] + m2.
m[2][0];
269 r.
m[2][1] = m[2][1] + m2.
m[2][1];
270 r.
m[2][2] = m[2][2] + m2.
m[2][2];
271 r.
m[2][3] = m[2][3] + m2.
m[2][3];
273 r.
m[3][0] = m[3][0] + m2.
m[3][0];
274 r.
m[3][1] = m[3][1] + m2.
m[3][1];
275 r.
m[3][2] = m[3][2] + m2.
m[3][2];
276 r.
m[3][3] = m[3][3] + m2.
m[3][3];
286 r.
m[0][0] = m[0][0] - m2.
m[0][0];
287 r.
m[0][1] = m[0][1] - m2.
m[0][1];
288 r.
m[0][2] = m[0][2] - m2.
m[0][2];
289 r.
m[0][3] = m[0][3] - m2.
m[0][3];
291 r.
m[1][0] = m[1][0] - m2.
m[1][0];
292 r.
m[1][1] = m[1][1] - m2.
m[1][1];
293 r.
m[1][2] = m[1][2] - m2.
m[1][2];
294 r.
m[1][3] = m[1][3] - m2.
m[1][3];
296 r.
m[2][0] = m[2][0] - m2.
m[2][0];
297 r.
m[2][1] = m[2][1] - m2.
m[2][1];
298 r.
m[2][2] = m[2][2] - m2.
m[2][2];
299 r.
m[2][3] = m[2][3] - m2.
m[2][3];
301 r.
m[3][0] = m[3][0] - m2.
m[3][0];
302 r.
m[3][1] = m[3][1] - m2.
m[3][1];
303 r.
m[3][2] = m[3][2] - m2.
m[3][2];
304 r.
m[3][3] = m[3][3] - m2.
m[3][3];
314 m[0][0] != m2.
m[0][0] || m[0][1] != m2.
m[0][1] || m[0][2] != m2.
m[0][2] || m[0][3] != m2.
m[0][3] ||
315 m[1][0] != m2.
m[1][0] || m[1][1] != m2.
m[1][1] || m[1][2] != m2.
m[1][2] || m[1][3] != m2.
m[1][3] ||
316 m[2][0] != m2.
m[2][0] || m[2][1] != m2.
m[2][1] || m[2][2] != m2.
m[2][2] || m[2][3] != m2.
m[2][3] ||
317 m[3][0] != m2.
m[3][0] || m[3][1] != m2.
m[3][1] || m[3][2] != m2.
m[3][2] || m[3][3] != m2.
m[3][3] )
327 m[0][0] != m2.
m[0][0] || m[0][1] != m2.
m[0][1] || m[0][2] != m2.
m[0][2] || m[0][3] != m2.
m[0][3] ||
328 m[1][0] != m2.
m[1][0] || m[1][1] != m2.
m[1][1] || m[1][2] != m2.
m[1][2] || m[1][3] != m2.
m[1][3] ||
329 m[2][0] != m2.
m[2][0] || m[2][1] != m2.
m[2][1] || m[2][2] != m2.
m[2][2] || m[2][3] != m2.
m[2][3] ||
330 m[3][0] != m2.
m[3][0] || m[3][1] != m2.
m[3][1] || m[3][2] != m2.
m[3][2] || m[3][3] != m2.
m[3][3] )
337 inline void operator = (
const Matrix3& mat3 )
339 m[0][0] = mat3.
m[0][0]; m[0][1] = mat3.
m[0][1]; m[0][2] = mat3.
m[0][2];
340 m[1][0] = mat3.
m[1][0]; m[1][1] = mat3.
m[1][1]; m[1][2] = mat3.
m[1][2];
341 m[2][0] = mat3.
m[2][0]; m[2][1] = mat3.
m[2][1]; m[2][2] = mat3.
m[2][2];
346 return Matrix4(m[0][0], m[1][0], m[2][0], m[3][0],
347 m[0][1], m[1][1], m[2][1], m[3][1],
348 m[0][2], m[1][2], m[2][2], m[3][2],
349 m[0][3], m[1][3], m[2][3], m[3][3]);
370 return Vector3(m[0][3], m[1][3], m[2][3]);
378 m[0][0] = 1.0; m[0][1] = 0.0; m[0][2] = 0.0; m[0][3] = v.
x;
379 m[1][0] = 0.0; m[1][1] = 1.0; m[1][2] = 0.0; m[1][3] = v.
y;
380 m[2][0] = 0.0; m[2][1] = 0.0; m[2][2] = 1.0; m[2][3] = v.
z;
381 m[3][0] = 0.0; m[3][1] = 0.0; m[3][2] = 0.0; m[3][3] = 1.0;
386 m[0][0] = 1.0; m[0][1] = 0.0; m[0][2] = 0.0; m[0][3] = tx;
387 m[1][0] = 0.0; m[1][1] = 1.0; m[1][2] = 0.0; m[1][3] = ty;
388 m[2][0] = 0.0; m[2][1] = 0.0; m[2][2] = 1.0; m[2][3] = tz;
389 m[3][0] = 0.0; m[3][1] = 0.0; m[3][2] = 0.0; m[3][3] = 1.0;
398 r.
m[0][0] = 1.0; r.
m[0][1] = 0.0; r.
m[0][2] = 0.0; r.
m[0][3] = v.
x;
399 r.
m[1][0] = 0.0; r.
m[1][1] = 1.0; r.
m[1][2] = 0.0; r.
m[1][3] = v.
y;
400 r.
m[2][0] = 0.0; r.
m[2][1] = 0.0; r.
m[2][2] = 1.0; r.
m[2][3] = v.
z;
401 r.
m[3][0] = 0.0; r.
m[3][1] = 0.0; r.
m[3][2] = 0.0; r.
m[3][3] = 1.0;
412 r.
m[0][0] = 1.0; r.
m[0][1] = 0.0; r.
m[0][2] = 0.0; r.
m[0][3] = t_x;
413 r.
m[1][0] = 0.0; r.
m[1][1] = 1.0; r.
m[1][2] = 0.0; r.
m[1][3] = t_y;
414 r.
m[2][0] = 0.0; r.
m[2][1] = 0.0; r.
m[2][2] = 1.0; r.
m[2][3] = t_z;
415 r.
m[3][0] = 0.0; r.
m[3][1] = 0.0; r.
m[3][2] = 0.0; r.
m[3][3] = 1.0;
439 r.
m[0][0] = v.
x; r.
m[0][1] = 0.0; r.
m[0][2] = 0.0; r.
m[0][3] = 0.0;
440 r.
m[1][0] = 0.0; r.
m[1][1] = v.
y; r.
m[1][2] = 0.0; r.
m[1][3] = 0.0;
441 r.
m[2][0] = 0.0; r.
m[2][1] = 0.0; r.
m[2][2] = v.
z; r.
m[2][3] = 0.0;
442 r.
m[3][0] = 0.0; r.
m[3][1] = 0.0; r.
m[3][2] = 0.0; r.
m[3][3] = 1.0;
452 r.
m[0][0] = s_x; r.
m[0][1] = 0.0; r.
m[0][2] = 0.0; r.
m[0][3] = 0.0;
453 r.
m[1][0] = 0.0; r.
m[1][1] = s_y; r.
m[1][2] = 0.0; r.
m[1][3] = 0.0;
454 r.
m[2][0] = 0.0; r.
m[2][1] = 0.0; r.
m[2][2] = s_z; r.
m[2][3] = 0.0;
455 r.
m[3][0] = 0.0; r.
m[3][1] = 0.0; r.
m[3][2] = 0.0; r.
m[3][3] = 1.0;
465 m3x3.
m[0][0] = m[0][0];
466 m3x3.
m[0][1] = m[0][1];
467 m3x3.
m[0][2] = m[0][2];
468 m3x3.
m[1][0] = m[1][0];
469 m3x3.
m[1][1] = m[1][1];
470 m3x3.
m[1][2] = m[1][2];
471 m3x3.
m[2][0] = m[2][0];
472 m3x3.
m[2][1] = m[2][1];
473 m3x3.
m[2][2] = m[2][2];
481 Real t = m[0][0] * m[0][0] + m[1][0] * m[1][0] + m[2][0] * m[2][0];
484 t = m[0][1] * m[0][1] + m[1][1] * m[1][1] + m[2][1] * m[2][1];
487 t = m[0][2] * m[0][2] + m[1][2] * m[1][2] + m[2][2] * m[2][2];
497 return determinant() < 0;
505 extract3x3Matrix(m3x3);
519 scalar*m[0][0], scalar*m[0][1], scalar*m[0][2], scalar*m[0][3],
520 scalar*m[1][0], scalar*m[1][1], scalar*m[1][2], scalar*m[1][3],
521 scalar*m[2][0], scalar*m[2][1], scalar*m[2][2], scalar*m[2][3],
522 scalar*m[3][0], scalar*m[3][1], scalar*m[3][2], scalar*m[3][3]);
527 inline _OgreExport friend std::ostream&
operator <<
531 for (
size_t i = 0; i < 4; ++i)
533 o <<
" row" << (unsigned)i <<
"{";
534 for(
size_t j = 0; j < 4; ++j)
536 o << mat[i][j] <<
" ";
545 Real determinant()
const;
574 return m[3][0] == 0 && m[3][1] == 0 && m[3][2] == 0 && m[3][3] == 1;
581 Matrix4 inverseAffine(
void)
const;
589 assert(isAffine() && m2.
isAffine());
592 m[0][0] * m2.
m[0][0] + m[0][1] * m2.
m[1][0] + m[0][2] * m2.
m[2][0],
593 m[0][0] * m2.
m[0][1] + m[0][1] * m2.
m[1][1] + m[0][2] * m2.
m[2][1],
594 m[0][0] * m2.
m[0][2] + m[0][1] * m2.
m[1][2] + m[0][2] * m2.
m[2][2],
595 m[0][0] * m2.
m[0][3] + m[0][1] * m2.
m[1][3] + m[0][2] * m2.
m[2][3] + m[0][3],
597 m[1][0] * m2.
m[0][0] + m[1][1] * m2.
m[1][0] + m[1][2] * m2.
m[2][0],
598 m[1][0] * m2.
m[0][1] + m[1][1] * m2.
m[1][1] + m[1][2] * m2.
m[2][1],
599 m[1][0] * m2.
m[0][2] + m[1][1] * m2.
m[1][2] + m[1][2] * m2.
m[2][2],
600 m[1][0] * m2.
m[0][3] + m[1][1] * m2.
m[1][3] + m[1][2] * m2.
m[2][3] + m[1][3],
602 m[2][0] * m2.
m[0][0] + m[2][1] * m2.
m[1][0] + m[2][2] * m2.
m[2][0],
603 m[2][0] * m2.
m[0][1] + m[2][1] * m2.
m[1][1] + m[2][2] * m2.
m[2][1],
604 m[2][0] * m2.
m[0][2] + m[2][1] * m2.
m[1][2] + m[2][2] * m2.
m[2][2],
605 m[2][0] * m2.
m[0][3] + m[2][1] * m2.
m[1][3] + m[2][2] * m2.
m[2][3] + m[2][3],
622 m[0][0] * v.
x + m[0][1] * v.
y + m[0][2] * v.
z + m[0][3],
623 m[1][0] * v.
x + m[1][1] * v.
y + m[1][2] * v.
z + m[1][3],
624 m[2][0] * v.
x + m[2][1] * v.
y + m[2][2] * v.
z + m[2][3]);
636 m[0][0] * v.
x + m[0][1] * v.
y + m[0][2] * v.
z + m[0][3] * v.
w,
637 m[1][0] * v.
x + m[1][1] * v.
y + m[1][2] * v.
z + m[1][3] * v.
w,
638 m[2][0] * v.
x + m[2][1] * v.
y + m[2][2] * v.
z + m[2][3] * v.
w,
650 v.
x*mat[0][0] + v.
y*mat[1][0] + v.
z*mat[2][0] + v.
w*mat[3][0],
651 v.
x*mat[0][1] + v.
y*mat[1][1] + v.
z*mat[2][1] + v.
w*mat[3][1],
652 v.
x*mat[0][2] + v.
y*mat[1][2] + v.
z*mat[2][2] + v.
w*mat[3][2],
653 v.
x*mat[0][3] + v.
y*mat[1][3] + v.
z*mat[2][3] + v.
w*mat[3][3]