[Bf-blender-cvs] [4844469ebc0] soc-2019-adaptive-cloth: Cloth: new method for collapsing an edge

ishbosamiya noreply at git.blender.org
Thu Aug 15 18:08:29 CEST 2019


Commit: 4844469ebc07b7f01d0b34f10f8ccfe329c8fea3
Author: ishbosamiya
Date:   Thu Aug 15 17:57:41 2019 +0530
Branches: soc-2019-adaptive-cloth
https://developer.blender.org/rB4844469ebc07b7f01d0b34f10f8ccfe329c8fea3

Cloth: new method for collapsing an edge

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

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 4d97cd06c01..2d0754cbb88 100644
--- a/source/blender/blenkernel/intern/cloth_remeshing.cpp
+++ b/source/blender/blenkernel/intern/cloth_remeshing.cpp
@@ -1607,8 +1607,9 @@ static bool cloth_remeshing_vert_on_seam_test(BMesh *bm, BMVert *v, const int cd
 
 static BMVert *cloth_remeshing_collapse_edge(BMesh *bm, BMEdge *e, int which, ClothVertMap &cvm)
 {
+#if 0
   BMVert *v1 = cloth_remeshing_edge_vert(e, which);
-#if 1
+#  if 1
   float uv_01[2], uv_02[2];
   cloth_remeshing_uv_of_vert_in_edge(bm, e, v1, uv_01);
   cloth_remeshing_uv_of_vert_in_edge(bm, e, cloth_remeshing_edge_vert(e, 1 - which), uv_02);
@@ -1619,22 +1620,22 @@ static BMVert *cloth_remeshing_collapse_edge(BMesh *bm, BMEdge *e, int which, Cl
   char file_name[100];
   sprintf(file_name, "/tmp/objs/collapse_edge_debug_before_collapse.obj");
   cloth_remeshing_export_obj(bm, file_name);
-#endif
+#  endif
   /* Need to store the value of vertex v1 which will be killed */
   BMVert *v = v1;
   BMVert *v2 = BM_edge_collapse(bm, e, v1, true, true);
 
   if (v2) {
     cloth_remeshing_remove_vertex_from_cloth(v, cvm);
-#if 1
+#  if 1
     BMFace *f;
     BMIter fiter;
     BM_ITER_ELEM (f, &fiter, v2, BM_FACES_OF_VERT) {
       BLI_assert(f->len == 3);
     }
-#endif
+#  endif
   }
-#if COLLAPSE_EDGES_DEBUG
+#  if COLLAPSE_EDGES_DEBUG
   printf("killed %f %f %f into %f %f %f\n",
          v.co[0],
          v.co[1],
@@ -1642,8 +1643,67 @@ static BMVert *cloth_remeshing_collapse_edge(BMesh *bm, BMEdge *e, int which, Cl
          v2->co[0],
          v2->co[1],
          v2->co[2]);
-#endif
+#  endif
   return v2;
+#else
+  printf("Started collapsing an edge\n");
+  BMVert *n1 = cloth_remeshing_edge_vert(e, which);
+  BMVert *n2 = cloth_remeshing_edge_vert(e, 1 - which);
+  /* Done: Need to remove n1 */
+  BMEdge *adj_e;
+  BMIter eiter;
+  printf("adj_e count: %d\n", BM_vert_edge_count(n1));
+  BM_ITER_ELEM (adj_e, &eiter, n1, BM_EDGES_OF_VERT) {
+    /* Done: Need to remove adj_e */
+    BMVert *n3 = adj_e->v1 == n1 ? adj_e->v2 : adj_e->v1;
+    if (n3 != n2 && !BM_edge_exists(n2, n3)) {
+      /* Done: Need to create edge between n2 and n3 */
+      printf("Creating edge between n2 and n3\n");
+      BM_edge_create(bm, n2, n3, adj_e, BM_CREATE_NO_DOUBLE);
+    }
+    /* edge_kill kills even the verts of the edge, so killing the
+     * vertex n1 should be enough */
+    /* printf("Killing edge adj_e\n"); */
+    /* BM_edge_kill(bm, adj_e); */
+  }
+  for (int s = 0; s < 2; s++) {
+    BMVert *v1 = cloth_remeshing_edge_vert(bm, e, s, which, NULL);
+    BMVert *v2 = cloth_remeshing_edge_vert(bm, e, s, 1 - which, NULL);
+
+    if (!v1 || (s == 1 && v1 == cloth_remeshing_edge_vert(bm, e, 0, 1 - which, NULL))) {
+      continue;
+    }
+    /* Done: Need to remove v1 */
+    BMFace *f;
+    BMIter fiter;
+    printf("f count: %d\n", BM_vert_face_count(v1));
+    BM_ITER_ELEM (f, &fiter, v1, BM_FACES_OF_VERT) {
+      /* Done: Need to remove f */
+      if (!BM_vert_in_face(v2, f)) {
+        BMVert *vs[3];
+        BM_face_as_array_vert_tri(f, vs);
+        /* Replacing v1 with v2 in vs */
+        for (int i = 0; i < 3; i++) {
+          if (vs[i] == v1) {
+            vs[i] = v2;
+          }
+        }
+        /* Done: Need to create face between vs[0], vs[1], vs[2] */
+        printf("Creating face between vs[0] vs[1] vs[2]\n");
+        BM_face_create_verts(bm, vs, 3, f, BM_CREATE_NO_DOUBLE, true);
+      }
+      /* printf("Killing face f\n"); */
+      /* BM_face_kill(bm, f); */
+    }
+    /* printf("Killing vertex v1\n"); */
+    /* BM_vert_kill(bm, v1); */
+  }
+  printf("Killing vertex n1\n");
+  BM_vert_kill(bm, n1);
+  cloth_remeshing_remove_vertex_from_cloth(n1, cvm);
+  printf("Finished collapsing edge\n");
+  return n2;
+#endif
 }
 
 static bool cloth_remeshing_has_labeled_edges(BMVert *v)
@@ -1851,7 +1911,7 @@ static bool cloth_remeshing_collapse_edges(ClothModifierData *clmd,
       BMIter temp_e_iter;
       BM_ITER_ELEM (temp_e, &temp_e_iter, temp_vert, BM_EDGES_OF_VERT) {
         if (BM_edge_face_count(temp_e) > 2) {
-#if 1
+#if 0
           float uv_01[2], uv_02[2];
           cloth_remeshing_uv_of_vert_in_edge(clmd->clothObject->bm, temp_e, temp_e->v1, uv_01);
           cloth_remeshing_uv_of_vert_in_edge(clmd->clothObject->bm, temp_e, temp_e->v2, uv_02);



More information about the Bf-blender-cvs mailing list