Commit: 143ece7199c20b231077273e4c16c7edd0bc4940 Author: Campbell Barton Date: Fri Oct 5 13:07:01 2018 +1000 Branches: blender2.8 https://developer.blender.org/rB143ece7199c20b231077273e4c16c7edd0bc4940
Tool System: initial support for UV-sculpt This currently conflicts with the UV-sculpt toggle being manually set, ideally this would work more like other paint modes in Blender. =================================================================== M release/scripts/startup/bl_ui/space_toolsystem_toolbar.py M source/blender/makesrna/intern/rna_workspace_api.c M source/blender/windowmanager/intern/wm_toolsystem.c =================================================================== diff --git a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py index b7dc8335a7b..01e9ac33491 100644 --- a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py +++ b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py @@ -1190,6 +1190,15 @@ class _defs_weight_paint: class _defs_image_generic: + @staticmethod + def poll_uvedit(context): + ob = context.edit_object + if ob is not None: + data = ob.data + if data is not None: + return bool(getattr(data, "uv_layers", False)) + return False + @ToolDef.from_fn def cursor(): return dict( @@ -1282,6 +1291,18 @@ class _defs_image_uv_select: ) +class _defs_image_uv_sculpt: + + @staticmethod + def generate_from_brushes(context): + return generate_from_enum_ex( + context, + icon_prefix="brush.uv_sculpt.", + data=context.tool_settings, + attr="uv_sculpt_tool", + ) + + class _defs_gpencil_paint: @staticmethod def draw_color_selector(context, layout): @@ -1772,6 +1793,12 @@ class IMAGE_PT_tools_active(ToolSelectPanelHelper, Panel): *_tools_transform, None, *_tools_annotate, + None, + lambda context: ( + _defs_image_uv_sculpt.generate_from_brushes(context) + if _defs_image_generic.poll_uvedit(context) + else () + ), ], 'MASK': [ None, diff --git a/source/blender/makesrna/intern/rna_workspace_api.c b/source/blender/makesrna/intern/rna_workspace_api.c index 898dc296299..fb237299dd0 100644 --- a/source/blender/makesrna/intern/rna_workspace_api.c +++ b/source/blender/makesrna/intern/rna_workspace_api.c @@ -90,7 +90,10 @@ static void rna_WorkspaceTool_refresh_from_context( if (ob == NULL) { /* pass */ } - else if (ob->mode & OB_MODE_PARTICLE_EDIT) { + else if ((tref->space_type == SPACE_VIEW3D) && + (tref->mode == CTX_MODE_PARTICLE) && + (ob->mode & OB_MODE_PARTICLE_EDIT)) + { const EnumPropertyItem *items = rna_enum_particle_edit_hair_brush_items; const int i = RNA_enum_from_value(items, ts->particle.brushtype); const EnumPropertyItem *item = &items[i]; @@ -99,6 +102,18 @@ static void rna_WorkspaceTool_refresh_from_context( STRNCPY(tref->idname, item->name); } } + else if ((tref->space_type == SPACE_IMAGE) && + (tref->mode == SI_MODE_VIEW) && + (ob->mode & OB_MODE_EDIT)) + { + const EnumPropertyItem *items = rna_enum_uv_sculpt_tool_items; + const int i = RNA_enum_from_value(items, ts->uv_sculpt_tool); + const EnumPropertyItem *item = &items[i]; + if (!STREQ(tref_rt->data_block, item->identifier)) { + STRNCPY(tref_rt->data_block, item->identifier); + STRNCPY(tref->idname, item->name); + } + } else { Paint *paint = BKE_paint_get_active(scene, view_layer); if (paint) { diff --git a/source/blender/windowmanager/intern/wm_toolsystem.c b/source/blender/windowmanager/intern/wm_toolsystem.c index 3a112ac0597..5584fada329 100644 --- a/source/blender/windowmanager/intern/wm_toolsystem.c +++ b/source/blender/windowmanager/intern/wm_toolsystem.c @@ -169,6 +169,14 @@ void WM_toolsystem_unlink(bContext *C, WorkSpace *workspace, const bToolKey *tke } } +static void toolsystem_ref_link__refresh_image_uv_sculpt(bContext *C, Scene *scene) +{ + PointerRNA ptr; + RNA_pointer_create(&scene->id, &RNA_ToolSettings, scene->toolsettings, &ptr); + PropertyRNA *prop = RNA_struct_find_property(&ptr, "use_uv_sculpt"); + RNA_property_update(C, &ptr, prop); +} + static void toolsystem_ref_link(bContext *C, WorkSpace *workspace, bToolRef *tref) { bToolRef_Runtime *tref_rt = tref->runtime; @@ -205,6 +213,30 @@ static void toolsystem_ref_link(bContext *C, WorkSpace *workspace, bToolRef *tre } } } + if ((tref->space_type == SPACE_IMAGE) && + (tref->mode == SI_MODE_VIEW)) + { + /* Note that switching uv-sculpt boolean is a hack at the moment. + * It would be best to make this either an operator or a higher level mode (like mesh-object sculpt mode). */ + const EnumPropertyItem *items = rna_enum_uv_sculpt_tool_items; + const int i = RNA_enum_from_identifier(items, tref_rt->data_block); + if (i != -1) { + const int value = items[i].value; + wmWindowManager *wm = bmain->wm.first; + for (wmWindow *win = wm->windows.first; win; win = win->next) { + if (workspace == WM_window_get_active_workspace(win)) { + Scene *scene = WM_window_get_active_scene(win); + ToolSettings *ts = scene->toolsettings; + ts->uv_sculpt_tool = value; + + if (ts->use_uv_sculpt == false) { + ts->use_uv_sculpt = true; + toolsystem_ref_link__refresh_image_uv_sculpt(C, scene); + } + } + } + } + } else { struct Brush *brush = (struct Brush *)BKE_libblock_find_name(bmain, ID_BR, tref_rt->data_block); if (brush) { @@ -224,6 +256,25 @@ static void toolsystem_ref_link(bContext *C, WorkSpace *workspace, bToolRef *tre } } } + else { + /* XXX, this part is weak, disables uv_sculpt when non uv-tool set. */ + if ((tref->space_type == SPACE_IMAGE) && + (tref->mode == SI_MODE_VIEW)) + { + Main *bmain = CTX_data_main(C); + wmWindowManager *wm = bmain->wm.first; + for (wmWindow *win = wm->windows.first; win; win = win->next) { + if (workspace == WM_window_get_active_workspace(win)) { + Scene *scene = WM_window_get_active_scene(win); + ToolSettings *ts = scene->toolsettings; + if (ts->use_uv_sculpt == true) { + ts->use_uv_sculpt = false; + toolsystem_ref_link__refresh_image_uv_sculpt(C, scene); + } + } + } + } + } } static void toolsystem_refresh_ref(bContext *C, WorkSpace *workspace, bToolRef *tref) _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs