[Bf-blender-cvs] [dcaba4c5e34] temp_bmesh_multires: Sculpt dyntopo: fix various faceset init operator bugs that crept in.

Joseph Eagar noreply at git.blender.org
Tue Aug 17 00:34:57 CEST 2021


Commit: dcaba4c5e3494240464ed6cc6330f40c30ba0e0e
Author: Joseph Eagar
Date:   Mon Aug 16 16:34:35 2021 -0700
Branches: temp_bmesh_multires
https://developer.blender.org/rBdcaba4c5e3494240464ed6cc6330f40c30ba0e0e

Sculpt dyntopo: fix various faceset init operator bugs
that crept in.

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

M	source/blender/editors/sculpt_paint/sculpt_curvature.c
M	source/blender/editors/sculpt_paint/sculpt_face_set.c

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

diff --git a/source/blender/editors/sculpt_paint/sculpt_curvature.c b/source/blender/editors/sculpt_paint/sculpt_curvature.c
index a23afb93407..9bc2f840e3a 100644
--- a/source/blender/editors/sculpt_paint/sculpt_curvature.c
+++ b/source/blender/editors/sculpt_paint/sculpt_curvature.c
@@ -24,6 +24,8 @@
 
 #include "MEM_guardedalloc.h"
 
+#include "BLI_alloca.h"
+#include "BLI_array.h"
 #include "BLI_blenlib.h"
 #include "BLI_dial_2d.h"
 #include "BLI_ghash.h"
@@ -151,15 +153,35 @@ bool SCULPT_calc_principle_curvatures(SculptSession *ss,
   SCULPT_vertex_normal_get(ss, vertex, no);
   normal_covariance(nmat, no);
 
-  SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, vertex, ni) {
-    SCULPT_vertex_normal_get(ss, ni.vertex, no2);
-    sub_v3_v3(no2, no);
+  if (useAccurateSolver) {
+    int val = SCULPT_vertex_valence_get(ss, vertex);
+    float *ws = BLI_array_alloca(ws, val);
+    float *cot1 = BLI_array_alloca(cot1, val);
+    float *cot2 = BLI_array_alloca(cot2, val);
+    float *areas = BLI_array_alloca(areas, val);
+    float totarea = 0.0f;
 
-    normal_covariance(nmat2, no2);
+    SCULPT_get_cotangents(ss, vertex, ws, cot1, cot2, areas, &totarea);
 
-    add_m3_m3m3(nmat, nmat, nmat2);
+    SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, vertex, ni) {
+      SCULPT_vertex_normal_get(ss, ni.vertex, no2);
+      sub_v3_v3(no2, no);
+
+      normal_covariance(nmat2, no2);
+      madd_m3_m3m3fl(nmat, nmat, nmat2, ws[ni.i]);
+    }
+    SCULPT_VERTEX_NEIGHBORS_ITER_END(ni);
+  }
+  else {
+    SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, vertex, ni) {
+      SCULPT_vertex_normal_get(ss, ni.vertex, no2);
+      sub_v3_v3(no2, no);
+
+      normal_covariance(nmat2, no2);
+      add_m3_m3m3(nmat, nmat, nmat2);
+    }
+    SCULPT_VERTEX_NEIGHBORS_ITER_END(ni);
   }
-  SCULPT_VERTEX_NEIGHBORS_ITER_END(ni);
 
   if (!useAccurateSolver || !BLI_eigen_solve_selfadjoint_m3(nmat, out->ks, out->principle)) {
     // do simple power solve in one direction
diff --git a/source/blender/editors/sculpt_paint/sculpt_face_set.c b/source/blender/editors/sculpt_paint/sculpt_face_set.c
index aa8bf3dc9ff..963f1b1b4fb 100644
--- a/source/blender/editors/sculpt_paint/sculpt_face_set.c
+++ b/source/blender/editors/sculpt_paint/sculpt_face_set.c
@@ -51,6 +51,7 @@
 #include "BKE_paint.h"
 #include "BKE_pbvh.h"
 #include "BKE_scene.h"
+#include "BKE_subdiv_ccg.h"
 
 #include "DEG_depsgraph.h"
 
@@ -74,14 +75,37 @@
 #include <math.h>
 #include <stdlib.h>
 
-int SCULPT_face_set_get(SculptSession *ss, SculptFaceRef face)
+static int sculpt_face_material_get(SculptSession *ss, SculptFaceRef face)
 {
-  if (ss->bm) {
-    BMFace *f = (BMFace *)face.i;
-    return BM_ELEM_CD_GET_INT(f, ss->cd_faceset_offset);
+  int ret = 0;
+
+  switch (BKE_pbvh_type(ss->pbvh)) {
+    case PBVH_BMESH: {
+      BMFace *f = (BMFace *)face.i;
+      return f->mat_nr;
+    }
+    case PBVH_GRIDS:
+    case PBVH_FACES:
+      return ss->mpoly[face.i].mat_nr;
   }
 
-  return ss->face_sets[face.i];
+  return -1;
+}
+
+int SCULPT_face_set_get(SculptSession *ss, SculptFaceRef face)
+{
+  int ret = 0;
+
+  switch (BKE_pbvh_type(ss->pbvh)) {
+    case PBVH_BMESH: {
+      BMFace *f = (BMFace *)face.i;
+      return BM_ELEM_CD_GET_INT(f, ss->cd_faceset_offset);
+    }
+    case PBVH_GRIDS:
+    case PBVH_FACES:
+      return ss->face_sets[face.i];
+  }
+  return -1;
 }
 
 // returns previous face set
@@ -89,15 +113,19 @@ int SCULPT_face_set_set(SculptSession *ss, SculptFaceRef face, int fset)
 {
   int ret = 0;
 
-  if (ss->bm) {
-    BMFace *f = (BMFace *)face.i;
-    ret = BM_ELEM_CD_GET_INT(f, ss->cd_faceset_offset);
+  switch (BKE_pbvh_type(ss->pbvh)) {
+    case PBVH_BMESH: {
+      BMFace *f = (BMFace *)face.i;
+      ret = BM_ELEM_CD_GET_INT(f, ss->cd_faceset_offset);
 
-    BM_ELEM_CD_SET_INT(f, ss->cd_faceset_offset, fset);
-  }
-  else {
-    ret = ss->face_sets[face.i];
-    ss->face_sets[face.i] = fset;
+      BM_ELEM_CD_SET_INT(f, ss->cd_faceset_offset, fset);
+      break;
+    }
+    case PBVH_FACES:
+    case PBVH_GRIDS:
+      ret = ss->face_sets[face.i];
+      ss->face_sets[face.i] = fset;
+      break;
   }
 
   return ret;
@@ -793,30 +821,58 @@ static void sculpt_face_sets_init_loop(Object *ob, const int mode)
 {
   Mesh *mesh = ob->data;
   SculptSession *ss = ob->sculpt;
-  BMesh *bm = sculpt_faceset_bm_begin(ss, mesh);
 
-  BMIter iter;
-  BMFace *f;
+  SCULPT_face_random_access_ensure(ss);
+
+  int cd_fmaps_offset = -1;
+  if (ss->bm) {
+    cd_fmaps_offset = CustomData_get_offset(&ss->bm->pdata, CD_FACEMAP);
+  }
 
-  const int cd_fmaps_offset = CustomData_get_offset(&bm->pdata, CD_FACEMAP);
+  Mesh *me = NULL;
+  int *fmaps = NULL;
 
-  BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
-    SculptFaceRef fref = {(intptr_t)f};
+  if (BKE_pbvh_type(ss->pbvh) == PBVH_GRIDS) {
+    me = ob->data;
+    fmaps = CustomData_get_layer(&me->pdata, CD_FACEMAP);
+  }
+  else if (BKE_pbvh_type(ss->pbvh) == PBVH_FACES) {
+    fmaps = CustomData_get_layer(ss->pdata, CD_FACEMAP);
+  }
+
+  for (int i = 0; i < ss->totfaces; i++) {
+    SculptFaceRef fref = BKE_pbvh_table_index_to_face(ss->pbvh, i);
 
     if (mode == SCULPT_FACE_SETS_FROM_MATERIALS) {
-      SCULPT_face_set_set(ss, fref, (int)(f->mat_nr + 1));
+      SCULPT_face_set_set(ss, fref, (int)(sculpt_face_material_get(ss, fref) + 1));
     }
     else if (mode == SCULPT_FACE_SETS_FROM_FACE_MAPS) {
-      if (cd_fmaps_offset != -1) {
-        SCULPT_face_set_set(ss, fref, BM_ELEM_CD_GET_INT(f, cd_fmaps_offset) + 2);
-      }
-      else {
-        SCULPT_face_set_set(ss, fref, 1);
+      int fmap = 1;
+
+      switch (BKE_pbvh_type(ss->pbvh)) {
+        case PBVH_BMESH: {
+          BMFace *f = (BMFace *)fref.i;
+
+          if (cd_fmaps_offset >= 0) {
+            fmap = BM_ELEM_CD_GET_INT(f, cd_fmaps_offset) + 2;
+          }
+
+          break;
+        }
+        case PBVH_FACES:
+        case PBVH_GRIDS: {
+          int f_i = fref.i;
+
+          if (fmaps) {
+            fmap = fmaps[i] + 2;
+          }
+          break;
+        }
       }
+
+      SCULPT_face_set_set(ss, fref, fmap);
     }
   }
-
-  sculpt_faceset_bm_end(ss, bm);
 }
 
 static int sculpt_face_set_init_exec(bContext *C, wmOperator *op)
@@ -1095,8 +1151,8 @@ static int sculpt_face_sets_change_visibility_invoke(bContext *C,
   Object *ob = CTX_data_active_object(C);
   SculptSession *ss = ob->sculpt;
 
-  /* Update the active vertex and Face Set using the cursor position to avoid relying on the paint
-   * cursor updates. */
+  /* Update the active vertex and Face Set using the cursor position to avoid relying on the
+   * paint cursor updates. */
   SculptCursorGeometryInfo sgi;
   float mouse[2];
   mouse[0] = event->mval[0];
@@ -1578,8 +1634,8 @@ static bool sculpt_face_set_edit_is_operation_valid(SculptSession *ss,
     if (BKE_pbvh_type(ss->pbvh) == PBVH_GRIDS) {
       /* Modification of base mesh geometry requires special remapping of multires displacement,
        * which does not happen here.
-       * Disable delete operation. It can be supported in the future by doing similar displacement
-       * data remapping as what happens in the mesh edit mode. */
+       * Disable delete operation. It can be supported in the future by doing similar
+       * displacement data remapping as what happens in the mesh edit mode. */
       return false;
     }
     if (check_single_face_set(ss, !modify_hidden)) {



More information about the Bf-blender-cvs mailing list