diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-10-16 21:17:03 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-10-16 21:19:11 +0300 |
commit | 569dfe5784aab59079589ef780d7826a9983b699 (patch) | |
tree | 3c00e46ffb43905e869ea176eb43d6646036491e /source/blender | |
parent | fb550ca6b9ef271c0c0f2d3cd12bc958663177bf (diff) |
Fix T56250: brush cycling with shortcuts is broken.
It was cycling both in the brush system and tool system which conflicted.
Now it uses just the tool system. This is more of a temporary fix until
the new tool/brush decoupled design is in place.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/editors/sculpt_paint/paint_ops.c | 54 |
1 files changed, 37 insertions, 17 deletions
diff --git a/source/blender/editors/sculpt_paint/paint_ops.c b/source/blender/editors/sculpt_paint/paint_ops.c index 0e51fb39d23..066ef1072fc 100644 --- a/source/blender/editors/sculpt_paint/paint_ops.c +++ b/source/blender/editors/sculpt_paint/paint_ops.c @@ -349,7 +349,11 @@ static void brush_tool_set(const Brush *brush, size_t tool_offset, int tool) *(((char *)brush) + tool_offset) = tool; } -/* generic functions for setting the active brush based on the tool */ +/* Generic functions for setting the active brush based on the tool. + * Replaced by tool system currently, but may come back once active + * tools and brushes are decoupled and brush cycling without changing + * the tool is needed again.. */ +#if 0 static Brush *brush_tool_cycle(Main *bmain, Brush *brush_orig, const int tool, const size_t tool_offset, const int ob_mode) { Brush *brush, *first_brush; @@ -442,6 +446,7 @@ static int brush_generic_tool_set( return OPERATOR_CANCELLED; } } +#endif /* used in the PAINT_OT_brush_select operator */ #define OB_MODE_ACTIVE 0 @@ -449,11 +454,9 @@ static int brush_generic_tool_set( static int brush_select_exec(bContext *C, wmOperator *op) { Main *bmain = CTX_data_main(C); - ToolSettings *toolsettings = CTX_data_tool_settings(C); - Paint *paint = NULL; int tool, paint_mode = RNA_enum_get(op->ptr, "paint_mode"); const bool create_missing = RNA_boolean_get(op->ptr, "create_missing"); - const bool toggle = RNA_boolean_get(op->ptr, "toggle"); + /* const bool toggle = RNA_boolean_get(op->ptr, "toggle"); */ const char *tool_name = "Brush"; size_t tool_offset; @@ -470,26 +473,22 @@ static int brush_select_exec(bContext *C, wmOperator *op) switch (paint_mode) { case OB_MODE_SCULPT: - paint = &toolsettings->sculpt->paint; tool_offset = offsetof(Brush, sculpt_tool); tool = RNA_enum_get(op->ptr, "sculpt_tool"); RNA_enum_name_from_value(rna_enum_brush_sculpt_tool_items, tool, &tool_name); break; case OB_MODE_VERTEX_PAINT: - paint = &toolsettings->vpaint->paint; tool_offset = offsetof(Brush, vertexpaint_tool); tool = RNA_enum_get(op->ptr, "vertex_paint_tool"); RNA_enum_name_from_value(rna_enum_brush_vertex_tool_items, tool, &tool_name); break; case OB_MODE_WEIGHT_PAINT: - paint = &toolsettings->wpaint->paint; /* vertexpaint_tool is used for weight paint mode */ tool_offset = offsetof(Brush, vertexpaint_tool); tool = RNA_enum_get(op->ptr, "weight_paint_tool"); RNA_enum_name_from_value(rna_enum_brush_vertex_tool_items, tool, &tool_name); break; case OB_MODE_TEXTURE_PAINT: - paint = &toolsettings->imapaint.paint; tool_offset = offsetof(Brush, imagepaint_tool); tool = RNA_enum_get(op->ptr, "texture_paint_tool"); RNA_enum_name_from_value(rna_enum_brush_image_tool_items, tool, &tool_name); @@ -499,21 +498,42 @@ static int brush_select_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } - /* TODO(campbell): Use the toolsystem for now, ideally the toolsystem will display brushes directly - * so we don't need to sync between tools and brushes. */ - int ret = brush_generic_tool_set( + /* TODO: old brush setting code disabled, replaced by tool system. */ +#if 0 + Paint *paint = BKE_paint_get_active_from_context(C); + return brush_generic_tool_set( bmain, paint, tool, tool_offset, paint_mode, tool_name, create_missing, toggle); +#else + /* Find matching brush. */ + Brush *brush; + for (brush = bmain->brush.first; brush; brush = brush->id.next) { + if ((brush->ob_mode & paint_mode) && + (brush_tool(brush, tool_offset) == tool)) + { + break; + } + } - if ((ret == OPERATOR_FINISHED) && (paint->brush != NULL)) { - Brush *brush = paint->brush; - WorkSpace *workspace = CTX_wm_workspace(C); - if (WM_toolsystem_ref_set_by_name(C, workspace, NULL, brush->id.name + 2, true)) { - /* ok */ + /* Create missing brush if needed. */ + if (!brush) { + if (create_missing) { + brush = BKE_brush_add(bmain, tool_name, paint_mode); + id_us_min(&brush->id); /* fake user only */ + brush_tool_set(brush, tool_offset, tool); + } + else { + return OPERATOR_CANCELLED; } } - return ret; + + /* Let tool system cycle through brushes. */ + WorkSpace *workspace = CTX_wm_workspace(C); + WM_toolsystem_ref_set_by_name(C, workspace, NULL, brush->id.name + 2, true); + + return OPERATOR_FINISHED; +#endif } static void PAINT_OT_brush_select(wmOperatorType *ot) |