[Bf-blender-cvs] [6022ea47aa4] soc-2019-adaptive-cloth: Cloth: some code to better understand problems with pinning

ishbosamiya noreply at git.blender.org
Mon Aug 26 05:50:35 CEST 2019


Commit: 6022ea47aa47c85ee1d5a3941b7a37c27e1c32ea
Author: ishbosamiya
Date:   Mon Aug 19 21:11:59 2019 +0530
Branches: soc-2019-adaptive-cloth
https://developer.blender.org/rB6022ea47aa47c85ee1d5a3941b7a37c27e1c32ea

Cloth: some code to better understand problems with pinning

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

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

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

diff --git a/source/blender/blenkernel/intern/cloth.c b/source/blender/blenkernel/intern/cloth.c
index 50b591949c0..04bffcc0fb4 100644
--- a/source/blender/blenkernel/intern/cloth.c
+++ b/source/blender/blenkernel/intern/cloth.c
@@ -364,7 +364,17 @@ static Mesh *do_step_cloth(
   }
 
   /* Support for dynamic vertex groups, changing from frame to frame */
+
+#if 0
+  if (clmd->mesh) {
+    cloth_apply_vgroup(clmd, clmd->mesh);
+  }
+  else {
+    cloth_apply_vgroup(clmd, result);
+  }
+#else
   cloth_apply_vgroup(clmd, result);
+#endif
 
   if ((clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_DYNAMIC_BASEMESH) ||
       (clmd->sim_parms->vgroup_shrink > 0) || (clmd->sim_parms->shrink_min > 0.0f)) {
@@ -389,6 +399,10 @@ static Mesh *do_step_cloth(
     mesh_result = cloth_remeshing_step(depsgraph, ob, clmd, result);
   }
 
+#if 0
+  BKE_id_copy_ex(NULL, (ID *)mesh_result, (ID **)&clmd->mesh, LIB_ID_COPY_LOCALIZE);
+#endif
+
   if (!ret) {
     return NULL;
   }
@@ -834,6 +848,30 @@ int cloth_uses_vgroup(ClothModifierData *clmd)
  */
 void cloth_apply_vgroup(ClothModifierData *clmd, Mesh *mesh)
 {
+#if 0
+  {
+    printf("mesh in %s totvert: %d\n", __func__, mesh->totvert);
+    MDeformVert *dvert = NULL;
+    for (int i = 0; i < mesh->totvert; i++) {
+      dvert = (MDeformVert *)CustomData_get(&mesh->vdata, i, CD_MDEFORMVERT);
+      if (dvert) {
+        printf("v: %f %f %f weights: ",
+               mesh->mvert[i].co[0],
+               mesh->mvert[i].co[1],
+               mesh->mvert[i].co[2]);
+        for (int j = 0; j < dvert->totweight; j++) {
+          if (dvert->dw[j].def_nr == (clmd->sim_parms->vgroup_mass - 1)) {
+            printf("%f ", pow4f(dvert->dw[j].weight));
+            if (dvert->dw[j].weight < 0.9999f) {
+              dvert->totweight = 0;
+            }
+          }
+        }
+        printf("\n");
+      }
+    }
+  }
+#endif
   /* Can be optimized to do all groups in one loop. */
   int i = 0;
   int j = 0;
diff --git a/source/blender/blenkernel/intern/cloth_remeshing.cpp b/source/blender/blenkernel/intern/cloth_remeshing.cpp
index eeaac6a99be..35a067e8f1e 100644
--- a/source/blender/blenkernel/intern/cloth_remeshing.cpp
+++ b/source/blender/blenkernel/intern/cloth_remeshing.cpp
@@ -1970,6 +1970,7 @@ static bool cloth_remeshing_collapse_edges(ClothModifierData *clmd,
       /* update active_faces */
       cloth_remeshing_update_active_faces(active_faces, clmd->clothObject->bm, temp_vert);
 
+#if 0
       /* run cloth_remeshing_fix_mesh on newly created faces by
        * cloth_remeshing_try_edge_collapse */
       vector<BMFace *> fix_active;
@@ -1982,6 +1983,7 @@ static bool cloth_remeshing_collapse_edges(ClothModifierData *clmd,
 
       /* update active_faces */
       cloth_remeshing_update_active_faces(active_faces, fix_active);
+#endif
 
       count++;
       return true;
@@ -2912,6 +2914,32 @@ static void cloth_remeshing_compute_vertex_sizing(ClothModifierData *clmd,
   }
 }
 
+static bool cloth_remeshing_find_in_mesh(Mesh *mesh, float a[3])
+{
+  for (int i = 0; i < mesh->totvert; i++) {
+    if (equals_v3v3(mesh->mvert[i].co, a, ALMOST_ZERO)) {
+      return true;
+    }
+  }
+  return false;
+}
+
+static void cloth_remeshing_reset_pin_weights(Mesh *old_mesh, Mesh *new_mesh)
+{
+  MDeformVert *dvert = NULL;
+  for (int i = 0; i < new_mesh->totvert; i++) {
+    dvert = (MDeformVert *)CustomData_get(&new_mesh->vdata, i, CD_MDEFORMVERT);
+    if (dvert) {
+      /* if vert is in old mesh, then leave it as is, otherwise
+       * set weight to 0 */
+      if (!cloth_remeshing_find_in_mesh(old_mesh, new_mesh->mvert[i].co)) {
+        print_v3("didn't find", new_mesh->mvert[i].co);
+        dvert->totweight = 0;
+      }
+    }
+  }
+}
+
 Mesh *cloth_remeshing_step(Depsgraph *depsgraph, Object *ob, ClothModifierData *clmd, Mesh *mesh)
 {
   ClothVertMap cvm;
@@ -2941,6 +2969,28 @@ Mesh *cloth_remeshing_step(Depsgraph *depsgraph, Object *ob, ClothModifierData *
   /*        mesh_result->totedge, */
   /*        mesh_result->totpoly); */
 
+#if 0
+  MDeformVert *dvert = NULL;
+  cloth_remeshing_reset_pin_weights(mesh, mesh_result);
+  printf("mesh->totvert: %d\n", mesh->totvert);
+  printf("mesh_result->totvert: %d\n", mesh_result->totvert);
+  for (int i = 0; i < mesh_result->totvert; i++) {
+    dvert = (MDeformVert *)CustomData_get(&mesh_result->vdata, i, CD_MDEFORMVERT);
+    if (dvert) {
+      printf("v: %f %f %f weights: ",
+             mesh_result->mvert[i].co[0],
+             mesh_result->mvert[i].co[1],
+             mesh_result->mvert[i].co[2]);
+      for (int j = 0; j < dvert->totweight; j++) {
+        if (dvert->dw[j].def_nr == (clmd->sim_parms->vgroup_mass - 1)) {
+          printf("%f ", pow4f(dvert->dw[j].weight));
+        }
+      }
+      printf("\n");
+    }
+  }
+#endif
+
   cvm.clear();
   return mesh_result;
 }



More information about the Bf-blender-cvs mailing list