Changeset 4905 for nanovis/trunk
- Timestamp:
- Dec 22, 2014 2:22:29 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
nanovis/trunk/vrmath/Matrix4x4f.cpp
r3628 r4905 230 230 void Matrix4x4f::multiply(const Matrix4x4f& m1, const Matrix4x4f& m2) 231 231 { 232 float mat[16]; 233 const float *mat1 = m1._data; 234 const float *mat2 = m2._data; 235 236 // 1 row 237 mat[0] = float(mat1[0] * mat2[0] + mat1[4] * mat2[1] + 238 mat1[8] * mat2[2] + mat1[12] * mat2[3]); 239 mat[4] = float(mat1[0] * mat2[4] + mat1[4] * mat2[5] + 240 mat1[8] * mat2[6] + mat1[12] * mat2[7]); 241 mat[8] = float(mat1[0] * mat2[8] + mat1[4] * mat2[9] + 242 mat1[8] * mat2[10] + mat1[12] * mat2[11]); 243 mat[12] = float(mat1[0] * mat2[12] + mat1[4] * mat2[13] + 244 mat1[8] * mat2[14] + mat1[12] * mat2[15]); 245 246 // 2 row 247 mat[1] = float(mat1[1] * mat2[0] + mat1[5] * mat2[1] + 248 mat1[9] * mat2[2] + mat1[13] * mat2[3]); 249 mat[5] = float(mat1[1] * mat2[4] + mat1[5] * mat2[5] + 250 mat1[9] * mat2[6] + mat1[13] * mat2[7]); 251 mat[9] = float(mat1[1] * mat2[8] + mat1[5] * mat2[9] + 252 mat1[9] * mat2[10] + mat1[13] * mat2[11]); 253 mat[13] = float(mat1[1] * mat2[12] + mat1[5] * mat2[13] + 254 mat1[9] * mat2[14] + mat1[13] * mat2[15]); 255 256 // 3 row 257 mat[2] = float(mat1[2] * mat2[0] + mat1[6] * mat2[1] + 258 mat1[10] * mat2[2] + mat1[14] * mat2[3]); 259 mat[6] = float(mat1[2] * mat2[4] + mat1[6] * mat2[5] + 260 mat1[10] * mat2[6] + mat1[14] * mat2[7]); 261 mat[10] = float(mat1[2] * mat2[8] + mat1[6] * mat2[9] + 262 mat1[10] * mat2[10] + mat1[14] * mat2[11]); 263 mat[14] = float(mat1[2] * mat2[12] + mat1[6] * mat2[13] + 264 mat1[10] * mat2[14] + mat1[14] * mat2[15]); 265 266 // 4 row 267 mat[3] = float(mat1[3] * mat2[0] + mat1[7] * mat2[1] + 268 mat1[11] * mat2[2] + mat1[15] * mat2[3]); 269 mat[7] = float(mat1[3] * mat2[4] + mat1[7] * mat2[5] + 270 mat1[11] * mat2[6] + mat1[15] * mat2[7]); 271 mat[11] = float(mat1[3] * mat2[8] + mat1[7] * mat2[9] + 272 mat1[11] * mat2[10] + mat1[15] * mat2[11]); 273 mat[15] = float(mat1[3] * mat2[12] + mat1[7] * mat2[13] + 274 mat1[11] * mat2[14] + mat1[15] * mat2[15]); 275 276 // set matrix 277 set(mat); 232 if (&m1 == this && &m2 != this) { 233 multiply(m2); 234 } else if (&m1 != this && &m2 != this) { 235 multiplyFast(m1, m2); 236 } else { 237 float mat[16]; 238 const float *mat1 = m1._data; 239 const float *mat2 = m2._data; 240 241 // 1 row 242 mat[0] = float(mat1[0] * mat2[0] + mat1[4] * mat2[1] + 243 mat1[8] * mat2[2] + mat1[12] * mat2[3]); 244 mat[4] = float(mat1[0] * mat2[4] + mat1[4] * mat2[5] + 245 mat1[8] * mat2[6] + mat1[12] * mat2[7]); 246 mat[8] = float(mat1[0] * mat2[8] + mat1[4] * mat2[9] + 247 mat1[8] * mat2[10] + mat1[12] * mat2[11]); 248 mat[12] = float(mat1[0] * mat2[12] + mat1[4] * mat2[13] + 249 mat1[8] * mat2[14] + mat1[12] * mat2[15]); 250 251 // 2 row 252 mat[1] = float(mat1[1] * mat2[0] + mat1[5] * mat2[1] + 253 mat1[9] * mat2[2] + mat1[13] * mat2[3]); 254 mat[5] = float(mat1[1] * mat2[4] + mat1[5] * mat2[5] + 255 mat1[9] * mat2[6] + mat1[13] * mat2[7]); 256 mat[9] = float(mat1[1] * mat2[8] + mat1[5] * mat2[9] + 257 mat1[9] * mat2[10] + mat1[13] * mat2[11]); 258 mat[13] = float(mat1[1] * mat2[12] + mat1[5] * mat2[13] + 259 mat1[9] * mat2[14] + mat1[13] * mat2[15]); 260 261 // 3 row 262 mat[2] = float(mat1[2] * mat2[0] + mat1[6] * mat2[1] + 263 mat1[10] * mat2[2] + mat1[14] * mat2[3]); 264 mat[6] = float(mat1[2] * mat2[4] + mat1[6] * mat2[5] + 265 mat1[10] * mat2[6] + mat1[14] * mat2[7]); 266 mat[10] = float(mat1[2] * mat2[8] + mat1[6] * mat2[9] + 267 mat1[10] * mat2[10] + mat1[14] * mat2[11]); 268 mat[14] = float(mat1[2] * mat2[12] + mat1[6] * mat2[13] + 269 mat1[10] * mat2[14] + mat1[14] * mat2[15]); 270 271 // 4 row 272 mat[3] = float(mat1[3] * mat2[0] + mat1[7] * mat2[1] + 273 mat1[11] * mat2[2] + mat1[15] * mat2[3]); 274 mat[7] = float(mat1[3] * mat2[4] + mat1[7] * mat2[5] + 275 mat1[11] * mat2[6] + mat1[15] * mat2[7]); 276 mat[11] = float(mat1[3] * mat2[8] + mat1[7] * mat2[9] + 277 mat1[11] * mat2[10] + mat1[15] * mat2[11]); 278 mat[15] = float(mat1[3] * mat2[12] + mat1[7] * mat2[13] + 279 mat1[11] * mat2[14] + mat1[15] * mat2[15]); 280 281 // set matrix 282 set(mat); 283 } 278 284 } 279 285 … … 500 506 void Matrix4x4f::invert(const Matrix4x4f& mat) 501 507 { 502 float *data = (float *)mat._data; 503 504 float det = 505 data[12] * data[9] * data[6] * data[3]- 506 data[8] * data[13] * data[6] * data[3]- 507 data[12] * data[5] * data[10] * data[3]+ 508 data[4] * data[13] * data[10] * data[3]+ 509 data[8] * data[5] * data[14] * data[3]- 510 data[4] * data[9] * data[14] * data[3]- 511 data[12] * data[9] * data[2] * data[7]+ 512 data[8] * data[13] * data[2] * data[7]+ 513 data[12] * data[1] * data[10] * data[7]- 514 data[0] * data[13] * data[10] * data[7]- 515 data[8] * data[1] * data[14] * data[7]+ 516 data[0] * data[9] * data[14] * data[7]+ 517 data[12] * data[5] * data[2] * data[11]- 518 data[4] * data[13] * data[2] * data[11]- 519 data[12] * data[1] * data[6] * data[11]+ 520 data[0] * data[13] * data[6] * data[11]+ 521 data[4] * data[1] * data[14] * data[11]- 522 data[0] * data[5] * data[14] * data[11]- 523 data[8] * data[5] * data[2] * data[15]+ 524 data[4] * data[9] * data[2] * data[15]+ 525 data[8] * data[1] * data[6] * data[15]- 526 data[0] * data[9] * data[6] * data[15]- 527 data[4] * data[1] * data[10] * data[15]+ 528 data[0] * data[5] * data[10] * data[15]; 529 530 if ( det == 0.0f ) return; 531 det = 1 / det; 532 533 float dstData[16]; 534 535 dstData[0] = (data[9]*data[14]*data[7] - 536 data[13]*data[10]*data[7] + 537 data[13]*data[6]*data[11] - 538 data[5]*data[14]*data[11] - 539 data[9]*data[6]*data[15] + 540 data[5]*data[10]*data[15]) * det; 541 542 dstData[4] = (data[12]*data[10]*data[7] - 543 data[8]*data[14]*data[7] - 544 data[12]*data[6]*data[11] + 545 data[4]*data[14]*data[11] + 546 data[8]*data[6]*data[15] - 547 data[4]*data[10]*data[15]) * det; 548 549 dstData[8] = (data[8]*data[13]*data[7] - 550 data[12]*data[9]*data[7] + 551 data[12]*data[5]*data[11] - 552 data[4]*data[13]*data[11] - 553 data[8]*data[5]*data[15] + 554 data[4]*data[9]*data[15]) * det; 555 556 dstData[12] = (data[12]*data[9]*data[6] - 557 data[8]*data[13]*data[6] - 558 data[12]*data[5]*data[10] + 559 data[4]*data[13]*data[10] + 560 data[8]*data[5]*data[14] - 561 data[4]*data[9]*data[14]) * det; 562 563 dstData[1] = (data[13]*data[10]*data[3] - 564 data[9]*data[14]*data[3] - 565 data[13]*data[2]*data[11] + 566 data[1]*data[14]*data[11] + 567 data[9]*data[2]*data[15] - 568 data[1]*data[10]*data[15]) * det; 569 570 dstData[5] = (data[8]*data[14]*data[3] - 571 data[12]*data[10]*data[3] + 572 data[12]*data[2]*data[11] - 573 data[0]*data[14]*data[11] - 574 data[8]*data[2]*data[15] + 575 data[0]*data[10]*data[15]) * det; 576 577 dstData[9] = (data[12]*data[9]*data[3] - 578 data[8]*data[13]*data[3] - 579 data[12]*data[1]*data[11] + 580 data[0]*data[13]*data[11] + 581 data[8]*data[1]*data[15] - 582 data[0]*data[9]*data[15]) * det; 583 584 dstData[13] = (data[8]*data[13]*data[2] - 585 data[12]*data[9]*data[2] + 586 data[12]*data[1]*data[10] - 587 data[0]*data[13]*data[10] - 588 data[8]*data[1]*data[14] + 589 data[0]*data[9]*data[14]) * det; 590 591 dstData[2] = (data[5]*data[14]*data[3] - 592 data[13]*data[6]*data[3] + 593 data[13]*data[2]*data[7] - 594 data[1]*data[14]*data[7] - 595 data[5]*data[2]*data[15] + 596 data[1]*data[6]*data[15]) * det; 597 598 dstData[6] = (data[12]*data[6]*data[3] - 599 data[4]*data[14]*data[3] - 600 data[12]*data[2]*data[7] + 601 data[0]*data[14]*data[7] + 602 data[4]*data[2]*data[15] - 603 data[0]*data[6]*data[15]) * det; 604 605 dstData[10] = (data[4]*data[13]*data[3] - 606 data[12]*data[5]*data[3] + 607 data[12]*data[1]*data[7] - 608 data[0]*data[13]*data[7] - 609 data[4]*data[1]*data[15] + 610 data[0]*data[5]*data[15]) * det; 611 612 dstData[14] = (data[12]*data[5]*data[2] - 613 data[4]*data[13]*data[2] - 614 data[12]*data[1]*data[6] + 615 data[0]*data[13]*data[6] + 616 data[4]*data[1]*data[14] - 617 data[0]*data[5]*data[14]) * det; 618 619 dstData[3] = (data[9]*data[6]*data[3] - 620 data[5]*data[10]*data[3] - 621 data[9]*data[2]*data[7] + 622 data[1]*data[10]*data[7] + 623 data[5]*data[2]*data[11] - 624 data[1]*data[6]*data[11]) * det; 625 626 dstData[7] = (data[4]*data[10]*data[3] - 627 data[8]*data[6]*data[3] + 628 data[8]*data[2]*data[7] - 629 data[0]*data[10]*data[7] - 630 data[4]*data[2]*data[11] + 631 data[0]*data[6]*data[11]) * det; 632 633 dstData[11] = (data[8]*data[5]*data[3] - 634 data[4]*data[9]*data[3] - 635 data[8]*data[1]*data[7] + 636 data[0]*data[9]*data[7] + 637 data[4]*data[1]*data[11] - 638 data[0]*data[5]*data[11]) * det; 639 640 dstData[15] = (data[4]*data[9]*data[2] - 641 data[8]*data[5]*data[2] + 642 data[8]*data[1]*data[6] - 643 data[0]*data[9]*data[6] - 644 data[4]*data[1]*data[10] + 645 data[0]*data[5]*data[10]) * det; 646 647 set(dstData); 508 if (&mat == this) { 509 invert(); 510 } else { 511 invertFast(mat); 512 } 648 513 } 649 514 … … 846 711 void Matrix4x4f::transpose(const Matrix4x4f& mat) 847 712 { 848 float m[16]; 849 850 m[0] = mat._data[0]; 851 m[1] = mat._data[4]; 852 m[2] = mat._data[8]; 853 m[3] = mat._data[12]; 854 855 m[4] = mat._data[1]; 856 m[5] = mat._data[5]; 857 m[6] = mat._data[9]; 858 m[7] = mat._data[13]; 859 860 m[8] = mat._data[2]; 861 m[9] = mat._data[6]; 862 m[10] = mat._data[10]; 863 m[11] = mat._data[14]; 864 865 m[12] = mat._data[3]; 866 m[13] = mat._data[7]; 867 m[14] = mat._data[11]; 868 m[15] = mat._data[15]; 869 870 set(m); 713 if (&mat == this) { 714 transpose(); 715 } else { 716 transposeFast(mat); 717 } 871 718 } 872 719
Note: See TracChangeset
for help on using the changeset viewer.