Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2019-05-01 11:10:34 +0300
committerCampbell Barton <ideasman42@gmail.com>2019-05-01 13:32:38 +0300
commit928becec60d16880838dd756cc8b6b5ee73f9b2d (patch)
treea54a8038c357c20d7b88a52d065b0f487480597d /release
parent5fd69f6bd8c91b73135d22b3cad829b0892dabca (diff)
UV Sculpt: improve tool-system integration
In 2.7x UV sculpt was a kind of sub-mode (a toggle with it's own key-map & drawing code). Move this to an operator that uses the tool-system, this simplifies internal logic, especially brush selection which now matches sculpt and other paint modes. - Remove toggle used to enable uv sculpt. - Expose the brush, which was already used but there was no way to select different brushes. - Make UV sculpt use paint paint tool slots (using brushes how all other paint mode currently do). - Move UV Sculpt keymap to the tools keymap. - Remove Q to toggle UV sculpt mode, S/P/G keys to switch tools.
Diffstat (limited to 'release')
-rw-r--r--release/scripts/presets/keyconfig/keymap_data/blender_default.py56
-rw-r--r--release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py33
-rw-r--r--release/scripts/startup/bl_ui/space_image.py98
-rw-r--r--release/scripts/startup/bl_ui/space_toolsystem_toolbar.py23
-rw-r--r--release/scripts/startup/bl_ui/space_view3d.py1
5 files changed, 95 insertions, 116 deletions
diff --git a/release/scripts/presets/keyconfig/keymap_data/blender_default.py b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
index 9a4ad19556a..844e5d335e6 100644
--- a/release/scripts/presets/keyconfig/keymap_data/blender_default.py
+++ b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
@@ -863,8 +863,6 @@ def km_uv_editor(params):
("uv.minimize_stretch", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
("uv.pack_islands", {"type": 'P', "value": 'PRESS', "ctrl": True}, None),
("uv.average_islands_scale", {"type": 'A', "value": 'PRESS', "ctrl": True}, None),
- ("wm.context_toggle", {"type": 'Q', "value": 'PRESS'},
- {"properties": [("data_path", 'tool_settings.use_uv_sculpt')]}),
])
if params.select_mouse == 'LEFTMOUSE' and not params.legacy:
@@ -877,39 +875,6 @@ def km_uv_editor(params):
return keymap
-def km_uv_sculpt(_params):
- items = []
- keymap = (
- "UV Sculpt",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items": items},
- )
-
- items.extend([
- ("wm.context_toggle", {"type": 'Q', "value": 'PRESS'},
- {"properties": [("data_path", 'tool_settings.use_uv_sculpt')]}),
- ("sculpt.uv_sculpt_stroke", {"type": 'LEFTMOUSE', "value": 'PRESS'},
- {"properties": [("mode", 'NORMAL')]}),
- ("sculpt.uv_sculpt_stroke", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True},
- {"properties": [("mode", 'INVERT')]}),
- ("sculpt.uv_sculpt_stroke", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True},
- {"properties": [("mode", 'RELAX')]}),
- ("brush.scale_size", {"type": 'LEFT_BRACKET', "value": 'PRESS'},
- {"properties": [("scalar", 0.9)]}),
- ("brush.scale_size", {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
- {"properties": [("scalar", 1.0 / 0.9)]}),
- *_template_paint_radial_control("uv_sculpt"),
- ("brush.uv_sculpt_tool_set", {"type": 'S', "value": 'PRESS'},
- {"properties": [("tool", 'RELAX')]}),
- ("brush.uv_sculpt_tool_set", {"type": 'P', "value": 'PRESS'},
- {"properties": [("tool", 'PINCH')]}),
- ("brush.uv_sculpt_tool_set", {"type": 'G', "value": 'PRESS'},
- {"properties": [("tool", 'GRAB')]}),
- ])
-
- return keymap
-
-
# 3D View: all regions.
def km_view3d_generic(_params):
items = []
@@ -5277,6 +5242,25 @@ def km_image_editor_tool_uv_select_lasso(params):
)
+def km_image_editor_tool_uv_sculpt_stroke(params):
+ return (
+ "Image Editor Tool: Uv, Sculpt Stroke",
+ {"space_type": 'IMAGE_EDITOR', "region_type": 'WINDOW'},
+ {"items": [
+ ("sculpt.uv_sculpt_stroke", {"type": params.tool_mouse, "value": 'PRESS'}, None),
+ ("sculpt.uv_sculpt_stroke", {"type": params.tool_mouse, "value": 'PRESS', "ctrl": True},
+ {"properties": [("mode", 'INVERT')]}),
+ ("sculpt.uv_sculpt_stroke", {"type": params.tool_mouse, "value": 'PRESS', "shift": True},
+ {"properties": [("mode", 'RELAX')]}),
+ ("brush.scale_size", {"type": 'LEFT_BRACKET', "value": 'PRESS'},
+ {"properties": [("scalar", 0.9)]}),
+ ("brush.scale_size", {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
+ {"properties": [("scalar", 1.0 / 0.9)]}),
+ *_template_paint_radial_control("uv_sculpt"),
+ ]},
+ )
+
+
def km_node_editor_tool_select(params):
return (
"Node Tool: Select",
@@ -6117,7 +6101,6 @@ def generate_keymaps(params=None):
# Editors.
km_outliner(params),
km_uv_editor(params),
- km_uv_sculpt(params),
km_view3d_generic(params),
km_view3d(params),
km_mask_editing(params),
@@ -6245,6 +6228,7 @@ def generate_keymaps(params=None):
km_image_editor_tool_uv_select_box(params),
km_image_editor_tool_uv_select_circle(params),
km_image_editor_tool_uv_select_lasso(params),
+ km_image_editor_tool_uv_sculpt_stroke(params),
km_node_editor_tool_select(params),
km_node_editor_tool_select_box(params),
km_node_editor_tool_select_lasso(params),
diff --git a/release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py b/release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py
index 0ea229ad12e..2e67c631efc 100644
--- a/release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py
+++ b/release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py
@@ -546,38 +546,6 @@ def km_uv_editor(params):
return keymap
-def km_uv_sculpt(params):
- items = []
- keymap = (
- "UV Sculpt",
- {"space_type": 'EMPTY', "region_type": 'WINDOW'},
- {"items": items},
- )
-
- items.extend([
- ("wm.context_toggle", {"type": 'Q', "value": 'PRESS'},
- {"properties": [("data_path", 'tool_settings.use_uv_sculpt')]}),
- ("sculpt.uv_sculpt_stroke", {"type": 'LEFTMOUSE', "value": 'PRESS'},
- {"properties": [("mode", 'NORMAL')]}),
- ("sculpt.uv_sculpt_stroke", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True},
- {"properties": [("mode", 'INVERT')]}),
- ("sculpt.uv_sculpt_stroke", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True},
- {"properties": [("mode", 'RELAX')]}),
- ("brush.scale_size", {"type": 'LEFT_BRACKET', "value": 'PRESS'},
- {"properties": [("scalar", 0.9)]}),
- ("brush.scale_size", {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
- {"properties": [("scalar", 1.0 / 0.9)]}),
- *_template_paint_radial_control("uv_sculpt"),
- ("brush.uv_sculpt_tool_set", {"type": 'S', "value": 'PRESS'},
- {"properties": [("tool", 'RELAX')]}),
- ("brush.uv_sculpt_tool_set", {"type": 'P', "value": 'PRESS'},
- {"properties": [("tool", 'PINCH')]}),
- ("brush.uv_sculpt_tool_set", {"type": 'G', "value": 'PRESS'},
- {"properties": [("tool", 'GRAB')]}),
- ])
-
- return keymap
-
# 3D View: all regions.
def km_view3d_generic(_params):
items = []
@@ -3582,7 +3550,6 @@ def generate_keymaps(params=None):
# Editors.
km_outliner(params),
km_uv_editor(params),
- km_uv_sculpt(params),
km_view3d_generic(params),
km_view3d(params),
km_mask_editing(params),
diff --git a/release/scripts/startup/bl_ui/space_image.py b/release/scripts/startup/bl_ui/space_image.py
index 466ba40b688..b27895fa04b 100644
--- a/release/scripts/startup/bl_ui/space_image.py
+++ b/release/scripts/startup/bl_ui/space_image.py
@@ -364,10 +364,6 @@ class IMAGE_MT_uvs(Menu):
layout.separator()
- layout.prop(tool_settings, "use_uv_sculpt")
-
- layout.separator()
-
layout.prop(uv, "use_live_unwrap")
layout.operator("uv.unwrap")
@@ -555,8 +551,9 @@ class IMAGE_HT_tool_header(Header):
if tool_mode == 'PAINT':
if (tool is not None) and tool.has_datablock:
layout.popover_group(space_type='IMAGE_EDITOR', region_type='UI', context=".paint_common_2d", category="")
- elif context.uv_sculpt_object is not None:
- layout.popover_group(space_type='IMAGE_EDITOR', region_type='UI', context=".uv_sculpt", category="")
+ elif tool_mode == 'UV':
+ if (tool is not None) and tool.has_datablock:
+ layout.popover_group(space_type='IMAGE_EDITOR', region_type='UI', context=".uv_sculpt", category="")
def draw_mode_settings(self, context):
layout = self.layout
@@ -573,10 +570,10 @@ class IMAGE_HT_tool_header(Header):
class _draw_tool_settings_context_mode:
@staticmethod
- def VIEW(context, layout, _tool):
- tool_settings = context.tool_settings
- if tool_settings.use_uv_sculpt:
+ def UV(context, layout, tool):
+ if tool and tool.has_datablock:
if context.mode == 'EDIT_MESH':
+ tool_settings = context.tool_settings
uv_sculpt = tool_settings.uv_sculpt
brush = uv_sculpt.brush
if brush:
@@ -1378,54 +1375,33 @@ class IMAGE_PT_tools_imagepaint_symmetry(BrushButtonsPanel, Panel):
row.prop(ipaint, "tile_y", text="Y", toggle=True)
-class IMAGE_PT_uv_sculpt_curve(Panel):
+class IMAGE_PT_uv_sculpt_brush(Panel):
bl_space_type = 'IMAGE_EDITOR'
bl_region_type = 'UI'
bl_context = ".uv_sculpt" # dot on purpose (access from topbar)
bl_category = "Tool"
- bl_label = "UV Sculpt Curve"
- bl_options = {'DEFAULT_CLOSED'}
+ bl_label = "Brush"
@classmethod
def poll(cls, context):
- return (context.uv_sculpt_object is not None)
+ sima = context.space_data
+ # TODO(campbell): nicer way to check if we're in uv sculpt mode.
+ if sima and sima.show_uvedit:
+ from .space_toolsystem_common import ToolSelectPanelHelper
+ tool = ToolSelectPanelHelper.tool_active_from_context(context)
+ if tool.has_datablock:
+ return True
+ return False
def draw(self, context):
+ from .properties_paint_common import UnifiedPaintPanel
layout = self.layout
tool_settings = context.tool_settings
uvsculpt = tool_settings.uv_sculpt
- brush = uvsculpt.brush
-
- if brush is not None:
- layout.template_curve_mapping(brush, "curve")
- row = layout.row(align=True)
- row.operator("brush.curve_preset", icon='SMOOTHCURVE', text="").shape = 'SMOOTH'
- row.operator("brush.curve_preset", icon='SPHERECURVE', text="").shape = 'ROUND'
- row.operator("brush.curve_preset", icon='ROOTCURVE', text="").shape = 'ROOT'
- row.operator("brush.curve_preset", icon='SHARPCURVE', text="").shape = 'SHARP'
- row.operator("brush.curve_preset", icon='LINCURVE', text="").shape = 'LINE'
- row.operator("brush.curve_preset", icon='NOCURVE', text="").shape = 'MAX'
-
-
-class IMAGE_PT_uv_sculpt(Panel):
- bl_space_type = 'IMAGE_EDITOR'
- bl_region_type = 'UI'
- bl_context = ".uv_sculpt" # dot on purpose (access from topbar)
- bl_category = "Tool"
- bl_label = "UV Sculpt"
-
- @classmethod
- def poll(cls, context):
- return (context.uv_sculpt_object is not None)
-
- def draw(self, context):
- from .properties_paint_common import UnifiedPaintPanel
- layout = self.layout
+ layout.template_ID(uvsculpt, "brush")
- tool_settings = context.tool_settings
- uvsculpt = tool_settings.uv_sculpt
brush = uvsculpt.brush
if not self.is_popover:
@@ -1444,13 +1420,43 @@ class IMAGE_PT_uv_sculpt(Panel):
col.prop(tool_settings, "uv_sculpt_lock_borders")
col.prop(tool_settings, "uv_sculpt_all_islands")
- col.prop(tool_settings, "uv_sculpt_tool")
- if tool_settings.uv_sculpt_tool == 'RELAX':
- col.prop(tool_settings, "uv_relax_method")
+ if brush:
+ if brush.uv_sculpt_tool == 'RELAX':
+ col.prop(tool_settings, "uv_relax_method")
col.prop(uvsculpt, "show_brush")
+class IMAGE_PT_uv_sculpt_curve(Panel):
+ bl_space_type = 'IMAGE_EDITOR'
+ bl_region_type = 'UI'
+ bl_context = ".uv_sculpt" # dot on purpose (access from topbar)
+ bl_category = "Tool"
+ bl_label = "Falloff"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ poll = IMAGE_PT_uv_sculpt_brush.poll
+
+ def draw(self, context):
+ layout = self.layout
+
+ tool_settings = context.tool_settings
+ uvsculpt = tool_settings.uv_sculpt
+ brush = uvsculpt.brush
+
+ if brush is not None:
+ layout.template_curve_mapping(brush, "curve")
+
+ row = layout.row(align=True)
+ row.operator("brush.curve_preset", icon='SMOOTHCURVE', text="").shape = 'SMOOTH'
+ row.operator("brush.curve_preset", icon='SPHERECURVE', text="").shape = 'ROUND'
+ row.operator("brush.curve_preset", icon='ROOTCURVE', text="").shape = 'ROOT'
+ row.operator("brush.curve_preset", icon='SHARPCURVE', text="").shape = 'SHARP'
+ row.operator("brush.curve_preset", icon='LINCURVE', text="").shape = 'LINE'
+ row.operator("brush.curve_preset", icon='NOCURVE', text="").shape = 'MAX'
+
+
+
class ImageScopesPanel:
@classmethod
def poll(cls, context):
@@ -1646,7 +1652,7 @@ classes = (
IMAGE_PT_tools_brush_display_show_brush,
IMAGE_PT_tools_brush_display_custom_icon,
IMAGE_PT_tools_imagepaint_symmetry,
- IMAGE_PT_uv_sculpt,
+ IMAGE_PT_uv_sculpt_brush,
IMAGE_PT_uv_sculpt_curve,
IMAGE_PT_view_histogram,
IMAGE_PT_view_waveform,
diff --git a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
index edde8f54d6e..dee2fa3c5f8 100644
--- a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
@@ -1171,12 +1171,33 @@ class _defs_image_uv_sculpt:
@staticmethod
def generate_from_brushes(context):
+ def draw_cursor(context, _tool, xy):
+ from gpu_extras.presets import draw_circle_2d
+ tool_settings = context.tool_settings
+ uv_sculpt = tool_settings.uv_sculpt
+ if not uv_sculpt.show_brush:
+ return
+ ups = tool_settings.unified_paint_settings
+ if ups.use_unified_size:
+ radius = ups.size
+ else:
+ brush = tool_settings.uv_sculpt.brush
+ if brush is None:
+ return
+ radius = brush.size
+ draw_circle_2d(xy, (1.0,) * 4, radius, 32)
+
return generate_from_enum_ex(
context,
idname_prefix="builtin_brush.",
icon_prefix="brush.uv_sculpt.",
- type=bpy.types.ToolSettings,
+ type=bpy.types.Brush,
attr="uv_sculpt_tool",
+ tooldef_keywords=dict(
+ operator="sculpt.uv_sculpt_stroke",
+ keymap="Image Editor Tool: Uv, Sculpt Stroke",
+ draw_cursor=draw_cursor,
+ ),
)
diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index 519217bf61c..461f6575d5d 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -2651,6 +2651,7 @@ class VIEW3D_MT_brush_paint_modes(Menu):
brush = settings.brush
layout.prop(brush, "use_paint_sculpt", text="Sculpt")
+ layout.prop(brush, "use_paint_uv_sculpt", text="UV Sculpt")
layout.prop(brush, "use_paint_vertex", text="Vertex Paint")
layout.prop(brush, "use_paint_weight", text="Weight Paint")
layout.prop(brush, "use_paint_image", text="Texture Paint")