15#ifndef MATH_STANDALONE
27 memset(m, 0,
sizeof(
float[3][3]));
32 memset(m, 0,
sizeof(
float[4][4]));
37 m[0][0] = m[1][1] = 1.0f;
44 m[0][0] = m[1][1] = m[2][2] = 1.0f;
45 m[0][1] = m[0][2] = 0.0f;
46 m[1][0] = m[1][2] = 0.0f;
47 m[2][0] = m[2][1] = 0.0f;
52 m[0][0] = m[1][1] = m[2][2] = m[3][3] = 1.0f;
53 m[0][1] = m[0][2] = m[0][3] = 0.0f;
54 m[1][0] = m[1][2] = m[1][3] = 0.0f;
55 m[2][0] = m[2][1] = m[2][3] = 0.0f;
56 m[3][0] = m[3][1] = m[3][2] = 0.0f;
61 m[0][0] = m[1][1] = m[2][2] = m[3][3] = 1.0f;
62 m[0][1] = m[0][2] = m[0][3] = 0.0f;
63 m[1][0] = m[1][2] = m[1][3] = 0.0f;
64 m[2][0] = m[2][1] = m[2][3] = 0.0f;
65 m[3][0] = m[3][1] = m[3][2] = 0.0f;
70 memcpy(m1, m2,
sizeof(
float[2][2]));
76 memcpy(m1, m2,
sizeof(
float[3][3]));
81 memcpy(m1, m2,
sizeof(
float[4][4]));
86 memcpy(m1, m2,
sizeof(
double[4][4]));
169 m1[0][0] =
float(m2[0][0]);
170 m1[0][1] =
float(m2[0][1]);
171 m1[0][2] =
float(m2[0][2]);
173 m1[1][0] =
float(m2[1][0]);
174 m1[1][1] =
float(m2[1][1]);
175 m1[1][2] =
float(m2[1][2]);
177 m1[2][0] =
float(m2[2][0]);
178 m1[2][1] =
float(m2[2][1]);
179 m1[2][2] =
float(m2[2][2]);
187 for (
i = 0;
i < 4;
i++) {
188 for (j = 0; j < 4; j++) {
199 for (
int k = 0; k < 4; k++) {
201 R[index[k]][k] = 1.0f;
219 __m128
A0 = _mm_loadu_ps(
A[0]);
220 __m128
A1 = _mm_loadu_ps(
A[1]);
221 __m128
A2 = _mm_loadu_ps(
A[2]);
222 __m128 A3 = _mm_loadu_ps(
A[3]);
224 for (
int i = 0;
i < 4;
i++) {
225 __m128 B0 = _mm_set1_ps(
B[
i][0]);
226 __m128 B1 = _mm_set1_ps(
B[
i][1]);
227 __m128 B2 = _mm_set1_ps(
B[
i][2]);
228 __m128 B3 = _mm_set1_ps(
B[
i][3]);
230 __m128
sum = _mm_add_ps(_mm_add_ps(_mm_mul_ps(B0,
A0), _mm_mul_ps(B1,
A1)),
231 _mm_add_ps(_mm_mul_ps(B2,
A2), _mm_mul_ps(B3, A3)));
233 _mm_storeu_ps(
R[
i],
sum);
236 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];
237 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];
238 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];
239 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];
241 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];
242 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];
243 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];
244 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];
246 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];
247 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];
248 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];
249 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];
251 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];
252 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];
253 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];
254 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];
269 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];
270 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];
271 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];
272 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];
274 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];
275 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];
276 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];
277 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];
279 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];
280 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];
281 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];
282 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];
284 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];
285 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];
286 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];
287 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];
318 R[0][0] =
B[0][0] *
A[0][0] +
B[0][1] *
A[1][0] +
B[0][2] *
A[2][0];
319 R[0][1] =
B[0][0] *
A[0][1] +
B[0][1] *
A[1][1] +
B[0][2] *
A[2][1];
320 R[0][2] =
B[0][0] *
A[0][2] +
B[0][1] *
A[1][2] +
B[0][2] *
A[2][2];
322 R[1][0] =
B[1][0] *
A[0][0] +
B[1][1] *
A[1][0] +
B[1][2] *
A[2][0];
323 R[1][1] =
B[1][0] *
A[0][1] +
B[1][1] *
A[1][1] +
B[1][2] *
A[2][1];
324 R[1][2] =
B[1][0] *
A[0][2] +
B[1][1] *
A[1][2] +
B[1][2] *
A[2][2];
326 R[2][0] =
B[2][0] *
A[0][0] +
B[2][1] *
A[1][0] +
B[2][2] *
A[2][0];
327 R[2][1] =
B[2][0] *
A[0][1] +
B[2][1] *
A[1][1] +
B[2][2] *
A[2][1];
328 R[2][2] =
B[2][0] *
A[0][2] +
B[2][1] *
A[1][2] +
B[2][2] *
A[2][2];
346 R[0][0] =
B[0][0] *
A[0][0] +
B[0][1] *
A[1][0] +
B[0][2] *
A[2][0];
347 R[0][1] =
B[0][0] *
A[0][1] +
B[0][1] *
A[1][1] +
B[0][2] *
A[2][1];
348 R[0][2] =
B[0][0] *
A[0][2] +
B[0][1] *
A[1][2] +
B[0][2] *
A[2][2];
349 R[1][0] =
B[1][0] *
A[0][0] +
B[1][1] *
A[1][0] +
B[1][2] *
A[2][0];
350 R[1][1] =
B[1][0] *
A[0][1] +
B[1][1] *
A[1][1] +
B[1][2] *
A[2][1];
351 R[1][2] =
B[1][0] *
A[0][2] +
B[1][1] *
A[1][2] +
B[1][2] *
A[2][2];
352 R[2][0] =
B[2][0] *
A[0][0] +
B[2][1] *
A[1][0] +
B[2][2] *
A[2][0];
353 R[2][1] =
B[2][0] *
A[0][1] +
B[2][1] *
A[1][1] +
B[2][2] *
A[2][1];
354 R[2][2] =
B[2][0] *
A[0][2] +
B[2][1] *
A[1][2] +
B[2][2] *
A[2][2];
368 R[0][0] =
B[0][0] *
A[0][0] +
B[0][1] *
A[1][0] +
B[0][2] *
A[2][0];
369 R[0][1] =
B[0][0] *
A[0][1] +
B[0][1] *
A[1][1] +
B[0][2] *
A[2][1];
370 R[0][2] =
B[0][0] *
A[0][2] +
B[0][1] *
A[1][2] +
B[0][2] *
A[2][2];
372 R[1][0] =
B[1][0] *
A[0][0] +
B[1][1] *
A[1][0] +
B[1][2] *
A[2][0];
373 R[1][1] =
B[1][0] *
A[0][1] +
B[1][1] *
A[1][1] +
B[1][2] *
A[2][1];
374 R[1][2] =
B[1][0] *
A[0][2] +
B[1][1] *
A[1][2] +
B[1][2] *
A[2][2];
376 R[2][0] =
B[2][0] *
A[0][0] +
B[2][1] *
A[1][0] +
B[2][2] *
A[2][0];
377 R[2][1] =
B[2][0] *
A[0][1] +
B[2][1] *
A[1][1] +
B[2][2] *
A[2][1];
378 R[2][2] =
B[2][0] *
A[0][2] +
B[2][1] *
A[1][2] +
B[2][2] *
A[2][2];
392 R[0][0] =
B[0][0] *
A[0][0] +
B[0][1] *
A[1][0] +
B[0][2] *
A[2][0];
393 R[0][1] =
B[0][0] *
A[0][1] +
B[0][1] *
A[1][1] +
B[0][2] *
A[2][1];
394 R[0][2] =
B[0][0] *
A[0][2] +
B[0][1] *
A[1][2] +
B[0][2] *
A[2][2];
396 R[1][0] =
B[1][0] *
A[0][0] +
B[1][1] *
A[1][0] +
B[1][2] *
A[2][0];
397 R[1][1] =
B[1][0] *
A[0][1] +
B[1][1] *
A[1][1] +
B[1][2] *
A[2][1];
398 R[1][2] =
B[1][0] *
A[0][2] +
B[1][1] *
A[1][2] +
B[1][2] *
A[2][2];
400 R[2][0] =
B[2][0] *
A[0][0] +
B[2][1] *
A[1][0] +
B[2][2] *
A[2][0];
401 R[2][1] =
B[2][0] *
A[0][1] +
B[2][1] *
A[1][1] +
B[2][2] *
A[2][1];
402 R[2][2] =
B[2][0] *
A[0][2] +
B[2][1] *
A[1][2] +
B[2][2] *
A[2][2];
420 R[0][0] =
B[0][0] *
A[0][0] +
B[0][1] *
A[1][0] +
B[0][2] *
A[2][0];
421 R[0][1] =
B[0][0] *
A[0][1] +
B[0][1] *
A[1][1] +
B[0][2] *
A[2][1];
422 R[0][2] =
B[0][0] *
A[0][2] +
B[0][1] *
A[1][2] +
B[0][2] *
A[2][2];
423 R[1][0] =
B[1][0] *
A[0][0] +
B[1][1] *
A[1][0] +
B[1][2] *
A[2][0];
424 R[1][1] =
B[1][0] *
A[0][1] +
B[1][1] *
A[1][1] +
B[1][2] *
A[2][1];
425 R[1][2] =
B[1][0] *
A[0][2] +
B[1][1] *
A[1][2] +
B[1][2] *
A[2][2];
426 R[2][0] =
B[2][0] *
A[0][0] +
B[2][1] *
A[1][0] +
B[2][2] *
A[2][0];
427 R[2][1] =
B[2][0] *
A[0][1] +
B[2][1] *
A[1][1] +
B[2][2] *
A[2][1];
428 R[2][2] =
B[2][0] *
A[0][2] +
B[2][1] *
A[1][2] +
B[2][2] *
A[2][2];
433 R[0][0] =
B[0][0] *
A[0][0] +
B[0][1] *
A[1][0] +
B[0][2] *
A[2][0];
434 R[0][1] =
B[0][0] *
A[0][1] +
B[0][1] *
A[1][1] +
B[0][2] *
A[2][1];
435 R[0][2] =
B[0][0] *
A[0][2] +
B[0][1] *
A[1][2] +
B[0][2] *
A[2][2];
436 R[1][0] =
B[1][0] *
A[0][0] +
B[1][1] *
A[1][0] +
B[1][2] *
A[2][0];
437 R[1][1] =
B[1][0] *
A[0][1] +
B[1][1] *
A[1][1] +
B[1][2] *
A[2][1];
438 R[1][2] =
B[1][0] *
A[0][2] +
B[1][1] *
A[1][2] +
B[1][2] *
A[2][2];
439 R[2][0] =
B[2][0] *
A[0][0] +
B[2][1] *
A[1][0] +
B[2][2] *
A[2][0];
440 R[2][1] =
B[2][0] *
A[0][1] +
B[2][1] *
A[1][1] +
B[2][2] *
A[2][1];
441 R[2][2] =
B[2][0] *
A[0][2] +
B[2][1] *
A[1][2] +
B[2][2] *
A[2][2];
453 const float m1[3][3],
454 const float m2[3][3],
455 const float m3[3][3])
462 const float m1[3][3],
463 const float m2[3][3],
464 const float m3[3][3],
465 const float m4[3][3])
474 const float m1[3][3],
475 const float m2[3][3],
476 const float m3[3][3],
477 const float m4[3][3],
478 const float m5[3][3])
488 const float m1[3][3],
489 const float m2[3][3],
490 const float m3[3][3],
491 const float m4[3][3],
492 const float m5[3][3],
493 const float m6[3][3])
504 const float m1[3][3],
505 const float m2[3][3],
506 const float m3[3][3],
507 const float m4[3][3],
508 const float m5[3][3],
509 const float m6[3][3],
510 const float m7[3][3])
522 const float m1[3][3],
523 const float m2[3][3],
524 const float m3[3][3],
525 const float m4[3][3],
526 const float m5[3][3],
527 const float m6[3][3],
528 const float m7[3][3],
529 const float m8[3][3])
553 const float m1[4][4],
554 const float m2[4][4],
555 const float m3[4][4])
562 const float m1[4][4],
563 const float m2[4][4],
564 const float m3[4][4],
565 const float m4[4][4])
574 const float m1[4][4],
575 const float m2[4][4],
576 const float m3[4][4],
577 const float m4[4][4],
578 const float m5[4][4])
588 const float m1[4][4],
589 const float m2[4][4],
590 const float m3[4][4],
591 const float m4[4][4],
592 const float m5[4][4],
593 const float m6[4][4])
604 const float m1[4][4],
605 const float m2[4][4],
606 const float m3[4][4],
607 const float m4[4][4],
608 const float m5[4][4],
609 const float m6[4][4],
610 const float m7[4][4])
622 const float m1[4][4],
623 const float m2[4][4],
624 const float m3[4][4],
625 const float m4[4][4],
626 const float m5[4][4],
627 const float m6[4][4],
628 const float m7[4][4],
629 const float m8[4][4])
646 float temp[3], warped[3];
653 r[0] = warped[0] / warped[2];
654 r[1] = warped[1] / warped[2];
664 const float x = r[0];
665 const float y = r[1];
667 r[0] =
x *
M[0][0] +
y *
M[1][0] +
M[2][0] * r[2] +
M[3][0];
668 r[1] =
x *
M[0][1] +
y *
M[1][1] +
M[2][1] * r[2] +
M[3][1];
669 r[2] =
x *
M[0][2] +
y *
M[1][2] +
M[2][2] * r[2] +
M[3][2];
672void mul_v3_m4v3(
float r[3],
const float mat[4][4],
const float vec[3])
674 const float x = vec[0];
675 const float y = vec[1];
677 r[0] =
x * mat[0][0] +
y * mat[1][0] + mat[2][0] * vec[2] + mat[3][0];
678 r[1] =
x * mat[0][1] +
y * mat[1][1] + mat[2][1] * vec[2] + mat[3][1];
679 r[2] =
x * mat[0][2] +
y * mat[1][2] + mat[2][2] * vec[2] + mat[3][2];
684 const double x = vec[0];
685 const double y = vec[1];
687 r[0] =
x * mat[0][0] +
y * mat[1][0] + mat[2][0] * vec[2] + mat[3][0];
688 r[1] =
x * mat[0][1] +
y * mat[1][1] + mat[2][1] * vec[2] + mat[3][1];
689 r[2] =
x * mat[0][2] +
y * mat[1][2] + mat[2][2] * vec[2] + mat[3][2];
693 const double x = vec[0];
694 const double y = vec[1];
696 r[0] =
x * mat[0][0] +
y * mat[1][0] + mat[2][0] * vec[2] + mat[3][0];
697 r[1] =
x * mat[0][1] +
y * mat[1][1] + mat[2][1] * vec[2] + mat[3][1];
698 r[2] =
x * mat[0][2] +
y * mat[1][2] + mat[2][2] * vec[2] + mat[3][2];
699 r[3] =
x * mat[0][3] +
y * mat[1][3] + mat[2][3] * vec[2] + mat[3][3];
702void mul_v2_m4v3(
float r[2],
const float mat[4][4],
const float vec[3])
704 const float x = vec[0];
706 r[0] =
x * mat[0][0] + vec[1] * mat[1][0] + mat[2][0] * vec[2] + mat[3][0];
707 r[1] =
x * mat[0][1] + vec[1] * mat[1][1] + mat[2][1] * vec[2] + mat[3][1];
710void mul_v2_m2v2(
float r[2],
const float mat[2][2],
const float vec[2])
712 const float x = vec[0];
714 r[0] = mat[0][0] *
x + mat[1][0] * vec[1];
715 r[1] = mat[0][1] *
x + mat[1][1] * vec[1];
725 const float x = r[0];
726 const float y = r[1];
728 r[0] =
x * mat[0][0] +
y * mat[1][0] + mat[2][0] * r[2];
729 r[1] =
x * mat[0][1] +
y * mat[1][1] + mat[2][1] * r[2];
730 r[2] =
x * mat[0][2] +
y * mat[1][2] + mat[2][2] * r[2];
735 const float x = vec[0];
736 const float y = vec[1];
738 r[0] =
x * mat[0][0] +
y * mat[1][0] + mat[2][0] * vec[2];
739 r[1] =
x * mat[0][1] +
y * mat[1][1] + mat[2][1] * vec[2];
740 r[2] =
x * mat[0][2] +
y * mat[1][2] + mat[2][2] * vec[2];
745 const double x = vec[0];
746 const double y = vec[1];
748 r[0] =
x * mat[0][0] +
y * mat[1][0] + mat[2][0] * vec[2];
749 r[1] =
x * mat[0][1] +
y * mat[1][1] + mat[2][1] * vec[2];
750 r[2] =
x * mat[0][2] +
y * mat[1][2] + mat[2][2] * vec[2];
785 const float x =
v[0];
786 const float y =
v[1];
787 const float z =
v[2];
789 r[0] =
x * mat[0][0] +
y * mat[1][0] +
z * mat[2][0] + mat[3][0] *
v[3];
790 r[1] =
x * mat[0][1] +
y * mat[1][1] +
z * mat[2][1] + mat[3][1] *
v[3];
791 r[2] =
x * mat[0][2] +
y * mat[1][2] +
z * mat[2][2] + mat[3][2] *
v[3];
792 r[3] =
x * mat[0][3] +
y * mat[1][3] +
z * mat[2][3] + mat[3][3] *
v[3];
803 r[0] =
v[0] *
M[0][0] +
v[1] *
M[1][0] +
M[2][0] *
v[2] +
M[3][0];
804 r[1] =
v[0] *
M[0][1] +
v[1] *
M[1][1] +
M[2][1] *
v[2] +
M[3][1];
805 r[2] =
v[0] *
M[0][2] +
v[1] *
M[1][2] +
M[2][2] *
v[2] +
M[3][2];
806 r[3] =
v[0] *
M[0][3] +
v[1] *
M[1][3] +
M[2][3] *
v[2] +
M[3][3];
814 r[0] =
M[0][0] * t[0] +
M[1][0] * t[1] +
M[2][0] * t[2];
815 r[1] =
M[0][1] * t[0] +
M[1][1] * t[1] +
M[2][1] * t[2];
816 r[2] =
M[0][2] * t[0] +
M[1][2] * t[1] +
M[2][2] * t[2];
824 r[0] =
M[0][0] * t[0] +
M[1][0] * t[1] +
M[2][0] * t[2];
825 r[1] =
M[0][1] * t[0] +
M[1][1] * t[1] +
M[2][1] * t[2];
826 r[2] =
M[0][2] * t[0] +
M[1][2] * t[1] +
M[2][2] * t[2];
834 r[0] =
M[0][0] * t[0] +
M[1][0] * t[1] +
M[2][0] * t[2];
835 r[1] =
M[0][1] * t[0] +
M[1][1] * t[1] +
M[2][1] * t[2];
850 const float x = r[0];
851 const float y = r[1];
853 r[0] =
x *
M[0][0] +
y *
M[0][1] +
M[0][2] * r[2];
854 r[1] =
x *
M[1][0] +
y *
M[1][1] +
M[1][2] * r[2];
855 r[2] =
x *
M[2][0] +
y *
M[2][1] +
M[2][2] * r[2];
860 const float x = r[0];
861 const float y = r[1];
863 r[0] =
x *
M[0][0] +
y *
M[0][1] +
M[0][2] * r[2];
864 r[1] =
x *
M[1][0] +
y *
M[1][1] +
M[1][2] * r[2];
865 r[2] =
x *
M[2][0] +
y *
M[2][1] +
M[2][2] * r[2];
872 for (
i = 0;
i < 3;
i++) {
873 for (j = 0; j < 3; j++) {
883 for (
i = 0;
i < 4;
i++) {
884 for (j = 0; j < 4; j++) {
894 for (
i = 0;
i < 3;
i++) {
895 for (j = 0; j < 3; j++) {
905 for (
i = 0;
i < 3;
i++) {
906 for (j = 0; j < 3; j++) {
916 for (
i = 0;
i < 3;
i++) {
917 for (j = 0; j < 3; j++) {
927 for (
i = 0;
i < 4;
i++) {
928 for (j = 0; j < 4; j++) {
938 for (
i = 0;
i < 3;
i++) {
939 for (j = 0; j < 3; j++) {
940 R[
i][j] =
A[
i][j] +
B[
i][j];
949 for (
i = 0;
i < 4;
i++) {
950 for (j = 0; j < 4; j++) {
951 R[
i][j] =
A[
i][j] +
B[
i][j];
960 for (
i = 0;
i < 3;
i++) {
961 for (j = 0; j < 3; j++) {
962 R[
i][j] =
A[
i][j] +
B[
i][j] * f;
971 for (
i = 0;
i < 4;
i++) {
972 for (j = 0; j < 4; j++) {
973 R[
i][j] =
A[
i][j] +
B[
i][j] * f;
982 for (
i = 0;
i < 3;
i++) {
983 for (j = 0; j < 3; j++) {
984 R[
i][j] =
A[
i][j] -
B[
i][j];
991 return (m[0][0] * (m[1][1] * m[2][2] - m[1][2] * m[2][1]) -
992 m[1][0] * (m[0][1] * m[2][2] - m[0][2] * m[2][1]) +
993 m[2][0] * (m[0][1] * m[1][2] - m[0][2] * m[1][1]));
998 return (m[0][0] * (m[1][1] * m[2][2] - m[1][2] * m[2][1]) -
999 m[1][0] * (m[0][1] * m[2][2] - m[0][2] * m[2][1]) +
1000 m[2][0] * (m[0][1] * m[1][2] - m[0][2] * m[1][1]));
1005 const float det =
determinant_m2(mat[0][0], mat[1][0], mat[0][1], mat[1][1]);
1008 bool success = (det != 0.0f);
1021 float mat_tmp[3][3];
1040 success = (det != 0.0f);
1042 if (
LIKELY(det != 0.0f)) {
1044 for (a = 0; a < 3; a++) {
1045 for (
b = 0;
b < 3;
b++) {
1056 float mat_tmp[4][4];
1065#ifndef MATH_STANDALONE
1073 float tempmat[4][4];
1080 for (
i = 0;
i < 4;
i++) {
1081 for (j = 0; j < 4; j++) {
1085 for (
i = 0;
i < 4;
i++) {
1090 for (
i = 0;
i < 4;
i++) {
1091 for (j = 0; j < 4; j++) {
1092 tempmat[
i][j] = mat[
i][j];
1096 for (
i = 0;
i < 4;
i++) {
1100 for (j =
i + 1; j < 4; j++) {
1108 for (k = 0; k < 4; k++) {
1109 SWAP(
float, tempmat[
i][k], tempmat[maxj][k]);
1117 temp = double(tempmat[
i][
i]);
1118 for (k = 0; k < 4; k++) {
1119 tempmat[
i][k] =
float(
double(tempmat[
i][k]) / temp);
1122 for (j = 0; j < 4; j++) {
1124 temp = tempmat[j][
i];
1125 for (k = 0; k < 4; k++) {
1126 tempmat[j][k] -=
float(
double(tempmat[
i][k]) * temp);
1137#ifndef MATH_STANDALONE
1148 float loc_a[3], rot_a[3][3], size_a[3];
1149 float loc_b[3], rot_b[3][3], size_b[3];
1150 float loc_r[3], rot_r[3][3], size_r[3];
1164 float loc_a[3], rot_a[3][3], size_a[3];
1165 float loc_b[3], rot_b[3][3], size_b[3];
1166 float loc_r[3], rot_r[3][3], size_r[3];
1273bool compare_m4m4(
const float mat1[4][4],
const float mat2[4][4],
float limit)
1462 if (len_sq_v1 > 0.0f) {
1472 float norm_v2[3], norm_v3[3], tmp[3];
1475 float cos_angle =
dot_v3v3(norm_v2, norm_v3);
1476 float abs_cos_angle =
fabsf(cos_angle);
1479 if (abs_cos_angle > 1e-4f && abs_cos_angle < 1.0f - FLT_EPSILON) {
1543 enum {
X = 1 << 0,
Y = 1 << 1,
Z = 1 << 2 };
1545 for (
int i = 0;
i < 3;
i++) {
1587 for (
int i = 0;
i < 3;
i++) {
1588 if (
flag & (1 <<
i)) {
1590 mat[
i][
i] = unit_length;
1600 float *unpacked[3] = {m[0], m[1], m[2]};
1605 float *unpacked[3] = {m[0], m[1], m[2]};
1615 for (
i = 0;
i < 3;
i++) {
1616 for (j = 0; j <
i; j++) {
1630 for (
i = 0;
i < 4;
i++) {
1631 for (j = 0; j <
i; j++) {
1646 for (
i = 0;
i < 3;
i++) {
1663 for (
i = 0;
i < 4;
i++) {
1677 for (
int row = 0; row < 4; row++) {
1679 if (m[row][
col] != (row ==
col ? 1.0f : 0.0f)) {
1690 const float eps = 1e-7f;
1692 float l1, l2, l3, l4, l5, l6;
1723 for (
i = 0;
i < 2;
i++) {
1731 for (
i = 0;
i < 3;
i++) {
1739 for (
i = 0;
i < 3;
i++) {
1747 for (
i = 0;
i < 3;
i++) {
1749 if (r_scale[
i] != 0.0f) {
1750 R[
i][3] /= r_scale[
i];
1757 for (
i = 0;
i < 3;
i++) {
1768 for (
i = 0;
i < 3;
i++) {
1770 rmat[
i][3] = (
len != 0.0f) ? (mat[
i][3] /
len) : mat[
i][3];
1777 const float r00 =
M[1][1];
1778 const float r01 = -
M[0][1];
1779 const float r10 = -
M[1][0];
1780 const float r11 =
M[0][0];
1791 R[0][0] =
M[1][1] *
M[2][2] -
M[1][2] *
M[2][1];
1792 R[0][1] = -
M[0][1] *
M[2][2] +
M[0][2] *
M[2][1];
1793 R[0][2] =
M[0][1] *
M[1][2] -
M[0][2] *
M[1][1];
1795 R[1][0] = -
M[1][0] *
M[2][2] +
M[1][2] *
M[2][0];
1796 R[1][1] =
M[0][0] *
M[2][2] -
M[0][2] *
M[2][0];
1797 R[1][2] = -
M[0][0] *
M[1][2] +
M[0][2] *
M[1][0];
1799 R[2][0] =
M[1][0] *
M[2][1] -
M[1][1] *
M[2][0];
1800 R[2][1] = -
M[0][0] *
M[2][1] +
M[0][1] *
M[2][0];
1801 R[2][2] =
M[0][0] *
M[1][1] -
M[0][1] *
M[1][0];
1806 float a1, a2, a3, a4, b1, b2, b3, b4;
1807 float c1, c2, c3, c4, d1, d2, d3, d4;
1852 return a * d -
b * c;
1856 float a1,
float a2,
float a3,
float b1,
float b2,
float b3,
float c1,
float c2,
float c3)
1869 float a1, a2, a3, a4, b1, b2, b3, b4, c1, c2, c3, c4, d1, d2, d3, d4;
1959 if (volume != 0.0f) {
2038#ifndef MATH_STANDALONE
2045 float W[3][3], S[3][3],
V[3][3], Vt[3][3];
2060 R[0][0] =
R[1][1] =
R[2][2] = scale;
2061 R[0][1] =
R[0][2] = 0.0;
2062 R[1][0] =
R[1][2] = 0.0;
2063 R[2][0] =
R[2][1] = 0.0;
2068 R[0][0] =
R[1][1] =
R[2][2] = scale;
2070 R[0][1] =
R[0][2] =
R[0][3] = 0.0;
2071 R[1][0] =
R[1][2] =
R[1][3] = 0.0;
2072 R[2][0] =
R[2][1] =
R[2][3] = 0.0;
2073 R[3][0] =
R[3][1] =
R[3][2] = 0.0;
2078 mat[3][0] += (Tx * mat[0][0] + Ty * mat[1][0] + Tz * mat[2][0]);
2079 mat[3][1] += (Tx * mat[0][1] + Ty * mat[1][1] + Tz * mat[2][1]);
2080 mat[3][2] += (Tx * mat[0][2] + Ty * mat[1][2] + Tz * mat[2][2]);
2093 float temp = angle_cos * mat[1][
col] + angle_sin * mat[2][
col];
2094 mat[2][
col] = -angle_sin * mat[1][
col] + angle_cos * mat[2][
col];
2101 float temp = angle_cos * mat[0][
col] - angle_sin * mat[2][
col];
2102 mat[2][
col] = angle_sin * mat[0][
col] + angle_cos * mat[2][
col];
2109 float temp = angle_cos * mat[0][
col] + angle_sin * mat[1][
col];
2110 mat[1][
col] = -angle_sin * mat[0][
col] + angle_cos * mat[1][
col];
2142 const float dst[3][3],
2143 const float src[3][3],
2144 const float srcweight)
2146 float srot[3][3], drot[3][3];
2147 float squat[4], dquat[4], fquat[4];
2148 float sscale[3], dscale[3], fsize[3];
2149 float rmat[3][3], smat[3][3];
2168 const float dst[4][4],
2169 const float src[4][4],
2170 const float srcweight)
2172 float sloc[3], dloc[3], floc[3];
2173 float srot[3][3], drot[3][3];
2174 float squat[4], dquat[4], fquat[4];
2175 float sscale[3], dscale[3], fsize[3];
2193#ifndef MATH_STANDALONE
2199 float U_A[3][3], U_B[3][3],
U[3][3];
2200 float quat_A[4], quat_B[4], quat[4];
2203 float P_A[3][3], P_B[3][3],
P[3][3];
2231 for (
i = 0;
i < 3;
i++) {
2241 float A3[3][3], B3[3][3], R3[3][3];
2244 float loc_A[3], loc_B[3], loc[3];
2291 const float rot[3][3],
2292 const float size[3])
2302 const float size[3])
2304 float rmat[3][3], smat[3][3], tmat[3][3];
2324 float R[4][4],
const float loc[3],
const float eul[3],
const float size[3],
const short order)
2326 float rmat[3][3], smat[3][3], tmat[3][3];
2347 const float quat[4],
2348 const float size[3])
2350 float rmat[3][3], smat[3][3], tmat[3][3];
2374 printf(
"%f %f %f\n", m[0][0], m[1][0], m[2][0]);
2375 printf(
"%f %f %f\n", m[0][1], m[1][1], m[2][1]);
2376 printf(
"%f %f %f\n", m[0][2], m[1][2], m[2][2]);
2383 printf(
"%f %f %f %f\n", m[0][0], m[1][0], m[2][0], m[3][0]);
2384 printf(
"%f %f %f %f\n", m[0][1], m[1][1], m[2][1], m[3][1]);
2385 printf(
"%f %f %f %f\n", m[0][2], m[1][2], m[2][2], m[3][2]);
2386 printf(
"%f %f %f %f\n", m[0][3], m[1][3], m[2][3], m[3][3]);
2390void svd_m4(
float U[4][4],
float s[4],
float V[4][4],
float A_[4][4])
2396 float work1[4], work2[4];
2402 float *work = work1;
2406 int i = 0, j = 0, k = 0, p, pp, iter;
2411 int nct =
min_ii(m - 1, n);
2418 for (k = 0; k <
max_ii(nct, nrt); k++) {
2425 for (
i = k;
i < m;
i++) {
2430 if (
A[k][k] < 0.0f) {
2433 invsk = 1.0f / s[k];
2434 for (
i = k;
i < m;
i++) {
2441 for (j = k + 1; j < n; j++) {
2442 if ((k < nct) && (s[k] != 0.0f)) {
2447 for (
i = k;
i < m;
i++) {
2448 t +=
A[
i][k] *
A[
i][j];
2451 for (
i = k;
i < m;
i++) {
2452 A[
i][j] += t *
A[
i][k];
2466 for (
i = k;
i < m;
i++) {
2476 for (
i = k + 1;
i < n;
i++) {
2481 if (
e[k + 1] < 0.0f) {
2484 invek = 1.0f /
e[k];
2485 for (
i = k + 1;
i < n;
i++) {
2491 if ((k + 1 < m) && (
e[k] != 0.0f)) {
2496 for (
i = k + 1;
i < m;
i++) {
2499 for (j = k + 1; j < n; j++) {
2500 for (
i = k + 1;
i < m;
i++) {
2501 work[
i] +=
e[j] *
A[
i][j];
2504 invek1 = 1.0f /
e[k + 1];
2505 for (j = k + 1; j < n; j++) {
2506 float t = -
e[j] * invek1;
2507 for (
i = k + 1;
i < m;
i++) {
2508 A[
i][j] += t * work[
i];
2516 for (
i = k + 1;
i < n;
i++) {
2526 s[nct] =
A[nct][nct];
2532 e[nrt] =
A[nrt][p - 1];
2538 for (j = nct; j < nu; j++) {
2539 for (
i = 0;
i < m;
i++) {
2544 for (k = nct - 1; k >= 0; k--) {
2546 for (j = k + 1; j < nu; j++) {
2548 for (
i = k;
i < m;
i++) {
2549 t +=
U[
i][k] *
U[
i][j];
2552 for (
i = k;
i < m;
i++) {
2553 U[
i][j] += t *
U[
i][k];
2556 for (
i = k;
i < m;
i++) {
2559 U[k][k] = 1.0f +
U[k][k];
2560 for (
i = 0;
i < k - 1;
i++) {
2565 for (
i = 0;
i < m;
i++) {
2574 for (k = n - 1; k >= 0; k--) {
2575 if ((k < nrt) && (
e[k] != 0.0f)) {
2576 for (j = k + 1; j < nu; j++) {
2578 for (
i = k + 1;
i < n;
i++) {
2579 t +=
V[
i][k] *
V[
i][j];
2581 t = -t /
V[k + 1][k];
2582 for (
i = k + 1;
i < n;
i++) {
2583 V[
i][j] += t *
V[
i][k];
2587 for (
i = 0;
i < n;
i++) {
2617 for (k = p - 2; k >= -1; k--) {
2631 for (ks = p - 1; ks >= k; ks--) {
2636 t = (ks != p ?
fabsf(
e[ks]) : 0.0f) + (ks != k + 1 ?
fabsf(
e[ks - 1]) : 0.0f);
2645 else if (ks == p - 1) {
2664 for (j = p - 2; j >= k; j--) {
2665 float t =
hypotf(s[j], f);
2666 float invt = 1.0f / t;
2667 float cs = s[j] * invt;
2668 float sn = f * invt;
2672 e[j - 1] = cs *
e[j - 1];
2675 for (
i = 0;
i < n;
i++) {
2676 t = cs *
V[
i][j] + sn *
V[
i][p - 1];
2677 V[
i][p - 1] = -sn *
V[
i][j] + cs *
V[
i][p - 1];
2689 for (j = k; j < p; j++) {
2690 float t =
hypotf(s[j], f);
2691 float invt = 1.0f / t;
2692 float cs = s[j] * invt;
2693 float sn = f * invt;
2698 for (
i = 0;
i < m;
i++) {
2699 t = cs *
U[
i][j] + sn *
U[
i][k - 1];
2700 U[
i][k - 1] = -sn *
U[
i][j] + cs *
U[
i][k - 1];
2716 float invscale = 1.0f / scale;
2717 float sp = s[p - 1] * invscale;
2718 float spm1 = s[p - 2] * invscale;
2719 float epm1 =
e[p - 2] * invscale;
2720 float sk = s[k] * invscale;
2721 float ek =
e[k] * invscale;
2722 float b = ((spm1 + sp) * (spm1 - sp) + epm1 * epm1) * 0.5f;
2723 float c = (sp * epm1) * (sp * epm1);
2726 if ((
b != 0.0f) || (c != 0.0f)) {
2731 shift = c / (
b + shift);
2733 f = (sk + sp) * (sk - sp) + shift;
2738 for (j = k; j < p - 1; j++) {
2741 float cs = (t == 0.0f) ? 0.0f : f / t;
2742 float sn = (t == 0.0f) ? 0.0f : g / t;
2746 f = cs * s[j] + sn *
e[j];
2747 e[j] = cs *
e[j] - sn * s[j];
2749 s[j + 1] = cs * s[j + 1];
2751 for (
i = 0;
i < n;
i++) {
2752 t = cs *
V[
i][j] + sn *
V[
i][j + 1];
2753 V[
i][j + 1] = -sn *
V[
i][j] + cs *
V[
i][j + 1];
2759 cs = (t == 0.0f) ? 0.0f : f / t;
2760 sn = (t == 0.0f) ? 0.0f : g / t;
2762 f = cs *
e[j] + sn * s[j + 1];
2763 s[j + 1] = -sn *
e[j] + cs * s[j + 1];
2765 e[j + 1] = cs *
e[j + 1];
2767 for (
i = 0;
i < m;
i++) {
2768 t = cs *
U[
i][j] + sn *
U[
i][j + 1];
2769 U[
i][j + 1] = -sn *
U[
i][j] + cs *
U[
i][j + 1];
2785 s[k] = (s[k] < 0.0f ? -s[k] : 0.0f);
2787 for (
i = 0;
i <= pp;
i++) {
2796 if (s[k] >= s[k + 1]) {
2803 for (
i = 0;
i < n;
i++) {
2805 V[
i][k + 1] =
V[
i][k];
2810 for (
i = 0;
i < m;
i++) {
2812 U[
i][k + 1] =
U[
i][k];
2830 float A[4][4],
V[4][4],
W[4], Wm[4][4],
U[4][4];
2839 for (
i = 0;
i < 4;
i++) {
2840 Wm[
i][
i] = (
W[
i] < epsilon) ? 0.0f : 1.0f /
W[
i];
2852 float mat_tmp[4][4], tmpinv[4][4];
2869 float mat_tmp[4][4];
2876 mat_tmp[0][0] += 1e-8f;
2877 mat_tmp[1][1] += 1e-8f;
2878 mat_tmp[2][2] += 1e-8f;
2904 float mat_tmp[4][4];
2915 float mat_tmp[3][3];
2926 const float local[4][4],
2927 const float target[4][4])
2929 float itarget[4][4];
2936 const float local[4][4],
2937 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 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_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 float mul_project_m4_v3_zfac(const float mat[4][4], const float co[3]) ATTR_WARN_UNUSED_RESULT
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
static double angle(const Eigen::Vector3d &v1, const Eigen::Vector3d &v2)
BMesh const char void * data
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMVert * v
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
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)
MatBase< C, R > inverse(MatBase< C, R >) RET
VecBase< float, D > normalize(VecOp< float, D >) RET
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 mul_v2_m4v3(float r[2], const float mat[4][4], const float vec[3])
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 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])
void orthogonalize_m4(float R[4][4], int axis)
void mul_v3_project_m4_v3(float r[3], const float mat[4][4], const float vec[3])
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 size_to_mat3(float R[3][3], const float size[3])
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 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 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_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])
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)
bool has_zero_axis_m4(const float matrix[4][4])
void transform_pivot_set_m4(float mat[4][4], const float pivot[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])
bool is_identity_m4(const float m[4][4])
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_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 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 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 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)
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 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])
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])
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 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])
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