From bb4b56df4dda85c86d6aea3f43625c94f79d7c25 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Wed, 24 Jan 2024 16:37:57 -0500 Subject: [PATCH 1/6] WIP: Brush Assets: Switch to a single "Brush" active tool --- .../startup/bl_ui/space_toolsystem_toolbar.py | 72 ++++++++++++------- scripts/startup/bl_ui/space_view3d.py | 9 ++- .../editors/sculpt_paint/curves_sculpt_ops.cc | 1 + .../blender/editors/sculpt_paint/paint_ops.cc | 59 +-------------- .../windowmanager/intern/wm_toolsystem.cc | 2 +- 5 files changed, 57 insertions(+), 86 deletions(-) diff --git a/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/scripts/startup/bl_ui/space_toolsystem_toolbar.py index 790459d778f..9e3d35c86f9 100644 --- a/scripts/startup/bl_ui/space_toolsystem_toolbar.py +++ b/scripts/startup/bl_ui/space_toolsystem_toolbar.py @@ -1383,17 +1383,24 @@ class _defs_particle: class _defs_sculpt: @staticmethod - def generate_from_brushes(context): - return generate_from_enum_ex( - context, - idname_prefix="builtin_brush.", - icon_prefix="brush.sculpt.", - type=bpy.types.Brush, - attr="sculpt_tool", - # TODO(@ideasman42): we may want to enable this, - # it causes awkward grouping with 2x column button layout. - use_separators=False, - ) + def generate_brush_tool(context): + if not context: + return () + brush = context.tool_settings.sculpt.brush + if not brush: + return () + tool = brush.sculpt_tool + icon = "ops.sculpt_" + tool.lower() + return [ + ToolDef.from_dict( + dict( + idname="builtin.brush", + label=brush.name, + icon=icon, + data_block=tool + ) + ) + ] @ToolDef.from_fn def hide_border(): @@ -2429,18 +2436,29 @@ class _defs_gpencil_weight: class _defs_curves_sculpt: @staticmethod - def generate_from_brushes(context): - return generate_from_enum_ex( - context, - idname_prefix="builtin_brush.", - icon_prefix="ops.curves.sculpt_", - type=bpy.types.Brush, - attr="curves_sculpt_tool", - icon_map={ - # Use the generic icon for selection painting. - "ops.curves.sculpt_selection_paint": "ops.generic.select_paint", - }, - ) + def generate_brush_tool(context): + if not context: + return () + brush = context.tool_settings.curves_sculpt.brush + if not brush: + return () + tool = brush.curves_sculpt_tool + icon = "ops.curves.sculpt_" + tool.lower() + icon_map = { + # Use the generic icon for selection painting. + "ops.curves.sculpt_selection_paint": "ops.generic.select_paint", + } + icon = icon_map.get(icon, icon) + return [ + ToolDef.from_dict( + dict( + idname="builtin.brush", + label=brush.name, + icon=icon, + data_block=tool + ) + ) + ] class _defs_gpencil_vertex: @@ -3076,7 +3094,9 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel): _defs_particle.generate_from_brushes, ], 'SCULPT': [ - _defs_sculpt.generate_from_brushes, + lambda context: ( + _defs_curves_sculpt.generate_brush_tool(context) + ), None, ( _defs_sculpt.mask_border, @@ -3221,7 +3241,9 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel): ), ], 'SCULPT_CURVES': [ - _defs_curves_sculpt.generate_from_brushes, + lambda context: ( + _defs_curves_sculpt.generate_brush_tool(context) + ), None, *_tools_annotate, ], diff --git a/scripts/startup/bl_ui/space_view3d.py b/scripts/startup/bl_ui/space_view3d.py index 1c7a8215238..421c0ccd028 100644 --- a/scripts/startup/bl_ui/space_view3d.py +++ b/scripts/startup/bl_ui/space_view3d.py @@ -496,8 +496,13 @@ class _draw_tool_settings_context_mode: @staticmethod def SCULPT_CURVES(context, layout, tool): - if (tool is None) or (not tool.has_datablock): - return False + # if tool is None: + # print("tool is None") + # return False + + # if not tool.has_datablock: + # print("not tool.has_datablock") + # return False tool_settings = context.tool_settings paint = tool_settings.curves_sculpt diff --git a/source/blender/editors/sculpt_paint/curves_sculpt_ops.cc b/source/blender/editors/sculpt_paint/curves_sculpt_ops.cc index 6b96a5cb757..6b3e979b144 100644 --- a/source/blender/editors/sculpt_paint/curves_sculpt_ops.cc +++ b/source/blender/editors/sculpt_paint/curves_sculpt_ops.cc @@ -1188,6 +1188,7 @@ static int brush_asset_select_exec(bContext *C, wmOperator *op) } WM_main_add_notifier(NC_SCENE | ND_TOOLSETTINGS, nullptr); + WM_toolsystem_ref_set_by_id(C, "builtin.brush"); return OPERATOR_FINISHED; } diff --git a/source/blender/editors/sculpt_paint/paint_ops.cc b/source/blender/editors/sculpt_paint/paint_ops.cc index a834e4134e6..37ae9e86e2a 100644 --- a/source/blender/editors/sculpt_paint/paint_ops.cc +++ b/source/blender/editors/sculpt_paint/paint_ops.cc @@ -850,36 +850,6 @@ static Brush *brush_tool_toggle(Main *bmain, Paint *paint, Brush *brush_orig, co return nullptr; } -/** The name of the active tool is "builtin_brush." concatenated with the returned string. */ -static blender::StringRefNull curves_active_tool_name_get(const eBrushCurvesSculptTool tool) -{ - switch (tool) { - case CURVES_SCULPT_TOOL_COMB: - return "comb"; - case CURVES_SCULPT_TOOL_DELETE: - return "delete"; - case CURVES_SCULPT_TOOL_SNAKE_HOOK: - return "snake_hook"; - case CURVES_SCULPT_TOOL_ADD: - return "add"; - case CURVES_SCULPT_TOOL_GROW_SHRINK: - return "grow_shrink"; - case CURVES_SCULPT_TOOL_SELECTION_PAINT: - return "selection_paint"; - case CURVES_SCULPT_TOOL_PINCH: - return "pinch"; - case CURVES_SCULPT_TOOL_SMOOTH: - return "smooth"; - case CURVES_SCULPT_TOOL_PUFF: - return "puff"; - case CURVES_SCULPT_TOOL_DENSITY: - return "density"; - case CURVES_SCULPT_TOOL_SLIDE: - return "slide"; - } - return ""; -} - static bool brush_generic_tool_set(bContext *C, Main *bmain, Paint *paint, @@ -911,26 +881,7 @@ static bool brush_generic_tool_set(bContext *C, BKE_paint_invalidate_overlay_all(); WM_main_add_notifier(NC_BRUSH | NA_EDITED, brush); - - /* Tool System - * This is needed for when there is a non-sculpt tool active (transform for e.g.). - * In case we are toggling (and the brush changed to the toggle_brush), we need to get the - * tool_name again. */ - int tool_result = brush_tool(brush, paint->runtime.tool_offset); - ePaintMode paint_mode = BKE_paintmode_get_active_from_context(C); - - if (paint_mode == PAINT_MODE_SCULPT_CURVES) { - tool_name = curves_active_tool_name_get(eBrushCurvesSculptTool(tool)).c_str(); - } - else { - const EnumPropertyItem *items = BKE_paint_get_tool_enum_from_paintmode(paint_mode); - RNA_enum_name_from_value(items, tool_result, &tool_name); - } - - char tool_id[MAX_NAME]; - SNPRINTF(tool_id, "builtin_brush.%s", tool_name); - WM_toolsystem_ref_set_by_id(C, tool_id); - + WM_toolsystem_ref_set_by_id(C, "builtin.brush"); return true; } return false; @@ -977,14 +928,6 @@ static int brush_select_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } - if (paint_mode == PAINT_MODE_SCULPT_CURVES) { - tool_name = curves_active_tool_name_get(eBrushCurvesSculptTool(tool)).c_str(); - } - else { - const EnumPropertyItem *items = BKE_paint_get_tool_enum_from_paintmode(paint_mode); - RNA_enum_name_from_value(items, tool, &tool_name); - } - if (brush_generic_tool_set(C, bmain, paint, tool, tool_name, create_missing, toggle)) { return OPERATOR_FINISHED; } diff --git a/source/blender/windowmanager/intern/wm_toolsystem.cc b/source/blender/windowmanager/intern/wm_toolsystem.cc index 6d796d2a923..81b249e9ad4 100644 --- a/source/blender/windowmanager/intern/wm_toolsystem.cc +++ b/source/blender/windowmanager/intern/wm_toolsystem.cc @@ -726,7 +726,7 @@ static const char *toolsystem_default_tool(const bToolKey *tkey) case CTX_MODE_VERTEX_GPENCIL_LEGACY: return "builtin_brush.Draw"; case CTX_MODE_SCULPT_CURVES: - return "builtin_brush.Density"; + return "builtin.brush"; /* end temporary hack. */ case CTX_MODE_PARTICLE: -- 2.30.2 From 507bc8fe763bdcd7c4e8e2ba177599d7e924b4e9 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Thu, 25 Jan 2024 16:00:53 -0500 Subject: [PATCH 2/6] Use single icon --- scripts/startup/bl_ui/space_toolsystem_toolbar.py | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/scripts/startup/bl_ui/space_toolsystem_toolbar.py index 9e3d35c86f9..a6dfb836a5c 100644 --- a/scripts/startup/bl_ui/space_toolsystem_toolbar.py +++ b/scripts/startup/bl_ui/space_toolsystem_toolbar.py @@ -1389,12 +1389,10 @@ class _defs_sculpt: brush = context.tool_settings.sculpt.brush if not brush: return () - tool = brush.sculpt_tool - icon = "ops.sculpt_" + tool.lower() return [ ToolDef.from_dict( dict( - idname="builtin.brush", + idname="builtin_brush.Paint", label=brush.name, icon=icon, data_block=tool @@ -2442,17 +2440,10 @@ class _defs_curves_sculpt: brush = context.tool_settings.curves_sculpt.brush if not brush: return () - tool = brush.curves_sculpt_tool - icon = "ops.curves.sculpt_" + tool.lower() - icon_map = { - # Use the generic icon for selection painting. - "ops.curves.sculpt_selection_paint": "ops.generic.select_paint", - } - icon = icon_map.get(icon, icon) return [ ToolDef.from_dict( dict( - idname="builtin.brush", + idname="builtin_brush.Paint", label=brush.name, icon=icon, data_block=tool -- 2.30.2 From 233869b481b5b2b9ec8ea80415e5b399beb0f06b Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Thu, 25 Jan 2024 16:10:46 -0500 Subject: [PATCH 3/6] Progress --- scripts/startup/bl_ui/space_toolsystem_toolbar.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/scripts/startup/bl_ui/space_toolsystem_toolbar.py index a6dfb836a5c..543827a25f2 100644 --- a/scripts/startup/bl_ui/space_toolsystem_toolbar.py +++ b/scripts/startup/bl_ui/space_toolsystem_toolbar.py @@ -1389,12 +1389,13 @@ class _defs_sculpt: brush = context.tool_settings.sculpt.brush if not brush: return () + tool = brush.sculpt_tool return [ ToolDef.from_dict( dict( - idname="builtin_brush.Paint", + idname="builtin.brush", label=brush.name, - icon=icon, + icon="builtin_brush.paint", data_block=tool ) ) @@ -2440,12 +2441,13 @@ class _defs_curves_sculpt: brush = context.tool_settings.curves_sculpt.brush if not brush: return () + tool = brush.curves_sculpt_tool return [ ToolDef.from_dict( dict( - idname="builtin_brush.Paint", + idname="builtin.brush", label=brush.name, - icon=icon, + icon="builtin_brush.paint", data_block=tool ) ) @@ -3086,7 +3088,7 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel): ], 'SCULPT': [ lambda context: ( - _defs_curves_sculpt.generate_brush_tool(context) + _defs_sculpt.generate_brush_tool(context) ), None, ( -- 2.30.2 From 718f02ce1bbad2395cac3d00008506d00db23709 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Fri, 26 Jan 2024 13:35:40 -0500 Subject: [PATCH 4/6] Fix icons --- scripts/startup/bl_ui/space_toolsystem_toolbar.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/scripts/startup/bl_ui/space_toolsystem_toolbar.py index 8e5fe277755..c7ab5bbbe9a 100644 --- a/scripts/startup/bl_ui/space_toolsystem_toolbar.py +++ b/scripts/startup/bl_ui/space_toolsystem_toolbar.py @@ -1395,7 +1395,7 @@ class _defs_sculpt: dict( idname="builtin.brush", label=brush.name, - icon="builtin_brush.paint", + icon="brush.sculpt.paint", data_block=tool ) ) @@ -2460,7 +2460,7 @@ class _defs_curves_sculpt: dict( idname="builtin.brush", label=brush.name, - icon="builtin_brush.paint", + icon="brush.sculpt.paint", data_block=tool ) ) -- 2.30.2 From 4e953508e76238457ba092ef1789c08e4646c3be Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Fri, 26 Jan 2024 14:13:17 -0500 Subject: [PATCH 5/6] Activate "brush" tool by default in mesh sculpt mode --- source/blender/windowmanager/intern/wm_toolsystem.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/source/blender/windowmanager/intern/wm_toolsystem.cc b/source/blender/windowmanager/intern/wm_toolsystem.cc index 81b249e9ad4..03804cc9a3f 100644 --- a/source/blender/windowmanager/intern/wm_toolsystem.cc +++ b/source/blender/windowmanager/intern/wm_toolsystem.cc @@ -713,6 +713,7 @@ static const char *toolsystem_default_tool(const bToolKey *tkey) switch (tkey->mode) { /* Use the names of the enums for each brush tool. */ case CTX_MODE_SCULPT: + return "builtin.brush"; case CTX_MODE_PAINT_VERTEX: case CTX_MODE_PAINT_WEIGHT: case CTX_MODE_PAINT_TEXTURE: -- 2.30.2 From f7488bab3beef1857e278b6f114c5ea5258a979d Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Fri, 26 Jan 2024 14:54:35 -0500 Subject: [PATCH 6/6] Remove unnecessary change --- scripts/startup/bl_ui/space_view3d.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/scripts/startup/bl_ui/space_view3d.py b/scripts/startup/bl_ui/space_view3d.py index 01a2f176f36..3fa8ea2c48f 100644 --- a/scripts/startup/bl_ui/space_view3d.py +++ b/scripts/startup/bl_ui/space_view3d.py @@ -496,13 +496,8 @@ class _draw_tool_settings_context_mode: @staticmethod def SCULPT_CURVES(context, layout, tool): - # if tool is None: - # print("tool is None") - # return False - - # if not tool.has_datablock: - # print("not tool.has_datablock") - # return False + if (tool is None) or (not tool.has_datablock): + return False tool_settings = context.tool_settings paint = tool_settings.curves_sculpt -- 2.30.2