[Bf-blender-cvs] [f91161a7076] sculpt-dev: Sculpt: fix broken jitter and smooth stabilize brush settings.
Joseph Eagar
noreply at git.blender.org
Fri Oct 8 04:45:05 CEST 2021
Commit: f91161a70760b22cffe353df1da6a6df0c220a7d
Author: Joseph Eagar
Date: Thu Oct 7 19:44:38 2021 -0700
Branches: sculpt-dev
https://developer.blender.org/rBf91161a70760b22cffe353df1da6a6df0c220a7d
Sculpt: fix broken jitter and smooth
stabilize brush settings.
===================================================================
M release/scripts/startup/bl_ui/properties_paint_common.py
M source/blender/blenkernel/intern/brush_channel_define.h
M source/blender/blenkernel/intern/brush_engine_presets.c
M source/blender/editors/sculpt_paint/sculpt.c
===================================================================
diff --git a/release/scripts/startup/bl_ui/properties_paint_common.py b/release/scripts/startup/bl_ui/properties_paint_common.py
index eb8db807fd2..6329ce4bae6 100644
--- a/release/scripts/startup/bl_ui/properties_paint_common.py
+++ b/release/scripts/startup/bl_ui/properties_paint_common.py
@@ -320,6 +320,12 @@ class UnifiedPaintPanel:
@staticmethod
def get_channel_value(context, brush, prop_name, toolsettings_only=False):
+ if context.mode != "SCULPT":
+ if prop_name in channel_name_map:
+ prop_name = channel_name_map[prop_name]
+
+ return getattr(brush, prop_name)
+
ch = brush.channels[prop_name]
if ch.inherit or toolsettings_only:
@@ -864,7 +870,7 @@ class StrokePanel(BrushPanel):
col.prop(brush, "dash_ratio", text="Dash Ratio")
col.prop(brush, "dash_samples", text="Dash Length")
- if (mode == 'SCULPT' and brush.sculpt_capabilities.has_jitter) or mode != 'SCULPT':
+ if mode != 'SCULPT':
col.separator()
row = col.row(align=True)
if brush.jitter_unit == 'BRUSH':
@@ -873,6 +879,26 @@ class StrokePanel(BrushPanel):
row.prop(brush, "jitter_absolute")
row.prop(brush, "use_pressure_jitter", toggle=True, text="")
col.row().prop(brush, "jitter_unit", expand=True)
+ elif mode == 'SCULPT' and brush.sculpt_capabilities.has_jitter:
+ col.separator()
+ row = col.row(align=True)
+ if UnifiedPaintPanel.get_channel_value(context, brush, "jitter_unit") == 'BRUSH':
+ UnifiedPaintPanel.channel_unified(row,
+ context,
+ brush,
+ "jitter", slider=True)
+ else:
+ UnifiedPaintPanel.channel_unified(row,
+ context,
+ brush,
+ "jitter_absolute")
+
+ #row.prop(brush, "use_pressure_jitter", toggle=True, text="")
+ UnifiedPaintPanel.channel_unified(col.row(),
+ context,
+ brush,
+ "jitter_unit", expand=True)
+ #col.row().prop(brush, "jitter_unit", expand=True)
col.separator()
col.prop(settings, "input_samples")
@@ -896,20 +922,41 @@ class SmoothStrokePanel(BrushPanel):
settings = self.paint_settings(context)
brush = settings.brush
- self.layout.prop(brush, "use_smooth_stroke", text="")
+ if context.mode == "SCULPT":
+ self.layout.prop(brush.channels["use_smooth_stroke"], "value", text="")
+ else:
+ self.layout.prop(brush, "use_smooth_stroke", text="")
def draw(self, context):
- layout = self.layout
- layout.use_property_split = True
- layout.use_property_decorate = False
+ ui_editing = context.tool_settings.unified_paint_settings.brush_editor_mode
settings = self.paint_settings(context)
brush = settings.brush
+ if ui_editing:
+ UnifiedPaintPanel.channel_unified(self.layout,
+ context,
+ brush,
+ "use_smooth_stroke", ui_editing=True, text="Stabilize Stroke")
+
+ layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
+
col = layout.column()
- col.active = brush.use_smooth_stroke
- col.prop(brush, "smooth_stroke_radius", text="Radius", slider=True)
- col.prop(brush, "smooth_stroke_factor", text="Factor", slider=True)
+
+ col.active = UnifiedPaintPanel.get_channel_value(context, brush, "use_smooth_stroke")
+
+ #col.prop(brush, "smooth_stroke_radius", text="Radius", slider=True)
+ #col.prop(brush, "smooth_stroke_factor", text="Factor", slider=True)
+ UnifiedPaintPanel.channel_unified(col,
+ context,
+ brush,
+ "smooth_stroke_radius", text="Radius", ui_editing=ui_editing, slider=True)
+ UnifiedPaintPanel.channel_unified(col,
+ context,
+ brush,
+ "smooth_stroke_factor", text="Factor", ui_editing=ui_editing, slider=True)
class FalloffPanel(BrushPanel):
diff --git a/source/blender/blenkernel/intern/brush_channel_define.h b/source/blender/blenkernel/intern/brush_channel_define.h
index a9b1bf2c7c3..1011fccedfe 100644
--- a/source/blender/blenkernel/intern/brush_channel_define.h
+++ b/source/blender/blenkernel/intern/brush_channel_define.h
@@ -288,8 +288,15 @@ MAKE_FLOAT(normal_weight, "Normal Weight", "", 0.0f, 0.0f, 1.0f)
MAKE_FLOAT(weight, "Weight", "", 0.5f, 0.0f, 1.0f)
MAKE_FLOAT(jitter, "Jitter", "Jitter the position of the brush while painting", 0.0f, 0.0f, 1.0f)
MAKE_INT(jitter_absolute, "Absolute Jitter", "", 0, 0.0f, 1000.0f)
-MAKE_FLOAT(smooth_stroke_radius, "Smooth Stroke Radius", "Minimum distance from last point before stroke continues", 75.0f, 10.0f, 200.0f)
-MAKE_FLOAT(smooth_stroke_factor, "Smooth Stroke Factor", "", 0.9f, 0.5f, 0.99f)
+MAKE_ENUM_EX(jitter_unit, "Jitter Unit", "Jitter in screen space or relative to brush size", 0, 0, {
+ {BRUSH_ABSOLUTE_JITTER, "VIEW", "NONE", "View", "Jittering happens in screen space, in pixels"},
+ {0, "BRUSH", "NONE", "Brush", "Jittering happens relative to the brush size"},
+ {-1}
+})
+
+MAKE_BOOL_EX(use_smooth_stroke, "Smooth Stroke", "Brush lags behind mouse and follows a smoother path", false, 0)
+MAKE_FLOAT_EX_EX(smooth_stroke_radius, "Smooth Stroke Radius", "Minimum distance from last point before stroke continues", 75.0f, 10.0f, 200.0f, 10.0f, 200.0f, false, false, 0)
+MAKE_FLOAT_EX_EX(smooth_stroke_factor, "Smooth Stroke Factor", "", 0.9f, 0.5f, 0.99f, 0.5f, 0.99f, false, false, 0)
MAKE_FLOAT_EX(rate, "Rate", "", 0.1f, 0.0001f, 10000.0f, 0.01f, 1.0f, false)
MAKE_FLOAT(flow, "Flow", "Amount of paint that is applied per stroke sample", 1.0f, 0.0f, 1.0f)
MAKE_FLOAT(wet_mix, "Wet Mix", "Amount of paint that is picked from the surface into the brush color", 0.0f, 0.0f, 1.0f)
diff --git a/source/blender/blenkernel/intern/brush_engine_presets.c b/source/blender/blenkernel/intern/brush_engine_presets.c
index 8512ce9992c..2ad013e5c40 100644
--- a/source/blender/blenkernel/intern/brush_engine_presets.c
+++ b/source/blender/blenkernel/intern/brush_engine_presets.c
@@ -248,6 +248,10 @@ static bool check_builtin_init()
// BKE_brush_channeltype_rna_check(brush_builtin_channels + i);
//}
+ SUBTYPE_SET(smooth_stroke_radius, BRUSH_CHANNEL_PIXEL);
+
+ SUBTYPE_SET(jitter_absolute, BRUSH_CHANNEL_PIXEL);
+
SUBTYPE_SET(radius, BRUSH_CHANNEL_PIXEL);
SUBTYPE_SET(spacing, BRUSH_CHANNEL_PERCENT);
SUBTYPE_SET(autosmooth_spacing, BRUSH_CHANNEL_PERCENT);
@@ -286,6 +290,12 @@ static bool check_builtin_init()
SETCAT(spacing, "Stroke");
SETCAT(use_space_attenuation, "Stroke");
+ SETCAT(use_smooth_stroke, "Stroke");
+ SETCAT(smooth_stroke_factor, "Stroke");
+ SETCAT(smooth_stroke_radius, "Stroke");
+ SETCAT(jitter_absolute, "Stroke");
+ SETCAT(jitter_unit, "Stroke");
+ SETCAT(jitter, "Stroke");
SETCAT(autosmooth, "Smoothing");
SETCAT(autosmooth_projection, "Smoothing");
@@ -416,7 +426,7 @@ static BrushSettingsMap brush_settings_map[] = {
DEF(weight, weight, FLOAT, FLOAT)
DEF(multiplane_scrape_angle, multiplane_scrape_angle, FLOAT, FLOAT)
DEF(jitter, jitter, FLOAT, FLOAT)
- DEF(jitter_absolute, JITTER_ABSOLITE, INT, INT)
+ DEF(jitter_absolute, jitter_absolute, INT, INT)
DEF(smooth_stroke_radius, smooth_stroke_radius, INT, FLOAT)
DEF(smooth_stroke_factor, smooth_stroke_factor, FLOAT, FLOAT)
DEF(rate, rate, FLOAT, FLOAT)
@@ -502,6 +512,7 @@ typedef struct BrushFlagMap {
char *channel_name;
int flag;
int member_size;
+ int bitmask_bit;
} BrushFlagMap;
/* clang-format off */
@@ -510,7 +521,10 @@ typedef struct BrushFlagMap {
#endif
#define DEF(member, channel, flag)\
- {offsetof(Brush, member), #channel, flag, sizeof(((Brush){0}).member)},
+ {offsetof(Brush, member), #channel, flag, sizeof(((Brush){0}).member), 0},
+
+#define DEFBIT(member, channel, flag, bit)\
+ {offsetof(Brush, member), #channel, flag, sizeof(((Brush){0}).member), bit},
/* This lookup table is like brush_settings_map except it converts
individual bitflags instead of whole struct members.*/
@@ -539,6 +553,8 @@ BrushFlagMap brush_flags_map[] = {
DEF(flag2, use_surface_falloff, BRUSH_USE_SURFACE_FALLOFF)
DEF(flag2, use_grab_active_vertex, BRUSH_GRAB_ACTIVE_VERTEX)
DEF(flag, accumulate, BRUSH_ACCUMULATE)
+ DEF(flag, use_smooth_stroke, BRUSH_SMOOTH_STROKE)
+ DEFBIT(flag, jitter_unit, BRUSH_ABSOLUTE_JITTER, BRUSH_ABSOLUTE_JITTER)
};
int brush_flags_map_len = ARRAY_SIZE(brush_flags_map);
@@ -637,6 +653,38 @@ void *get_channel_value_pointer(BrushChannel *ch, int *r_data_size)
return NULL;
}
+static int brushflag_from_channel(BrushFlagMap *mf, int flag, int val)
+{
+ if (mf->bitmask_bit == 0) {
+ return val ? flag | mf->flag : flag & ~mf->flag;
+ }
+
+ if (val & mf->bitmask_bit) {
+ flag |= mf->flag;
+ }
+ else {
+ flag &= ~mf->flag;
+ }
+
+ return flag;
+}
+
+static int brushflag_to_channel(BrushFlagMap *mf, int chvalue, int val)
+{
+ if (mf->bitmask_bit == 0) {
+ return val & mf->flag ? 1 : 0;
+ }
+
+ if (val & mf->flag) {
+ chvalue |= mf->bitmask_bit;
+ }
+ else {
+ chvalue &= ~mf->bitmask_bit;
+ }
+
+ return chvalue;
+}
+
static void brush_flags_from_channels(BrushChannelSet *chset, Brush *brush)
{
for (int i = 0; i < brush_flags_map_len; i++) {
@@ -653,42 +701,22 @@ static void brush_flags_from_channels(BrushChannelSet *chset, Brush *brush)
switch (mf->member_size) {
case 1: {
char *f = (char *)ptr;
- if (ch->ivalue) {
- *f |= mf->flag;
- }
- else {
- *f &= ~mf->flag;
- }
+ *f = (char)brushflag_from_channel(mf, *f, ch->ivalue);
break;
}
case 2: {
ushort *f = (ushort *)ptr;
- if (ch->ivalue) {
- *f |= mf->flag;
- }
- else {
- *f &= ~mf->flag;
- }
+ *f = (ushort)brushflag_from_channel(mf, *f, ch->ivalue);
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list