Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/blenlib/intern/math_matrix.c')
-rw-r--r--source/blender/blenlib/intern/math_matrix.c207
1 files changed, 142 insertions, 65 deletions
diff --git a/source/blender/blenlib/intern/math_matrix.c b/source/blender/blenlib/intern/math_matrix.c
index 7fc30e3112b..74b0df1c6c0 100644
--- a/source/blender/blenlib/intern/math_matrix.c
+++ b/source/blender/blenlib/intern/math_matrix.c
@@ -274,71 +274,148 @@ void mul_m4_m3m4(float m1[4][4], float m3_[3][3], float m2_[4][4])
m1[2][2] = m2[2][0] * m3[0][2] + m2[2][1] * m3[1][2] + m2[2][2] * m3[2][2];
}
-void mul_serie_m3(float answ[3][3],
- float m1[3][3], float m2[3][3], float m3[3][3],
- float m4[3][3], float m5[3][3], float m6[3][3],
- float m7[3][3], float m8[3][3])
-{
- float temp[3][3];
-
- if (m1 == NULL || m2 == NULL) return;
-
- mul_m3_m3m3(answ, m2, m1);
- if (m3) {
- mul_m3_m3m3(temp, m3, answ);
- if (m4) {
- mul_m3_m3m3(answ, m4, temp);
- if (m5) {
- mul_m3_m3m3(temp, m5, answ);
- if (m6) {
- mul_m3_m3m3(answ, m6, temp);
- if (m7) {
- mul_m3_m3m3(temp, m7, answ);
- if (m8) {
- mul_m3_m3m3(answ, m8, temp);
- }
- else copy_m3_m3(answ, temp);
- }
- }
- else copy_m3_m3(answ, temp);
- }
- }
- else copy_m3_m3(answ, temp);
- }
-}
-void mul_serie_m4(float answ[4][4], float m1[4][4],
- float m2[4][4], float m3[4][4], float m4[4][4],
- float m5[4][4], float m6[4][4], float m7[4][4],
- float m8[4][4])
-{
- float temp[4][4];
-
- if (m1 == NULL || m2 == NULL) return;
-
- mul_m4_m4m4(answ, m1, m2);
- if (m3) {
- mul_m4_m4m4(temp, answ, m3);
- if (m4) {
- mul_m4_m4m4(answ, temp, m4);
- if (m5) {
- mul_m4_m4m4(temp, answ, m5);
- if (m6) {
- mul_m4_m4m4(answ, temp, m6);
- if (m7) {
- mul_m4_m4m4(temp, answ, m7);
- if (m8) {
- mul_m4_m4m4(answ, temp, m8);
- }
- else copy_m4_m4(answ, temp);
- }
- }
- else copy_m4_m4(answ, temp);
- }
- }
- else copy_m4_m4(answ, temp);
- }
-}
+/** \name Macro helpers for: mul_serie_m3
+ * \{ */
+void _va_mul_serie_m3_3(
+ float r[3][3],
+ float m1[3][3], float m2[3][3])
+{
+ mul_m3_m3m3(r, m2, m1);
+}
+void _va_mul_serie_m3_4(
+ float r[3][3],
+ float m1[3][3], float m2[3][3], float m3[3][3])
+{
+ mul_m3_m3m3(r, m2, m1);
+ mul_m3_m3m3(r, m3, r);
+}
+void _va_mul_serie_m3_5(
+ float r[3][3],
+ float m1[3][3], float m2[3][3], float m3[3][3], float m4[3][3])
+{
+ mul_m3_m3m3(r, m2, m1);
+ mul_m3_m3m3(r, m3, r);
+ mul_m3_m3m3(r, m4, r);
+}
+void _va_mul_serie_m3_6(
+ float r[3][3],
+ float m1[3][3], float m2[3][3], float m3[3][3], float m4[3][3],
+ float m5[3][3])
+{
+ mul_m3_m3m3(r, m2, m1);
+ mul_m3_m3m3(r, m3, r);
+ mul_m3_m3m3(r, m4, r);
+ mul_m3_m3m3(r, m5, r);
+}
+void _va_mul_serie_m3_7(
+ float r[3][3],
+ float m1[3][3], float m2[3][3], float m3[3][3], float m4[3][3],
+ float m5[3][3], float m6[3][3])
+{
+ mul_m3_m3m3(r, m2, m1);
+ mul_m3_m3m3(r, m3, r);
+ mul_m3_m3m3(r, m4, r);
+ mul_m3_m3m3(r, m5, r);
+ mul_m3_m3m3(r, m6, r);
+}
+void _va_mul_serie_m3_8(
+ float r[3][3],
+ float m1[3][3], float m2[3][3], float m3[3][3], float m4[3][3],
+ float m5[3][3], float m6[3][3], float m7[3][3])
+{
+ mul_m3_m3m3(r, m2, m1);
+ mul_m3_m3m3(r, m3, r);
+ mul_m3_m3m3(r, m4, r);
+ mul_m3_m3m3(r, m5, r);
+ mul_m3_m3m3(r, m6, r);
+ mul_m3_m3m3(r, m7, r);
+}
+void _va_mul_serie_m3_9(
+ float r[3][3],
+ float m1[3][3], float m2[3][3], float m3[3][3], float m4[3][3],
+ float m5[3][3], float m6[3][3], float m7[3][3], float m8[3][3])
+{
+ mul_m3_m3m3(r, m2, m1);
+ mul_m3_m3m3(r, m3, r);
+ mul_m3_m3m3(r, m4, r);
+ mul_m3_m3m3(r, m5, r);
+ mul_m3_m3m3(r, m6, r);
+ mul_m3_m3m3(r, m7, r);
+ mul_m3_m3m3(r, m8, r);
+}
+/** \} */
+
+/** \name Macro helpers for: mul_serie_m4
+ * \{ */
+void _va_mul_serie_m4_3(
+ float r[4][4],
+ float m1[4][4], float m2[4][4])
+{
+ mul_m4_m4m4(r, m2, m1);
+}
+void _va_mul_serie_m4_4(
+ float r[4][4],
+ float m1[4][4], float m2[4][4], float m3[4][4])
+{
+ mul_m4_m4m4(r, m2, m1);
+ mul_m4_m4m4(r, m3, r);
+}
+void _va_mul_serie_m4_5(
+ float r[4][4],
+ float m1[4][4], float m2[4][4], float m3[4][4], float m4[4][4])
+{
+ mul_m4_m4m4(r, m2, m1);
+ mul_m4_m4m4(r, m3, r);
+ mul_m4_m4m4(r, m4, r);
+}
+void _va_mul_serie_m4_6(
+ float r[4][4],
+ float m1[4][4], float m2[4][4], float m3[4][4], float m4[4][4],
+ float m5[4][4])
+{
+ mul_m4_m4m4(r, m2, m1);
+ mul_m4_m4m4(r, m3, r);
+ mul_m4_m4m4(r, m4, r);
+ mul_m4_m4m4(r, m5, r);
+}
+void _va_mul_serie_m4_7(
+ float r[4][4],
+ float m1[4][4], float m2[4][4], float m3[4][4], float m4[4][4],
+ float m5[4][4], float m6[4][4])
+{
+ mul_m4_m4m4(r, m2, m1);
+ mul_m4_m4m4(r, m3, r);
+ mul_m4_m4m4(r, m4, r);
+ mul_m4_m4m4(r, m5, r);
+ mul_m4_m4m4(r, m6, r);
+}
+void _va_mul_serie_m4_8(
+ float r[4][4],
+ float m1[4][4], float m2[4][4], float m3[4][4], float m4[4][4],
+ float m5[4][4], float m6[4][4], float m7[4][4])
+{
+ mul_m4_m4m4(r, m2, m1);
+ mul_m4_m4m4(r, m3, r);
+ mul_m4_m4m4(r, m4, r);
+ mul_m4_m4m4(r, m5, r);
+ mul_m4_m4m4(r, m6, r);
+ mul_m4_m4m4(r, m7, r);
+}
+void _va_mul_serie_m4_9(
+ float r[4][4],
+ float m1[4][4], float m2[4][4], float m3[4][4], float m4[4][4],
+ float m5[4][4], float m6[4][4], float m7[4][4], float m8[4][4])
+{
+ mul_m4_m4m4(r, m2, m1);
+ mul_m4_m4m4(r, m3, r);
+ mul_m4_m4m4(r, m4, r);
+ mul_m4_m4m4(r, m5, r);
+ mul_m4_m4m4(r, m6, r);
+ mul_m4_m4m4(r, m7, r);
+ mul_m4_m4m4(r, m8, r);
+}
+/** \} */
void mul_v2_m3v2(float r[2], float m[3][3], float v[2])
{
@@ -2115,7 +2192,7 @@ void pseudoinverse_m4_m4(float Ainv[4][4], float A[4][4], float epsilon)
transpose_m4(V);
- mul_serie_m4(Ainv, U, Wm, V, NULL, NULL, NULL, NULL, NULL);
+ mul_serie_m4(Ainv, U, Wm, V);
}
void pseudoinverse_m3_m3(float Ainv[3][3], float A[3][3], float epsilon)