| 680 | } |
| 681 | |
| 682 | void xQuatSlerp(xQuat* q, const xQuat* a, const xQuat* b, F32 t) |
| 683 | { |
| 684 | F32 one_sintheta; |
| 685 | F32 temp_t; |
| 686 | F32 abdot; |
| 687 | xQuat b2; |
| 688 | |
| 689 | xQuat* qp1 = 0; |
| 690 | xQuat* qp2 = 0; |
| 691 | |
| 692 | abdot = xQuatDot(a, b); |
| 693 | if (abdot < 0.0) |
| 694 | { |
| 695 | abdot = -abdot; |
| 696 | b2.v.x = -b->v.x; |
| 697 | b2.v.y = -b->v.y; |
| 698 | b2.v.z = -b->v.z; |
| 699 | b2.s = -b->s; |
| 700 | b = &b2; |
| 701 | } |
| 702 | if (0.999 <= abdot) |
| 703 | { |
| 704 | temp_t = 1.0 - t; |
| 705 | } |
| 706 | else |
| 707 | { |
| 708 | abdot = xacos(abdot); |
| 709 | one_sintheta = 1.0 / isin(abdot); |
| 710 | temp_t = isin(t); |
| 711 | temp_t = one_sintheta * temp_t; |
| 712 | abdot = isin(t * abdot); |
| 713 | t = one_sintheta * abdot; |
| 714 | } |
| 715 | |
| 716 | xQuatSMul(qp1, a, temp_t); |
| 717 | xQuatSMul(qp2, b, t); |
| 718 | xQuatAdd(q, qp1, qp2); |
| 719 | xQuatNormalize(q, q); |
| 720 | return; |
| 721 | } |
| 722 | |
| 723 | void xQuatMul(xQuat* o, const xQuat* a, const xQuat* b) |
| 724 |
no test coverage detected