15#ifndef MATH_STANDALONE
27 memset(m, 0,
sizeof(
float[2][2]));
32 memset(m, 0,
sizeof(
float[3][3]));
37 memset(m, 0,
sizeof(
float[4][4]));
42 m[0][0] = m[1][1] = 1.0f;
49 m[0][0] = m[1][1] = m[2][2] = 1.0f;
50 m[0][1] = m[0][2] = 0.0f;
51 m[1][0] = m[1][2] = 0.0f;
52 m[2][0] = m[2][1] = 0.0f;
57 m[0][0] = m[1][1] = m[2][2] = m[3][3] = 1.0f;
58 m[0][1] = m[0][2] = m[0][3] = 0.0f;
59 m[1][0] = m[1][2] = m[1][3] = 0.0f;
60 m[2][0] = m[2][1] = m[2][3] = 0.0f;
61 m[3][0] = m[3][1] = m[3][2] = 0.0f;
66 m[0][0] = m[1][1] = m[2][2] = m[3][3] = 1.0f;
67 m[0][1] = m[0][2] = m[0][3] = 0.0f;
68 m[1][0] = m[1][2] = m[1][3] = 0.0f;
69 m[2][0] = m[2][1] = m[2][3] = 0.0f;
70 m[3][0] = m[3][1] = m[3][2] = 0.0f;
75 memcpy(m1, m2,
sizeof(
float[2][2]));
81 memcpy(m1, m2,
sizeof(
float[3][3]));
86 memcpy(m1, m2,
sizeof(
float[4][4]));
91 memcpy(m1, m2,
sizeof(
double[4][4]));
212 m1[0][0] =
float(m2[0][0]);
213 m1[0][1] =
float(m2[0][1]);
214 m1[0][2] =
float(m2[0][2]);
216 m1[1][0] =
float(m2[1][0]);
217 m1[1][1] =
float(m2[1][1]);
218 m1[1][2] =
float(m2[1][2]);
220 m1[2][0] =
float(m2[2][0]);
221 m1[2][1] =
float(m2[2][1]);
222 m1[2][2] =
float(m2[2][2]);
230 for (i = 0; i < 3; i++) {
231 for (j = 0; j < 3; j++) {
244 for (i = 0; i < 4; i++) {
245 for (j = 0; j < 4; j++) {
256 for (
int k = 0; k < 4; k++) {
258 R[index[k]][k] = 1.0f;
276 __m128
A0 = _mm_loadu_ps(A[0]);
277 __m128
A1 = _mm_loadu_ps(A[1]);
278 __m128
A2 = _mm_loadu_ps(A[2]);
279 __m128 A3 = _mm_loadu_ps(A[3]);
281 for (
int i = 0; i < 4; i++) {
282 __m128 B0 = _mm_set1_ps(
B[i][0]);
283 __m128 B1 = _mm_set1_ps(
B[i][1]);
284 __m128 B2 = _mm_set1_ps(
B[i][2]);
285 __m128 B3 = _mm_set1_ps(
B[i][3]);
287 __m128
sum = _mm_add_ps(_mm_add_ps(_mm_mul_ps(B0,
A0), _mm_mul_ps(B1,
A1)),
288 _mm_add_ps(_mm_mul_ps(B2,
A2), _mm_mul_ps(B3, A3)));
290 _mm_storeu_ps(
R[i],
sum);
293 R[0][0] =
B[0][0] * A[0][0] +
B[0][1] * A[1][0] +
B[0][2] * A[2][0] +
B[0][3] * A[3][0];
294 R[0][1] =
B[0][0] * A[0][1] +
B[0][1] * A[1][1] +
B[0][2] * A[2][1] +
B[0][3] * A[3][1];
295 R[0][2] =
B[0][0] * A[0][2] +
B[0][1] * A[1][2] +
B[0][2] * A[2][2] +
B[0][3] * A[3][2];
296 R[0][3] =
B[0][0] * A[0][3] +
B[0][1] * A[1][3] +
B[0][2] * A[2][3] +
B[0][3] * A[3][3];
298 R[1][0] =
B[1][0] * A[0][0] +
B[1][1] * A[1][0] +
B[1][2] * A[2][0] +
B[1][3] * A[3][0];
299 R[1][1] =
B[1][0] * A[0][1] +
B[1][1] * A[1][1] +
B[1][2] * A[2][1] +
B[1][3] * A[3][1];
300 R[1][2] =
B[1][0] * A[0][2] +
B[1][1] * A[1][2] +
B[1][2] * A[2][2] +
B[1][3] * A[3][2];
301 R[1][3] =
B[1][0] * A[0][3] +
B[1][1] * A[1][3] +
B[1][2] * A[2][3] +
B[1][3] * A[3][3];
303 R[2][0] =
B[2][0] * A[0][0] +
B[2][1] * A[1][0] +
B[2][2] * A[2][0] +
B[2][3] * A[3][0];
304 R[2][1] =
B[2][0] * A[0][1] +
B[2][1] * A[1][1] +
B[2][2] * A[2][1] +
B[2][3] * A[3][1];
305 R[2][2] =
B[2][0] * A[0][2] +
B[2][1] * A[1][2] +
B[2][2] * A[2][2] +
B[2][3] * A[3][2];
306 R[2][3] =
B[2][0] * A[0][3] +
B[2][1] * A[1][3] +
B[2][2] * A[2][3] +
B[2][3] * A[3][3];
308 R[3][0] =
B[3][0] * A[0][0] +
B[3][1] * A[1][0] +
B[3][2] * A[2][0] +
B[3][3] * A[3][0];
309 R[3][1] =
B[3][0] * A[0][1] +
B[3][1] * A[1][1] +
B[3][2] * A[2][1] +
B[3][3] * A[3][1];
310 R[3][2] =
B[3][0] * A[0][2] +
B[3][1] * A[1][2] +
B[3][2] * A[2][2] +
B[3][3] * A[3][2];
311 R[3][3] =
B[3][0] * A[0][3] +
B[3][1] * A[1][3] +
B[3][2] * A[2][3] +
B[3][3] * A[3][3];
326 R[0][0] =
B[0][0] * A[0][0] +
B[0][1] * A[1][0] +
B[0][2] * A[2][0] +
B[0][3] * A[3][0];
327 R[0][1] =
B[0][0] * A[0][1] +
B[0][1] * A[1][1] +
B[0][2] * A[2][1] +
B[0][3] * A[3][1];
328 R[0][2] =
B[0][0] * A[0][2] +
B[0][1] * A[1][2] +
B[0][2] * A[2][2] +
B[0][3] * A[3][2];
329 R[0][3] =
B[0][0] * A[0][3] +
B[0][1] * A[1][3] +
B[0][2] * A[2][3] +
B[0][3] * A[3][3];
331 R[1][0] =
B[1][0] * A[0][0] +
B[1][1] * A[1][0] +
B[1][2] * A[2][0] +
B[1][3] * A[3][0];
332 R[1][1] =
B[1][0] * A[0][1] +
B[1][1] * A[1][1] +
B[1][2] * A[2][1] +
B[1][3] * A[3][1];
333 R[1][2] =
B[1][0] * A[0][2] +
B[1][1] * A[1][2] +
B[1][2] * A[2][2] +
B[1][3] * A[3][2];
334 R[1][3] =
B[1][0] * A[0][3] +
B[1][1] * A[1][3] +
B[1][2] * A[2][3] +
B[1][3] * A[3][3];
336 R[2][0] =
B[2][0] * A[0][0] +
B[2][1] * A[1][0] +
B[2][2] * A[2][0] +
B[2][3] * A[3][0];
337 R[2][1] =
B[2][0] * A[0][1] +
B[2][1] * A[1][1] +
B[2][2] * A[2][1] +
B[2][3] * A[3][1];
338 R[2][2] =
B[2][0] * A[0][2] +
B[2][1] * A[1][2] +
B[2][2] * A[2][2] +
B[2][3] * A[3][2];
339 R[2][3] =
B[2][0] * A[0][3] +
B[2][1] * A[1][3] +
B[2][2] * A[2][3] +
B[2][3] * A[3][3];
341 R[3][0] =
B[3][0] * A[0][0] +
B[3][1] * A[1][0] +
B[3][2] * A[2][0] +
B[3][3] * A[3][0];
342 R[3][1] =
B[3][0] * A[0][1] +
B[3][1] * A[1][1] +
B[3][2] * A[2][1] +
B[3][3] * A[3][1];
343 R[3][2] =
B[3][0] * A[0][2] +
B[3][1] * A[1][2] +
B[3][2] * A[2][2] +
B[3][3] * A[3][2];
344 R[3][3] =
B[3][0] * A[0][3] +
B[3][1] * A[1][3] +
B[3][2] * A[2][3] +
B[3][3] * A[3][3];
375 R[0][0] =
B[0][0] * A[0][0] +
B[0][1] * A[1][0] +
B[0][2] * A[2][0];
376 R[0][1] =
B[0][0] * A[0][1] +
B[0][1] * A[1][1] +
B[0][2] * A[2][1];
377 R[0][2] =
B[0][0] * A[0][2] +
B[0][1] * A[1][2] +
B[0][2] * A[2][2];
379 R[1][0] =
B[1][0] * A[0][0] +
B[1][1] * A[1][0] +
B[1][2] * A[2][0];
380 R[1][1] =
B[1][0] * A[0][1] +
B[1][1] * A[1][1] +
B[1][2] * A[2][1];
381 R[1][2] =
B[1][0] * A[0][2] +
B[1][1] * A[1][2] +
B[1][2] * A[2][2];
383 R[2][0] =
B[2][0] * A[0][0] +
B[2][1] * A[1][0] +
B[2][2] * A[2][0];
384 R[2][1] =
B[2][0] * A[0][1] +
B[2][1] * A[1][1] +
B[2][2] * A[2][1];
385 R[2][2] =
B[2][0] * A[0][2] +
B[2][1] * A[1][2] +
B[2][2] * A[2][2];
403 R[0][0] =
B[0][0] * A[0][0] +
B[0][1] * A[1][0] +
B[0][2] * A[2][0];
404 R[0][1] =
B[0][0] * A[0][1] +
B[0][1] * A[1][1] +
B[0][2] * A[2][1];
405 R[0][2] =
B[0][0] * A[0][2] +
B[0][1] * A[1][2] +
B[0][2] * A[2][2];
406 R[1][0] =
B[1][0] * A[0][0] +
B[1][1] * A[1][0] +
B[1][2] * A[2][0];
407 R[1][1] =
B[1][0] * A[0][1] +
B[1][1] * A[1][1] +
B[1][2] * A[2][1];
408 R[1][2] =
B[1][0] * A[0][2] +
B[1][1] * A[1][2] +
B[1][2] * A[2][2];
409 R[2][0] =
B[2][0] * A[0][0] +
B[2][1] * A[1][0] +
B[2][2] * A[2][0];
410 R[2][1] =
B[2][0] * A[0][1] +
B[2][1] * A[1][1] +
B[2][2] * A[2][1];
411 R[2][2] =
B[2][0] * A[0][2] +
B[2][1] * A[1][2] +
B[2][2] * A[2][2];
425 R[0][0] =
B[0][0] * A[0][0] +
B[0][1] * A[1][0] +
B[0][2] * A[2][0];
426 R[0][1] =
B[0][0] * A[0][1] +
B[0][1] * A[1][1] +
B[0][2] * A[2][1];
427 R[0][2] =
B[0][0] * A[0][2] +
B[0][1] * A[1][2] +
B[0][2] * A[2][2];
429 R[1][0] =
B[1][0] * A[0][0] +
B[1][1] * A[1][0] +
B[1][2] * A[2][0];
430 R[1][1] =
B[1][0] * A[0][1] +
B[1][1] * A[1][1] +
B[1][2] * A[2][1];
431 R[1][2] =
B[1][0] * A[0][2] +
B[1][1] * A[1][2] +
B[1][2] * A[2][2];
433 R[2][0] =
B[2][0] * A[0][0] +
B[2][1] * A[1][0] +
B[2][2] * A[2][0];
434 R[2][1] =
B[2][0] * A[0][1] +
B[2][1] * A[1][1] +
B[2][2] * A[2][1];
435 R[2][2] =
B[2][0] * A[0][2] +
B[2][1] * A[1][2] +
B[2][2] * A[2][2];
449 R[0][0] =
B[0][0] * A[0][0] +
B[0][1] * A[1][0] +
B[0][2] * A[2][0];
450 R[0][1] =
B[0][0] * A[0][1] +
B[0][1] * A[1][1] +
B[0][2] * A[2][1];
451 R[0][2] =
B[0][0] * A[0][2] +
B[0][1] * A[1][2] +
B[0][2] * A[2][2];
453 R[1][0] =
B[1][0] * A[0][0] +
B[1][1] * A[1][0] +
B[1][2] * A[2][0];
454 R[1][1] =
B[1][0] * A[0][1] +
B[1][1] * A[1][1] +
B[1][2] * A[2][1];
455 R[1][2] =
B[1][0] * A[0][2] +
B[1][1] * A[1][2] +
B[1][2] * A[2][2];
457 R[2][0] =
B[2][0] * A[0][0] +
B[2][1] * A[1][0] +
B[2][2] * A[2][0];
458 R[2][1] =
B[2][0] * A[0][1] +
B[2][1] * A[1][1] +
B[2][2] * A[2][1];
459 R[2][2] =
B[2][0] * A[0][2] +
B[2][1] * A[1][2] +
B[2][2] * A[2][2];
477 R[0][0] =
B[0][0] * A[0][0] +
B[0][1] * A[1][0] +
B[0][2] * A[2][0];
478 R[0][1] =
B[0][0] * A[0][1] +
B[0][1] * A[1][1] +
B[0][2] * A[2][1];
479 R[0][2] =
B[0][0] * A[0][2] +
B[0][1] * A[1][2] +
B[0][2] * A[2][2];
480 R[1][0] =
B[1][0] * A[0][0] +
B[1][1] * A[1][0] +
B[1][2] * A[2][0];
481 R[1][1] =
B[1][0] * A[0][1] +
B[1][1] * A[1][1] +
B[1][2] * A[2][1];
482 R[1][2] =
B[1][0] * A[0][2] +
B[1][1] * A[1][2] +
B[1][2] * A[2][2];
483 R[2][0] =
B[2][0] * A[0][0] +
B[2][1] * A[1][0] +
B[2][2] * A[2][0];
484 R[2][1] =
B[2][0] * A[0][1] +
B[2][1] * A[1][1] +
B[2][2] * A[2][1];
485 R[2][2] =
B[2][0] * A[0][2] +
B[2][1] * A[1][2] +
B[2][2] * A[2][2];
490 R[0][0] =
B[0][0] * A[0][0] +
B[0][1] * A[1][0] +
B[0][2] * A[2][0];
491 R[0][1] =
B[0][0] * A[0][1] +
B[0][1] * A[1][1] +
B[0][2] * A[2][1];
492 R[0][2] =
B[0][0] * A[0][2] +
B[0][1] * A[1][2] +
B[0][2] * A[2][2];
493 R[1][0] =
B[1][0] * A[0][0] +
B[1][1] * A[1][0] +
B[1][2] * A[2][0];
494 R[1][1] =
B[1][0] * A[0][1] +
B[1][1] * A[1][1] +
B[1][2] * A[2][1];
495 R[1][2] =
B[1][0] * A[0][2] +
B[1][1] * A[1][2] +
B[1][2] * A[2][2];
496 R[2][0] =
B[2][0] * A[0][0] +
B[2][1] * A[1][0] +
B[2][2] * A[2][0];
497 R[2][1] =
B[2][0] * A[0][1] +
B[2][1] * A[1][1] +
B[2][2] * A[2][1];
498 R[2][2] =
B[2][0] * A[0][2] +
B[2][1] * A[1][2] +
B[2][2] * A[2][2];
510 const float m1[3][3],
511 const float m2[3][3],
512 const float m3[3][3])
519 const float m1[3][3],
520 const float m2[3][3],
521 const float m3[3][3],
522 const float m4[3][3])
531 const float m1[3][3],
532 const float m2[3][3],
533 const float m3[3][3],
534 const float m4[3][3],
535 const float m5[3][3])
545 const float m1[3][3],
546 const float m2[3][3],
547 const float m3[3][3],
548 const float m4[3][3],
549 const float m5[3][3],
550 const float m6[3][3])
561 const float m1[3][3],
562 const float m2[3][3],
563 const float m3[3][3],
564 const float m4[3][3],
565 const float m5[3][3],
566 const float m6[3][3],
567 const float m7[3][3])
579 const float m1[3][3],
580 const float m2[3][3],
581 const float m3[3][3],
582 const float m4[3][3],
583 const float m5[3][3],
584 const float m6[3][3],
585 const float m7[3][3],
586 const float m8[3][3])
610 const float m1[4][4],
611 const float m2[4][4],
612 const float m3[4][4])
619 const float m1[4][4],
620 const float m2[4][4],
621 const float m3[4][4],
622 const float m4[4][4])
631 const float m1[4][4],
632 const float m2[4][4],
633 const float m3[4][4],
634 const float m4[4][4],
635 const float m5[4][4])
645 const float m1[4][4],
646 const float m2[4][4],
647 const float m3[4][4],
648 const float m4[4][4],
649 const float m5[4][4],
650 const float m6[4][4])
661 const float m1[4][4],
662 const float m2[4][4],
663 const float m3[4][4],
664 const float m4[4][4],
665 const float m5[4][4],
666 const float m6[4][4],
667 const float m7[4][4])
679 const float m1[4][4],
680 const float m2[4][4],
681 const float m3[4][4],
682 const float m4[4][4],
683 const float m5[4][4],
684 const float m6[4][4],
685 const float m7[4][4],
686 const float m8[4][4])
703 float temp[3], warped[3];
710 r[0] = warped[0] / warped[2];
711 r[1] = warped[1] / warped[2];
721 const float x = r[0];
722 const float y = r[1];
724 r[0] = x *
M[0][0] + y *
M[1][0] +
M[2][0] * r[2] +
M[3][0];
725 r[1] = x *
M[0][1] + y *
M[1][1] +
M[2][1] * r[2] +
M[3][1];
726 r[2] = x *
M[0][2] + y *
M[1][2] +
M[2][2] * r[2] +
M[3][2];
729void mul_v3_m4v3(
float r[3],
const float mat[4][4],
const float vec[3])
731 const float x = vec[0];
732 const float y = vec[1];
734 r[0] = x * mat[0][0] + y * mat[1][0] + mat[2][0] * vec[2] + mat[3][0];
735 r[1] = x * mat[0][1] + y * mat[1][1] + mat[2][1] * vec[2] + mat[3][1];
736 r[2] = x * mat[0][2] + y * mat[1][2] + mat[2][2] * vec[2] + mat[3][2];
741 const double x = vec[0];
742 const double y = vec[1];
744 r[0] = x * mat[0][0] + y * mat[1][0] + mat[2][0] * vec[2] + mat[3][0];
745 r[1] = x * mat[0][1] + y * mat[1][1] + mat[2][1] * vec[2] + mat[3][1];
746 r[2] = x * mat[0][2] + y * mat[1][2] + mat[2][2] * vec[2] + mat[3][2];
750 const double x = vec[0];
751 const double y = vec[1];
753 r[0] = x * mat[0][0] + y * mat[1][0] + mat[2][0] * vec[2] + mat[3][0];
754 r[1] = x * mat[0][1] + y * mat[1][1] + mat[2][1] * vec[2] + mat[3][1];
755 r[2] = x * mat[0][2] + y * mat[1][2] + mat[2][2] * vec[2] + mat[3][2];
756 r[3] = x * mat[0][3] + y * mat[1][3] + mat[2][3] * vec[2] + mat[3][3];
759void mul_v2_m4v3(
float r[2],
const float mat[4][4],
const float vec[3])
761 const float x = vec[0];
763 r[0] = x * mat[0][0] + vec[1] * mat[1][0] + mat[2][0] * vec[2] + mat[3][0];
764 r[1] = x * mat[0][1] + vec[1] * mat[1][1] + mat[2][1] * vec[2] + mat[3][1];
767void mul_v2_m2v2(
float r[2],
const float mat[2][2],
const float vec[2])
769 const float x = vec[0];
771 r[0] = mat[0][0] * x + mat[1][0] * vec[1];
772 r[1] = mat[0][1] * x + mat[1][1] * vec[1];
782 const float x = r[0];
783 const float y = r[1];
785 r[0] = x * mat[0][0] + y * mat[1][0] + mat[2][0] * r[2];
786 r[1] = x * mat[0][1] + y * mat[1][1] + mat[2][1] * r[2];
787 r[2] = x * mat[0][2] + y * mat[1][2] + mat[2][2] * r[2];
792 const float x = vec[0];
793 const float y = vec[1];
795 r[0] = x * mat[0][0] + y * mat[1][0] + mat[2][0] * vec[2];
796 r[1] = x * mat[0][1] + y * mat[1][1] + mat[2][1] * vec[2];
797 r[2] = x * mat[0][2] + y * mat[1][2] + mat[2][2] * vec[2];
802 const double x = vec[0];
803 const double y = vec[1];
805 r[0] = x * mat[0][0] + y * mat[1][0] + mat[2][0] * vec[2];
806 r[1] = x * mat[0][1] + y * mat[1][1] + mat[2][1] * vec[2];
807 r[2] = x * mat[0][2] + y * mat[1][2] + mat[2][2] * vec[2];
842 const float x =
v[0];
843 const float y =
v[1];
844 const float z =
v[2];
846 r[0] = x * mat[0][0] + y * mat[1][0] +
z * mat[2][0] + mat[3][0] *
v[3];
847 r[1] = x * mat[0][1] + y * mat[1][1] +
z * mat[2][1] + mat[3][1] *
v[3];
848 r[2] = x * mat[0][2] + y * mat[1][2] +
z * mat[2][2] + mat[3][2] *
v[3];
849 r[3] = x * mat[0][3] + y * mat[1][3] +
z * mat[2][3] + mat[3][3] *
v[3];
859 const double x =
v[0];
860 const double y =
v[1];
861 const double z =
v[2];
881 r[0] =
v[0] *
M[0][0] +
v[1] *
M[1][0] +
M[2][0] *
v[2] +
M[3][0];
882 r[1] =
v[0] *
M[0][1] +
v[1] *
M[1][1] +
M[2][1] *
v[2] +
M[3][1];
883 r[2] =
v[0] *
M[0][2] +
v[1] *
M[1][2] +
M[2][2] *
v[2] +
M[3][2];
884 r[3] =
v[0] *
M[0][3] +
v[1] *
M[1][3] +
M[2][3] *
v[2] +
M[3][3];
892 r[0] =
M[0][0] * t[0] +
M[1][0] * t[1] +
M[2][0] * t[2];
893 r[1] =
M[0][1] * t[0] +
M[1][1] * t[1] +
M[2][1] * t[2];
894 r[2] =
M[0][2] * t[0] +
M[1][2] * t[1] +
M[2][2] * t[2];
902 r[0] =
M[0][0] * t[0] +
M[1][0] * t[1] +
M[2][0] * t[2];
903 r[1] =
M[0][1] * t[0] +
M[1][1] * t[1] +
M[2][1] * t[2];
904 r[2] =
M[0][2] * t[0] +
M[1][2] * t[1] +
M[2][2] * t[2];
912 r[0] =
M[0][0] * t[0] +
M[1][0] * t[1] +
M[2][0] * t[2];
913 r[1] =
M[0][1] * t[0] +
M[1][1] * t[1] +
M[2][1] * t[2];
928 const float x = r[0];
929 const float y = r[1];
931 r[0] = x *
M[0][0] + y *
M[0][1] +
M[0][2] * r[2];
932 r[1] = x *
M[1][0] + y *
M[1][1] +
M[1][2] * r[2];
933 r[2] = x *
M[2][0] + y *
M[2][1] +
M[2][2] * r[2];
938 const float x = r[0];
939 const float y = r[1];
941 r[0] = x *
M[0][0] + y *
M[0][1] +
M[0][2] * r[2];
942 r[1] = x *
M[1][0] + y *
M[1][1] +
M[1][2] * r[2];
943 r[2] = x *
M[2][0] + y *
M[2][1] +
M[2][2] * r[2];
950 for (i = 0; i < 3; i++) {
951 for (j = 0; j < 3; j++) {
961 for (i = 0; i < 4; i++) {
962 for (j = 0; j < 4; j++) {
972 for (i = 0; i < 3; i++) {
973 for (j = 0; j < 3; j++) {
983 for (i = 0; i < 3; i++) {
984 for (j = 0; j < 3; j++) {
994 for (i = 0; i < 3; i++) {
995 for (j = 0; j < 3; j++) {
1005 for (i = 0; i < 4; i++) {
1006 for (j = 0; j < 4; j++) {
1014 const double x = r[0];
1015 const double y = r[1];
1026 for (i = 0; i < 3; i++) {
1027 for (j = 0; j < 3; j++) {
1028 R[i][j] = A[i][j] +
B[i][j];
1037 for (i = 0; i < 4; i++) {
1038 for (j = 0; j < 4; j++) {
1039 R[i][j] = A[i][j] +
B[i][j];
1048 for (i = 0; i < 3; i++) {
1049 for (j = 0; j < 3; j++) {
1050 R[i][j] = A[i][j] +
B[i][j] * f;
1059 for (i = 0; i < 4; i++) {
1060 for (j = 0; j < 4; j++) {
1061 R[i][j] = A[i][j] +
B[i][j] * f;
1070 for (i = 0; i < 3; i++) {
1071 for (j = 0; j < 3; j++) {
1072 R[i][j] = A[i][j] -
B[i][j];
1081 for (i = 0; i < 4; i++) {
1082 for (j = 0; j < 4; j++) {
1083 R[i][j] = A[i][j] -
B[i][j];
1090 return (m[0][0] * (m[1][1] * m[2][2] - m[1][2] * m[2][1]) -
1091 m[1][0] * (m[0][1] * m[2][2] - m[0][2] * m[2][1]) +
1092 m[2][0] * (m[0][1] * m[1][2] - m[0][2] * m[1][1]));
1097 return (m[0][0] * (m[1][1] * m[2][2] - m[1][2] * m[2][1]) -
1098 m[1][0] * (m[0][1] * m[2][2] - m[0][2] * m[2][1]) +
1099 m[2][0] * (m[0][1] * m[1][2] - m[0][2] * m[1][1]));
1104 return (m[0][0] * (m[1][1] * m[2][2] - m[1][2] * m[2][1]) -
1105 m[1][0] * (m[0][1] * m[2][2] - m[0][2] * m[2][1]) +
1106 m[2][0] * (m[0][1] * m[1][2] - m[0][2] * m[1][1]));
1111 const float det =
determinant_m2(mat[0][0], mat[1][0], mat[0][1], mat[1][1]);
1114 bool success = (det != 0.0f);
1127 float mat_tmp[3][3];
1148 success = (
fabsf(det) > epsilon);
1150 if (
LIKELY(det != 0.0f)) {
1152 for (a = 0; a < 3; a++) {
1153 for (
b = 0;
b < 3;
b++) {
1163 float mat_tmp[3][3];
1182 success = (det != 0.0f);
1184 if (
LIKELY(det != 0.0f)) {
1186 for (a = 0; a < 3; a++) {
1187 for (
b = 0;
b < 3;
b++) {
1198 float mat_tmp[4][4];
1207#ifndef MATH_STANDALONE
1215 float tempmat[4][4];
1222 for (i = 0; i < 4; i++) {
1223 for (j = 0; j < 4; j++) {
1227 for (i = 0; i < 4; i++) {
1232 for (i = 0; i < 4; i++) {
1233 for (j = 0; j < 4; j++) {
1234 tempmat[i][j] = mat[i][j];
1238 for (i = 0; i < 4; i++) {
1240 max =
fabsf(tempmat[i][i]);
1242 for (j = i + 1; j < 4; j++) {
1243 if (
fabsf(tempmat[j][i]) > max) {
1244 max =
fabsf(tempmat[j][i]);
1250 for (k = 0; k < 4; k++) {
1251 SWAP(
float, tempmat[i][k], tempmat[maxj][k]);
1256 if (
UNLIKELY(tempmat[i][i] == 0.0f)) {
1259 temp =
double(tempmat[i][i]);
1260 for (k = 0; k < 4; k++) {
1261 tempmat[i][k] =
float(
double(tempmat[i][k]) / temp);
1264 for (j = 0; j < 4; j++) {
1266 temp = tempmat[j][i];
1267 for (k = 0; k < 4; k++) {
1268 tempmat[j][k] -=
float(
double(tempmat[i][k]) * temp);
1279#ifndef MATH_STANDALONE
1290 float loc_a[3], rot_a[3][3], size_a[3];
1291 float loc_b[3], rot_b[3][3], size_b[3];
1292 float loc_r[3], rot_r[3][3], size_r[3];
1306 float loc_a[3], rot_a[3][3], size_a[3];
1307 float loc_b[3], rot_b[3][3], size_b[3];
1308 float loc_r[3], rot_r[3][3], size_r[3];
1415bool compare_m4m4(
const float mat1[4][4],
const float mat2[4][4],
float limit)
1604 if (len_sq_v1 > 0.0f) {
1614 float norm_v2[3], norm_v3[3], tmp[3];
1617 float cos_angle =
dot_v3v3(norm_v2, norm_v3);
1618 float abs_cos_angle =
fabsf(cos_angle);
1621 if (abs_cos_angle > 1e-4f && abs_cos_angle < 1.0f - FLT_EPSILON) {
1624 float angle =
acosf(cos_angle);
1703 enum {
X = 1 << 0,
Y = 1 << 1, Z = 1 << 2 };
1705 for (
int i = 0; i < 3; i++) {
1747 for (
int i = 0; i < 3; i++) {
1748 if (
flag & (1 << i)) {
1750 mat[i][i] = unit_length;
1760 float *unpacked[3] = {m[0], m[1], m[2]};
1765 float *unpacked[3] = {m[0], m[1], m[2]};
1775 for (i = 0; i < 3; i++) {
1776 for (j = 0; j < i; j++) {
1790 for (i = 0; i < 4; i++) {
1791 for (j = 0; j < i; j++) {
1806 for (i = 0; i < 3; i++) {
1823 for (i = 0; i < 4; i++) {
1837 const float eps = 1e-7f;
1839 float l1, l2, l3, l4, l5, l6;
1870 for (i = 0; i < 2; i++) {
1878 for (i = 0; i < 2; i++) {
1886 for (i = 0; i < 2; i++) {
1893 for (i = 0; i < 2; i++) {
1901 for (i = 0; i < 3; i++) {
1908 for (i = 0; i < 3; i++) {
1916 for (i = 0; i < 3; i++) {
1923 for (i = 0; i < 3; i++) {
1931 for (i = 0; i < 3; i++) {
1933 if (r_scale[i] != 0.0f) {
1934 R[i][3] /= r_scale[i];
1941 for (i = 0; i < 3; i++) {
1952 for (i = 0; i < 3; i++) {
1954 rmat[i][3] = (r_scale[i] != 0.0f) ? (mat[i][3] / r_scale[i]) : mat[i][3];
1961 for (i = 0; i < 3; i++) {
1963 rmat[i][3] = (
len != 0.0f) ? (mat[i][3] /
len) : mat[i][3];
1970 const float r00 =
M[1][1];
1971 const float r01 = -
M[0][1];
1972 const float r10 = -
M[1][0];
1973 const float r11 =
M[0][0];
1984 R[0][0] =
M[1][1] *
M[2][2] -
M[1][2] *
M[2][1];
1985 R[0][1] = -
M[0][1] *
M[2][2] +
M[0][2] *
M[2][1];
1986 R[0][2] =
M[0][1] *
M[1][2] -
M[0][2] *
M[1][1];
1988 R[1][0] = -
M[1][0] *
M[2][2] +
M[1][2] *
M[2][0];
1989 R[1][1] =
M[0][0] *
M[2][2] -
M[0][2] *
M[2][0];
1990 R[1][2] = -
M[0][0] *
M[1][2] +
M[0][2] *
M[1][0];
1992 R[2][0] =
M[1][0] *
M[2][1] -
M[1][1] *
M[2][0];
1993 R[2][1] = -
M[0][0] *
M[2][1] +
M[0][1] *
M[2][0];
1994 R[2][2] =
M[0][0] *
M[1][1] -
M[0][1] *
M[1][0];
1999 float a1, a2, a3, a4, b1, b2, b3, b4;
2000 float c1, c2, c3, c4, d1, d2, d3, d4;
2045 return a * d -
b * c;
2049 float a1,
float a2,
float a3,
float b1,
float b2,
float b3,
float c1,
float c2,
float c3)
2062 float a1, a2, a3, a4, b1, b2, b3, b4, c1, c2, c3, c4, d1, d2, d3, d4;
2161 float volume = size[0] * size[1] * size[2];
2163 if (volume != 0.0f) {
2249void mat4_decompose(
float loc[3],
float quat[4],
float size[3],
const float wmat[4][4])
2265#ifndef MATH_STANDALONE
2272 float W[3][3], S[3][3],
V[3][3], Vt[3][3];
2287 R[0][0] =
R[1][1] =
R[2][2] = scale;
2288 R[0][1] =
R[0][2] = 0.0;
2289 R[1][0] =
R[1][2] = 0.0;
2290 R[2][0] =
R[2][1] = 0.0;
2295 R[0][0] =
R[1][1] =
R[2][2] = scale;
2297 R[0][1] =
R[0][2] =
R[0][3] = 0.0;
2298 R[1][0] =
R[1][2] =
R[1][3] = 0.0;
2299 R[2][0] =
R[2][1] =
R[2][3] = 0.0;
2300 R[3][0] =
R[3][1] =
R[3][2] = 0.0;
2307 R[2][2] =
R[3][3] = 1.0;
2308 R[0][1] =
R[0][2] =
R[0][3] = 0.0;
2309 R[1][0] =
R[1][2] =
R[1][3] = 0.0;
2310 R[2][0] =
R[2][1] =
R[2][3] = 0.0;
2311 R[3][0] =
R[3][1] =
R[3][2] = 0.0;
2316 mat[3][0] += (Tx * mat[0][0] + Ty * mat[1][0] + Tz * mat[2][0]);
2317 mat[3][1] += (Tx * mat[0][1] + Ty * mat[1][1] + Tz * mat[2][1]);
2318 mat[3][2] += (Tx * mat[0][2] + Ty * mat[1][2] + Tz * mat[2][2]);
2321void rotate_m4(
float mat[4][4],
const char axis,
const float angle)
2323 const float angle_cos =
cosf(angle);
2324 const float angle_sin =
sinf(angle);
2331 float temp = angle_cos * mat[1][
col] + angle_sin * mat[2][
col];
2332 mat[2][
col] = -angle_sin * mat[1][
col] + angle_cos * mat[2][
col];
2339 float temp = angle_cos * mat[0][
col] - angle_sin * mat[2][
col];
2340 mat[2][
col] = angle_sin * mat[0][
col] + angle_cos * mat[2][
col];
2347 float temp = angle_cos * mat[0][
col] + angle_sin * mat[1][
col];
2348 mat[1][
col] = -angle_sin * mat[0][
col] + angle_cos * mat[1][
col];
2380 const float dst[3][3],
2381 const float src[3][3],
2382 const float srcweight)
2384 float srot[3][3], drot[3][3];
2385 float squat[4], dquat[4], fquat[4];
2386 float sscale[3], dscale[3], fsize[3];
2387 float rmat[3][3], smat[3][3];
2406 const float dst[4][4],
2407 const float src[4][4],
2408 const float srcweight)
2410 float sloc[3], dloc[3], floc[3];
2411 float srot[3][3], drot[3][3];
2412 float squat[4], dquat[4], fquat[4];
2413 float sscale[3], dscale[3], fsize[3];
2431#ifndef MATH_STANDALONE
2437 float U_A[3][3], U_B[3][3],
U[3][3];
2438 float quat_A[4], quat_B[4], quat[4];
2441 float P_A[3][3], P_B[3][3],
P[3][3];
2469 for (i = 0; i < 3; i++) {
2479 float A3[3][3], B3[3][3], R3[3][3];
2482 float loc_A[3], loc_B[3], loc[3];
2533 const float rot[3][3],
2534 const float size[3])
2544 const float size[3])
2546 float rmat[3][3], smat[3][3], tmat[3][3];
2566 float R[4][4],
const float loc[3],
const float eul[3],
const float size[3],
const short order)
2568 float rmat[3][3], smat[3][3], tmat[3][3];
2589 const float quat[4],
2590 const float size[3])
2592 float rmat[3][3], smat[3][3], tmat[3][3];
2612 float R[4][4],
const float loc[3],
const float axis[3],
const float angle,
const float size[3])
2624 printf(
"%f %f %f\n", m[0][0], m[1][0], m[2][0]);
2625 printf(
"%f %f %f\n", m[0][1], m[1][1], m[2][1]);
2626 printf(
"%f %f %f\n", m[0][2], m[1][2], m[2][2]);
2633 printf(
"%f %f %f %f\n", m[0][0], m[1][0], m[2][0], m[3][0]);
2634 printf(
"%f %f %f %f\n", m[0][1], m[1][1], m[2][1], m[3][1]);
2635 printf(
"%f %f %f %f\n", m[0][2], m[1][2], m[2][2], m[3][2]);
2636 printf(
"%f %f %f %f\n", m[0][3], m[1][3], m[2][3], m[3][3]);
2640void svd_m4(
float U[4][4],
float s[4],
float V[4][4],
float A_[4][4])
2646 float work1[4], work2[4];
2652 float *work = work1;
2656 int i = 0, j = 0, k = 0, p, pp, iter;
2661 int nct =
min_ii(m - 1, n);
2668 for (k = 0; k <
max_ii(nct, nrt); k++) {
2675 for (i = k; i < m; i++) {
2676 s[k] =
hypotf(s[k], A[i][k]);
2680 if (A[k][k] < 0.0f) {
2683 invsk = 1.0f / s[k];
2684 for (i = k; i < m; i++) {
2691 for (j = k + 1; j < n; j++) {
2692 if ((k < nct) && (s[k] != 0.0f)) {
2697 for (i = k; i < m; i++) {
2698 t += A[i][k] * A[i][j];
2701 for (i = k; i < m; i++) {
2702 A[i][j] += t * A[i][k];
2716 for (i = k; i < m; i++) {
2726 for (i = k + 1; i < n; i++) {
2731 if (
e[k + 1] < 0.0f) {
2734 invek = 1.0f /
e[k];
2735 for (i = k + 1; i < n; i++) {
2741 if ((k + 1 < m) && (
e[k] != 0.0f)) {
2746 for (i = k + 1; i < m; i++) {
2749 for (j = k + 1; j < n; j++) {
2750 for (i = k + 1; i < m; i++) {
2751 work[i] +=
e[j] * A[i][j];
2754 invek1 = 1.0f /
e[k + 1];
2755 for (j = k + 1; j < n; j++) {
2756 float t = -
e[j] * invek1;
2757 for (i = k + 1; i < m; i++) {
2758 A[i][j] += t * work[i];
2766 for (i = k + 1; i < n; i++) {
2776 s[nct] = A[nct][nct];
2782 e[nrt] = A[nrt][p - 1];
2788 for (j = nct; j < nu; j++) {
2789 for (i = 0; i < m; i++) {
2794 for (k = nct - 1; k >= 0; k--) {
2796 for (j = k + 1; j < nu; j++) {
2798 for (i = k; i < m; i++) {
2799 t +=
U[i][k] *
U[i][j];
2802 for (i = k; i < m; i++) {
2803 U[i][j] += t *
U[i][k];
2806 for (i = k; i < m; i++) {
2809 U[k][k] = 1.0f +
U[k][k];
2810 for (i = 0; i < k - 1; i++) {
2815 for (i = 0; i < m; i++) {
2824 for (k = n - 1; k >= 0; k--) {
2825 if ((k < nrt) && (
e[k] != 0.0f)) {
2826 for (j = k + 1; j < nu; j++) {
2828 for (i = k + 1; i < n; i++) {
2829 t +=
V[i][k] *
V[i][j];
2831 t = -t /
V[k + 1][k];
2832 for (i = k + 1; i < n; i++) {
2833 V[i][j] += t *
V[i][k];
2837 for (i = 0; i < n; i++) {
2867 for (k = p - 2; k >= -1; k--) {
2881 for (ks = p - 1; ks >= k; ks--) {
2886 t = (ks != p ?
fabsf(
e[ks]) : 0.0f) + (ks != k + 1 ?
fabsf(
e[ks - 1]) : 0.0f);
2895 else if (ks == p - 1) {
2914 for (j = p - 2; j >= k; j--) {
2915 float t =
hypotf(s[j], f);
2916 float invt = 1.0f / t;
2917 float cs = s[j] * invt;
2918 float sn = f * invt;
2922 e[j - 1] = cs *
e[j - 1];
2925 for (i = 0; i < n; i++) {
2926 t = cs *
V[i][j] + sn *
V[i][p - 1];
2927 V[i][p - 1] = -sn *
V[i][j] + cs *
V[i][p - 1];
2939 for (j = k; j < p; j++) {
2940 float t =
hypotf(s[j], f);
2941 float invt = 1.0f / t;
2942 float cs = s[j] * invt;
2943 float sn = f * invt;
2948 for (i = 0; i < m; i++) {
2949 t = cs *
U[i][j] + sn *
U[i][k - 1];
2950 U[i][k - 1] = -sn *
U[i][j] + cs *
U[i][k - 1];
2966 float invscale = 1.0f / scale;
2967 float sp = s[p - 1] * invscale;
2968 float spm1 = s[p - 2] * invscale;
2969 float epm1 =
e[p - 2] * invscale;
2970 float sk = s[k] * invscale;
2971 float ek =
e[k] * invscale;
2972 float b = ((spm1 + sp) * (spm1 - sp) + epm1 * epm1) * 0.5f;
2973 float c = (sp * epm1) * (sp * epm1);
2976 if ((
b != 0.0f) || (c != 0.0f)) {
2981 shift = c / (
b + shift);
2983 f = (sk + sp) * (sk - sp) + shift;
2988 for (j = k; j < p - 1; j++) {
2991 float cs = (t == 0.0f) ? 0.0f : f / t;
2992 float sn = (t == 0.0f) ? 0.0f : g / t;
2996 f = cs * s[j] + sn *
e[j];
2997 e[j] = cs *
e[j] - sn * s[j];
2999 s[j + 1] = cs * s[j + 1];
3001 for (i = 0; i < n; i++) {
3002 t = cs *
V[i][j] + sn *
V[i][j + 1];
3003 V[i][j + 1] = -sn *
V[i][j] + cs *
V[i][j + 1];
3009 cs = (t == 0.0f) ? 0.0f : f / t;
3010 sn = (t == 0.0f) ? 0.0f : g / t;
3012 f = cs *
e[j] + sn * s[j + 1];
3013 s[j + 1] = -sn *
e[j] + cs * s[j + 1];
3015 e[j + 1] = cs *
e[j + 1];
3017 for (i = 0; i < m; i++) {
3018 t = cs *
U[i][j] + sn *
U[i][j + 1];
3019 U[i][j + 1] = -sn *
U[i][j] + cs *
U[i][j + 1];
3035 s[k] = (s[k] < 0.0f ? -s[k] : 0.0f);
3037 for (i = 0; i <= pp; i++) {
3046 if (s[k] >= s[k + 1]) {
3053 for (i = 0; i < n; i++) {
3055 V[i][k + 1] =
V[i][k];
3060 for (i = 0; i < m; i++) {
3062 U[i][k + 1] =
U[i][k];
3080 float A[4][4],
V[4][4],
W[4], Wm[4][4],
U[4][4];
3089 for (i = 0; i < 4; i++) {
3090 Wm[i][i] = (
W[i] < epsilon) ? 0.0f : 1.0f /
W[i];
3102 float mat_tmp[4][4], tmpinv[4][4];
3118 const bool axis_x_degenerate =
len_squared_v3(mat[0]) < FLT_EPSILON;
3119 const bool axis_y_degenerate =
len_squared_v3(mat[1]) < FLT_EPSILON;
3120 const bool axis_z_degenerate =
len_squared_v3(mat[2]) < FLT_EPSILON;
3123 if (axis_x_degenerate && !axis_y_degenerate && !axis_z_degenerate) {
3130 if (!axis_x_degenerate && axis_y_degenerate && !axis_z_degenerate) {
3137 if (!axis_x_degenerate && !axis_y_degenerate && axis_z_degenerate) {
3147 float mat_tmp[4][4];
3154 mat_tmp[0][0] += 1e-8f;
3155 mat_tmp[1][1] += 1e-8f;
3156 mat_tmp[2][2] += 1e-8f;
3182 float mat_tmp[4][4];
3193 float mat_tmp[3][3];
3204 const float local[4][4],
3205 const float target[4][4])
3207 float itarget[4][4];
3214 const float local[4][4],
3215 const float target[4][4])
#define BLI_assert_unreachable()
MINLINE float max_fff(float a, float b, float c)
MINLINE float max_ff(float a, float b)
MINLINE int min_ii(int a, int b)
MINLINE int max_ii(int a, int b)
#define mul_m4_series(...)
#define mul_m3_series(...)
void interp_qt_qtqt(float q[4], const float a[4], const float b[4], float t)
void eul_to_mat3(float mat[3][3], const float eul[3])
void axis_angle_to_quat(float r[4], const float axis[3], float angle)
void quat_to_mat3(float m[3][3], const float q[4])
void mat3_to_quat(float q[4], const float mat[3][3])
void mat3_normalized_to_quat_fast(float q[4], const float mat[3][3])
void eulO_to_mat3(float M[3][3], const float e[3], short order)
void mat3_normalized_to_quat(float q[4], const float mat[3][3])
void BLI_svd_m3(const float m3[3][3], float r_U[3][3], float r_S[3], float r_V[3][3])
Compute the SVD (Singular Values Decomposition) of given 3D matrix (m3 = USV*).
MINLINE void copy_v4_v4(float r[4], const float a[4])
MINLINE float len_v2(const float v[2]) ATTR_WARN_UNUSED_RESULT
MINLINE float len_squared_v3(const float v[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void madd_v3_v3fl(float r[3], const float a[3], float f)
MINLINE bool equals_v3v3(const float v1[3], const float v2[3]) ATTR_WARN_UNUSED_RESULT
MINLINE bool is_zero_v4(const float v[4]) ATTR_WARN_UNUSED_RESULT
MINLINE bool compare_v4v4(const float v1[4], const float v2[4], float limit) ATTR_WARN_UNUSED_RESULT
MINLINE void copy_v2_v2(float r[2], const float a[2])
MINLINE void mul_v3_fl(float r[3], float f)
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE float dot_v4v4(const float a[4], const float b[4]) ATTR_WARN_UNUSED_RESULT
MINLINE float dot_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
void interp_v3_v3v3(float r[3], const float a[3], const float b[3], float t)
MINLINE void add_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void cross_v3_v3v3(float r[3], const float a[3], const float b[3])
void ortho_v3_v3(float out[3], const float v[3])
MINLINE bool equals_v4v4(const float v1[4], const float v2[4]) ATTR_WARN_UNUSED_RESULT
MINLINE void negate_v3(float r[3])
MINLINE void zero_v4(float r[4])
MINLINE void mul_v3_v3v3(float r[3], const float v1[3], const float v2[3])
MINLINE float normalize_v3_v3(float r[3], const float a[3])
MINLINE bool is_zero_v3(const float v[3]) ATTR_WARN_UNUSED_RESULT
MINLINE float mul_project_m4_v3_zfac(const float mat[4][4], const float co[3]) ATTR_WARN_UNUSED_RESULT
MINLINE float normalize_v2(float n[2])
MINLINE void copy_v3_fl(float r[3], float f)
MINLINE void copy_v3_v3_db(double r[3], const double a[3])
MINLINE void mul_v3_v3fl(float r[3], const float a[3], float f)
MINLINE float normalize_v2_v2(float r[2], const float a[2])
MINLINE float normalize_v3_length(float n[3], float unit_length)
MINLINE float normalize_v3(float n[3])
MINLINE float len_v3(const float a[3]) ATTR_WARN_UNUSED_RESULT
typedef double(DMatrix)[4][4]
static double angle(const Eigen::Vector3d &v1, const Eigen::Vector3d &v2)
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMVert * v
btMatrix3x3 inverse() const
Return the inverse of the matrix.
SIMD_FORCE_INLINE const btScalar & z() const
Return the z value.
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
static T sum(const btAlignedObjectArray< T > &items)
SIMD_FORCE_INLINE btVector3 & normalize()
Normalize this vector x^2 + y^2 + z^2 = 1.
local_group_size(16, 16) .push_constant(Type b
draw_view in_light_buf[] float
void mul_v4_m4v3(float r[4], const float M[4][4], const float v[3])
void _va_mul_m4_series_4(float r[4][4], const float m1[4][4], const float m2[4][4], const float m3[4][4])
bool invert_m2_m2(float inverse[2][2], const float mat[2][2])
void scale_m4_v2(float R[4][4], const float scale[2])
void mul_v2_m4v3(float r[2], const float mat[4][4], const float vec[3])
void orthogonalize_m3_stable(float R[3][3], int axis, bool normalize)
float mat3_to_scale(const float mat[3][3])
float mat4_to_volume_scale(const float mat[4][4])
bool is_negative_m3(const float mat[3][3])
void mul_v2_project_m4_v3(float r[2], const float mat[4][4], const float vec[3])
bool invert_m3_m3_ex(float inverse[3][3], const float mat[3][3], const float epsilon)
bool is_orthogonal_m3(const float m[3][3])
void sub_m3_m3m3(float R[3][3], const float A[3][3], const float B[3][3])
void unit_m2(float m[2][2])
void BLI_space_transform_apply_normal(const SpaceTransform *data, float no[3])
void mul_v4_m4v3_db(double r[4], const double mat[4][4], const double vec[3])
void normalize_m4_m4(float rmat[4][4], const float mat[4][4])
void negate_m3(float R[3][3])
void _va_mul_m3_series_6(float r[3][3], const float m1[3][3], const float m2[3][3], const float m3[3][3], const float m4[3][3], const float m5[3][3])
void _va_mul_m3_series_5(float r[3][3], const float m1[3][3], const float m2[3][3], const float m3[3][3], const float m4[3][3])
float mat4_to_scale(const float mat[4][4])
bool is_zero_m3(const float mat[3][3])
void orthogonalize_m4(float R[4][4], int axis)
void swap_m3m3(float m1[3][3], float m2[3][3])
void mul_v3_project_m4_v3(float r[3], const float mat[4][4], const float vec[3])
bool invert_m3_ex(float mat[3][3], const float epsilon)
void mul_m3_v3(const float M[3][3], float r[3])
void zero_m4(float m[4][4])
void _va_mul_m4_series_9(float r[4][4], const float m1[4][4], const float m2[4][4], const float m3[4][4], const float m4[4][4], const float m5[4][4], const float m6[4][4], const float m7[4][4], const float m8[4][4])
void mul_m4_fl(float R[4][4], float f)
void _va_mul_m3_series_8(float r[3][3], const float m1[3][3], const float m2[3][3], const float m3[3][3], const float m4[3][3], const float m5[3][3], const float m6[3][3], const float m7[3][3])
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void mul_mat3_m4_fl(float R[4][4], float f)
void _va_mul_m4_series_7(float r[4][4], const float m1[4][4], const float m2[4][4], const float m3[4][4], const float m4[4][4], const float m5[4][4], const float m6[4][4])
void mul_v4_m4v4(float r[4], const float mat[4][4], const float v[4])
void mul_m3_m3_pre(float R[3][3], const float A[3][3])
void pseudoinverse_m3_m3(float inverse[3][3], const float mat[3][3], float epsilon)
void normalize_m2_m2_ex(float R[2][2], const float M[2][2], float r_scale[2])
void size_to_mat3(float R[3][3], const float size[3])
void normalize_m2(float R[2][2])
void sub_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void mul_v3_m3v3_db(double r[3], const double M[3][3], const double a[3])
void BLI_space_transform_invert_normal(const SpaceTransform *data, float no[3])
void copy_m3_m3(float m1[3][3], const float m2[3][3])
void mat4_decompose(float loc[3], float quat[4], float size[3], const float wmat[4][4])
void madd_m4_m4m4fl(float R[4][4], const float A[4][4], const float B[4][4], const float f)
bool is_orthogonal_m4(const float m[4][4])
void adjoint_m3_m3(float R[3][3], const float M[3][3])
void unit_m3(float m[3][3])
void mul_m3_v2(const float m[3][3], float r[2])
void mat3_to_rot_size(float rot[3][3], float size[3], const float mat3[3][3])
void add_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void scale_m3_fl(float R[3][3], float scale)
void loc_eulO_size_to_mat4(float R[4][4], const float loc[3], const float eul[3], const float size[3], const short order)
void copy_m3_m4(float m1[3][3], const float m2[4][4])
float determinant_m4_mat3_array(const float m[4][4])
void mul_m4_m4m3(float R[4][4], const float A[4][4], const float B[3][3])
void mul_v3_m4v3_db(double r[3], const double mat[4][4], const double vec[3])
void transpose_m4_m4(float R[4][4], const float M[4][4])
void mul_m4_m4_pre(float R[4][4], const float A[4][4])
void mul_m3_fl(float R[3][3], float f)
void mul_v2_m3v3(float r[2], const float M[3][3], const float a[3])
void zero_m2(float m[2][2])
void mul_m4db_m4db_m4fl(double R[4][4], const double A[4][4], const float B[4][4])
void _va_mul_m3_series_7(float r[3][3], const float m1[3][3], const float m2[3][3], const float m3[3][3], const float m4[3][3], const float m5[3][3], const float m6[3][3])
void orthogonalize_m3(float R[3][3], int axis)
void copy_m3_m3d(float m1[3][3], const double m2[3][3])
bool invert_m3_m3(float inverse[3][3], const float mat[3][3])
void mul_m3_m3_post(float R[3][3], const float B[3][3])
void add_m3_m3m3(float R[3][3], const float A[3][3], const float B[3][3])
void copy_m4_m3(float m1[4][4], const float m2[3][3])
bool is_uniform_scaled_m3(const float m[3][3])
void mul_m4_v4d(const float mat[4][4], double r[4])
void loc_rot_size_to_mat4(float R[4][4], const float loc[3], const float rot[3][3], const float size[3])
void mat4_to_rot(float rot[3][3], const float wmat[4][4])
void mat4_to_size_fix_shear(float size[3], const float M[4][4])
bool is_uniform_scaled_m4(const float m[4][4])
void mat4_to_loc_rot_size(float loc[3], float rot[3][3], float size[3], const float wmat[4][4])
float mat4_to_xy_scale(const float mat[4][4])
void svd_m4(float U[4][4], float s[4], float V[4][4], float A_[4][4])
bool is_orthonormal_m3(const float m[3][3])
void zero_m3(float m[3][3])
void translate_m4(float mat[4][4], float Tx, float Ty, float Tz)
void loc_axisangle_size_to_mat4(float R[4][4], const float loc[3], const float axis[3], const float angle, const float size[3])
bool has_zero_axis_m4(const float matrix[4][4])
void transform_pivot_set_m4(float mat[4][4], const float pivot[3])
void mul_m3_v3_double(const float M[3][3], double r[3])
bool equals_m3m3(const float mat1[3][3], const float mat2[3][3])
void rescale_m4(float mat[4][4], const float scale[3])
void size_to_mat4(float R[4][4], const float size[3])
void mul_project_m4_v3(const float mat[4][4], float vec[3])
void unit_m4_db(double m[4][4])
void copy_m4d_m4(double m1[4][4], const float m2[4][4])
void mul_v4d_m4v4d(double r[4], const float mat[4][4], const double v[4])
void mul_m4_v3(const float M[4][4], float r[3])
void invert_m4_m4_safe(float inverse[4][4], const float mat[4][4])
void orthogonalize_m4_stable(float R[4][4], int axis, bool normalize)
void scale_m4_fl(float R[4][4], float scale)
void normalize_m4(float R[4][4])
void adjoint_m4_m4(float R[4][4], const float M[4][4])
bool equals_m4m4(const float mat1[4][4], const float mat2[4][4])
void invert_m3_m3_safe_ortho(float inverse[3][3], const float mat[3][3])
void mul_m4_m4m4_split_channels(float R[4][4], const float A[4][4], const float B[4][4])
float determinant_m4(const float m[4][4])
void swap_m4m4(float m1[4][4], float m2[4][4])
void _va_mul_m3_series_4(float r[3][3], const float m1[3][3], const float m2[3][3], const float m3[3][3])
void transpose_m3_m4(float R[3][3], const float M[4][4])
static bool orthogonalize_m3_zero_axes_impl(float *mat[3], const float unit_length)
void mat3_to_size_2d(float size[2], const float M[3][3])
double determinant_m3_array_db(const double m[3][3])
void copy_m2_m2(float m1[2][2], const float m2[2][2])
void mat3_polar_decompose(const float mat3[3][3], float r_U[3][3], float r_P[3][3])
void mul_v2_m2v2(float r[2], const float mat[2][2], const float vec[2])
void normalize_m3(float R[3][3])
void _va_mul_m3_series_9(float r[3][3], const float m1[3][3], const float m2[3][3], const float m3[3][3], const float m4[3][3], const float m5[3][3], const float m6[3][3], const float m7[3][3], const float m8[3][3])
void normalize_m4_ex(float R[4][4], float r_scale[3])
void copy_m4_m4(float m1[4][4], const float m2[4][4])
void normalize_m4_m4_ex(float rmat[4][4], const float mat[4][4], float r_scale[3])
void interp_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4], const float t)
void mat4_to_loc_quat(float loc[3], float quat[4], const float wmat[4][4])
float determinant_m2(const float a, const float b, const float c, const float d)
void normalize_m3_ex(float R[3][3], float r_scale[3])
void mul_transposed_mat3_m4_v3(const float M[4][4], float r[3])
void mul_m3_m3m4(float R[3][3], const float A[3][3], const float B[4][4])
bool orthogonalize_m4_zero_axes(float m[4][4], const float unit_length)
float mat3_to_size_max_axis(const float M[3][3])
void normalize_m3_m3_ex(float R[3][3], const float M[3][3], float r_scale[3])
bool is_orthonormal_m4(const float m[4][4])
void mul_m3_v3_db(const double M[3][3], double r[3])
float mat4_to_size_max_axis(const float M[4][4])
void mul_v3_m4v3(float r[3], const float mat[4][4], const float vec[3])
float determinant_m3_array(const float m[3][3])
void copy_m4_m2(float m1[4][4], const float m2[2][2])
void shuffle_m4(float R[4][4], const int index[4])
bool is_negative_m4(const float mat[4][4])
void blend_m3_m3m3(float out[3][3], const float dst[3][3], const float src[3][3], const float srcweight)
void negate_mat3_m4(float R[4][4])
void normalize_m2_m2(float R[2][2], const float M[2][2])
void copy_m3_m2(float m1[3][3], const float m2[2][2])
bool invert_m4_m4(float inverse[4][4], const float mat[4][4])
void mul_v2_m3v2(float r[2], const float m[3][3], const float v[2])
void normalize_m2_ex(float R[2][2], float r_scale[2])
static void orthogonalize_stable(float v1[3], float v2[3], float v3[3], bool normalize)
void normalize_m3_m3(float R[3][3], const float M[3][3])
void mul_m4_m4m4_aligned_scale(float R[4][4], const float A[4][4], const float B[4][4])
void print_m3(const char *str, const float m[3][3])
void zero_axis_bias_m4(float mat[4][4])
void mul_m4_v4(const float mat[4][4], float r[4])
void loc_quat_size_to_mat4(float R[4][4], const float loc[3], const float quat[4], const float size[3])
void mul_v3_m3v3(float r[3], const float M[3][3], const float a[3])
void loc_eul_size_to_mat4(float R[4][4], const float loc[3], const float eul[3], const float size[3])
bool invert_m4(float mat[4][4])
void mat4_to_size(float size[3], const float M[4][4])
void interp_m3_m3m3(float R[3][3], const float A[3][3], const float B[3][3], const float t)
void transpose_m3(float R[3][3])
float determinant_m3(float a1, float a2, float a3, float b1, float b2, float b3, float c1, float c2, float c3)
void mul_m2_v2(const float mat[2][2], float vec[2])
void blend_m4_m4m4(float out[4][4], const float dst[4][4], const float src[4][4], const float srcweight)
void invert_m4_m4_safe_ortho(float inverse[4][4], const float mat[4][4])
void transpose_m3_m3(float R[3][3], const float M[3][3])
void _va_mul_m4_series_8(float r[4][4], const float m1[4][4], const float m2[4][4], const float m3[4][4], const float m4[4][4], const float m5[4][4], const float m6[4][4], const float m7[4][4])
void _va_mul_m4_series_6(float r[4][4], const float m1[4][4], const float m2[4][4], const float m3[4][4], const float m4[4][4], const float m5[4][4])
void BLI_space_transform_global_from_matrices(SpaceTransform *data, const float local[4][4], const float target[4][4])
void negate_m4(float R[4][4])
void mul_transposed_m3_v3(const float M[3][3], float r[3])
bool compare_m4m4(const float mat1[4][4], const float mat2[4][4], float limit)
void copy_m3d_m3(double m1[3][3], const float m2[3][3])
void BLI_space_transform_apply(const SpaceTransform *data, float co[3])
void pseudoinverse_m4_m4(float inverse[4][4], const float mat[4][4], float epsilon)
void mul_v3_mat3_m4v3_db(double r[3], const double mat[4][4], const double vec[3])
void mul_m3_m3m3(float R[3][3], const float A[3][3], const float B[3][3])
void print_m4(const char *str, const float m[4][4])
bool is_zero_m4(const float mat[4][4])
void mat3_to_size(float size[3], const float M[3][3])
void mul_m4_m3m4(float R[4][4], const float A[3][3], const float B[4][4])
void _va_mul_m4_series_3(float r[4][4], const float m1[4][4], const float m2[4][4])
void transpose_m4(float R[4][4])
void mul_m4_m4_post(float R[4][4], const float B[4][4])
void _va_mul_m3_series_3(float r[3][3], const float m1[3][3], const float m2[3][3])
void mul_v3_mat3_m4v3(float r[3], const float mat[4][4], const float vec[3])
bool invert_m3(float mat[3][3])
void _va_mul_m4_series_5(float r[4][4], const float m1[4][4], const float m2[4][4], const float m3[4][4], const float m4[4][4])
void mul_mat3_m4_v3(const float mat[4][4], float r[3])
void madd_m3_m3m3fl(float R[3][3], const float A[3][3], const float B[3][3], const float f)
void mul_m3_m4m4(float R[3][3], const float A[4][4], const float B[4][4])
void copy_m4_m4_db(double m1[4][4], const double m2[4][4])
void BLI_space_transform_from_matrices(SpaceTransform *data, const float local[4][4], const float target[4][4])
bool invert_m4_m4_fallback(float inverse[4][4], const float mat[4][4])
bool orthogonalize_m3_zero_axes(float m[3][3], const float unit_length)
void BLI_space_transform_invert(const SpaceTransform *data, float co[3])
void mul_m3_m4m3(float R[3][3], const float A[4][4], const float B[3][3])
float mat3_to_volume_scale(const float mat[3][3])
void rotate_m4(float mat[4][4], const char axis, const float angle)
void adjoint_m2_m2(float R[2][2], const float M[2][2])
void unit_m4(float m[4][4])
bool EIG_invert_m4_m4(float inverse[4][4], const float matrix[4][4])
CCL_NAMESPACE_BEGIN struct Window V