[Bf-blender-cvs] [3380fb36467] master: Complete the set of matrix multiplication functions.

Alexander Gavrilov noreply at git.blender.org
Sun Apr 14 17:15:58 CEST 2019


Commit: 3380fb364677ed4695be74272777fd676520d721
Author: Alexander Gavrilov
Date:   Sun Apr 14 18:13:39 2019 +0300
Branches: master
https://developer.blender.org/rB3380fb364677ed4695be74272777fd676520d721

Complete the set of matrix multiplication functions.

Also, mul_m3_m3m4 was named incorrectly.

===================================================================

M	source/blender/blenlib/BLI_math_matrix.h
M	source/blender/blenlib/intern/math_matrix.c

===================================================================

diff --git a/source/blender/blenlib/BLI_math_matrix.h b/source/blender/blenlib/BLI_math_matrix.h
index 49e05f5401e..0b65597665d 100644
--- a/source/blender/blenlib/BLI_math_matrix.h
+++ b/source/blender/blenlib/BLI_math_matrix.h
@@ -69,7 +69,9 @@ void mul_m3_m3m3(float R[3][3], const float A[3][3], const float B[3][3]);
 void mul_m4_m3m4(float R[4][4], const float A[3][3], const float B[4][4]);
 void mul_m4_m4m3(float R[4][4], const float A[4][4], const float B[3][3]);
 void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4]);
-void mul_m3_m3m4(float R[3][3], const float A[4][4], const float B[3][3]);
+void mul_m3_m3m4(float R[3][3], const float A[3][3], const float B[4][4]);
+void mul_m3_m4m3(float R[3][3], const float A[4][4], const float B[3][3]);
+void mul_m3_m4m4(float R[3][3], const float A[4][4], const float B[4][4]);
 
 /* special matrix multiplies
  * uniq: R <-- AB, R is neither A nor B
diff --git a/source/blender/blenlib/intern/math_matrix.c b/source/blender/blenlib/intern/math_matrix.c
index d750ae4ce59..3da69e92227 100644
--- a/source/blender/blenlib/intern/math_matrix.c
+++ b/source/blender/blenlib/intern/math_matrix.c
@@ -316,8 +316,32 @@ void mul_m4_m4m3(float m1[4][4], const float m3_[4][4], const float m2_[3][3])
 	m1[2][2] = m2[2][0] * m3[0][2] + m2[2][1] * m3[1][2] + m2[2][2] * m3[2][2];
 }
 
+/* m1 = m2 * m3, ignore the elements on the 4th row/column of m2 */
+void mul_m3_m3m4(float m1[3][3], const float m3_[3][3], const float m2_[4][4])
+{
+	float m2[4][4], m3[3][3];
+
+	/* copy so it works when m1 is the same pointer as m2 or m3 */
+	/* TODO: avoid copying when matrices are different */
+	copy_m4_m4(m2, m2_);
+	copy_m3_m3(m3, m3_);
+
+	/* m1[i][j] = m2[i][k] * m3[k][j] */
+	m1[0][0] = m2[0][0] * m3[0][0] + m2[0][1] * m3[1][0] + m2[0][2] * m3[2][0];
+	m1[0][1] = m2[0][0] * m3[0][1] + m2[0][1] * m3[1][1] + m2[0][2] * m3[2][1];
+	m1[0][2] = m2[0][0] * m3[0][2] + m2[0][1] * m3[1][2] + m2[0][2] * m3[2][2];
+
+	m1[1][0] = m2[1][0] * m3[0][0] + m2[1][1] * m3[1][0] + m2[1][2] * m3[2][0];
+	m1[1][1] = m2[1][0] * m3[0][1] + m2[1][1] * m3[1][1] + m2[1][2] * m3[2][1];
+	m1[1][2] = m2[1][0] * m3[0][2] + m2[1][1] * m3[1][2] + m2[1][2] * m3[2][2];
+
+	m1[2][0] = m2[2][0] * m3[0][0] + m2[2][1] * m3[1][0] + m2[2][2] * m3[2][0];
+	m1[2][1] = m2[2][0] * m3[0][1] + m2[2][1] * m3[1][1] + m2[2][2] * m3[2][1];
+	m1[2][2] = m2[2][0] * m3[0][2] + m2[2][1] * m3[1][2] + m2[2][2] * m3[2][2];
+}
+
 /* m1 = m2 * m3, ignore the elements on the 4th row/column of m3 */
-void mul_m3_m3m4(float m1[3][3], const float m3_[4][4], const float m2_[3][3])
+void mul_m3_m4m3(float m1[3][3], const float m3_[4][4], const float m2_[3][3])
 {
 	float m2[3][3], m3[4][4];
 
@@ -360,6 +384,18 @@ void mul_m4_m3m4(float m1[4][4], const float m3_[3][3], const 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_m3_m4m4(float m1[3][3], const float m3[4][4], const float m2[4][4])
+{
+	m1[0][0] = m2[0][0] * m3[0][0] + m2[0][1] * m3[1][0] + m2[0][2] * m3[2][0];
+	m1[0][1] = m2[0][0] * m3[0][1] + m2[0][1] * m3[1][1] + m2[0][2] * m3[2][1];
+	m1[0][2] = m2[0][0] * m3[0][2] + m2[0][1] * m3[1][2] + m2[0][2] * m3[2][2];
+	m1[1][0] = m2[1][0] * m3[0][0] + m2[1][1] * m3[1][0] + m2[1][2] * m3[2][0];
+	m1[1][1] = m2[1][0] * m3[0][1] + m2[1][1] * m3[1][1] + m2[1][2] * m3[2][1];
+	m1[1][2] = m2[1][0] * m3[0][2] + m2[1][1] * m3[1][2] + m2[1][2] * m3[2][2];
+	m1[2][0] = m2[2][0] * m3[0][0] + m2[2][1] * m3[1][0] + m2[2][2] * m3[2][0];
+	m1[2][1] = m2[2][0] * m3[0][1] + m2[2][1] * m3[1][1] + m2[2][2] * m3[2][1];
+	m1[2][2] = m2[2][0] * m3[0][2] + m2[2][1] * m3[1][2] + m2[2][2] * m3[2][2];
+}
 
 /** \name Macro helpers for: mul_m3_series
  * \{ */



More information about the Bf-blender-cvs mailing list