381 {
382 Matrix4<T> inv;
383 T det;
384
385 inv.MAT4_XX = m.MAT4_YY * m.MAT4_ZZ * m.MAT4_WW -
386 m.MAT4_YY * m.MAT4_ZW * m.MAT4_WZ -
387 m.MAT4_ZY * m.MAT4_YZ * m.MAT4_WW +
388 m.MAT4_ZY * m.MAT4_YW * m.MAT4_WZ +
389 m.MAT4_WY * m.MAT4_YZ * m.MAT4_ZW -
390 m.MAT4_WY * m.MAT4_YW * m.MAT4_ZZ;
391
392 inv.MAT4_YX = -m.MAT4_YX * m.MAT4_ZZ * m.MAT4_WW +
393 m.MAT4_YX * m.MAT4_ZW * m.MAT4_WZ +
394 m.MAT4_ZX * m.MAT4_YZ * m.MAT4_WW -
395 m.MAT4_ZX * m.MAT4_YW * m.MAT4_WZ -
396 m.MAT4_WX * m.MAT4_YZ * m.MAT4_ZW +
397 m.MAT4_WX * m.MAT4_YW * m.MAT4_ZZ;
398
399 inv.MAT4_ZX = m.MAT4_YX * m.MAT4_ZY * m.MAT4_WW -
400 m.MAT4_YX * m.MAT4_ZW * m.MAT4_WY -
401 m.MAT4_ZX * m.MAT4_YY * m.MAT4_WW +
402 m.MAT4_ZX * m.MAT4_YW * m.MAT4_WY +
403 m.MAT4_WX * m.MAT4_YY * m.MAT4_ZW -
404 m.MAT4_WX * m.MAT4_YW * m.MAT4_ZY;
405
406 inv.MAT4_WX = -m.MAT4_YX * m.MAT4_ZY * m.MAT4_WZ +
407 m.MAT4_YX * m.MAT4_ZZ * m.MAT4_WY +
408 m.MAT4_ZX * m.MAT4_YY * m.MAT4_WZ -
409 m.MAT4_ZX * m.MAT4_YZ * m.MAT4_WY -
410 m.MAT4_WX * m.MAT4_YY * m.MAT4_ZZ +
411 m.MAT4_WX * m.MAT4_YZ * m.MAT4_ZY;
412
413 inv.MAT4_XY = -m.MAT4_XY * m.MAT4_ZZ * m.MAT4_WW +
414 m.MAT4_XY * m.MAT4_ZW * m.MAT4_WZ +
415 m.MAT4_ZY * m.MAT4_XZ * m.MAT4_WW -
416 m.MAT4_ZY * m.MAT4_XW * m.MAT4_WZ -
417 m.MAT4_WY * m.MAT4_XZ * m.MAT4_ZW +
418 m.MAT4_WY * m.MAT4_XW * m.MAT4_ZZ;
419
420 inv.MAT4_YY = m.MAT4_XX * m.MAT4_ZZ * m.MAT4_WW -
421 m.MAT4_XX * m.MAT4_ZW * m.MAT4_WZ -
422 m.MAT4_ZX * m.MAT4_XZ * m.MAT4_WW +
423 m.MAT4_ZX * m.MAT4_XW * m.MAT4_WZ +
424 m.MAT4_WX * m.MAT4_XZ * m.MAT4_ZW -
425 m.MAT4_WX * m.MAT4_XW * m.MAT4_ZZ;
426
427 inv.MAT4_ZY = -m.MAT4_XX * m.MAT4_ZY * m.MAT4_WW +
428 m.MAT4_XX * m.MAT4_ZW * m.MAT4_WY +
429 m.MAT4_ZX * m.MAT4_XY * m.MAT4_WW -
430 m.MAT4_ZX * m.MAT4_XW * m.MAT4_WY -
431 m.MAT4_WX * m.MAT4_XY * m.MAT4_ZW +
432 m.MAT4_WX * m.MAT4_XW * m.MAT4_ZY;
433
434 inv.MAT4_WY = m.MAT4_XX * m.MAT4_ZY * m.MAT4_WZ -
435 m.MAT4_XX * m.MAT4_ZZ * m.MAT4_WY -
436 m.MAT4_ZX * m.MAT4_XY * m.MAT4_WZ +
437 m.MAT4_ZX * m.MAT4_XZ * m.MAT4_WY +
438 m.MAT4_WX * m.MAT4_XY * m.MAT4_ZZ -
439 m.MAT4_WX * m.MAT4_XZ * m.MAT4_ZY;
440
441 inv.MAT4_XZ = m.MAT4_XY * m.MAT4_YZ * m.MAT4_WW -
442 m.MAT4_XY * m.MAT4_YW * m.MAT4_WZ -
443 m.MAT4_YY * m.MAT4_XZ * m.MAT4_WW +
444 m.MAT4_YY * m.MAT4_XW * m.MAT4_WZ +
445 m.MAT4_WY * m.MAT4_XZ * m.MAT4_YW -
446 m.MAT4_WY * m.MAT4_XW * m.MAT4_YZ;
447
448 inv.MAT4_YZ = -m.MAT4_XX * m.MAT4_YZ * m.MAT4_WW +
449 m.MAT4_XX * m.MAT4_YW * m.MAT4_WZ +
450 m.MAT4_YX * m.MAT4_XZ * m.MAT4_WW -
451 m.MAT4_YX * m.MAT4_XW * m.MAT4_WZ -
452 m.MAT4_WX * m.MAT4_XZ * m.MAT4_YW +
453 m.MAT4_WX * m.MAT4_XW * m.MAT4_YZ;
454
455 inv.MAT4_ZZ = m.MAT4_XX * m.MAT4_YY * m.MAT4_WW -
456 m.MAT4_XX * m.MAT4_YW * m.MAT4_WY -
457 m.MAT4_YX * m.MAT4_XY * m.MAT4_WW +
458 m.MAT4_YX * m.MAT4_XW * m.MAT4_WY +
459 m.MAT4_WX * m.MAT4_XY * m.MAT4_YW -
460 m.MAT4_WX * m.MAT4_XW * m.MAT4_YY;
461
462 inv.MAT4_WZ = -m.MAT4_XX * m.MAT4_YY * m.MAT4_WZ +
463 m.MAT4_XX * m.MAT4_YZ * m.MAT4_WY +
464 m.MAT4_YX * m.MAT4_XY * m.MAT4_WZ -
465 m.MAT4_YX * m.MAT4_XZ * m.MAT4_WY -
466 m.MAT4_WX * m.MAT4_XY * m.MAT4_YZ +
467 m.MAT4_WX * m.MAT4_XZ * m.MAT4_YY;
468
469 inv.MAT4_XW = -m.MAT4_XY * m.MAT4_YZ * m.MAT4_ZW +
470 m.MAT4_XY * m.MAT4_YW * m.MAT4_ZZ +
471 m.MAT4_YY * m.MAT4_XZ * m.MAT4_ZW -
472 m.MAT4_YY * m.MAT4_XW * m.MAT4_ZZ -
473 m.MAT4_ZY * m.MAT4_XZ * m.MAT4_YW +
474 m.MAT4_ZY * m.MAT4_XW * m.MAT4_YZ;
475
476 inv.MAT4_YW = m.MAT4_XX * m.MAT4_YZ * m.MAT4_ZW -
477 m.MAT4_XX * m.MAT4_YW * m.MAT4_ZZ -
478 m.MAT4_YX * m.MAT4_XZ * m.MAT4_ZW +
479 m.MAT4_YX * m.MAT4_XW * m.MAT4_ZZ +
480 m.MAT4_ZX * m.MAT4_XZ * m.MAT4_YW -
481 m.MAT4_ZX * m.MAT4_XW * m.MAT4_YZ;
482
483 inv.MAT4_ZW = -m.MAT4_XX * m.MAT4_YY * m.MAT4_ZW +
484 m.MAT4_XX * m.MAT4_YW * m.MAT4_ZY +
485 m.MAT4_YX * m.MAT4_XY * m.MAT4_ZW -
486 m.MAT4_YX * m.MAT4_XW * m.MAT4_ZY -
487 m.MAT4_ZX * m.MAT4_XY * m.MAT4_YW +
488 m.MAT4_ZX * m.MAT4_XW * m.MAT4_YY;
489
490 inv.MAT4_WW = m.MAT4_XX * m.MAT4_YY * m.MAT4_ZZ -
491 m.MAT4_XX * m.MAT4_YZ * m.MAT4_ZY -
492 m.MAT4_YX * m.MAT4_XY * m.MAT4_ZZ +
493 m.MAT4_YX * m.MAT4_XZ * m.MAT4_ZY +
494 m.MAT4_ZX * m.MAT4_XY * m.MAT4_YZ -
495 m.MAT4_ZX * m.MAT4_XZ * m.MAT4_YY;
496
497 det = m.MAT4_XX * inv.MAT4_XX + m.MAT4_XY * inv.MAT4_YX + m.MAT4_XZ * inv.MAT4_ZX + m.MAT4_XW * inv.MAT4_WX;
498
499 if (det == 0)
500 return Identity();
501
502 det = 1.0 / det;
503
504 Matrix4<T> invOut;
505
506 invOut.MAT4_XX = inv.MAT4_XX * det;
507 invOut.MAT4_XY = inv.MAT4_XY * det;
508 invOut.MAT4_XZ = inv.MAT4_XZ * det;
509 invOut.MAT4_XW = inv.MAT4_XW * det;
510
511 invOut.MAT4_YX = inv.MAT4_YX * det;
512 invOut.MAT4_YY = inv.MAT4_YY * det;
513 invOut.MAT4_YZ = inv.MAT4_YZ * det;
514 invOut.MAT4_YW = inv.MAT4_YW * det;
515
516 invOut.MAT4_ZX = inv.MAT4_ZX * det;
517 invOut.MAT4_ZY = inv.MAT4_ZY * det;
518 invOut.MAT4_ZZ = inv.MAT4_ZZ * det;
519 invOut.MAT4_ZW = inv.MAT4_ZW * det;
520
521 invOut.MAT4_WX = inv.MAT4_WX * det;
522 invOut.MAT4_WY = inv.MAT4_WY * det;
523 invOut.MAT4_WZ = inv.MAT4_WZ * det;
524 invOut.MAT4_WW = inv.MAT4_WW * det;
525
526 return invOut;
527 }