1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
from bpy.props import *
from .Utils.core import *
airbrush = 'AIRBRUSH'
anchored = 'ANCHORED'
space = 'SPACE'
drag_dot = 'DRAG_DOT'
dots = 'DOTS'
line = 'LINE'
curve = 'CURVE'
class StrokeOptionsMenu(bpy.types.Menu):
bl_label = "Stroke Options"
bl_idname = "VIEW3D_MT_sv3_stroke_options"
@classmethod
def poll(self, context):
if get_mode() in [sculpt, vertex_paint, weight_paint, texture_paint, particle_edit]:
return True
else:
return False
def init(self):
if get_mode() == sculpt:
settings = bpy.context.tool_settings.sculpt
brush = settings.brush
if bpy.app.version > (2, 71):
stroke_method = brush.stroke_method
else:
stroke_method = brush.sculpt_stroke_method
elif get_mode() == texture_paint:
settings = bpy.context.tool_settings.image_paint
brush = settings.brush
stroke_method = brush.stroke_method
else:
settings = bpy.context.tool_settings.vertex_paint
brush = settings.brush
stroke_method = brush.stroke_method
return settings, brush, stroke_method
def draw(self, context):
settings, brush, stroke_method = self.init()
menu = Menu(self)
menu.add_item().menu(StrokeMethodMenu.bl_idname)
menu.add_item().separator()
if stroke_method == space:
menu.add_item().prop(brush, "spacing", text=PIW+"Spacing", slider=True)
elif stroke_method == airbrush:
menu.add_item().prop(brush, "rate", text=PIW+"Rate", slider=True)
elif stroke_method == anchored:
menu.add_item().prop(brush, "use_edge_to_edge")
else:
pass
if get_mode() == sculpt and stroke_method in [drag_dot, anchored]:
pass
else:
menu.add_item().prop(brush, "jitter", text=PIW+"Jitter", slider=True)
menu.add_item().prop(settings, "input_samples", text=PIW+"Input Samples", slider=True)
if stroke_method in [dots, space, airbrush]:
menu.add_item().separator()
menu.add_item().prop(brush, "use_smooth_stroke", toggle=True)
if brush.use_smooth_stroke:
menu.add_item().prop(brush, "smooth_stroke_radius", text=PIW+"Radius", slider=True)
menu.add_item().prop(brush, "smooth_stroke_factor", text=PIW+"Factor", slider=True)
class StrokeMethodMenu(bpy.types.Menu):
bl_label = "Stroke Method"
bl_idname = "VIEW3D_MT_sv3_stroke_method"
def init(self):
if get_mode() == sculpt:
brush = bpy.context.tool_settings.sculpt.brush
path = "tool_settings.sculpt.brush.stroke_method"
elif get_mode() == texture_paint:
brush = bpy.context.tool_settings.image_paint.brush
path = "tool_settings.image_paint.brush.stroke_method"
else:
brush = bpy.context.tool_settings.vertex_paint.brush
path = "tool_settings.vertex_paint.brush.stroke_method"
return brush, path
def draw(self, context):
brush, path = self.init()
menu = Menu(self)
menu.add_item().label(text="Stroke Method")
menu.add_item().separator()
# add the menu items dynamicaly based on values in enum property
for tool in brush.bl_rna.properties['stroke_method'].enum_items:
if tool.identifier in [anchored, drag_dot] and get_mode() in [vertex_paint, weight_paint]:
continue
menuprop(menu.add_item(), tool.name, tool.identifier, path,
icon='RADIOBUT_OFF', disable=True,
disable_icon='RADIOBUT_ON')
|