[Bf-blender-cvs] [06e8cc02565] sculpt-dev: Sculpt-dev: Improve autosmooth performance

Joseph Eagar noreply at git.blender.org
Wed Sep 29 08:16:18 CEST 2021


Commit: 06e8cc0256541ae33d22edc7290bc7842f87271c
Author: Joseph Eagar
Date:   Tue Sep 28 23:14:27 2021 -0700
Branches: sculpt-dev
https://developer.blender.org/rB06e8cc0256541ae33d22edc7290bc7842f87271c

Sculpt-dev: Improve autosmooth performance

* PBVH_FACES now uses MDynTopoVert (have got
  to rename it) to store boundary/corner/visibility
  flags the same way PBVH_BMESH does.
* Fixed brush add/sub buttons in header not
  working
* Fixed inverted brushes feeding negative strength
  to sub commands (like autosmooth, which flips it
  to sharpen mode).

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

M	extern/rangetree/intern/range_tree.c
M	release/scripts/startup/bl_ui/properties_paint_common.py
M	release/scripts/startup/bl_ui/space_view3d.py
M	source/blender/blenkernel/BKE_paint.h
M	source/blender/blenkernel/BKE_pbvh.h
M	source/blender/blenkernel/intern/brush_channel_define.h
M	source/blender/blenkernel/intern/brush_engine.c
M	source/blender/blenkernel/intern/brush_engine_presets.c
M	source/blender/blenkernel/intern/paint.c
M	source/blender/blenkernel/intern/pbvh.c
M	source/blender/blenkernel/intern/pbvh_intern.h
M	source/blender/bmesh/intern/bmesh_construct.c
M	source/blender/bmesh/intern/bmesh_mesh.h
M	source/blender/editors/sculpt_paint/sculpt.c
M	source/blender/editors/sculpt_paint/sculpt_array.c
M	source/blender/editors/sculpt_paint/sculpt_cloth.c

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

diff --git a/extern/rangetree/intern/range_tree.c b/extern/rangetree/intern/range_tree.c
index 87bae433101..77496e32fa3 100644
--- a/extern/rangetree/intern/range_tree.c
+++ b/extern/rangetree/intern/range_tree.c
@@ -794,7 +794,6 @@ void range_tree_uint_take(RangeTreeUInt *rt, const uint value)
 	range_tree_uint_take_impl(rt, value, node);
 }
 
-#pragma optimize("", off)
 bool range_tree_uint_retake(RangeTreeUInt *rt, const uint value)
 {
 	Node *node = rt_find_node_from_value(rt, value);
diff --git a/release/scripts/startup/bl_ui/properties_paint_common.py b/release/scripts/startup/bl_ui/properties_paint_common.py
index df1dbd5b655..d6c2c7cff3c 100644
--- a/release/scripts/startup/bl_ui/properties_paint_common.py
+++ b/release/scripts/startup/bl_ui/properties_paint_common.py
@@ -300,6 +300,15 @@ class UnifiedPaintPanel:
                         itemicon = "CHECKBOX_DEHLT"
                     row3.prop_enum(finalch, typeprop, item.identifier, icon=itemicon)
 
+        elif header and ch.idname == "direction":
+            row2 = row.row(align=True)
+            row2.use_property_split = False
+            row2.use_property_decorate = False
+
+            #replicate pre-existing functionality of direction showing up as +/-  in the header
+            row2.prop_enum(finalch, typeprop, "ADD", text="")
+            row2.prop_enum(finalch, typeprop, "SUBTRACT", text="")
+            pass
         elif expand is not None:
             row.prop(finalch, typeprop, icon=icon, text=text, slider=slider, expand=expand)
         else:
diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index c13cd0d66f7..e05b6478462 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -274,7 +274,19 @@ class _draw_tool_settings_context_mode:
 
         # direction
         if not capabilities.has_direction:
-            layout.row().prop(brush, "direction", expand=True, text="")
+            row = layout.row()
+
+            UnifiedPaintPanel.prop_unified(
+                layout,
+                context,
+                brush,
+                "direction",
+                pressure_name=pressure_name,
+                unified_name="use_unified_strength",
+                text="",
+                header=True,
+                expand=True
+            )
 
         if capabilities.has_color:
             UnifiedPaintPanel.prop_unified_color(layout, context, brush, "color", text="")
diff --git a/source/blender/blenkernel/BKE_paint.h b/source/blender/blenkernel/BKE_paint.h
index bc35fd30094..63d0357de49 100644
--- a/source/blender/blenkernel/BKE_paint.h
+++ b/source/blender/blenkernel/BKE_paint.h
@@ -538,7 +538,7 @@ typedef struct SculptArray {
   int *symmetry_pass;
 
   float *smooth_strength;
-
+  struct SculptCustomLayer *scl_inst, *scl_sym;
 } SculptArray;
 
 typedef struct SculptFakeNeighbors {
diff --git a/source/blender/blenkernel/BKE_pbvh.h b/source/blender/blenkernel/BKE_pbvh.h
index dd6d5bf1bda..6db155e03f1 100644
--- a/source/blender/blenkernel/BKE_pbvh.h
+++ b/source/blender/blenkernel/BKE_pbvh.h
@@ -110,6 +110,7 @@ struct BMVert;
 struct BMEdge;
 struct BMFace;
 struct CCGElem;
+struct MeshElemMap;
 struct CCGKey;
 struct CustomData;
 struct TableGSet;
@@ -913,6 +914,15 @@ typedef struct SculptLayerEntry {
 int BKE_pbvh_do_fset_symmetry(int fset, const int symflag, const float *co);
 bool BKE_pbvh_check_vert_boundary(PBVH *pbvh, struct BMVert *v);
 
+void BKE_pbvh_update_vert_boundary_faces(int *face_sets,
+                                         struct MVert *mvert,
+                                         struct MEdge *medge,
+                                         struct MLoop *mloop,
+                                         struct MPoly *mpoly,
+                                         struct MDynTopoVert *mdyntopo_verts,
+                                         struct MeshElemMap *pmap,
+                                         SculptVertRef vertex);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/blenkernel/intern/brush_channel_define.h b/source/blender/blenkernel/intern/brush_channel_define.h
index c89c63e1b03..effdcb957b5 100644
--- a/source/blender/blenkernel/intern/brush_channel_define.h
+++ b/source/blender/blenkernel/intern/brush_channel_define.h
@@ -441,6 +441,7 @@ MAKE_ENUM(elastic_deform_type, "Deformation", "Deformation type that is used in
   {BRUSH_ELASTIC_DEFORM_TWIST, "TWIST", "NONE", "Twist", ""},
   {-1}
 })
+MAKE_BOOL(use_ctrl_invert, "Use Ctrl Invert", "Take brush addition or subtraction mode into account", true)
 
 //MAKE_FLOAT3_EX
 /* clang-format on */
diff --git a/source/blender/blenkernel/intern/brush_engine.c b/source/blender/blenkernel/intern/brush_engine.c
index f0f8065f801..3e4974b3427 100644
--- a/source/blender/blenkernel/intern/brush_engine.c
+++ b/source/blender/blenkernel/intern/brush_engine.c
@@ -1397,6 +1397,9 @@ BrushCommand *BKE_brush_command_init(BrushCommand *command, int tool)
 #define float_set_uninherit(chset, channel, val) \
   _float_set_uninherit(chset, MAKE_BUILTIN_CH_NAME(channel), val)
 
+#define int_set_uninherit(chset, channel, val) \
+  _int_set_uninherit(chset, MAKE_BUILTIN_CH_NAME(channel), val)
+
 static void _float_set_uninherit(BrushChannelSet *chset, const char *channel, float val)
 {
   BrushChannel *ch = BKE_brush_channelset_lookup(chset, channel);
@@ -1410,6 +1413,19 @@ static void _float_set_uninherit(BrushChannelSet *chset, const char *channel, fl
   ch->flag &= ~BRUSH_CHANNEL_INHERIT;
 }
 
+static void _int_set_uninherit(BrushChannelSet *chset, const char *channel, int val)
+{
+  BrushChannel *ch = BKE_brush_channelset_lookup(chset, channel);
+
+  if (!ch) {
+    printf("%s: unknown channel %s\n", __func__, channel);
+    return;
+  }
+
+  ch->ivalue = val;
+  ch->flag &= ~BRUSH_CHANNEL_INHERIT;
+}
+
 /*flag all mappings to use inherited curves even if owning channel
   is not set to inherit.*/
 void BKE_brush_commandset_inherit_all_mappings(BrushChannelSet *chset)
@@ -1463,6 +1479,7 @@ static void bke_builtin_commandlist_create_paint(Brush *brush,
       ch->flag |= BRUSH_CHANNEL_INHERIT;
     }
 
+    int_set_uninherit(cmd->params, use_ctrl_invert, false);
     float_set_uninherit(cmd->params, strength, autosmooth);
     float_set_uninherit(cmd->params, radius, radius * autosmooth_scale);
     float_set_uninherit(cmd->params, projection, autosmooth_projection);
@@ -1580,6 +1597,7 @@ void BKE_builtin_commandlist_create(Brush *brush,
       ch->flag |= BRUSH_CHANNEL_INHERIT;
     }
 
+    int_set_uninherit(cmd->params, use_ctrl_invert, false);
     float_set_uninherit(cmd->params, strength, autosmooth);
     float_set_uninherit(cmd->params, radius, radius * autosmooth_scale);
     float_set_uninherit(cmd->params, projection, autosmooth_projection);
@@ -1620,6 +1638,7 @@ void BKE_builtin_commandlist_create(Brush *brush,
       ch->flag |= BRUSH_CHANNEL_INHERIT;
     }
 
+    int_set_uninherit(cmd->params, use_ctrl_invert, false);
     float_set_uninherit(cmd->params, strength, topology_rake);
     float_set_uninherit(cmd->params, radius, radius * topology_rake_scale);
     float_set_uninherit(cmd->params, projection, topology_rake_projection);
@@ -1637,6 +1656,7 @@ void BKE_builtin_commandlist_create(Brush *brush,
 
     radius2 *= radius;
 
+    int_set_uninherit(cmd->params, use_ctrl_invert, false);
     float_set_uninherit(cmd->params, spacing, spacing);
     float_set_uninherit(cmd->params, radius, radius2);
   }
diff --git a/source/blender/blenkernel/intern/brush_engine_presets.c b/source/blender/blenkernel/intern/brush_engine_presets.c
index d26b179c46c..418f340dd7e 100644
--- a/source/blender/blenkernel/intern/brush_engine_presets.c
+++ b/source/blender/blenkernel/intern/brush_engine_presets.c
@@ -807,6 +807,7 @@ void BKE_brush_builtin_patch(Brush *brush, int tool)
   ADDCH(radius_unit);
   ADDCH(unprojected_radius);
 
+  ADDCH(use_ctrl_invert);
   ADDCH(tilt_strength_factor);
 
   ADDCH(autosmooth);
diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c
index fb5db35b339..61e83f4d090 100644
--- a/source/blender/blenkernel/intern/paint.c
+++ b/source/blender/blenkernel/intern/paint.c
@@ -2203,6 +2203,7 @@ static PBVH *build_pbvh_for_dynamic_topology(Object *ob)
 
 static PBVH *build_pbvh_from_regular_mesh(Object *ob, Mesh *me_eval_deform, bool respect_hide)
 {
+  SculptSession *ss = ob->sculpt;
   Mesh *me = BKE_object_get_original_mesh(ob);
   const int looptris_num = poly_to_tri_count(me->totpoly, me->totloop);
   PBVH *pbvh = BKE_pbvh_new();
@@ -2214,6 +2215,19 @@ static PBVH *build_pbvh_from_regular_mesh(Object *ob, Mesh *me_eval_deform, bool
 
   BKE_sculpt_sync_face_set_visibility(me, NULL);
 
+  if (!ss->pmap) {
+    BKE_mesh_vert_poly_map_create(&ss->pmap,
+                                  &ss->pmap_mem,
+                                  me->mvert,
+                                  me->medge,
+                                  me->mpoly,
+                                  me->mloop,
+                                  me->totvert,
+                                  me->totpoly,
+                                  me->totloop,
+                                  false);
+  }
+
   BKE_sculptsession_check_mdyntopo(ob->sculpt, me->totvert);
 
   BKE_pbvh_build_mesh(pbvh,
@@ -2294,6 +2308,16 @@ static void init_mdyntopo_layer(SculptSession *ss, int totvert)
   for (int i = 0; i < totvert; i++, mv++) {
     mv->flag = DYNVERT_NEED_BOUNDARY | DYNVERT_NEED_VALENCE | DYNVERT_NEED_DISK_SORT;
     mv->stroke_id = -1;
+
+    SculptVertRef vertex = {.i = i};
+    BKE_pbvh_update_vert_boundary_faces(ss->face_sets,
+                                        ss->mvert,
+                                        ss->medge,
+                                        ss->mloop,
+                                        ss->mpoly,
+                                        ss->mdyntopo_verts,
+                                        ss->pmap,
+                                        vertex);
   }
 }
 PBVH *BKE_sculpt_object_pbvh_ensure(Depsgraph *depsgraph, Object *ob)
diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blen

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list