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 const float eps = 1e-7f;
1679 float l1, l2, l3, l4, l5, l6;
1710 for (
i = 0;
i < 2;
i++) {
1718 for (
i = 0;
i < 3;
i++) {
1726 for (
i = 0;
i < 3;
i++) {
1734 for (
i = 0;
i < 3;
i++) {
1736 if (r_scale[
i] != 0.0f) {
1737 R[
i][3] /= r_scale[
i];
1744 for (
i = 0;
i < 3;
i++) {
1755 for (
i = 0;
i < 3;
i++) {
1757 rmat[
i][3] = (
len != 0.0f) ? (mat[
i][3] /
len) : mat[
i][3];
1764 const float r00 =
M[1][1];
1765 const float r01 = -
M[0][1];
1766 const float r10 = -
M[1][0];
1767 const float r11 =
M[0][0];
1778 R[0][0] =
M[1][1] *
M[2][2] -
M[1][2] *
M[2][1];
1779 R[0][1] = -
M[0][1] *
M[2][2] +
M[0][2] *
M[2][1];
1780 R[0][2] =
M[0][1] *
M[1][2] -
M[0][2] *
M[1][1];
1782 R[1][0] = -
M[1][0] *
M[2][2] +
M[1][2] *
M[2][0];
1783 R[1][1] =
M[0][0] *
M[2][2] -
M[0][2] *
M[2][0];
1784 R[1][2] = -
M[0][0] *
M[1][2] +
M[0][2] *
M[1][0];
1786 R[2][0] =
M[1][0] *
M[2][1] -
M[1][1] *
M[2][0];
1787 R[2][1] = -
M[0][0] *
M[2][1] +
M[0][1] *
M[2][0];
1788 R[2][2] =
M[0][0] *
M[1][1] -
M[0][1] *
M[1][0];
1793 float a1, a2, a3, a4, b1, b2, b3, b4;
1794 float c1, c2, c3, c4, d1, d2, d3, d4;
1839 return a * d -
b * c;
1843 float a1,
float a2,
float a3,
float b1,
float b2,
float b3,
float c1,
float c2,
float c3)
1856 float a1, a2, a3, a4, b1, b2, b3, b4, c1, c2, c3, c4, d1, d2, d3, d4;
1946 if (volume != 0.0f) {
2025#ifndef MATH_STANDALONE
2032 float W[3][3], S[3][3],
V[3][3], Vt[3][3];
2047 R[0][0] =
R[1][1] =
R[2][2] = scale;
2048 R[0][1] =
R[0][2] = 0.0;
2049 R[1][0] =
R[1][2] = 0.0;
2050 R[2][0] =
R[2][1] = 0.0;
2055 R[0][0] =
R[1][1] =
R[2][2] = scale;
2057 R[0][1] =
R[0][2] =
R[0][3] = 0.0;
2058 R[1][0] =
R[1][2] =
R[1][3] = 0.0;
2059 R[2][0] =
R[2][1] =
R[2][3] = 0.0;
2060 R[3][0] =
R[3][1] =
R[3][2] = 0.0;
2065 mat[3][0] += (Tx * mat[0][0] + Ty * mat[1][0] + Tz * mat[2][0]);
2066 mat[3][1] += (Tx * mat[0][1] + Ty * mat[1][1] + Tz * mat[2][1]);
2067 mat[3][2] += (Tx * mat[0][2] + Ty * mat[1][2] + Tz * mat[2][2]);
2080 float temp = angle_cos * mat[1][
col] + angle_sin * mat[2][
col];
2081 mat[2][
col] = -angle_sin * mat[1][
col] + angle_cos * mat[2][
col];
2088 float temp = angle_cos * mat[0][
col] - angle_sin * mat[2][
col];
2089 mat[2][
col] = angle_sin * mat[0][
col] + angle_cos * mat[2][
col];
2096 float temp = angle_cos * mat[0][
col] + angle_sin * mat[1][
col];
2097 mat[1][
col] = -angle_sin * mat[0][
col] + angle_cos * mat[1][
col];
2129 const float dst[3][3],
2130 const float src[3][3],
2131 const float srcweight)
2133 float srot[3][3], drot[3][3];
2134 float squat[4], dquat[4], fquat[4];
2135 float sscale[3], dscale[3], fsize[3];
2136 float rmat[3][3], smat[3][3];
2155 const float dst[4][4],
2156 const float src[4][4],
2157 const float srcweight)
2159 float sloc[3], dloc[3], floc[3];
2160 float srot[3][3], drot[3][3];
2161 float squat[4], dquat[4], fquat[4];
2162 float sscale[3], dscale[3], fsize[3];
2180#ifndef MATH_STANDALONE
2186 float U_A[3][3], U_B[3][3],
U[3][3];
2187 float quat_A[4], quat_B[4], quat[4];
2190 float P_A[3][3], P_B[3][3],
P[3][3];
2218 for (
i = 0;
i < 3;
i++) {
2228 float A3[3][3], B3[3][3], R3[3][3];
2231 float loc_A[3], loc_B[3], loc[3];
2278 const float rot[3][3],
2279 const float size[3])
2289 const float size[3])
2291 float rmat[3][3], smat[3][3], tmat[3][3];
2311 float R[4][4],
const float loc[3],
const float eul[3],
const float size[3],
const short order)
2313 float rmat[3][3], smat[3][3], tmat[3][3];
2334 const float quat[4],
2335 const float size[3])
2337 float rmat[3][3], smat[3][3], tmat[3][3];
2361 printf(
"%f %f %f\n", m[0][0], m[1][0], m[2][0]);
2362 printf(
"%f %f %f\n", m[0][1], m[1][1], m[2][1]);
2363 printf(
"%f %f %f\n", m[0][2], m[1][2], m[2][2]);
2370 printf(
"%f %f %f %f\n", m[0][0], m[1][0], m[2][0], m[3][0]);
2371 printf(
"%f %f %f %f\n", m[0][1], m[1][1], m[2][1], m[3][1]);
2372 printf(
"%f %f %f %f\n", m[0][2], m[1][2], m[2][2], m[3][2]);
2373 printf(
"%f %f %f %f\n", m[0][3], m[1][3], m[2][3], m[3][3]);
2377void svd_m4(
float U[4][4],
float s[4],
float V[4][4],
float A_[4][4])
2383 float work1[4], work2[4];
2389 float *work = work1;
2393 int i = 0, j = 0, k = 0, p, pp, iter;
2398 int nct =
min_ii(m - 1, n);
2405 for (k = 0; k <
max_ii(nct, nrt); k++) {
2412 for (
i = k;
i < m;
i++) {
2417 if (
A[k][k] < 0.0f) {
2420 invsk = 1.0f / s[k];
2421 for (
i = k;
i < m;
i++) {
2428 for (j = k + 1; j < n; j++) {
2429 if ((k < nct) && (s[k] != 0.0f)) {
2434 for (
i = k;
i < m;
i++) {
2435 t +=
A[
i][k] *
A[
i][j];
2438 for (
i = k;
i < m;
i++) {
2439 A[
i][j] += t *
A[
i][k];
2453 for (
i = k;
i < m;
i++) {
2463 for (
i = k + 1;
i < n;
i++) {
2468 if (
e[k + 1] < 0.0f) {
2471 invek = 1.0f /
e[k];
2472 for (
i = k + 1;
i < n;
i++) {
2478 if ((k + 1 < m) && (
e[k] != 0.0f)) {
2483 for (
i = k + 1;
i < m;
i++) {
2486 for (j = k + 1; j < n; j++) {
2487 for (
i = k + 1;
i < m;
i++) {
2488 work[
i] +=
e[j] *
A[
i][j];
2491 invek1 = 1.0f /
e[k + 1];
2492 for (j = k + 1; j < n; j++) {
2493 float t = -
e[j] * invek1;
2494 for (
i = k + 1;
i < m;
i++) {
2495 A[
i][j] += t * work[
i];
2503 for (
i = k + 1;
i < n;
i++) {
2513 s[nct] =
A[nct][nct];
2519 e[nrt] =
A[nrt][p - 1];
2525 for (j = nct; j < nu; j++) {
2526 for (
i = 0;
i < m;
i++) {
2531 for (k = nct - 1; k >= 0; k--) {
2533 for (j = k + 1; j < nu; j++) {
2535 for (
i = k;
i < m;
i++) {
2536 t +=
U[
i][k] *
U[
i][j];
2539 for (
i = k;
i < m;
i++) {
2540 U[
i][j] += t *
U[
i][k];
2543 for (
i = k;
i < m;
i++) {
2546 U[k][k] = 1.0f +
U[k][k];
2547 for (
i = 0;
i < k - 1;
i++) {
2552 for (
i = 0;
i < m;
i++) {
2561 for (k = n - 1; k >= 0; k--) {
2562 if ((k < nrt) && (
e[k] != 0.0f)) {
2563 for (j = k + 1; j < nu; j++) {
2565 for (
i = k + 1;
i < n;
i++) {
2566 t +=
V[
i][k] *
V[
i][j];
2568 t = -t /
V[k + 1][k];
2569 for (
i = k + 1;
i < n;
i++) {
2570 V[
i][j] += t *
V[
i][k];
2574 for (
i = 0;
i < n;
i++) {
2604 for (k = p - 2; k >= -1; k--) {
2618 for (ks = p - 1; ks >= k; ks--) {
2623 t = (ks != p ?
fabsf(
e[ks]) : 0.0f) + (ks != k + 1 ?
fabsf(
e[ks - 1]) : 0.0f);
2632 else if (ks == p - 1) {
2651 for (j = p - 2; j >= k; j--) {
2652 float t =
hypotf(s[j], f);
2653 float invt = 1.0f / t;
2654 float cs = s[j] * invt;
2655 float sn = f * invt;
2659 e[j - 1] = cs *
e[j - 1];
2662 for (
i = 0;
i < n;
i++) {
2663 t = cs *
V[
i][j] + sn *
V[
i][p - 1];
2664 V[
i][p - 1] = -sn *
V[
i][j] + cs *
V[
i][p - 1];
2676 for (j = k; j < p; j++) {
2677 float t =
hypotf(s[j], f);
2678 float invt = 1.0f / t;
2679 float cs = s[j] * invt;
2680 float sn = f * invt;
2685 for (
i = 0;
i < m;
i++) {
2686 t = cs *
U[
i][j] + sn *
U[
i][k - 1];
2687 U[
i][k - 1] = -sn *
U[
i][j] + cs *
U[
i][k - 1];
2703 float invscale = 1.0f / scale;
2704 float sp = s[p - 1] * invscale;
2705 float spm1 = s[p - 2] * invscale;
2706 float epm1 =
e[p - 2] * invscale;
2707 float sk = s[k] * invscale;
2708 float ek =
e[k] * invscale;
2709 float b = ((spm1 + sp) * (spm1 - sp) + epm1 * epm1) * 0.5f;
2710 float c = (sp * epm1) * (sp * epm1);
2713 if ((
b != 0.0f) || (c != 0.0f)) {
2718 shift = c / (
b + shift);
2720 f = (sk + sp) * (sk - sp) + shift;
2725 for (j = k; j < p - 1; j++) {
2728 float cs = (t == 0.0f) ? 0.0f : f / t;
2729 float sn = (t == 0.0f) ? 0.0f : g / t;
2733 f = cs * s[j] + sn *
e[j];
2734 e[j] = cs *
e[j] - sn * s[j];
2736 s[j + 1] = cs * s[j + 1];
2738 for (
i = 0;
i < n;
i++) {
2739 t = cs *
V[
i][j] + sn *
V[
i][j + 1];
2740 V[
i][j + 1] = -sn *
V[
i][j] + cs *
V[
i][j + 1];
2746 cs = (t == 0.0f) ? 0.0f : f / t;
2747 sn = (t == 0.0f) ? 0.0f : g / t;
2749 f = cs *
e[j] + sn * s[j + 1];
2750 s[j + 1] = -sn *
e[j] + cs * s[j + 1];
2752 e[j + 1] = cs *
e[j + 1];
2754 for (
i = 0;
i < m;
i++) {
2755 t = cs *
U[
i][j] + sn *
U[
i][j + 1];
2756 U[
i][j + 1] = -sn *
U[
i][j] + cs *
U[
i][j + 1];
2772 s[k] = (s[k] < 0.0f ? -s[k] : 0.0f);
2774 for (
i = 0;
i <= pp;
i++) {
2783 if (s[k] >= s[k + 1]) {
2790 for (
i = 0;
i < n;
i++) {
2792 V[
i][k + 1] =
V[
i][k];
2797 for (
i = 0;
i < m;
i++) {
2799 U[
i][k + 1] =
U[
i][k];
2817 float A[4][4],
V[4][4],
W[4], Wm[4][4],
U[4][4];
2826 for (
i = 0;
i < 4;
i++) {
2827 Wm[
i][
i] = (
W[
i] < epsilon) ? 0.0f : 1.0f /
W[
i];
2839 float mat_tmp[4][4], tmpinv[4][4];
2856 float mat_tmp[4][4];
2863 mat_tmp[0][0] += 1e-8f;
2864 mat_tmp[1][1] += 1e-8f;
2865 mat_tmp[2][2] += 1e-8f;
2891 float mat_tmp[4][4];
2902 float mat_tmp[3][3];
2913 const float local[4][4],
2914 const float target[4][4])
2916 float itarget[4][4];
2923 const float local[4][4],
2924 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])
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