[Bf-blender-cvs] [4d544d6ae72] blender-v2.91-release: Fix T80068: skin modifier not working with motion blur

Brecht Van Lommel noreply at git.blender.org
Mon Nov 9 15:26:29 CET 2020


Commit: 4d544d6ae7211f8bdf086b14415a388e44116ee5
Author: Brecht Van Lommel
Date:   Mon Nov 9 14:50:33 2020 +0100
Branches: blender-v2.91-release
https://developer.blender.org/rB4d544d6ae7211f8bdf086b14415a388e44116ee5

Fix T80068: skin modifier not working with motion blur

The skin modifier did not output consistent results, causing failure to find
corresponding vertices across frames.

Remove unnecessary use of GSet, all we need is an array.

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

M	source/blender/bmesh/operators/bmo_hull.c

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

diff --git a/source/blender/bmesh/operators/bmo_hull.c b/source/blender/bmesh/operators/bmo_hull.c
index 84938084aec..4876a12a923 100644
--- a/source/blender/bmesh/operators/bmo_hull.c
+++ b/source/blender/bmesh/operators/bmo_hull.c
@@ -60,12 +60,12 @@ typedef struct HullTriangle {
 /*************************** Hull Triangles ***************************/
 
 static void hull_add_triangle(
-    BMesh *bm, GSet *hull_triangles, BLI_mempool *pool, BMVert *v1, BMVert *v2, BMVert *v3)
+    BMesh *bm, BLI_mempool *hull_triangles, BMVert *v1, BMVert *v2, BMVert *v3)
 {
   HullTriangle *t;
   int i;
 
-  t = BLI_mempool_calloc(pool);
+  t = BLI_mempool_calloc(hull_triangles);
   t->v[0] = v1;
   t->v[1] = v2;
   t->v[2] = v3;
@@ -75,7 +75,6 @@ static void hull_add_triangle(
     BMO_vert_flag_disable(bm, t->v[i], HULL_FLAG_INTERIOR_ELE);
   }
 
-  BLI_gset_insert(hull_triangles, t);
   normal_tri_v3(t->no, v1->co, v2->co, v3->co);
 }
 
@@ -94,12 +93,13 @@ static BMFace *hull_find_example_face(BMesh *bm, BMEdge *e)
   return NULL;
 }
 
-static void hull_output_triangles(BMesh *bm, GSet *hull_triangles)
+static void hull_output_triangles(BMesh *bm, BLI_mempool *hull_triangles)
 {
-  GSetIterator iter;
+  BLI_mempool_iter iter;
+  BLI_mempool_iternew(hull_triangles, &iter);
+  HullTriangle *t;
 
-  GSET_ITER (iter, hull_triangles) {
-    HullTriangle *t = BLI_gsetIterator_getKey(&iter);
+  while ((t = BLI_mempool_iterstep(&iter))) {
     int i;
 
     if (!t->skip) {
@@ -198,18 +198,20 @@ static int hull_final_edges_lookup(HullFinalEdges *final_edges, BMVert *v1, BMVe
 }
 
 /* Used for checking whether a pre-existing edge lies on the hull */
-static HullFinalEdges *hull_final_edges(GSet *hull_triangles)
+static HullFinalEdges *hull_final_edges(BLI_mempool *hull_triangles)
 {
   HullFinalEdges *final_edges;
-  GSetIterator iter;
 
   final_edges = MEM_callocN(sizeof(HullFinalEdges), "HullFinalEdges");
   final_edges->edges = BLI_ghash_ptr_new("final edges ghash");
   final_edges->base_pool = BLI_mempool_create(sizeof(ListBase), 0, 128, BLI_MEMPOOL_NOP);
   final_edges->link_pool = BLI_mempool_create(sizeof(LinkData), 0, 128, BLI_MEMPOOL_NOP);
 
-  GSET_ITER (iter, hull_triangles) {
-    HullTriangle *t = BLI_gsetIterator_getKey(&iter);
+  BLI_mempool_iter iter;
+  BLI_mempool_iternew(hull_triangles, &iter);
+  HullTriangle *t;
+
+  while ((t = BLI_mempool_iterstep(&iter))) {
     LinkData *link;
     int i;
 
@@ -250,12 +252,15 @@ static void hull_final_edges_free(HullFinalEdges *final_edges)
 
 /**************************** Final Output ****************************/
 
-static void hull_remove_overlapping(BMesh *bm, GSet *hull_triangles, HullFinalEdges *final_edges)
+static void hull_remove_overlapping(BMesh *bm,
+                                    BLI_mempool *hull_triangles,
+                                    HullFinalEdges *final_edges)
 {
-  GSetIterator hull_iter;
+  BLI_mempool_iter iter;
+  BLI_mempool_iternew(hull_triangles, &iter);
+  HullTriangle *t;
 
-  GSET_ITER (hull_iter, hull_triangles) {
-    HullTriangle *t = BLI_gsetIterator_getKey(&hull_iter);
+  while ((t = BLI_mempool_iterstep(&iter))) {
     BMIter bm_iter1, bm_iter2;
     BMFace *f;
     bool f_on_hull;
@@ -467,7 +472,7 @@ static BMVert **hull_verts_from_bullet(plConvexHull hull,
   return hull_verts;
 }
 
-static void hull_from_bullet(BMesh *bm, BMOperator *op, GSet *hull_triangles, BLI_mempool *pool)
+static void hull_from_bullet(BMesh *bm, BMOperator *op, BLI_mempool *hull_triangles)
 {
   int *fvi = NULL;
   BLI_array_declare(fvi);
@@ -509,7 +514,7 @@ static void hull_from_bullet(BMesh *bm, BMOperator *op, GSet *hull_triangles, BL
         fv[1] = hull_verts[fvi[j - 1]];
         fv[2] = hull_verts[fvi[j]];
 
-        hull_add_triangle(bm, hull_triangles, pool, fv[0], fv[1], fv[2]);
+        hull_add_triangle(bm, hull_triangles, fv[0], fv[1], fv[2]);
       }
     }
   }
@@ -543,10 +548,9 @@ static bool hull_num_input_verts_is_ok(BMOperator *op)
 void bmo_convex_hull_exec(BMesh *bm, BMOperator *op)
 {
   HullFinalEdges *final_edges;
-  BLI_mempool *hull_pool;
+  BLI_mempool *hull_triangles;
   BMElemF *ele;
   BMOIter oiter;
-  GSet *hull_triangles;
 
   /* Verify that at least three verts in the input */
   if (!hull_num_input_verts_is_ok(op)) {
@@ -569,10 +573,9 @@ void bmo_convex_hull_exec(BMesh *bm, BMOperator *op)
     }
   }
 
-  hull_pool = BLI_mempool_create(sizeof(HullTriangle), 0, 128, BLI_MEMPOOL_NOP);
-  hull_triangles = BLI_gset_ptr_new("hull_triangles");
+  hull_triangles = BLI_mempool_create(sizeof(HullTriangle), 0, 128, BLI_MEMPOOL_ALLOW_ITER);
 
-  hull_from_bullet(bm, op, hull_triangles, hull_pool);
+  hull_from_bullet(bm, op, hull_triangles);
 
   final_edges = hull_final_edges(hull_triangles);
 
@@ -590,9 +593,7 @@ void bmo_convex_hull_exec(BMesh *bm, BMOperator *op)
 
   /* Convert hull triangles to BMesh faces */
   hull_output_triangles(bm, hull_triangles);
-  BLI_mempool_destroy(hull_pool);
-
-  BLI_gset_free(hull_triangles, NULL);
+  BLI_mempool_destroy(hull_triangles);
 
   hull_tag_unused(bm, op);



More information about the Bf-blender-cvs mailing list