[Bf-blender-cvs] [65b4c99e7d7] soc-2019-adaptive-cloth: Cloth: initial implementation of flip edges

ishbosamiya noreply at git.blender.org
Wed Jul 10 15:33:27 CEST 2019


Commit: 65b4c99e7d77ad0ca37eea9934baedd689d728b7
Author: ishbosamiya
Date:   Wed Jul 10 19:02:53 2019 +0530
Branches: soc-2019-adaptive-cloth
https://developer.blender.org/rB65b4c99e7d77ad0ca37eea9934baedd689d728b7

Cloth: initial implementation of flip edges

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

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 f90b88da297..302c292181a 100644
--- a/source/blender/blenkernel/intern/cloth_remeshing.cpp
+++ b/source/blender/blenkernel/intern/cloth_remeshing.cpp
@@ -80,6 +80,12 @@ static void cloth_remeshing_uv_of_vert_in_face(BMesh *bm, BMFace *f, BMVert *v,
 static float cloth_remeshing_wedge(float v_01[2], float v_02[2]);
 static float cloth_remeshing_edge_size_with_vert(
     BMesh *bm, BMVert *v1, BMVert *v2, BMVert *v, vector<ClothSizing> &sizing);
+static void cloth_remeshing_update_active_faces(vector<BMFace *> &active_faces,
+                                                BMesh *bm,
+                                                BMVert *v);
+static void cloth_remeshing_update_active_faces(vector<BMFace *> &active_faces,
+                                                BMesh *bm,
+                                                BMEdge *e);
 
 static CustomData_MeshMasks cloth_remeshing_get_cd_mesh_masks(void)
 {
@@ -359,6 +365,7 @@ static vector<BMEdge *> cloth_remeshing_find_edges_to_flip(BMesh *bm,
                                                            vector<ClothSizing> &sizing,
                                                            vector<BMFace *> &active_faces)
 {
+  printf("starting: %s\n", __func__);
   vector<BMEdge *> edges;
   BMVert *v1;
   BMIter viter;
@@ -412,6 +419,7 @@ static vector<BMEdge *> cloth_remeshing_find_edges_to_flip(BMesh *bm,
       }
     }
   }
+  printf("ending: %s\n", __func__);
   return edges;
 }
 
@@ -428,12 +436,14 @@ static bool cloth_remeshing_independent_edge_test(BMEdge *e, vector<BMEdge *> ed
 
 static vector<BMEdge *> cloth_remeshing_find_independent_edges(vector<BMEdge *> edges)
 {
+  printf("starting: %s\n", __func__);
   vector<BMEdge *> i_edges;
   for (int i = 0; i < edges.size(); i++) {
     if (cloth_remeshing_independent_edge_test(edges[i], i_edges)) {
       i_edges.push_back(edges[i]);
     }
   }
+  printf("ending: %s\n", __func__);
   return i_edges;
 }
 
@@ -441,20 +451,27 @@ static void cloth_remeshing_flip_edges(BMesh *bm,
                                        vector<ClothSizing> &sizing,
                                        vector<BMFace *> &active_faces)
 {
+  printf("starting: %s\n", __func__);
+  static int prev_num_flipable_edges = 0;
   /* TODO(Ish): This loop might cause problems */
   while (active_faces.size() != 0) {
     vector<BMEdge *> flipable_edges = cloth_remeshing_find_edges_to_flip(bm, sizing, active_faces);
+    if (flipable_edges.size() == prev_num_flipable_edges) {
+      break;
+    }
+    prev_num_flipable_edges = flipable_edges.size();
     vector<BMEdge *> independent_edges = cloth_remeshing_find_independent_edges(flipable_edges);
 
     for (int i = 0; i < independent_edges.size(); i++) {
       BMEdge *edge = independent_edges[i];
-      BM_edge_rotate(
-          bm, edge, true, BM_EDGEROT_CHECK_SPLICE); /* this sets it up for BM_CREATE_NO_DOUBLE
-                                                     */
+      /* BM_EDGEROT_CHECK_SPLICE sets it up for BM_CREATE_NO_DOUBLE */
+      BMEdge *new_edge = BM_edge_rotate(bm, edge, true, BM_EDGEROT_CHECK_SPLICE);
+      BLI_assert(new_edge != NULL);
+      /* TODO(Ish): need to update active_faces */
+      cloth_remeshing_update_active_faces(active_faces, bm, new_edge);
     }
-
-    /* TODO(Ish): need to update active_faces */
   }
+  printf("ending: %s\n", __func__);
 }
 
 static bool cloth_remeshing_fix_mesh(BMesh *bm,
@@ -1084,6 +1101,35 @@ static void cloth_remeshing_remove_face(vector<BMFace *> &faces, int index)
   faces.pop_back();
 }
 
+static void cloth_remeshing_update_active_faces(vector<BMFace *> &active_faces,
+                                                BMesh *bm,
+                                                BMEdge *e)
+{
+  BMFace *f, *f2;
+  BMIter fiter;
+  bool face_exists = false;
+  /* add the newly created faces, all those that have that vertex v */
+  BM_ITER_ELEM (f, &fiter, e, BM_FACES_OF_EDGE) {
+    active_faces.push_back(f);
+  }
+
+  /* remove the faces from active_faces that have been removed from
+   * bmesh */
+  for (int i = 0; i < active_faces.size(); i++) {
+    face_exists = false;
+    f = active_faces[i];
+    BM_ITER_MESH (f2, &fiter, bm, BM_FACES_OF_MESH) {
+      if (f == f2) {
+        face_exists = true;
+        break;
+      }
+    }
+    if (!face_exists) {
+      cloth_remeshing_remove_face(active_faces, i);
+    }
+  }
+}
+
 static void cloth_remeshing_update_active_faces(vector<BMFace *> &active_faces,
                                                 BMesh *bm,
                                                 BMVert *v)
@@ -1140,6 +1186,7 @@ static bool cloth_remeshing_collapse_edges(ClothModifierData *clmd,
 
       /* run cloth_remeshing_fix_mesh on newly created faces by
        * cloth_remeshing_try_edge_collapse */
+      cloth_remeshing_fix_mesh(clmd->clothObject->bm, sizing, active_faces);
 
       /* update active_faces */



More information about the Bf-blender-cvs mailing list