[Bf-blender-cvs] [a5e9b66be23] soc-2019-adaptive-cloth: Cloth: split face to triangles test

ishbosamiya noreply at git.blender.org
Thu Jun 13 21:16:03 CEST 2019


Commit: a5e9b66be2389e185caa3adcf164cd02c705c6cd
Author: ishbosamiya
Date:   Wed Jun 12 16:43:25 2019 +0530
Branches: soc-2019-adaptive-cloth
https://developer.blender.org/rBa5e9b66be2389e185caa3adcf164cd02c705c6cd

Cloth: split face to triangles test

It works for meshes that have convex uv layouts, otherwise goes into an infinite loop

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

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

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

diff --git a/source/blender/blenkernel/intern/cloth.c b/source/blender/blenkernel/intern/cloth.c
index 6da3b80cc32..8e91de7e71f 100644
--- a/source/blender/blenkernel/intern/cloth.c
+++ b/source/blender/blenkernel/intern/cloth.c
@@ -431,7 +431,7 @@ static void cloth_remeshing_init_bmesh(Object *ob, ClothModifierData *clmd, Mesh
   clmd->clothObject->bm = clmd->clothObject->bm_prev;
 }
 
-static Mesh *cloth_remeshing_update_cloth_object_bmesh(Object *ob, ClothModifierData *clmd)
+static Mesh *cloth_remeshing_update_cloth_object_bmesh(Object *UNUSED(ob), ClothModifierData *clmd)
 {
   Mesh *mesh_result = NULL;
   CustomData_MeshMasks cddata_masks = cloth_remeshing_get_cd_mesh_masks();
@@ -445,8 +445,7 @@ static Mesh *cloth_remeshing_update_cloth_object_bmesh(Object *ob, ClothModifier
 
 static float cloth_remeshing_edge_size(BMesh *bm, BMEdge *edge, LinkNodePair *sizing)
 {
-  BMVert v1 = *edge->v1;
-  BMVert v2 = *edge->v2;
+  /* BMVert v1 = *edge->v1; */
   float u1[2], u2[2];
 
   /**
@@ -475,7 +474,7 @@ static float cloth_remeshing_edge_size(BMesh *bm, BMEdge *edge, LinkNodePair *si
   sub_v2_v2(u12, u2);
   float value = 0.0;
   float temp_v2[2];
-  int index = BM_elem_index_get(&v1);
+  /* int index = BM_elem_index_get(&v1); */
   /* ClothSizing *sizing_temp = (ClothSizing *)BLI_linklist_find(sizing->list, index)->link; */
   ClothSizing *sizing_temp = (ClothSizing *)BLI_linklist_find(sizing->list, 0)->link;
   /* TODO(Ish): sizing_temp needs to be average of the both vertices, for static it doesn't matter
@@ -489,8 +488,6 @@ static float cloth_remeshing_edge_size(BMesh *bm, BMEdge *edge, LinkNodePair *si
 static int cloth_remeshing_find_bad_edges(BMesh *bm, LinkNodePair *sizing)
 {
   int tagged = 0;
-  BMVert *v;
-  BMIter iter;
   BMEdge *e;
   BMIter eiter;
   /* clearing out the tags */
@@ -527,7 +524,7 @@ static BMVert *cloth_remeshing_split_edge_keep_triangles(BMesh *bm,
     else {
       f2 = f;
     }
-    printf("face_i: %d\n", face_i);
+    /* printf("face_i: %d\n", face_i); */
   }
 
   if (!f1) {
@@ -536,7 +533,6 @@ static BMVert *cloth_remeshing_split_edge_keep_triangles(BMesh *bm,
 
   /* split the edge */
   BMEdge *new_edge;
-  BMEdge old_edge = *e;
   BMVert *new_v = BM_edge_split(bm, e, v, &new_edge, fac);
   BM_elem_flag_disable(new_edge, BM_ELEM_TAG);
 
@@ -546,23 +542,31 @@ static BMVert *cloth_remeshing_split_edge_keep_triangles(BMesh *bm,
    * create new edge between this
    * vert and newly created vert */
   BM_ITER_ELEM (vert, &viter, f1, BM_VERTS_OF_FACE) {
-    if (vert == old_edge.v1 || vert == old_edge.v2 || vert == new_v) {
+    if (vert == e->v1 || vert == e->v2 || vert == new_edge->v1 || vert == new_edge->v2 ||
+        vert == new_v) {
       continue;
     }
-
-    BM_face_create_quad_tri(bm, vert, old_edge.v1, new_v, NULL, NULL, BM_CREATE_NOP);
-    BM_face_create_quad_tri(bm, vert, new_v, old_edge.v2, NULL, NULL, BM_CREATE_NOP);
-    BM_face_kill(bm, f1);
+    BMLoop *l_a = NULL, *l_b = NULL;
+    l_a = BM_face_vert_share_loop(f1, vert);
+    l_b = BM_face_vert_share_loop(f1, new_v);
+    if (!BM_face_split(bm, f1, l_a, l_b, NULL, NULL, true)) {
+      printf("face not split: f1\n");
+    }
+    break;
   }
   if (f2) {
     BM_ITER_ELEM (vert, &viter, f2, BM_VERTS_OF_FACE) {
-      if (vert == old_edge.v1 || vert == old_edge.v2 || vert == new_v) {
+      if (vert == e->v1 || vert == e->v2 || vert == new_edge->v1 || vert == new_edge->v2 ||
+          vert == new_v) {
         continue;
       }
-
-      BM_face_create_quad_tri(bm, vert, old_edge.v1, new_v, NULL, NULL, BM_CREATE_NOP);
-      BM_face_create_quad_tri(bm, vert, new_v, old_edge.v2, NULL, NULL, BM_CREATE_NOP);
-      BM_face_kill(bm, f2);
+      BMLoop *l_a = NULL, *l_b = NULL;
+      l_a = BM_face_vert_share_loop(f2, vert);
+      l_b = BM_face_vert_share_loop(f2, new_v);
+      if (!BM_face_split(bm, f2, l_a, l_b, NULL, NULL, true)) {
+        printf("face not split: f2\n");
+      }
+      break;
     }
   }
 
@@ -581,11 +585,12 @@ static bool cloth_remeshing_split_edges(ClothModifierData *clmd, LinkNodePair *s
   BMIter iter;
   BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
     if (BM_elem_flag_test_bool(e, BM_ELEM_TAG)) {
-      int v1_index = BM_elem_index_get(e->v1);
-      int v2_index = BM_elem_index_get(e->v2);
-      BMEdge(*new_edges)[3];
-      int new_edge_count = 0;
-      BMVert *new_v = cloth_remeshing_split_edge_keep_triangles(bm, e, e->v1, 0.5);
+      /* int v1_index = BM_elem_index_get(e->v1); */
+      /* int v2_index = BM_elem_index_get(e->v2); */
+      /* BMEdge(*new_edges)[3]; */
+      /* int new_edge_count = 0; */
+      cloth_remeshing_split_edge_keep_triangles(bm, e, e->v1, 0.5);
+      /* BMVert *new_v = cloth_remeshing_split_edge_keep_triangles(bm, e, e->v1, 0.5); */
       BM_elem_flag_disable(e, BM_ELEM_TAG);
       /* ClothSizing *sizing_mean = MEM_mallocN(sizeof(ClothSizing), "ClothSizing_single"); */
 
@@ -606,7 +611,6 @@ static bool cloth_remeshing_split_edges(ClothModifierData *clmd, LinkNodePair *s
       /* BM_elem_flag_disable(e, BM_ELEM_TAG); */
     }
   }
-  BM_mesh_normals_update(bm);
   return true;
 }



More information about the Bf-blender-cvs mailing list