[Bf-blender-cvs] [aa116ba5bac] temp_bmesh_multires: Added per-brush DynTopo settings which are stored in a new DynTopoSettings struct.

Joseph Eagar noreply at git.blender.org
Tue Mar 30 09:24:29 CEST 2021


Commit: aa116ba5bac6a8138f1f14c582fe8246ffd356e9
Author: Joseph Eagar
Date:   Tue Mar 30 00:08:09 2021 -0700
Branches: temp_bmesh_multires
https://developer.blender.org/rBaa116ba5bac6a8138f1f14c582fe8246ffd356e9

Added per-brush DynTopo settings which are stored in a new DynTopoSettings struct.

This system is designed to inherit settings from scene dyntopo defaults
in a highly flexible way; settings can be individually overridden via the
.inherit bitmask.

At stroke time the scene settings and brush->dyntopo are merged
and stored in brush->cached_dyntopo.

Note that brush->flag has a bit flag, DYNTOPO_DISABLED, with a few
subtlies.  It does not switch the PBVH back to PBVH_FACES mode, it
simply disbles dyntopo topology update.  It also doesn't inherit from
any default settings.  And it's the only setting
that's currently exposed in the UI.

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

M	release/scripts/startup/bl_ui/properties_paint_common.py
M	source/blender/blenkernel/BKE_brush.h
M	source/blender/blenkernel/BKE_pbvh.h
M	source/blender/blenkernel/intern/brush.c
M	source/blender/blenkernel/intern/paint.c
M	source/blender/blenkernel/intern/pbvh_bmesh.c
M	source/blender/blenloader/intern/versioning_290.c
M	source/blender/editors/sculpt_paint/sculpt.c
M	source/blender/editors/sculpt_paint/sculpt_detail.c
M	source/blender/makesdna/DNA_brush_defaults.h
M	source/blender/makesdna/DNA_brush_enums.h
M	source/blender/makesdna/DNA_brush_types.h
M	source/blender/makesdna/DNA_scene_types.h
M	source/blender/makesrna/intern/rna_brush.c

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

diff --git a/release/scripts/startup/bl_ui/properties_paint_common.py b/release/scripts/startup/bl_ui/properties_paint_common.py
index 5468b6059e4..bd8cca847e5 100644
--- a/release/scripts/startup/bl_ui/properties_paint_common.py
+++ b/release/scripts/startup/bl_ui/properties_paint_common.py
@@ -574,7 +574,8 @@ def brush_settings(layout, context, brush, popover=False):
                 context.sculpt_object.use_dynamic_topology_sculpting
         ):
             layout.prop(brush, "topology_rake_factor", slider=True)
-
+            layout.prop(brush.dyntopo, "disabled", text="Disable Dyntopo");
+            
         # normal_weight
         if capabilities.has_normal_weight:
             layout.prop(brush, "normal_weight", slider=True)
diff --git a/source/blender/blenkernel/BKE_brush.h b/source/blender/blenkernel/BKE_brush.h
index 452a08bc9c8..bf3d45d318c 100644
--- a/source/blender/blenkernel/BKE_brush.h
+++ b/source/blender/blenkernel/BKE_brush.h
@@ -36,6 +36,8 @@ struct Main;
 struct Scene;
 struct ToolSettings;
 struct UnifiedPaintSettings;
+struct DynTopoSettings;
+struct Sculpt;
 
 // enum eCurveMappingPreset;
 
@@ -151,6 +153,8 @@ void BKE_brush_scale_size(int *r_brush_size,
 /* debugging only */
 void BKE_brush_debug_print_state(struct Brush *br);
 
+void BKE_brush_get_dyntopo(struct Brush *brush, struct Sculpt *sd, struct DynTopoSettings *out);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/blenkernel/BKE_pbvh.h b/source/blender/blenkernel/BKE_pbvh.h
index 46076baccd3..146eb3208e9 100644
--- a/source/blender/blenkernel/BKE_pbvh.h
+++ b/source/blender/blenkernel/BKE_pbvh.h
@@ -349,7 +349,7 @@ int BKE_pbvh_get_grid_num_faces(const PBVH *pbvh);
 
 /* Only valid for type == PBVH_BMESH */
 struct BMesh *BKE_pbvh_get_bmesh(PBVH *pbvh);
-void BKE_pbvh_bmesh_detail_size_set(PBVH *pbvh, float detail_size);
+void BKE_pbvh_bmesh_detail_size_set(PBVH *pbvh, float detail_size, float detail_range);
 
 typedef enum {
   PBVH_Subdivide = 1,
diff --git a/source/blender/blenkernel/intern/brush.c b/source/blender/blenkernel/intern/brush.c
index 3b5b16feea8..e9bc22fd5b7 100644
--- a/source/blender/blenkernel/intern/brush.c
+++ b/source/blender/blenkernel/intern/brush.c
@@ -478,6 +478,7 @@ static void brush_defaults(Brush *brush)
   FROM_DEFAULT(stencil_dimension);
   FROM_DEFAULT(mtex);
   FROM_DEFAULT(mask_mtex);
+  FROM_DEFAULT(dyntopo);
 
 #undef FROM_DEFAULT
 #undef FROM_DEFAULT_PTR
@@ -1691,6 +1692,8 @@ void BKE_brush_sculpt_reset(Brush *br)
    * assign this so logic below can remain the same. */
   br->alpha = 0.5f;
 
+  bool disable_dyntopo = false;
+
   /* Brush settings */
   switch (br->sculpt_tool) {
     case SCULPT_TOOL_DRAW_SHARP:
@@ -1702,11 +1705,16 @@ void BKE_brush_sculpt_reset(Brush *br)
       br->curve_preset = BRUSH_CURVE_SMOOTHER;
       br->spacing = 10;
       br->alpha = 1.0f;
+
+      disable_dyntopo = true;
+
       break;
     case SCULPT_TOOL_SLIDE_RELAX:
       br->spacing = 10;
       br->alpha = 1.0f;
       br->slide_deform_type = BRUSH_SLIDE_DEFORM_DRAG;
+
+      disable_dyntopo = true;
       break;
     case SCULPT_TOOL_CLAY:
       br->flag |= BRUSH_SIZE_PRESSURE;
@@ -1754,6 +1762,8 @@ void BKE_brush_sculpt_reset(Brush *br)
       break;
     case SCULPT_TOOL_ROTATE:
       br->alpha = 1.0;
+      disable_dyntopo = true;
+
       break;
     case SCULPT_TOOL_SMOOTH:
       br->flag &= ~BRUSH_SPACE_ATTEN;
@@ -1762,6 +1772,8 @@ void BKE_brush_sculpt_reset(Brush *br)
       br->surface_smooth_shape_preservation = 0.5f;
       br->surface_smooth_current_vertex = 0.5f;
       br->surface_smooth_iterations = 4;
+
+      disable_dyntopo = true;
       break;
     case SCULPT_TOOL_SNAKE_HOOK:
       br->alpha = 1.0f;
@@ -1779,6 +1791,8 @@ void BKE_brush_sculpt_reset(Brush *br)
       br->flag &= ~BRUSH_ALPHA_PRESSURE;
       br->flag &= ~BRUSH_SPACE;
       br->flag &= ~BRUSH_SPACE_ATTEN;
+
+      disable_dyntopo = true;
       break;
     case SCULPT_TOOL_POSE:
       br->pose_smooth_iterations = 4;
@@ -1787,18 +1801,24 @@ void BKE_brush_sculpt_reset(Brush *br)
       br->flag &= ~BRUSH_ALPHA_PRESSURE;
       br->flag &= ~BRUSH_SPACE;
       br->flag &= ~BRUSH_SPACE_ATTEN;
+
+      disable_dyntopo = true;
       break;
     case SCULPT_TOOL_BOUNDARY:
       br->flag &= ~BRUSH_ALPHA_PRESSURE;
       br->flag &= ~BRUSH_SPACE;
       br->flag &= ~BRUSH_SPACE_ATTEN;
       br->curve_preset = BRUSH_CURVE_CONSTANT;
+
+      disable_dyntopo = true;
       break;
     case SCULPT_TOOL_DRAW_FACE_SETS:
       br->alpha = 0.5f;
       br->flag &= ~BRUSH_ALPHA_PRESSURE;
       br->flag &= ~BRUSH_SPACE;
       br->flag &= ~BRUSH_SPACE_ATTEN;
+
+      disable_dyntopo = true;
       break;
     case SCULPT_TOOL_GRAB:
       br->alpha = 0.4f;
@@ -1806,6 +1826,8 @@ void BKE_brush_sculpt_reset(Brush *br)
       br->flag &= ~BRUSH_ALPHA_PRESSURE;
       br->flag &= ~BRUSH_SPACE;
       br->flag &= ~BRUSH_SPACE_ATTEN;
+
+      disable_dyntopo = true;
       break;
     case SCULPT_TOOL_CLOTH:
       br->cloth_mass = 1.0f;
@@ -1814,6 +1836,8 @@ void BKE_brush_sculpt_reset(Brush *br)
       br->cloth_sim_falloff = 0.75f;
       br->cloth_deform_type = BRUSH_CLOTH_DEFORM_DRAG;
       br->flag &= ~(BRUSH_ALPHA_PRESSURE | BRUSH_SIZE_PRESSURE);
+
+      disable_dyntopo = true;
       break;
     case SCULPT_TOOL_LAYER:
       br->flag &= ~BRUSH_SPACE_ATTEN;
@@ -1831,6 +1855,8 @@ void BKE_brush_sculpt_reset(Brush *br)
       br->density = 1.0f;
       br->flag &= ~BRUSH_SPACE_ATTEN;
       zero_v3(br->rgb);
+
+      disable_dyntopo = true;
       break;
     case SCULPT_TOOL_SMEAR:
       br->alpha = 1.0f;
@@ -1838,6 +1864,8 @@ void BKE_brush_sculpt_reset(Brush *br)
       br->flag &= ~BRUSH_ALPHA_PRESSURE;
       br->flag &= ~BRUSH_SPACE_ATTEN;
       br->curve_preset = BRUSH_CURVE_SPHERE;
+
+      disable_dyntopo = true;
       break;
     case SCULPT_TOOL_VCOL_BOUNDARY:
       br->flag &= ~BRUSH_SPACE_ATTEN;
@@ -1846,6 +1874,9 @@ void BKE_brush_sculpt_reset(Brush *br)
       br->surface_smooth_shape_preservation = 0.5f;
       br->surface_smooth_current_vertex = 0.5f;
       br->surface_smooth_iterations = 4;
+
+      disable_dyntopo = true;
+      break;
     case SCULPT_TOOL_DISPLACEMENT_SMEAR:
       br->alpha = 1.0f;
       br->spacing = 5;
@@ -1853,11 +1884,17 @@ void BKE_brush_sculpt_reset(Brush *br)
       br->flag &= ~BRUSH_ALPHA_PRESSURE;
       br->flag &= ~BRUSH_SPACE_ATTEN;
       br->curve_preset = BRUSH_CURVE_SMOOTHER;
+      disable_dyntopo = true;
       break;
     default:
       break;
   }
 
+  if (disable_dyntopo) {
+    //disabled flag is never inherited
+    br->dyntopo.flag |= DYNTOPO_DISABLED;
+  }
+
   /* Cursor colors */
 
   /* Default Alpha */
@@ -2550,3 +2587,59 @@ struct ImBuf *BKE_brush_gen_radial_control_imbuf(Brush *br, bool secondary, bool
 
   return im;
 }
+
+void BKE_brush_get_dyntopo(Brush *brush, Sculpt *sd, DynTopoSettings *out)
+{
+  *out = brush->dyntopo;
+
+  int inherit = out->inherit;
+
+  if (out->inherit & DYNTOPO_INHERIT_ALL) {
+    inherit = 0x7FFF;
+  }
+
+  if (inherit & DYNTOPO_INHERIT_MODE) {
+    if (sd->flags & SCULPT_DYNTOPO_DETAIL_CONSTANT) {
+      out->mode = DYNTOPO_DETAIL_CONSTANT;
+    }
+    else if (sd->flags & SCULPT_DYNTOPO_DETAIL_BRUSH) {
+      out->mode = DYNTOPO_DETAIL_BRUSH;
+    }
+    else if (sd->flags & SCULPT_DYNTOPO_DETAIL_MANUAL) {
+      out->mode = DYNTOPO_DETAIL_MANUAL;
+    }
+    else {
+      out->mode = DYNTOPO_DETAIL_RELATIVE;
+    }
+  }
+
+  if (inherit & DYNTOPO_INHERIT_DETAIL_RANGE) {
+    out->detail_range = sd->detail_range;
+  }
+
+  if (inherit & DYNTOPO_INHERIT_DETAIL_PERCENT) {
+    out->detail_percent = sd->detail_percent;
+  }
+
+  if (inherit & DYNTOPO_INHERIT_CONSTANT_DETAIL) {
+    out->constant_detail = sd->constant_detail;
+  }
+
+  if (inherit & DYNTOPO_SUBDIVIDE) {
+    if (sd->flags & SCULPT_DYNTOPO_SUBDIVIDE) {
+      out->flag |= DYNTOPO_SUBDIVIDE;
+    }
+    else {
+      out->flag &= ~DYNTOPO_SUBDIVIDE;
+    }
+  }
+
+  if (inherit & DYNTOPO_COLLAPSE) {
+    if (sd->flags & SCULPT_DYNTOPO_COLLAPSE) {
+      out->flag |= DYNTOPO_COLLAPSE;
+    }
+    else {
+      out->flag &= ~DYNTOPO_COLLAPSE;
+    }
+  }
+};
diff --git a/source/blender/blenkernel/intern/paint.c b/source/blender/blenkernel/intern/paint.c
index fe86365b72e..d6f1f72a492 100644
--- a/source/blender/blenkernel/intern/paint.c
+++ b/source/blender/blenkernel/intern/paint.c
@@ -1907,6 +1907,9 @@ void BKE_sculpt_toolsettings_data_ensure(struct Scene *scene)
   if (!sd->detail_size) {
     sd->detail_size = 12;
   }
+  if (!sd->detail_range) {
+    sd->detail_range = 0.4f;
+  }
   if (!sd->detail_percent) {
     sd->detail_percent = 25;
   }
diff --git a/source/blender/blenkernel/intern/pbvh_bmesh.c b/source/blender/blenkernel/intern/pbvh_bmesh.c
index e35518e6bf6..73423dbcf2c 100644
--- a/source/blender/blenkernel/intern/pbvh_bmesh.c
+++ b/source/blender/blenkernel/intern/pbvh_bmesh.c
@@ -2957,7 +2957,7 @@ void BKE_pbvh_build_bmesh(PBVH *pbvh,
 
   pbvh->bm = bm;
 
-  BKE_pbvh_bmesh_detail_size_set(pbvh, 0.75);
+  BKE_pbvh_bmesh_detail_size_set(pbvh, 0.75f, 0.4f);
 
   pbvh->type = PBVH_BMESH;
   pbvh->bm_log = log;
@@ -3664,10 +3664,10 @@ void BKE_pbvh_bmesh_after_stroke(PBVH *pbvh)
   BKE_pbvh_update_bounds(pbvh, (PBVH_UpdateBB | PBVH_UpdateOriginalBB | PBVH_UpdateRedraw));
 }
 
-void BKE_pbvh_bmesh_detail_size_set(PBVH *pbvh, float detail_size)
+void BKE_pbvh_bmesh_detail_size_set(PBVH *pbvh, float detail_size, float detail_range)
 {
   pbvh->bm_max_edge_len = detail_size;
-  pbvh->bm_min_edge_len = pbvh->bm_max_edge_len * 0.4f;
+  pbvh->bm_min_edge_len = pbvh->bm_max_edge_len * detail_range;
 }
 
 void BKE_pbvh_node_mark_topology_update(PBVHNode *node)
diff --git a/source/blender/blenloader/intern/versioning_290.c b/source/blender/blenloader/intern/versioning_290.c
index 6ad556b6b1e..22b38d73c22 100644
--- a/source/blender/blenloader/intern/versioning_290.c
+++ b/source/blender/blenloader/intern/versioning_290.c
@@ -48,6 +48,7 @@
 #include "DNA_space_types.h"
 #include "DNA_tracking_types.h"
 #include "DNA_workspace_types.h"
+#include "DNA_defaults.h"
 
 #include "BKE_animsys.h"
 #include "BKE_armature.h"
@@ -61,6 +62,7 @@
 #include "BKE_mesh.h"
 #include "BK

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list