[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