forked from bartvdbraak/blender
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.
This commit is contained in:
parent
5fd69f6bd8
commit
928becec60
@ -1054,7 +1054,6 @@ context_type_map = {
|
|||||||
"texture_slot": ("MaterialTextureSlot", False),
|
"texture_slot": ("MaterialTextureSlot", False),
|
||||||
"texture_user": ("ID", False),
|
"texture_user": ("ID", False),
|
||||||
"texture_user_property": ("Property", False),
|
"texture_user_property": ("Property", False),
|
||||||
"uv_sculpt_object": ("Object", False),
|
|
||||||
"vertex_paint_object": ("Object", False),
|
"vertex_paint_object": ("Object", False),
|
||||||
"view_layer": ("ViewLayer", False),
|
"view_layer": ("ViewLayer", False),
|
||||||
"visible_bases": ("ObjectBase", True),
|
"visible_bases": ("ObjectBase", True),
|
||||||
|
@ -863,8 +863,6 @@ def km_uv_editor(params):
|
|||||||
("uv.minimize_stretch", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
|
("uv.minimize_stretch", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
|
||||||
("uv.pack_islands", {"type": 'P', "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),
|
("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:
|
if params.select_mouse == 'LEFTMOUSE' and not params.legacy:
|
||||||
@ -877,39 +875,6 @@ def km_uv_editor(params):
|
|||||||
return keymap
|
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.
|
# 3D View: all regions.
|
||||||
def km_view3d_generic(_params):
|
def km_view3d_generic(_params):
|
||||||
items = []
|
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):
|
def km_node_editor_tool_select(params):
|
||||||
return (
|
return (
|
||||||
"Node Tool: Select",
|
"Node Tool: Select",
|
||||||
@ -6117,7 +6101,6 @@ def generate_keymaps(params=None):
|
|||||||
# Editors.
|
# Editors.
|
||||||
km_outliner(params),
|
km_outliner(params),
|
||||||
km_uv_editor(params),
|
km_uv_editor(params),
|
||||||
km_uv_sculpt(params),
|
|
||||||
km_view3d_generic(params),
|
km_view3d_generic(params),
|
||||||
km_view3d(params),
|
km_view3d(params),
|
||||||
km_mask_editing(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_box(params),
|
||||||
km_image_editor_tool_uv_select_circle(params),
|
km_image_editor_tool_uv_select_circle(params),
|
||||||
km_image_editor_tool_uv_select_lasso(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(params),
|
||||||
km_node_editor_tool_select_box(params),
|
km_node_editor_tool_select_box(params),
|
||||||
km_node_editor_tool_select_lasso(params),
|
km_node_editor_tool_select_lasso(params),
|
||||||
|
@ -546,38 +546,6 @@ def km_uv_editor(params):
|
|||||||
return keymap
|
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.
|
# 3D View: all regions.
|
||||||
def km_view3d_generic(_params):
|
def km_view3d_generic(_params):
|
||||||
items = []
|
items = []
|
||||||
@ -3582,7 +3550,6 @@ def generate_keymaps(params=None):
|
|||||||
# Editors.
|
# Editors.
|
||||||
km_outliner(params),
|
km_outliner(params),
|
||||||
km_uv_editor(params),
|
km_uv_editor(params),
|
||||||
km_uv_sculpt(params),
|
|
||||||
km_view3d_generic(params),
|
km_view3d_generic(params),
|
||||||
km_view3d(params),
|
km_view3d(params),
|
||||||
km_mask_editing(params),
|
km_mask_editing(params),
|
||||||
|
@ -364,10 +364,6 @@ class IMAGE_MT_uvs(Menu):
|
|||||||
|
|
||||||
layout.separator()
|
layout.separator()
|
||||||
|
|
||||||
layout.prop(tool_settings, "use_uv_sculpt")
|
|
||||||
|
|
||||||
layout.separator()
|
|
||||||
|
|
||||||
layout.prop(uv, "use_live_unwrap")
|
layout.prop(uv, "use_live_unwrap")
|
||||||
layout.operator("uv.unwrap")
|
layout.operator("uv.unwrap")
|
||||||
|
|
||||||
@ -555,8 +551,9 @@ class IMAGE_HT_tool_header(Header):
|
|||||||
if tool_mode == 'PAINT':
|
if tool_mode == 'PAINT':
|
||||||
if (tool is not None) and tool.has_datablock:
|
if (tool is not None) and tool.has_datablock:
|
||||||
layout.popover_group(space_type='IMAGE_EDITOR', region_type='UI', context=".paint_common_2d", category="")
|
layout.popover_group(space_type='IMAGE_EDITOR', region_type='UI', context=".paint_common_2d", category="")
|
||||||
elif context.uv_sculpt_object is not None:
|
elif tool_mode == 'UV':
|
||||||
layout.popover_group(space_type='IMAGE_EDITOR', region_type='UI', context=".uv_sculpt", category="")
|
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):
|
def draw_mode_settings(self, context):
|
||||||
layout = self.layout
|
layout = self.layout
|
||||||
@ -573,10 +570,10 @@ class IMAGE_HT_tool_header(Header):
|
|||||||
|
|
||||||
class _draw_tool_settings_context_mode:
|
class _draw_tool_settings_context_mode:
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def VIEW(context, layout, _tool):
|
def UV(context, layout, tool):
|
||||||
tool_settings = context.tool_settings
|
if tool and tool.has_datablock:
|
||||||
if tool_settings.use_uv_sculpt:
|
|
||||||
if context.mode == 'EDIT_MESH':
|
if context.mode == 'EDIT_MESH':
|
||||||
|
tool_settings = context.tool_settings
|
||||||
uv_sculpt = tool_settings.uv_sculpt
|
uv_sculpt = tool_settings.uv_sculpt
|
||||||
brush = uv_sculpt.brush
|
brush = uv_sculpt.brush
|
||||||
if brush:
|
if brush:
|
||||||
@ -1378,17 +1375,67 @@ class IMAGE_PT_tools_imagepaint_symmetry(BrushButtonsPanel, Panel):
|
|||||||
row.prop(ipaint, "tile_y", text="Y", toggle=True)
|
row.prop(ipaint, "tile_y", text="Y", toggle=True)
|
||||||
|
|
||||||
|
|
||||||
|
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 = "Brush"
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def poll(cls, context):
|
||||||
|
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
|
||||||
|
|
||||||
|
layout.template_ID(uvsculpt, "brush")
|
||||||
|
|
||||||
|
brush = uvsculpt.brush
|
||||||
|
|
||||||
|
if not self.is_popover:
|
||||||
|
if brush:
|
||||||
|
col = layout.column()
|
||||||
|
|
||||||
|
row = col.row(align=True)
|
||||||
|
UnifiedPaintPanel.prop_unified_size(row, context, brush, "size", slider=True)
|
||||||
|
UnifiedPaintPanel.prop_unified_size(row, context, brush, "use_pressure_size", text="")
|
||||||
|
|
||||||
|
row = col.row(align=True)
|
||||||
|
UnifiedPaintPanel.prop_unified_strength(row, context, brush, "strength", slider=True)
|
||||||
|
UnifiedPaintPanel.prop_unified_strength(row, context, brush, "use_pressure_strength", text="")
|
||||||
|
|
||||||
|
col = layout.column()
|
||||||
|
col.prop(tool_settings, "uv_sculpt_lock_borders")
|
||||||
|
col.prop(tool_settings, "uv_sculpt_all_islands")
|
||||||
|
|
||||||
|
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):
|
class IMAGE_PT_uv_sculpt_curve(Panel):
|
||||||
bl_space_type = 'IMAGE_EDITOR'
|
bl_space_type = 'IMAGE_EDITOR'
|
||||||
bl_region_type = 'UI'
|
bl_region_type = 'UI'
|
||||||
bl_context = ".uv_sculpt" # dot on purpose (access from topbar)
|
bl_context = ".uv_sculpt" # dot on purpose (access from topbar)
|
||||||
bl_category = "Tool"
|
bl_category = "Tool"
|
||||||
bl_label = "UV Sculpt Curve"
|
bl_label = "Falloff"
|
||||||
bl_options = {'DEFAULT_CLOSED'}
|
bl_options = {'DEFAULT_CLOSED'}
|
||||||
|
|
||||||
@classmethod
|
poll = IMAGE_PT_uv_sculpt_brush.poll
|
||||||
def poll(cls, context):
|
|
||||||
return (context.uv_sculpt_object is not None)
|
|
||||||
|
|
||||||
def draw(self, context):
|
def draw(self, context):
|
||||||
layout = self.layout
|
layout = self.layout
|
||||||
@ -1409,47 +1456,6 @@ class IMAGE_PT_uv_sculpt_curve(Panel):
|
|||||||
row.operator("brush.curve_preset", icon='NOCURVE', text="").shape = 'MAX'
|
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
|
|
||||||
|
|
||||||
tool_settings = context.tool_settings
|
|
||||||
uvsculpt = tool_settings.uv_sculpt
|
|
||||||
brush = uvsculpt.brush
|
|
||||||
|
|
||||||
if not self.is_popover:
|
|
||||||
if brush:
|
|
||||||
col = layout.column()
|
|
||||||
|
|
||||||
row = col.row(align=True)
|
|
||||||
UnifiedPaintPanel.prop_unified_size(row, context, brush, "size", slider=True)
|
|
||||||
UnifiedPaintPanel.prop_unified_size(row, context, brush, "use_pressure_size", text="")
|
|
||||||
|
|
||||||
row = col.row(align=True)
|
|
||||||
UnifiedPaintPanel.prop_unified_strength(row, context, brush, "strength", slider=True)
|
|
||||||
UnifiedPaintPanel.prop_unified_strength(row, context, brush, "use_pressure_strength", text="")
|
|
||||||
|
|
||||||
col = layout.column()
|
|
||||||
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")
|
|
||||||
|
|
||||||
col.prop(uvsculpt, "show_brush")
|
|
||||||
|
|
||||||
|
|
||||||
class ImageScopesPanel:
|
class ImageScopesPanel:
|
||||||
@classmethod
|
@classmethod
|
||||||
@ -1646,7 +1652,7 @@ classes = (
|
|||||||
IMAGE_PT_tools_brush_display_show_brush,
|
IMAGE_PT_tools_brush_display_show_brush,
|
||||||
IMAGE_PT_tools_brush_display_custom_icon,
|
IMAGE_PT_tools_brush_display_custom_icon,
|
||||||
IMAGE_PT_tools_imagepaint_symmetry,
|
IMAGE_PT_tools_imagepaint_symmetry,
|
||||||
IMAGE_PT_uv_sculpt,
|
IMAGE_PT_uv_sculpt_brush,
|
||||||
IMAGE_PT_uv_sculpt_curve,
|
IMAGE_PT_uv_sculpt_curve,
|
||||||
IMAGE_PT_view_histogram,
|
IMAGE_PT_view_histogram,
|
||||||
IMAGE_PT_view_waveform,
|
IMAGE_PT_view_waveform,
|
||||||
|
@ -1171,12 +1171,33 @@ class _defs_image_uv_sculpt:
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def generate_from_brushes(context):
|
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(
|
return generate_from_enum_ex(
|
||||||
context,
|
context,
|
||||||
idname_prefix="builtin_brush.",
|
idname_prefix="builtin_brush.",
|
||||||
icon_prefix="brush.uv_sculpt.",
|
icon_prefix="brush.uv_sculpt.",
|
||||||
type=bpy.types.ToolSettings,
|
type=bpy.types.Brush,
|
||||||
attr="uv_sculpt_tool",
|
attr="uv_sculpt_tool",
|
||||||
|
tooldef_keywords=dict(
|
||||||
|
operator="sculpt.uv_sculpt_stroke",
|
||||||
|
keymap="Image Editor Tool: Uv, Sculpt Stroke",
|
||||||
|
draw_cursor=draw_cursor,
|
||||||
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -2651,6 +2651,7 @@ class VIEW3D_MT_brush_paint_modes(Menu):
|
|||||||
brush = settings.brush
|
brush = settings.brush
|
||||||
|
|
||||||
layout.prop(brush, "use_paint_sculpt", text="Sculpt")
|
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_vertex", text="Vertex Paint")
|
||||||
layout.prop(brush, "use_paint_weight", text="Weight Paint")
|
layout.prop(brush, "use_paint_weight", text="Weight Paint")
|
||||||
layout.prop(brush, "use_paint_image", text="Texture Paint")
|
layout.prop(brush, "use_paint_image", text="Texture Paint")
|
||||||
|
@ -145,6 +145,7 @@ void BKE_paint_runtime_init(const struct ToolSettings *ts, struct Paint *paint);
|
|||||||
void BKE_paint_cavity_curve_preset(struct Paint *p, int preset);
|
void BKE_paint_cavity_curve_preset(struct Paint *p, int preset);
|
||||||
|
|
||||||
eObjectMode BKE_paint_object_mode_from_paintmode(ePaintMode mode);
|
eObjectMode BKE_paint_object_mode_from_paintmode(ePaintMode mode);
|
||||||
|
bool BKE_paint_ensure_from_paintmode(struct Scene *sce, ePaintMode mode);
|
||||||
struct Paint *BKE_paint_get_active_from_paintmode(struct Scene *sce, ePaintMode mode);
|
struct Paint *BKE_paint_get_active_from_paintmode(struct Scene *sce, ePaintMode mode);
|
||||||
const struct EnumPropertyItem *BKE_paint_get_tool_enum_from_paintmode(ePaintMode mode);
|
const struct EnumPropertyItem *BKE_paint_get_tool_enum_from_paintmode(ePaintMode mode);
|
||||||
const char *BKE_paint_get_tool_prop_id_from_paintmode(ePaintMode mode);
|
const char *BKE_paint_get_tool_prop_id_from_paintmode(ePaintMode mode);
|
||||||
|
@ -140,6 +140,40 @@ void BKE_paint_reset_overlay_invalid(eOverlayControlFlags flag)
|
|||||||
overlay_flags &= ~(flag);
|
overlay_flags &= ~(flag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool BKE_paint_ensure_from_paintmode(Scene *sce, ePaintMode mode)
|
||||||
|
{
|
||||||
|
ToolSettings *ts = sce->toolsettings;
|
||||||
|
Paint **paint_ptr = NULL;
|
||||||
|
|
||||||
|
switch (mode) {
|
||||||
|
case PAINT_MODE_SCULPT:
|
||||||
|
paint_ptr = (Paint **)&ts->sculpt;
|
||||||
|
break;
|
||||||
|
case PAINT_MODE_VERTEX:
|
||||||
|
paint_ptr = (Paint **)&ts->vpaint;
|
||||||
|
break;
|
||||||
|
case PAINT_MODE_WEIGHT:
|
||||||
|
paint_ptr = (Paint **)&ts->wpaint;
|
||||||
|
break;
|
||||||
|
case PAINT_MODE_TEXTURE_2D:
|
||||||
|
case PAINT_MODE_TEXTURE_3D:
|
||||||
|
break;
|
||||||
|
case PAINT_MODE_SCULPT_UV:
|
||||||
|
paint_ptr = (Paint **)&ts->uvsculpt;
|
||||||
|
break;
|
||||||
|
case PAINT_MODE_GPENCIL:
|
||||||
|
paint_ptr = (Paint **)&ts->gp_paint;
|
||||||
|
break;
|
||||||
|
case PAINT_MODE_INVALID:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (paint_ptr && (*paint_ptr == NULL)) {
|
||||||
|
BKE_paint_ensure(ts, paint_ptr);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
Paint *BKE_paint_get_active_from_paintmode(Scene *sce, ePaintMode mode)
|
Paint *BKE_paint_get_active_from_paintmode(Scene *sce, ePaintMode mode)
|
||||||
{
|
{
|
||||||
if (sce) {
|
if (sce) {
|
||||||
@ -182,6 +216,7 @@ const EnumPropertyItem *BKE_paint_get_tool_enum_from_paintmode(ePaintMode mode)
|
|||||||
case PAINT_MODE_TEXTURE_3D:
|
case PAINT_MODE_TEXTURE_3D:
|
||||||
return rna_enum_brush_image_tool_items;
|
return rna_enum_brush_image_tool_items;
|
||||||
case PAINT_MODE_SCULPT_UV:
|
case PAINT_MODE_SCULPT_UV:
|
||||||
|
return rna_enum_brush_uv_sculpt_tool_items;
|
||||||
return NULL;
|
return NULL;
|
||||||
case PAINT_MODE_GPENCIL:
|
case PAINT_MODE_GPENCIL:
|
||||||
return rna_enum_brush_gpencil_types_items;
|
return rna_enum_brush_gpencil_types_items;
|
||||||
@ -203,6 +238,8 @@ const char *BKE_paint_get_tool_prop_id_from_paintmode(ePaintMode mode)
|
|||||||
case PAINT_MODE_TEXTURE_2D:
|
case PAINT_MODE_TEXTURE_2D:
|
||||||
case PAINT_MODE_TEXTURE_3D:
|
case PAINT_MODE_TEXTURE_3D:
|
||||||
return "image_tool";
|
return "image_tool";
|
||||||
|
case PAINT_MODE_SCULPT_UV:
|
||||||
|
return "uv_sculpt_tool";
|
||||||
case PAINT_MODE_GPENCIL:
|
case PAINT_MODE_GPENCIL:
|
||||||
return "gpencil_tool";
|
return "gpencil_tool";
|
||||||
default:
|
default:
|
||||||
@ -229,10 +266,7 @@ Paint *BKE_paint_get_active(Scene *sce, ViewLayer *view_layer)
|
|||||||
case OB_MODE_PAINT_GPENCIL:
|
case OB_MODE_PAINT_GPENCIL:
|
||||||
return &ts->gp_paint->paint;
|
return &ts->gp_paint->paint;
|
||||||
case OB_MODE_EDIT:
|
case OB_MODE_EDIT:
|
||||||
if (ts->use_uv_sculpt) {
|
return &ts->uvsculpt->paint;
|
||||||
return &ts->uvsculpt->paint;
|
|
||||||
}
|
|
||||||
return &ts->imapaint.paint;
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -264,7 +298,7 @@ Paint *BKE_paint_get_active_from_context(const bContext *C)
|
|||||||
if (sima->mode == SI_MODE_PAINT) {
|
if (sima->mode == SI_MODE_PAINT) {
|
||||||
return &ts->imapaint.paint;
|
return &ts->imapaint.paint;
|
||||||
}
|
}
|
||||||
else if (ts->use_uv_sculpt) {
|
else if (sima->mode == SI_MODE_UV) {
|
||||||
return &ts->uvsculpt->paint;
|
return &ts->uvsculpt->paint;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -287,7 +321,6 @@ ePaintMode BKE_paintmode_get_active_from_context(const bContext *C)
|
|||||||
SpaceImage *sima;
|
SpaceImage *sima;
|
||||||
|
|
||||||
if (sce && view_layer) {
|
if (sce && view_layer) {
|
||||||
ToolSettings *ts = sce->toolsettings;
|
|
||||||
Object *obact = NULL;
|
Object *obact = NULL;
|
||||||
|
|
||||||
if (view_layer->basact && view_layer->basact->object) {
|
if (view_layer->basact && view_layer->basact->object) {
|
||||||
@ -299,7 +332,7 @@ ePaintMode BKE_paintmode_get_active_from_context(const bContext *C)
|
|||||||
if (sima->mode == SI_MODE_PAINT) {
|
if (sima->mode == SI_MODE_PAINT) {
|
||||||
return PAINT_MODE_TEXTURE_2D;
|
return PAINT_MODE_TEXTURE_2D;
|
||||||
}
|
}
|
||||||
else if (ts->use_uv_sculpt) {
|
else if (sima->mode == SI_MODE_UV) {
|
||||||
return PAINT_MODE_SCULPT_UV;
|
return PAINT_MODE_SCULPT_UV;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -318,10 +351,7 @@ ePaintMode BKE_paintmode_get_active_from_context(const bContext *C)
|
|||||||
case OB_MODE_TEXTURE_PAINT:
|
case OB_MODE_TEXTURE_PAINT:
|
||||||
return PAINT_MODE_TEXTURE_3D;
|
return PAINT_MODE_TEXTURE_3D;
|
||||||
case OB_MODE_EDIT:
|
case OB_MODE_EDIT:
|
||||||
if (ts->use_uv_sculpt) {
|
return PAINT_MODE_SCULPT_UV;
|
||||||
return PAINT_MODE_SCULPT_UV;
|
|
||||||
}
|
|
||||||
return PAINT_MODE_TEXTURE_2D;
|
|
||||||
default:
|
default:
|
||||||
return PAINT_MODE_TEXTURE_2D;
|
return PAINT_MODE_TEXTURE_2D;
|
||||||
}
|
}
|
||||||
@ -355,6 +385,8 @@ ePaintMode BKE_paintmode_get_from_tool(const struct bToolRef *tref)
|
|||||||
switch (tref->mode) {
|
switch (tref->mode) {
|
||||||
case SI_MODE_PAINT:
|
case SI_MODE_PAINT:
|
||||||
return PAINT_MODE_TEXTURE_2D;
|
return PAINT_MODE_TEXTURE_2D;
|
||||||
|
case SI_MODE_UV:
|
||||||
|
return PAINT_MODE_SCULPT_UV;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -395,15 +427,14 @@ void BKE_paint_runtime_init(const ToolSettings *ts, Paint *paint)
|
|||||||
paint->runtime.tool_offset = offsetof(Brush, weightpaint_tool);
|
paint->runtime.tool_offset = offsetof(Brush, weightpaint_tool);
|
||||||
paint->runtime.ob_mode = OB_MODE_WEIGHT_PAINT;
|
paint->runtime.ob_mode = OB_MODE_WEIGHT_PAINT;
|
||||||
}
|
}
|
||||||
|
else if (paint == &ts->uvsculpt->paint) {
|
||||||
|
paint->runtime.tool_offset = offsetof(Brush, uv_sculpt_tool);
|
||||||
|
paint->runtime.ob_mode = OB_MODE_EDIT;
|
||||||
|
}
|
||||||
else if (paint == &ts->gp_paint->paint) {
|
else if (paint == &ts->gp_paint->paint) {
|
||||||
paint->runtime.tool_offset = offsetof(Brush, gpencil_tool);
|
paint->runtime.tool_offset = offsetof(Brush, gpencil_tool);
|
||||||
paint->runtime.ob_mode = OB_MODE_PAINT_GPENCIL;
|
paint->runtime.ob_mode = OB_MODE_PAINT_GPENCIL;
|
||||||
}
|
}
|
||||||
else if (paint == &ts->uvsculpt->paint) {
|
|
||||||
/* We don't use these yet. */
|
|
||||||
paint->runtime.tool_offset = 0;
|
|
||||||
paint->runtime.ob_mode = 0;
|
|
||||||
}
|
|
||||||
else {
|
else {
|
||||||
BLI_assert(0);
|
BLI_assert(0);
|
||||||
}
|
}
|
||||||
@ -421,9 +452,10 @@ uint BKE_paint_get_brush_tool_offset_from_paintmode(const ePaintMode mode)
|
|||||||
return offsetof(Brush, vertexpaint_tool);
|
return offsetof(Brush, vertexpaint_tool);
|
||||||
case PAINT_MODE_WEIGHT:
|
case PAINT_MODE_WEIGHT:
|
||||||
return offsetof(Brush, weightpaint_tool);
|
return offsetof(Brush, weightpaint_tool);
|
||||||
|
case PAINT_MODE_SCULPT_UV:
|
||||||
|
return offsetof(Brush, uv_sculpt_tool);
|
||||||
case PAINT_MODE_GPENCIL:
|
case PAINT_MODE_GPENCIL:
|
||||||
return offsetof(Brush, gpencil_tool);
|
return offsetof(Brush, gpencil_tool);
|
||||||
case PAINT_MODE_SCULPT_UV:
|
|
||||||
case PAINT_MODE_INVALID:
|
case PAINT_MODE_INVALID:
|
||||||
break; /* We don't use these yet. */
|
break; /* We don't use these yet. */
|
||||||
}
|
}
|
||||||
|
@ -70,6 +70,7 @@ void BKE_paint_toolslots_init_from_main(struct Main *bmain)
|
|||||||
paint_toolslots_init(bmain, &ts->sculpt->paint);
|
paint_toolslots_init(bmain, &ts->sculpt->paint);
|
||||||
paint_toolslots_init(bmain, &ts->vpaint->paint);
|
paint_toolslots_init(bmain, &ts->vpaint->paint);
|
||||||
paint_toolslots_init(bmain, &ts->wpaint->paint);
|
paint_toolslots_init(bmain, &ts->wpaint->paint);
|
||||||
|
paint_toolslots_init(bmain, &ts->uvsculpt->paint);
|
||||||
paint_toolslots_init(bmain, &ts->gp_paint->paint);
|
paint_toolslots_init(bmain, &ts->gp_paint->paint);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -387,6 +387,13 @@ void BLO_update_defaults_startup_blend(Main *bmain, const char *app_template)
|
|||||||
copy_v2_fl2(scene->safe_areas.action, 0.035f, 0.035f);
|
copy_v2_fl2(scene->safe_areas.action, 0.035f, 0.035f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (app_template == NULL) {
|
||||||
|
/* Enable for UV sculpt (other brush types will be created as needed),
|
||||||
|
* without this the grab brush will be active but not selectable from the list. */
|
||||||
|
Brush *brush = BLI_findstring(&bmain->brushes, "Grab", offsetof(ID, name) + 2);
|
||||||
|
brush->ob_mode |= OB_MODE_EDIT;
|
||||||
|
}
|
||||||
|
|
||||||
for (Brush *brush = bmain->brushes.first; brush; brush = brush->id.next) {
|
for (Brush *brush = bmain->brushes.first; brush; brush = brush->id.next) {
|
||||||
brush->blur_kernel_radius = 2;
|
brush->blur_kernel_radius = 2;
|
||||||
}
|
}
|
||||||
|
@ -71,9 +71,6 @@ void ED_space_image_scopes_update(const struct bContext *C,
|
|||||||
void ED_space_image_paint_update(struct Main *bmain,
|
void ED_space_image_paint_update(struct Main *bmain,
|
||||||
struct wmWindowManager *wm,
|
struct wmWindowManager *wm,
|
||||||
struct Scene *scene);
|
struct Scene *scene);
|
||||||
void ED_space_image_uv_sculpt_update(struct Main *bmain,
|
|
||||||
struct wmWindowManager *wm,
|
|
||||||
struct Scene *scene);
|
|
||||||
|
|
||||||
void ED_image_get_uv_aspect(struct Image *ima, struct ImageUser *iuser, float *aspx, float *aspy);
|
void ED_image_get_uv_aspect(struct Image *ima, struct ImageUser *iuser, float *aspx, float *aspy);
|
||||||
void ED_image_mouse_pos(struct SpaceImage *sima,
|
void ED_image_mouse_pos(struct SpaceImage *sima,
|
||||||
|
@ -178,7 +178,6 @@ void ED_uvedit_add_simple_uvs(struct Main *bmain, struct Scene *scene, struct Ob
|
|||||||
/* uvedit_draw.c */
|
/* uvedit_draw.c */
|
||||||
void ED_image_draw_cursor(struct ARegion *ar, const float cursor[2]);
|
void ED_image_draw_cursor(struct ARegion *ar, const float cursor[2]);
|
||||||
void ED_uvedit_draw_main(struct SpaceImage *sima,
|
void ED_uvedit_draw_main(struct SpaceImage *sima,
|
||||||
struct ARegion *ar,
|
|
||||||
struct Scene *scene,
|
struct Scene *scene,
|
||||||
struct ViewLayer *view_layer,
|
struct ViewLayer *view_layer,
|
||||||
struct Object *obedit,
|
struct Object *obedit,
|
||||||
|
@ -703,8 +703,6 @@ static int editmode_toggle_exec(bContext *C, wmOperator *op)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ED_space_image_uv_sculpt_update(bmain, CTX_wm_manager(C), scene);
|
|
||||||
|
|
||||||
WM_msg_publish_rna_prop(mbus, &obact->id, obact, Object, mode);
|
WM_msg_publish_rna_prop(mbus, &obact->id, obact, Object, mode);
|
||||||
|
|
||||||
if (G.background == false) {
|
if (G.background == false) {
|
||||||
|
@ -98,7 +98,6 @@ const char *screen_context_dir[] = {
|
|||||||
"weight_paint_object",
|
"weight_paint_object",
|
||||||
"image_paint_object",
|
"image_paint_object",
|
||||||
"particle_edit_object",
|
"particle_edit_object",
|
||||||
"uv_sculpt_object",
|
|
||||||
"pose_object",
|
"pose_object",
|
||||||
"sequences",
|
"sequences",
|
||||||
"selected_sequences",
|
"selected_sequences",
|
||||||
@ -520,22 +519,6 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
|
|||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
else if (CTX_data_equals(member, "uv_sculpt_object")) {
|
|
||||||
/* TODO(campbell): most likely we change rules for uv_sculpt. */
|
|
||||||
if (obact && (obact->mode & OB_MODE_EDIT)) {
|
|
||||||
const ToolSettings *ts = scene->toolsettings;
|
|
||||||
if (ts->use_uv_sculpt) {
|
|
||||||
if (ED_uvedit_test(obedit)) {
|
|
||||||
WorkSpace *workspace = CTX_wm_workspace(C);
|
|
||||||
if ((workspace->tools_space_type == SPACE_IMAGE) &&
|
|
||||||
(workspace->tools_mode == SI_MODE_UV)) {
|
|
||||||
CTX_data_id_pointer_set(result, &obact->id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
else if (CTX_data_equals(member, "pose_object")) {
|
else if (CTX_data_equals(member, "pose_object")) {
|
||||||
Object *obpose = BKE_object_pose_armature_get(obact);
|
Object *obpose = BKE_object_pose_armature_get(obact);
|
||||||
if (obpose) {
|
if (obpose) {
|
||||||
|
@ -279,9 +279,6 @@ struct ListBase *ED_image_undosys_step_get_tiles(struct UndoStep *us_p);
|
|||||||
struct ListBase *ED_image_undo_get_tiles(void);
|
struct ListBase *ED_image_undo_get_tiles(void);
|
||||||
|
|
||||||
/* sculpt_uv.c */
|
/* sculpt_uv.c */
|
||||||
bool uv_sculpt_poll(struct bContext *C);
|
|
||||||
bool uv_sculpt_keymap_poll(struct bContext *C);
|
|
||||||
|
|
||||||
void SCULPT_OT_uv_sculpt_stroke(struct wmOperatorType *ot);
|
void SCULPT_OT_uv_sculpt_stroke(struct wmOperatorType *ot);
|
||||||
|
|
||||||
/* paint_utils.c */
|
/* paint_utils.c */
|
||||||
|
@ -524,37 +524,6 @@ static void PAINT_OT_brush_select(wmOperatorType *ot)
|
|||||||
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int brush_uv_sculpt_tool_set_exec(bContext *C, wmOperator *op)
|
|
||||||
{
|
|
||||||
Brush *brush;
|
|
||||||
Scene *scene = CTX_data_scene(C);
|
|
||||||
ToolSettings *ts = scene->toolsettings;
|
|
||||||
ts->uv_sculpt_tool = RNA_enum_get(op->ptr, "tool");
|
|
||||||
brush = ts->uvsculpt->paint.brush;
|
|
||||||
/* To update toolshelf */
|
|
||||||
WM_event_add_notifier(C, NC_BRUSH | NA_EDITED, brush);
|
|
||||||
|
|
||||||
return OPERATOR_FINISHED;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void BRUSH_OT_uv_sculpt_tool_set(wmOperatorType *ot)
|
|
||||||
{
|
|
||||||
/* identifiers */
|
|
||||||
ot->name = "UV Sculpt Tool Set";
|
|
||||||
ot->description = "Set the UV sculpt tool";
|
|
||||||
ot->idname = "BRUSH_OT_uv_sculpt_tool_set";
|
|
||||||
|
|
||||||
/* api callbacks */
|
|
||||||
ot->exec = brush_uv_sculpt_tool_set_exec;
|
|
||||||
ot->poll = uv_sculpt_poll;
|
|
||||||
|
|
||||||
/* flags */
|
|
||||||
ot->flag = 0;
|
|
||||||
|
|
||||||
/* props */
|
|
||||||
ot->prop = RNA_def_enum(ot->srna, "tool", rna_enum_uv_sculpt_tool_items, 0, "Tool", "");
|
|
||||||
}
|
|
||||||
|
|
||||||
/***** Stencil Control *****/
|
/***** Stencil Control *****/
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@ -1014,7 +983,6 @@ void ED_operatortypes_paint(void)
|
|||||||
|
|
||||||
/* note, particle uses a different system, can be added with existing operators in wm.py */
|
/* note, particle uses a different system, can be added with existing operators in wm.py */
|
||||||
WM_operatortype_append(PAINT_OT_brush_select);
|
WM_operatortype_append(PAINT_OT_brush_select);
|
||||||
WM_operatortype_append(BRUSH_OT_uv_sculpt_tool_set);
|
|
||||||
|
|
||||||
/* image */
|
/* image */
|
||||||
WM_operatortype_append(PAINT_OT_texture_paint_toggle);
|
WM_operatortype_append(PAINT_OT_texture_paint_toggle);
|
||||||
@ -1101,9 +1069,6 @@ void ED_keymap_paint(wmKeyConfig *keyconf)
|
|||||||
keymap = WM_keymap_ensure(keyconf, "Face Mask", 0, 0);
|
keymap = WM_keymap_ensure(keyconf, "Face Mask", 0, 0);
|
||||||
keymap->poll = facemask_paint_poll;
|
keymap->poll = facemask_paint_poll;
|
||||||
|
|
||||||
keymap = WM_keymap_ensure(keyconf, "UV Sculpt", 0, 0);
|
|
||||||
keymap->poll = uv_sculpt_keymap_poll;
|
|
||||||
|
|
||||||
/* paint stroke */
|
/* paint stroke */
|
||||||
keymap = paint_stroke_modal_keymap(keyconf);
|
keymap = paint_stroke_modal_keymap(keyconf);
|
||||||
WM_modalkeymap_assign(keymap, "SCULPT_OT_brush_stroke");
|
WM_modalkeymap_assign(keymap, "SCULPT_OT_brush_stroke");
|
||||||
|
@ -139,121 +139,6 @@ typedef struct UvSculptData {
|
|||||||
char invert;
|
char invert;
|
||||||
} UvSculptData;
|
} UvSculptData;
|
||||||
|
|
||||||
static Brush *uv_sculpt_brush(bContext *C)
|
|
||||||
{
|
|
||||||
Scene *scene = CTX_data_scene(C);
|
|
||||||
ToolSettings *settings = scene->toolsettings;
|
|
||||||
|
|
||||||
if (!settings->uvsculpt) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return BKE_paint_brush(&settings->uvsculpt->paint);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool uv_sculpt_brush_poll_do(bContext *C, const bool check_region)
|
|
||||||
{
|
|
||||||
BMEditMesh *em;
|
|
||||||
int ret;
|
|
||||||
Object *obedit = CTX_data_edit_object(C);
|
|
||||||
SpaceImage *sima = CTX_wm_space_image(C);
|
|
||||||
Scene *scene = CTX_data_scene(C);
|
|
||||||
ToolSettings *toolsettings = scene->toolsettings;
|
|
||||||
|
|
||||||
if (!uv_sculpt_brush(C) || !obedit || obedit->type != OB_MESH || !sima ||
|
|
||||||
ED_space_image_show_render(sima) || (sima->mode == SI_MODE_PAINT)) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
em = BKE_editmesh_from_object(obedit);
|
|
||||||
ret = EDBM_uv_check(em);
|
|
||||||
|
|
||||||
if (ret) {
|
|
||||||
ARegion *ar = CTX_wm_region(C);
|
|
||||||
if ((!toolsettings->use_uv_sculpt) ||
|
|
||||||
(check_region && ar && (ar->regiontype != RGN_TYPE_WINDOW))) {
|
|
||||||
ret = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool uv_sculpt_brush_poll(bContext *C)
|
|
||||||
{
|
|
||||||
return uv_sculpt_brush_poll_do(C, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void brush_drawcursor_uvsculpt(bContext *C, int x, int y, void *UNUSED(customdata))
|
|
||||||
{
|
|
||||||
#define PX_SIZE_FADE_MAX 12.0f
|
|
||||||
#define PX_SIZE_FADE_MIN 4.0f
|
|
||||||
|
|
||||||
Scene *scene = CTX_data_scene(C);
|
|
||||||
// Brush *brush = image_paint_brush(C);
|
|
||||||
Paint *paint = BKE_paint_get_active_from_context(C);
|
|
||||||
Brush *brush = BKE_paint_brush(paint);
|
|
||||||
|
|
||||||
if (paint && brush && paint->flags & PAINT_SHOW_BRUSH) {
|
|
||||||
const float size = (float)BKE_brush_size_get(scene, brush);
|
|
||||||
float alpha = 0.5f;
|
|
||||||
|
|
||||||
/* fade out the brush (cheap trick to work around brush interfering with sampling [#])*/
|
|
||||||
if (size < PX_SIZE_FADE_MIN) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else if (size < PX_SIZE_FADE_MAX) {
|
|
||||||
alpha *= (size - PX_SIZE_FADE_MIN) / (PX_SIZE_FADE_MAX - PX_SIZE_FADE_MIN);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint pos = GPU_vertformat_attr_add(immVertexFormat(), "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
|
|
||||||
immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
|
|
||||||
immUniformColor3fvAlpha(brush->add_col, alpha);
|
|
||||||
|
|
||||||
GPU_line_smooth(true);
|
|
||||||
GPU_blend(true);
|
|
||||||
imm_draw_circle_wire_2d(pos, (float)x, (float)y, size, 40);
|
|
||||||
GPU_blend(false);
|
|
||||||
GPU_line_smooth(false);
|
|
||||||
|
|
||||||
immUnbindProgram();
|
|
||||||
}
|
|
||||||
#undef PX_SIZE_FADE_MAX
|
|
||||||
#undef PX_SIZE_FADE_MIN
|
|
||||||
}
|
|
||||||
|
|
||||||
void ED_space_image_uv_sculpt_update(Main *bmain, wmWindowManager *wm, Scene *scene)
|
|
||||||
{
|
|
||||||
ToolSettings *settings = scene->toolsettings;
|
|
||||||
if (settings->use_uv_sculpt) {
|
|
||||||
if (settings->uvsculpt == NULL) {
|
|
||||||
settings->uv_sculpt_tool = UV_SCULPT_TOOL_GRAB;
|
|
||||||
settings->uv_sculpt_settings = UV_SCULPT_LOCK_BORDERS | UV_SCULPT_ALL_ISLANDS;
|
|
||||||
settings->uv_relax_method = UV_SCULPT_TOOL_RELAX_LAPLACIAN;
|
|
||||||
}
|
|
||||||
BKE_paint_ensure(settings, (Paint **)&settings->uvsculpt);
|
|
||||||
BKE_paint_init(bmain, scene, PAINT_MODE_SCULPT_UV, PAINT_CURSOR_SCULPT);
|
|
||||||
|
|
||||||
settings->uvsculpt->paint.paint_cursor = WM_paint_cursor_activate(
|
|
||||||
wm, SPACE_IMAGE, RGN_TYPE_WINDOW, uv_sculpt_brush_poll, brush_drawcursor_uvsculpt, NULL);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (settings->uvsculpt) {
|
|
||||||
WM_paint_cursor_end(wm, settings->uvsculpt->paint.paint_cursor);
|
|
||||||
settings->uvsculpt->paint.paint_cursor = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool uv_sculpt_poll(bContext *C)
|
|
||||||
{
|
|
||||||
return uv_sculpt_brush_poll_do(C, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool uv_sculpt_keymap_poll(bContext *C)
|
|
||||||
{
|
|
||||||
return uv_sculpt_brush_poll_do(C, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*********** Improved Laplacian Relaxation Operator ************************/
|
/*********** Improved Laplacian Relaxation Operator ************************/
|
||||||
/* original code by Raul Fernandez Hernandez "farsthary" *
|
/* original code by Raul Fernandez Hernandez "farsthary" *
|
||||||
* adapted to uv smoothing by Antony Riakiatakis *
|
* adapted to uv smoothing by Antony Riakiatakis *
|
||||||
@ -631,8 +516,9 @@ static UvSculptData *uv_sculpt_stroke_init(bContext *C, wmOperator *op, const wm
|
|||||||
int island_index = 0;
|
int island_index = 0;
|
||||||
/* Holds, for each UvElement in elementMap, a pointer to its unique uv.*/
|
/* Holds, for each UvElement in elementMap, a pointer to its unique uv.*/
|
||||||
int *uniqueUv;
|
int *uniqueUv;
|
||||||
data->tool = (RNA_enum_get(op->ptr, "mode") == BRUSH_STROKE_SMOOTH) ? UV_SCULPT_TOOL_RELAX :
|
data->tool = (RNA_enum_get(op->ptr, "mode") == BRUSH_STROKE_SMOOTH) ?
|
||||||
ts->uv_sculpt_tool;
|
UV_SCULPT_TOOL_RELAX :
|
||||||
|
ts->uvsculpt->paint.brush->uv_sculpt_tool;
|
||||||
data->invert = (RNA_enum_get(op->ptr, "mode") == BRUSH_STROKE_INVERT) ? 1 : 0;
|
data->invert = (RNA_enum_get(op->ptr, "mode") == BRUSH_STROKE_INVERT) ? 1 : 0;
|
||||||
|
|
||||||
data->uvsculpt = &ts->uvsculpt->paint;
|
data->uvsculpt = &ts->uvsculpt->paint;
|
||||||
@ -951,7 +837,7 @@ void SCULPT_OT_uv_sculpt_stroke(wmOperatorType *ot)
|
|||||||
/* api callbacks */
|
/* api callbacks */
|
||||||
ot->invoke = uv_sculpt_stroke_invoke;
|
ot->invoke = uv_sculpt_stroke_invoke;
|
||||||
ot->modal = uv_sculpt_stroke_modal;
|
ot->modal = uv_sculpt_stroke_modal;
|
||||||
ot->poll = uv_sculpt_poll;
|
ot->poll = ED_operator_uvedit_space_image;
|
||||||
|
|
||||||
/* flags */
|
/* flags */
|
||||||
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
|
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
|
||||||
|
@ -552,9 +552,6 @@ static void image_main_region_init(wmWindowManager *wm, ARegion *ar)
|
|||||||
keymap = WM_keymap_ensure(wm->defaultconf, "UV Editor", 0, 0);
|
keymap = WM_keymap_ensure(wm->defaultconf, "UV Editor", 0, 0);
|
||||||
WM_event_add_keymap_handler(&ar->handlers, keymap);
|
WM_event_add_keymap_handler(&ar->handlers, keymap);
|
||||||
|
|
||||||
keymap = WM_keymap_ensure(wm->defaultconf, "UV Sculpt", 0, 0);
|
|
||||||
WM_event_add_keymap_handler(&ar->handlers, keymap);
|
|
||||||
|
|
||||||
/* own keymaps */
|
/* own keymaps */
|
||||||
keymap = WM_keymap_ensure(wm->defaultconf, "Image Generic", SPACE_IMAGE, 0);
|
keymap = WM_keymap_ensure(wm->defaultconf, "Image Generic", SPACE_IMAGE, 0);
|
||||||
WM_event_add_keymap_handler(&ar->handlers, keymap);
|
WM_event_add_keymap_handler(&ar->handlers, keymap);
|
||||||
@ -608,7 +605,7 @@ static void image_main_region_draw(const bContext *C, ARegion *ar)
|
|||||||
|
|
||||||
ED_region_draw_cb_draw(C, ar, REGION_DRAW_PRE_VIEW);
|
ED_region_draw_cb_draw(C, ar, REGION_DRAW_PRE_VIEW);
|
||||||
|
|
||||||
ED_uvedit_draw_main(sima, ar, scene, view_layer, obedit, obact, depsgraph);
|
ED_uvedit_draw_main(sima, scene, view_layer, obedit, obact, depsgraph);
|
||||||
|
|
||||||
/* check for mask (delay draw) */
|
/* check for mask (delay draw) */
|
||||||
if (ED_space_image_show_uvedit(sima, obedit)) {
|
if (ED_space_image_show_uvedit(sima, obedit)) {
|
||||||
|
@ -479,14 +479,12 @@ static void draw_uv_shadows_get(
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ED_uvedit_draw_main(SpaceImage *sima,
|
void ED_uvedit_draw_main(SpaceImage *sima,
|
||||||
ARegion *ar,
|
|
||||||
Scene *scene,
|
Scene *scene,
|
||||||
ViewLayer *view_layer,
|
ViewLayer *view_layer,
|
||||||
Object *obedit,
|
Object *obedit,
|
||||||
Object *obact,
|
Object *obact,
|
||||||
Depsgraph *depsgraph)
|
Depsgraph *depsgraph)
|
||||||
{
|
{
|
||||||
ToolSettings *toolsettings = scene->toolsettings;
|
|
||||||
bool show_uvedit, show_uvshadow, show_texpaint_uvshadow;
|
bool show_uvedit, show_uvshadow, show_texpaint_uvshadow;
|
||||||
|
|
||||||
show_uvedit = ED_space_image_show_uvedit(sima, obedit);
|
show_uvedit = ED_space_image_show_uvedit(sima, obedit);
|
||||||
@ -509,9 +507,5 @@ void ED_uvedit_draw_main(SpaceImage *sima,
|
|||||||
else {
|
else {
|
||||||
draw_uvs_texpaint(scene, obact, depsgraph);
|
draw_uvs_texpaint(scene, obact, depsgraph);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (show_uvedit && !(toolsettings->use_uv_sculpt)) {
|
|
||||||
ED_image_draw_cursor(ar, sima->cursor);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -128,15 +128,6 @@ bool ED_uvedit_test(Object *obedit)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool ED_operator_uvedit_can_uv_sculpt(struct bContext *C)
|
|
||||||
{
|
|
||||||
SpaceImage *sima = CTX_wm_space_image(C);
|
|
||||||
ToolSettings *toolsettings = CTX_data_tool_settings(C);
|
|
||||||
Object *obedit = CTX_data_edit_object(C);
|
|
||||||
|
|
||||||
return ED_space_image_show_uvedit(sima, obedit) && !(toolsettings->use_uv_sculpt);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int UNUSED_FUNCTION(ED_operator_uvmap_mesh)(bContext *C)
|
static int UNUSED_FUNCTION(ED_operator_uvmap_mesh)(bContext *C)
|
||||||
{
|
{
|
||||||
Object *ob = CTX_data_active_object(C);
|
Object *ob = CTX_data_active_object(C);
|
||||||
@ -5013,7 +5004,7 @@ void ED_keymap_uvedit(wmKeyConfig *keyconf)
|
|||||||
wmKeyMap *keymap;
|
wmKeyMap *keymap;
|
||||||
|
|
||||||
keymap = WM_keymap_ensure(keyconf, "UV Editor", 0, 0);
|
keymap = WM_keymap_ensure(keyconf, "UV Editor", 0, 0);
|
||||||
keymap->poll = ED_operator_uvedit_can_uv_sculpt;
|
keymap->poll = ED_operator_uvedit;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** \} */
|
/** \} */
|
||||||
|
@ -263,6 +263,8 @@ typedef struct Brush {
|
|||||||
|
|
||||||
/** Active sculpt tool. */
|
/** Active sculpt tool. */
|
||||||
char sculpt_tool;
|
char sculpt_tool;
|
||||||
|
/** Active sculpt tool. */
|
||||||
|
char uv_sculpt_tool;
|
||||||
/** Active vertex paint. */
|
/** Active vertex paint. */
|
||||||
char vertexpaint_tool;
|
char vertexpaint_tool;
|
||||||
/** Active weight paint. */
|
/** Active weight paint. */
|
||||||
@ -273,7 +275,7 @@ typedef struct Brush {
|
|||||||
char mask_tool;
|
char mask_tool;
|
||||||
/** Active grease pencil tool. */
|
/** Active grease pencil tool. */
|
||||||
char gpencil_tool;
|
char gpencil_tool;
|
||||||
char _pad0[2];
|
char _pad0[1];
|
||||||
|
|
||||||
float autosmooth_factor;
|
float autosmooth_factor;
|
||||||
|
|
||||||
@ -437,6 +439,13 @@ typedef enum eBrushSculptTool {
|
|||||||
SCULPT_TOOL_MASK = 19,
|
SCULPT_TOOL_MASK = 19,
|
||||||
} eBrushSculptTool;
|
} eBrushSculptTool;
|
||||||
|
|
||||||
|
/* Brush.uv_sculpt_tool */
|
||||||
|
typedef enum eBrushUVSculptTool {
|
||||||
|
UV_SCULPT_TOOL_GRAB = 0,
|
||||||
|
UV_SCULPT_TOOL_RELAX = 1,
|
||||||
|
UV_SCULPT_TOOL_PINCH = 2,
|
||||||
|
} eBrushUVSculptTool;
|
||||||
|
|
||||||
/** When #BRUSH_ACCUMULATE is used */
|
/** When #BRUSH_ACCUMULATE is used */
|
||||||
#define SCULPT_TOOL_HAS_ACCUMULATE(t) \
|
#define SCULPT_TOOL_HAS_ACCUMULATE(t) \
|
||||||
ELEM(t, \
|
ELEM(t, \
|
||||||
|
@ -803,11 +803,6 @@ typedef struct RenderProfile {
|
|||||||
#define UV_SCULPT_LOCK_BORDERS 1
|
#define UV_SCULPT_LOCK_BORDERS 1
|
||||||
#define UV_SCULPT_ALL_ISLANDS 2
|
#define UV_SCULPT_ALL_ISLANDS 2
|
||||||
|
|
||||||
/* ToolSettings.uv_sculpt_tool */
|
|
||||||
#define UV_SCULPT_TOOL_PINCH 1
|
|
||||||
#define UV_SCULPT_TOOL_RELAX 2
|
|
||||||
#define UV_SCULPT_TOOL_GRAB 3
|
|
||||||
|
|
||||||
/* ToolSettings.uv_relax_method */
|
/* ToolSettings.uv_relax_method */
|
||||||
#define UV_SCULPT_TOOL_RELAX_LAPLACIAN 1
|
#define UV_SCULPT_TOOL_RELAX_LAPLACIAN 1
|
||||||
#define UV_SCULPT_TOOL_RELAX_HC 2
|
#define UV_SCULPT_TOOL_RELAX_HC 2
|
||||||
@ -1488,10 +1483,8 @@ typedef struct ToolSettings {
|
|||||||
char vgroupsubset;
|
char vgroupsubset;
|
||||||
|
|
||||||
/* UV painting */
|
/* UV painting */
|
||||||
char _pad2[1];
|
char _pad2[3];
|
||||||
char use_uv_sculpt;
|
|
||||||
char uv_sculpt_settings;
|
char uv_sculpt_settings;
|
||||||
char uv_sculpt_tool;
|
|
||||||
char uv_relax_method;
|
char uv_relax_method;
|
||||||
/* XXX: these sculpt_paint_* fields are deprecated, use the
|
/* XXX: these sculpt_paint_* fields are deprecated, use the
|
||||||
* unified_paint_settings field instead! */
|
* unified_paint_settings field instead! */
|
||||||
|
@ -114,6 +114,7 @@ extern const EnumPropertyItem rna_enum_operator_return_items[];
|
|||||||
extern const EnumPropertyItem rna_enum_operator_property_tags[];
|
extern const EnumPropertyItem rna_enum_operator_property_tags[];
|
||||||
|
|
||||||
extern const EnumPropertyItem rna_enum_brush_sculpt_tool_items[];
|
extern const EnumPropertyItem rna_enum_brush_sculpt_tool_items[];
|
||||||
|
extern const EnumPropertyItem rna_enum_brush_uv_sculpt_tool_items[];
|
||||||
extern const EnumPropertyItem rna_enum_brush_vertex_tool_items[];
|
extern const EnumPropertyItem rna_enum_brush_vertex_tool_items[];
|
||||||
extern const EnumPropertyItem rna_enum_brush_weight_tool_items[];
|
extern const EnumPropertyItem rna_enum_brush_weight_tool_items[];
|
||||||
extern const EnumPropertyItem rna_enum_brush_gpencil_types_items[];
|
extern const EnumPropertyItem rna_enum_brush_gpencil_types_items[];
|
||||||
|
@ -94,6 +94,13 @@ const EnumPropertyItem rna_enum_brush_sculpt_tool_items[] = {
|
|||||||
{0, NULL, 0, NULL, NULL},
|
{0, NULL, 0, NULL, NULL},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const EnumPropertyItem rna_enum_brush_uv_sculpt_tool_items[] = {
|
||||||
|
{UV_SCULPT_TOOL_GRAB, "GRAB", 0, "Grab", "Grab UVs"},
|
||||||
|
{UV_SCULPT_TOOL_RELAX, "RELAX", 0, "Relax", "Relax UVs"},
|
||||||
|
{UV_SCULPT_TOOL_PINCH, "PINCH", 0, "Pinch", "Pinch UVs"},
|
||||||
|
{0, NULL, 0, NULL, NULL},
|
||||||
|
};
|
||||||
|
|
||||||
const EnumPropertyItem rna_enum_brush_vertex_tool_items[] = {
|
const EnumPropertyItem rna_enum_brush_vertex_tool_items[] = {
|
||||||
{VPAINT_TOOL_DRAW, "DRAW", ICON_BRUSH_MIX, "Draw", ""},
|
{VPAINT_TOOL_DRAW, "DRAW", ICON_BRUSH_MIX, "Draw", ""},
|
||||||
{VPAINT_TOOL_BLUR, "BLUR", ICON_BRUSH_BLUR, "Blur", ""},
|
{VPAINT_TOOL_BLUR, "BLUR", ICON_BRUSH_BLUR, "Blur", ""},
|
||||||
@ -1575,6 +1582,11 @@ static void rna_def_brush(BlenderRNA *brna)
|
|||||||
RNA_def_property_ui_text(prop, "Sculpt Tool", "");
|
RNA_def_property_ui_text(prop, "Sculpt Tool", "");
|
||||||
RNA_def_property_update(prop, 0, "rna_Brush_update_and_reset_icon");
|
RNA_def_property_update(prop, 0, "rna_Brush_update_and_reset_icon");
|
||||||
|
|
||||||
|
prop = RNA_def_property(srna, "uv_sculpt_tool", PROP_ENUM, PROP_NONE);
|
||||||
|
RNA_def_property_enum_items(prop, rna_enum_brush_uv_sculpt_tool_items);
|
||||||
|
RNA_def_property_ui_text(prop, "Sculpt Tool", "");
|
||||||
|
RNA_def_property_update(prop, 0, "rna_Brush_update_and_reset_icon");
|
||||||
|
|
||||||
prop = RNA_def_property(srna, "vertex_tool", PROP_ENUM, PROP_NONE);
|
prop = RNA_def_property(srna, "vertex_tool", PROP_ENUM, PROP_NONE);
|
||||||
RNA_def_property_enum_sdna(prop, NULL, "vertexpaint_tool");
|
RNA_def_property_enum_sdna(prop, NULL, "vertexpaint_tool");
|
||||||
RNA_def_property_enum_items(prop, rna_enum_brush_vertex_tool_items);
|
RNA_def_property_enum_items(prop, rna_enum_brush_vertex_tool_items);
|
||||||
@ -2105,6 +2117,10 @@ static void rna_def_brush(BlenderRNA *brna)
|
|||||||
RNA_def_property_boolean_sdna(prop, NULL, "ob_mode", OB_MODE_SCULPT);
|
RNA_def_property_boolean_sdna(prop, NULL, "ob_mode", OB_MODE_SCULPT);
|
||||||
RNA_def_property_ui_text(prop, "Use Sculpt", "Use this brush in sculpt mode");
|
RNA_def_property_ui_text(prop, "Use Sculpt", "Use this brush in sculpt mode");
|
||||||
|
|
||||||
|
prop = RNA_def_property(srna, "use_paint_uv_sculpt", PROP_BOOLEAN, PROP_NONE);
|
||||||
|
RNA_def_property_boolean_sdna(prop, NULL, "ob_mode", OB_MODE_EDIT);
|
||||||
|
RNA_def_property_ui_text(prop, "Use UV Sculpt", "Use this brush in UV sculpt mode");
|
||||||
|
|
||||||
prop = RNA_def_property(srna, "use_paint_vertex", PROP_BOOLEAN, PROP_NONE);
|
prop = RNA_def_property(srna, "use_paint_vertex", PROP_BOOLEAN, PROP_NONE);
|
||||||
RNA_def_property_boolean_sdna(prop, NULL, "ob_mode", OB_MODE_VERTEX_PAINT);
|
RNA_def_property_boolean_sdna(prop, NULL, "ob_mode", OB_MODE_VERTEX_PAINT);
|
||||||
RNA_def_property_ui_text(prop, "Use Vertex", "Use this brush in vertex paint mode");
|
RNA_def_property_ui_text(prop, "Use Vertex", "Use this brush in vertex paint mode");
|
||||||
|
@ -106,13 +106,6 @@ static const EnumPropertyItem uv_sculpt_relaxation_items[] = {
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const EnumPropertyItem rna_enum_uv_sculpt_tool_items[] = {
|
|
||||||
{UV_SCULPT_TOOL_PINCH, "PINCH", 0, "Pinch", "Pinch UVs"},
|
|
||||||
{UV_SCULPT_TOOL_RELAX, "RELAX", 0, "Relax", "Relax UVs"},
|
|
||||||
{UV_SCULPT_TOOL_GRAB, "GRAB", 0, "Grab", "Grab UVs"},
|
|
||||||
{0, NULL, 0, NULL, NULL},
|
|
||||||
};
|
|
||||||
|
|
||||||
const EnumPropertyItem rna_enum_snap_target_items[] = {
|
const EnumPropertyItem rna_enum_snap_target_items[] = {
|
||||||
{SCE_SNAP_TARGET_CLOSEST, "CLOSEST", 0, "Closest", "Snap closest point onto target"},
|
{SCE_SNAP_TARGET_CLOSEST, "CLOSEST", 0, "Closest", "Snap closest point onto target"},
|
||||||
{SCE_SNAP_TARGET_CENTER, "CENTER", 0, "Center", "Snap transformation center onto target"},
|
{SCE_SNAP_TARGET_CENTER, "CENTER", 0, "Center", "Snap transformation center onto target"},
|
||||||
@ -708,13 +701,6 @@ static void rna_GPencilInterpolateSettings_type_set(PointerRNA *ptr, int value)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rna_SpaceImageEditor_uv_sculpt_update(Main *bmain,
|
|
||||||
Scene *scene,
|
|
||||||
PointerRNA *UNUSED(ptr))
|
|
||||||
{
|
|
||||||
ED_space_image_uv_sculpt_update(bmain, bmain->wm.first, scene);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Read-only Iterator of all the scene objects. */
|
/* Read-only Iterator of all the scene objects. */
|
||||||
|
|
||||||
static void rna_Scene_objects_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
|
static void rna_Scene_objects_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
|
||||||
@ -2751,13 +2737,6 @@ static void rna_def_tool_settings(BlenderRNA *brna)
|
|||||||
RNA_def_property_pointer_sdna(prop, NULL, "particle");
|
RNA_def_property_pointer_sdna(prop, NULL, "particle");
|
||||||
RNA_def_property_ui_text(prop, "Particle Edit", "");
|
RNA_def_property_ui_text(prop, "Particle Edit", "");
|
||||||
|
|
||||||
prop = RNA_def_property(srna, "use_uv_sculpt", PROP_BOOLEAN, PROP_NONE);
|
|
||||||
RNA_def_property_boolean_sdna(prop, NULL, "use_uv_sculpt", 1);
|
|
||||||
RNA_def_property_ui_text(prop, "UV Sculpt", "Enable brush for UV sculpting");
|
|
||||||
RNA_def_property_ui_icon(prop, ICON_TPAINT_HLT, 0);
|
|
||||||
RNA_def_property_update(
|
|
||||||
prop, NC_SPACE | ND_SPACE_IMAGE, "rna_SpaceImageEditor_uv_sculpt_update");
|
|
||||||
|
|
||||||
prop = RNA_def_property(srna, "uv_sculpt_lock_borders", PROP_BOOLEAN, PROP_NONE);
|
prop = RNA_def_property(srna, "uv_sculpt_lock_borders", PROP_BOOLEAN, PROP_NONE);
|
||||||
RNA_def_property_boolean_sdna(prop, NULL, "uv_sculpt_settings", UV_SCULPT_LOCK_BORDERS);
|
RNA_def_property_boolean_sdna(prop, NULL, "uv_sculpt_settings", UV_SCULPT_LOCK_BORDERS);
|
||||||
RNA_def_property_ui_text(prop, "Lock Borders", "Disable editing of boundary edges");
|
RNA_def_property_ui_text(prop, "Lock Borders", "Disable editing of boundary edges");
|
||||||
@ -2766,11 +2745,6 @@ static void rna_def_tool_settings(BlenderRNA *brna)
|
|||||||
RNA_def_property_boolean_sdna(prop, NULL, "uv_sculpt_settings", UV_SCULPT_ALL_ISLANDS);
|
RNA_def_property_boolean_sdna(prop, NULL, "uv_sculpt_settings", UV_SCULPT_ALL_ISLANDS);
|
||||||
RNA_def_property_ui_text(prop, "Sculpt All Islands", "Brush operates on all islands");
|
RNA_def_property_ui_text(prop, "Sculpt All Islands", "Brush operates on all islands");
|
||||||
|
|
||||||
prop = RNA_def_property(srna, "uv_sculpt_tool", PROP_ENUM, PROP_NONE);
|
|
||||||
RNA_def_property_enum_sdna(prop, NULL, "uv_sculpt_tool");
|
|
||||||
RNA_def_property_enum_items(prop, rna_enum_uv_sculpt_tool_items);
|
|
||||||
RNA_def_property_ui_text(prop, "UV Sculpt Tools", "Select Tools for the UV sculpt brushes");
|
|
||||||
|
|
||||||
prop = RNA_def_property(srna, "uv_relax_method", PROP_ENUM, PROP_NONE);
|
prop = RNA_def_property(srna, "uv_relax_method", PROP_ENUM, PROP_NONE);
|
||||||
RNA_def_property_enum_sdna(prop, NULL, "uv_relax_method");
|
RNA_def_property_enum_sdna(prop, NULL, "uv_relax_method");
|
||||||
RNA_def_property_enum_items(prop, uv_sculpt_relaxation_items);
|
RNA_def_property_enum_items(prop, uv_sculpt_relaxation_items);
|
||||||
|
@ -365,6 +365,12 @@ static bool rna_Brush_mode_with_tool_poll(PointerRNA *ptr, PointerRNA value)
|
|||||||
}
|
}
|
||||||
mode = OB_MODE_SCULPT;
|
mode = OB_MODE_SCULPT;
|
||||||
}
|
}
|
||||||
|
else if (paint_contains_brush_slot(&ts->uvsculpt->paint, tslot, &slot_index)) {
|
||||||
|
if (slot_index != brush->uv_sculpt_tool) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
mode = OB_MODE_EDIT;
|
||||||
|
}
|
||||||
else if (paint_contains_brush_slot(&ts->vpaint->paint, tslot, &slot_index)) {
|
else if (paint_contains_brush_slot(&ts->vpaint->paint, tslot, &slot_index)) {
|
||||||
if (slot_index != brush->vertexpaint_tool) {
|
if (slot_index != brush->vertexpaint_tool) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -295,9 +295,6 @@ wmKeyMap *WM_keymap_guess_opname(const bContext *C, const char *opname)
|
|||||||
case CTX_MODE_SCULPT:
|
case CTX_MODE_SCULPT:
|
||||||
km = WM_keymap_find_all(C, "Sculpt", 0, 0);
|
km = WM_keymap_find_all(C, "Sculpt", 0, 0);
|
||||||
break;
|
break;
|
||||||
case CTX_MODE_EDIT_MESH:
|
|
||||||
km = WM_keymap_find_all(C, "UV Sculpt", 0, 0);
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -169,14 +169,6 @@ 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);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \see #toolsystem_ref_link
|
* \see #toolsystem_ref_link
|
||||||
*/
|
*/
|
||||||
@ -244,29 +236,6 @@ static void toolsystem_ref_link(bContext *C, WorkSpace *workspace, bToolRef *tre
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ((tref->space_type == SPACE_IMAGE) && (tref->mode == SI_MODE_UV)) {
|
|
||||||
/* 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 {
|
else {
|
||||||
const ePaintMode paint_mode = BKE_paintmode_get_from_tool(tref);
|
const ePaintMode paint_mode = BKE_paintmode_get_from_tool(tref);
|
||||||
BLI_assert(paint_mode != PAINT_MODE_INVALID);
|
BLI_assert(paint_mode != PAINT_MODE_INVALID);
|
||||||
@ -280,6 +249,7 @@ static void toolsystem_ref_link(bContext *C, WorkSpace *workspace, bToolRef *tre
|
|||||||
for (wmWindow *win = wm->windows.first; win; win = win->next) {
|
for (wmWindow *win = wm->windows.first; win; win = win->next) {
|
||||||
if (workspace == WM_window_get_active_workspace(win)) {
|
if (workspace == WM_window_get_active_workspace(win)) {
|
||||||
Scene *scene = WM_window_get_active_scene(win);
|
Scene *scene = WM_window_get_active_scene(win);
|
||||||
|
BKE_paint_ensure_from_paintmode(scene, paint_mode);
|
||||||
Paint *paint = BKE_paint_get_active_from_paintmode(scene, paint_mode);
|
Paint *paint = BKE_paint_get_active_from_paintmode(scene, paint_mode);
|
||||||
struct Brush *brush = BKE_paint_toolslots_brush_get(paint, slot_index);
|
struct Brush *brush = BKE_paint_toolslots_brush_get(paint, slot_index);
|
||||||
if (brush == NULL) {
|
if (brush == NULL) {
|
||||||
@ -300,23 +270,6 @@ 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_UV)) {
|
|
||||||
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)
|
static void toolsystem_refresh_ref(bContext *C, WorkSpace *workspace, bToolRef *tref)
|
||||||
@ -489,17 +442,6 @@ void WM_toolsystem_ref_sync_from_context(Main *bmain, WorkSpace *workspace, bToo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ((tref->space_type == SPACE_IMAGE) && (tref->mode == SI_MODE_UV)) {
|
|
||||||
if (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);
|
|
||||||
SNPRINTF(tref->idname, "builtin_brush.%s", item->name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
else {
|
||||||
const ePaintMode paint_mode = BKE_paintmode_get_from_tool(tref);
|
const ePaintMode paint_mode = BKE_paintmode_get_from_tool(tref);
|
||||||
Paint *paint = BKE_paint_get_active_from_paintmode(scene, paint_mode);
|
Paint *paint = BKE_paint_get_active_from_paintmode(scene, paint_mode);
|
||||||
|
Loading…
Reference in New Issue
Block a user