[Bf-blender-cvs] [dc30002cfd1] temp-lineart-contained: Fix T88060: Expand freezing when deleting a Face Set with multiple loose parts

Pablo Dobarro noreply at git.blender.org
Wed May 12 04:15:51 CEST 2021


Commit: dc30002cfd1ac7b1061df43b8dadd35c1365dc2c
Author: Pablo Dobarro
Date:   Wed May 5 17:27:32 2021 +0200
Branches: temp-lineart-contained
https://developer.blender.org/rBdc30002cfd1ac7b1061df43b8dadd35c1365dc2c

Fix T88060: Expand freezing when deleting a Face Set with multiple loose parts

When checking if the mesh has only one Face Set only the current active
component for expand needs to be checked. Otherwhise other components
that won't be modified by Expand that contain other IDs will be taken
into account, making the Face Set deletion go into an infinite loop.

Reviewed By: JacquesLucke

Maniphest Tasks: T88060

Differential Revision: https://developer.blender.org/D11169

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

M	source/blender/editors/sculpt_paint/sculpt_expand.c

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

diff --git a/source/blender/editors/sculpt_paint/sculpt_expand.c b/source/blender/editors/sculpt_paint/sculpt_expand.c
index 8b8ed42a694..e6259ebecb7 100644
--- a/source/blender/editors/sculpt_paint/sculpt_expand.c
+++ b/source/blender/editors/sculpt_paint/sculpt_expand.c
@@ -1892,13 +1892,22 @@ static int sculpt_expand_modal(bContext *C, wmOperator *op, const wmEvent *event
  * The faces that were using the `delete_id` Face Set are filled
  * using the content from their neighbors.
  */
-static void sculpt_expand_delete_face_set_id(
-    int *r_face_sets, Mesh *mesh, MeshElemMap *pmap, const int totface, const int delete_id)
+static void sculpt_expand_delete_face_set_id(int *r_face_sets,
+                                             SculptSession *ss,
+                                             ExpandCache *expand_cache,
+                                             Mesh *mesh,
+                                             const int delete_id)
 {
+  const int totface = ss->totvert;
+  MeshElemMap *pmap = ss->pmap;
+
   /* Check that all the face sets IDs in the mesh are not equal to `delete_id`
    * before attempting to delete it. */
   bool all_same_id = true;
   for (int i = 0; i < totface; i++) {
+    if (!sculpt_expand_is_face_in_active_component(ss, expand_cache, i)) {
+      continue;
+    }
     if (r_face_sets[i] != delete_id) {
       all_same_id = false;
       break;
@@ -2070,9 +2079,9 @@ static int sculpt_expand_invoke(bContext *C, wmOperator *op, const wmEvent *even
 
   if (ss->expand_cache->modify_active_face_set) {
     sculpt_expand_delete_face_set_id(ss->expand_cache->initial_face_sets,
+                                     ss,
+                                     ss->expand_cache,
                                      ob->data,
-                                     ss->pmap,
-                                     ss->totfaces,
                                      ss->expand_cache->next_face_set);
   }



More information about the Bf-blender-cvs mailing list