[Bf-blender-cvs] [d4cc81d] master: Fix T38870: Freezes when jumping in front of a keyframe.

Sergey Sharybin noreply at git.blender.org
Tue Mar 25 11:07:18 CET 2014


Commit: d4cc81d5523b3e625b809baa4a57c73664fb13db
Author: Sergey Sharybin
Date:   Tue Mar 25 16:05:28 2014 +0600
https://developer.blender.org/rBd4cc81d5523b3e625b809baa4a57c73664fb13db

Fix T38870: Freezes when jumping in front of a keyframe.

Issue was caused by inverting a degenerate matrix when
evaluating drivers.

Solved by using tweaked inverse code (same as used in Cycles).

Should have no affect on cases when matrix is not degenerate.

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

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

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

diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c
index 415c84a..580a8a7 100644
--- a/source/blender/blenkernel/intern/constraint.c
+++ b/source/blender/blenkernel/intern/constraint.c
@@ -312,7 +312,7 @@ void BKE_constraint_mat_convertspace(Object *ob, bPoseChannel *pchan, float mat[
 			if (ob->parent) {
 				/* 'subtract' parent's effects from owner */
 				mul_m4_m4m4(diff_mat, ob->parent->obmat, ob->parentinv);
-				invert_m4_m4(imat, diff_mat);
+				invert_m4_m4_safe(imat, diff_mat);
 				mul_m4_m4m4(mat, imat, mat);
 			}
 			else {
@@ -323,7 +323,7 @@ void BKE_constraint_mat_convertspace(Object *ob, bPoseChannel *pchan, float mat[
 				normalize_m4(diff_mat);
 				zero_v3(diff_mat[3]);
 				
-				invert_m4_m4(imat, diff_mat);
+				invert_m4_m4_safe(imat, diff_mat);
 				mul_m4_m4m4(mat, imat, mat);
 			}
 		}
diff --git a/source/blender/blenlib/BLI_math_matrix.h b/source/blender/blenlib/BLI_math_matrix.h
index af25148..e59c557 100644
--- a/source/blender/blenlib/BLI_math_matrix.h
+++ b/source/blender/blenlib/BLI_math_matrix.h
@@ -166,6 +166,8 @@ void pseudoinverse_m3_m3(float Ainv[3][3], float A[3][3], float epsilon);
 
 bool has_zero_axis_m4(float matrix[4][4]);
 
+void invert_m4_m4_safe(float Ainv[4][4], float A[4][4]);
+
 /****************************** Transformations ******************************/
 
 void scale_m3_fl(float R[3][3], float scale);
diff --git a/source/blender/blenlib/intern/math_matrix.c b/source/blender/blenlib/intern/math_matrix.c
index eb5c5f4..3dd6c66 100644
--- a/source/blender/blenlib/intern/math_matrix.c
+++ b/source/blender/blenlib/intern/math_matrix.c
@@ -2110,3 +2110,23 @@ bool has_zero_axis_m4(float matrix[4][4])
 	       len_squared_v3(matrix[1]) < FLT_EPSILON ||
 	       len_squared_v3(matrix[2]) < FLT_EPSILON;
 }
+
+void invert_m4_m4_safe(float Ainv[4][4], float A[4][4])
+{
+	if (!invert_m4_m4(Ainv, A)) {
+		float Atemp[4][4];
+
+		copy_m4_m4(Atemp, A);
+
+		/* Matrix is degenerate (e.g. 0 scale on some axis), ideally we should
+		 * never be in this situation, but try to invert it anyway with tweak.
+		 */
+		Atemp[0][0] += 1e-8f;
+		Atemp[1][1] += 1e-8f;
+		Atemp[2][2] += 1e-8f;
+
+		if (!invert_m4_m4(Ainv, Atemp)) {
+			return unit_m4(Ainv);
+		}
+	}
+}




More information about the Bf-blender-cvs mailing list