Commit: 57df2985e3cc6f6ae73c6a226bbe68a233085f2a
Author: ishbosamiya
Date:   Thu Jul 18 16:33:02 2019 +0530
Branches: soc-2019-adaptive-cloth
https://developer.blender.org/rB57df2985e3cc6f6ae73c6a226bbe68a233085f2a

Cloth: added eigen decomposition support for 2x2 matrix

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

M       source/blender/blenkernel/intern/cloth_remeshing.cpp

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

diff --git a/source/blender/blenkernel/intern/cloth_remeshing.cpp 
b/source/blender/blenkernel/intern/cloth_remeshing.cpp
index 1a413dfd238..c2ceff18708 100644
--- a/source/blender/blenkernel/intern/cloth_remeshing.cpp
+++ b/source/blender/blenkernel/intern/cloth_remeshing.cpp
@@ -68,6 +68,7 @@ extern "C" {
 #include <vector>
 #include <map>
 #include <utility>
+#include <algorithm>
 using namespace std;
 
 /******************************************************************************
@@ -1616,6 +1617,49 @@ static float cloth_remeshing_calc_area(BMesh *bm, BMVert 
*v)
   return area / (float)i;
 }
 
+static void cloth_remeshing_eigen_decomposition(float mat[2][2], float 
r_mat[2][2], float r_vec[2])
+{
+  float a = mat[0][0];
+  float b = mat[1][0];
+  float d = mat[1][1];
+
+  float amd = a - d;
+  float apd = a + d;
+  float b2 = b * b;
+  float det = sqrtf(4 * b + amd * amd);
+  float l1 = 0.5 * (apd + det);
+  float l2 = 0.5 * (apd - det);
+
+  r_vec[0] = l1;
+  r_vec[1] = l2;
+
+  float v0, v1, vn;
+  if (b) {
+    v0 = l1 - d;
+    v1 = b;
+    vn = sqrtf(v0 * v0 + b2);
+    r_mat[0][0] = v0 / vn;
+    r_mat[1][0] = v1 / vn;
+
+    v0 = l2 - d;
+    vn = sqrtf(v0 * v0 + b2);
+    r_mat[0][1] = v0 / vn;
+    r_mat[1][1] = v1 / vn;
+  }
+  else if (a >= d) {
+    r_mat[0][0] = 1;
+    r_mat[1][0] = 0;
+    r_mat[0][1] = 0;
+    r_mat[1][1] = 1;
+  }
+  else {
+    r_mat[0][0] = 0;
+    r_mat[1][0] = 1;
+    r_mat[0][1] = 1;
+    r_mat[1][1] = 0;
+  }
+}
+
 static void cloth_remeshing_curvature(BMFace *f, float r_mat[2][2])
 {
   /* TODO(Ish) */
@@ -1718,9 +1762,35 @@ static ClothSizing 
cloth_remeshing_compute_face_sizing(ClothModifierData *clmd,
   add_m2_m2m2(m, m, dvel_temp);
   add_m2_m2m2(m, m, obs);
 
-  /* TODO(Ish): eigen decomposition on m */
+  /* eigen decomposition on m */
+  float l[2];    /* Eigen values */
+  float q[2][2]; /* Eigen Matrix */
+  cloth_remeshing_eigen_decomposition(m, q, l);
+  for (int i = 0; i < 2; i++) {
+    l[i] = min(max(l[i], 1.0f / clmd->sim_parms->size_max), 1.0f / 
clmd->sim_parms->size_min);
+  }
+  float lmax = max(l[0], l[1]);
+  float lmin = lmax * clmd->sim_parms->aspect_min * 
clmd->sim_parms->aspect_min;
+  for (int i = 0; i < 2; i++) {
+    if (l[i] < lmin) {
+      l[i] = lmin;
+    }
+  }
+  float result[2][2];
+  float temp_result[2][2];
+  float diag_l[2][2];
+  zero_m2(diag_l);
+  for (int i = 0; i < 2; i++) {
+    diag_l[i][i] = l[i];
+  }
+  float q_t[2][2];
+  copy_m2_m2(q_t, q);
+  transpose_m2(q_t);
+
+  mul_m2_m2m2(temp_result, q, diag_l);
+  mul_m2_m2m2(result, temp_result, q_t);
 
-  return ClothSizing(m);
+  return ClothSizing(result);
 }
 
 static ClothSizing cloth_remeshing_compute_vertex_sizing(BMesh *bm,

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to