[Bf-blender-cvs] [e7a6a80552d] soc-2019-adaptive-cloth: Cloth: better flip edges implementation

ishbosamiya noreply at git.blender.org
Fri Jul 26 20:19:28 CEST 2019


Commit: e7a6a80552d0d8dcaddeb1c9210bbefa3ae40b0c
Author: ishbosamiya
Date:   Thu Jul 25 17:16:59 2019 +0530
Branches: soc-2019-adaptive-cloth
https://developer.blender.org/rBe7a6a80552d0d8dcaddeb1c9210bbefa3ae40b0c

Cloth: better flip edges implementation

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

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 db6d8deb650..f4e6a193e19 100644
--- a/source/blender/blenkernel/intern/cloth_remeshing.cpp
+++ b/source/blender/blenkernel/intern/cloth_remeshing.cpp
@@ -631,35 +631,38 @@ static vector<BMEdge *> cloth_remeshing_find_independent_edges(vector<BMEdge *>
   return i_edges;
 }
 
-static void cloth_remeshing_flip_edges(BMesh *bm,
+static bool cloth_remeshing_flip_edges(BMesh *bm,
                                        map<BMVert *, ClothSizing> &sizing,
                                        vector<BMFace *> &active_faces)
 {
-  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_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);
-      cloth_remeshing_update_active_faces(active_faces, bm, new_edge);
-    }
+  static int prev_num_independent_edges = 0;
+  vector<BMEdge *> flipable_edges = cloth_remeshing_find_edges_to_flip(bm, sizing, active_faces);
+  vector<BMEdge *> independent_edges = cloth_remeshing_find_independent_edges(flipable_edges);
+  if (independent_edges.size() == prev_num_independent_edges) {
+    return false;
+  }
+  prev_num_independent_edges = independent_edges.size();
+  for (int i = 0; i < independent_edges.size(); i++) {
+    BMEdge *edge = independent_edges[i];
+    /* 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 check if the normals are flipped by some
+     * kind of area check */
+    cloth_remeshing_update_active_faces(active_faces, bm, new_edge);
   }
+  return true;
 }
 
 static bool cloth_remeshing_fix_mesh(BMesh *bm,
                                      map<BMVert *, ClothSizing> &sizing,
                                      vector<BMFace *> active_faces)
 {
-  cloth_remeshing_flip_edges(bm, sizing, active_faces);
+  for (int i = 0; i < bm->totvert * 3; i++) {
+    if (cloth_remeshing_flip_edges(bm, sizing, active_faces) == false) {
+      break;
+    }
+  }
   return true;
 }
 
@@ -796,7 +799,11 @@ static BMVert *cloth_remeshing_split_edge_keep_triangles(BMesh *bm,
   cloth_remeshing_edge_face_pair(e, &f1, &f2);
   /* There should be at least one face for that edge */
   if (!f1) {
-    return NULL;
+    if (!f2) {
+      return NULL;
+    }
+    f1 = f2;
+    f2 = NULL;
   }
 
   /* split the edge */
@@ -1122,6 +1129,9 @@ static bool cloth_remeshing_split_edges(ClothModifierData *clmd,
   vector<BMEdge *> bad_edges;
   cloth_remeshing_find_bad_edges(bm, sizing, bad_edges);
   printf("split edges tagged: %d\n", (int)bad_edges.size());
+  if (prev_num_bad_edges == bad_edges.size()) {
+    return false;
+  }
   prev_num_bad_edges = bad_edges.size();
   Cloth *cloth = clmd->clothObject;
   cloth->verts = (ClothVertex *)MEM_reallocN(
@@ -1131,6 +1141,9 @@ static bool cloth_remeshing_split_edges(ClothModifierData *clmd,
     e = bad_edges[i];
     BMEdge old_edge = *e;
     BMVert *new_vert = cloth_remeshing_split_edge_keep_triangles(bm, e, e->v1, 0.5);
+    if (!new_vert) {
+      printf("new_vert == NULL\n");
+    }
 
     cloth_remeshing_add_vertex_to_cloth(cloth, old_edge.v1, old_edge.v2, new_vert, sizing);
 
@@ -1454,11 +1467,11 @@ static bool cloth_remeshing_can_collapse_edge(
         if (vs[i] == v1) {
           vs[i] = v2;
           copy_v2_v2(uvs[i], uv_v2);
+          break;
         }
       }
 
       /* Aspect ratio part */
-      /* TODO(Ish): get the uvs of vs */
       float uv_21[2], uv_31[2];
       sub_v2_v2v2(uv_21, uvs[1], uvs[0]);
       sub_v2_v2v2(uv_31, uvs[2], uvs[0]);



More information about the Bf-blender-cvs mailing list