Brushstroke Tools: Initial Version #328

Merged
Simon Thommes merged 229 commits from SimonThommes/blender-studio-tools:brushstroke_tools-initial-version into main 2024-11-06 15:03:47 +01:00
3 changed files with 32 additions and 1 deletions
Showing only changes of commit 1a09a1df63 - Show all commits

View File

@ -166,6 +166,25 @@ def set_active_context_brushstrokes_index(self, value):
if 'BSBST_material' in bs_ob.keys(): if 'BSBST_material' in bs_ob.keys():
settings.context_material = bs_ob['BSBST_material'] settings.context_material = bs_ob['BSBST_material']
def get_brush_style(self):
name = self.node_tree.nodes['Brush Style'].node_tree.name
return '.'.join(name.split('.')[1:])
def set_brush_style(self, value):
ng = bpy.data.node_groups.get(f'BSBST-brushstroke.{value}')
self.node_tree.nodes['Brush Style'].node_tree = ng
self["brush_style"] = value
def get_brush_style_items(self, context, edit_text):
items = []
for ng in bpy.data.node_groups:
if not ng.type == 'SHADER':
continue
if not ng.name.startswith('BSBST-brushstroke.'):
continue
items += [('.'.join(ng.name.split('.')[1:]), ng.name)]
return items
def link_context_type_items(self, context): def link_context_type_items(self, context):
items = [ items = [
('SURFACE_OBJECT', 'Surface Object', 'Link socket preset to context surface object', 'OUTLINER_OB_SURFACE', 1),\ ('SURFACE_OBJECT', 'Surface Object', 'Link socket preset to context surface object', 'OUTLINER_OB_SURFACE', 1),\
@ -218,7 +237,7 @@ class BSBST_Settings(bpy.types.PropertyGroup):
('BRUSHSTROKES', 'Brushstrokes', 'Specify the style of the currently active brushstrokes', 'BRUSH_DATA', 1), ('BRUSHSTROKES', 'Brushstrokes', 'Specify the style of the currently active brushstrokes', 'BRUSH_DATA', 1),
('AUTO', 'Auto', 'Specify the style of either the active brushstrokes or the preset depending on the context', 'AUTO', 2), ('AUTO', 'Auto', 'Specify the style of either the active brushstrokes or the preset depending on the context', 'AUTO', 2),
]) ])
try: try:
gpv3 = bpy.context.preferences.experimental.use_grease_pencil_version3 gpv3 = bpy.context.preferences.experimental.use_grease_pencil_version3
except: except:
@ -263,6 +282,7 @@ def register():
bpy.utils.register_class(c) bpy.utils.register_class(c)
bpy.types.Scene.BSBST_settings = bpy.props.PointerProperty(type=BSBST_Settings) bpy.types.Scene.BSBST_settings = bpy.props.PointerProperty(type=BSBST_Settings)
bpy.types.Object.modifier_info = bpy.props.CollectionProperty(type=BSBST_modifier_info) bpy.types.Object.modifier_info = bpy.props.CollectionProperty(type=BSBST_modifier_info)
bpy.types.Material.brush_style = bpy.props.StringProperty(get=get_brush_style, set=set_brush_style, search=get_brush_style_items, search_options={'SORT'})
bpy.app.handlers.depsgraph_update_post.append(find_context_brushstrokes) bpy.app.handlers.depsgraph_update_post.append(find_context_brushstrokes)

View File

@ -125,12 +125,23 @@ def draw_panel_ui_recursive(panel, panel_name, mod, items, display_mode, hide_pa
col.prop(s, 'hide_ui', icon_only=True, icon='UNPINNED' if s.hide_ui else 'PINNED', emboss=False) col.prop(s, 'hide_ui', icon_only=True, icon='UNPINNED' if s.hide_ui else 'PINNED', emboss=False)
def draw_material_settings(layout, material): def draw_material_settings(layout, material):
settings = bpy.context.scene.BSBST_settings
layout.prop(material.node_tree.nodes['Opacity'].outputs[0], 'default_value', text='Opacity') layout.prop(material.node_tree.nodes['Opacity'].outputs[0], 'default_value', text='Opacity')
layout.prop(material.node_tree.nodes['Use Strength'], 'mute', text='Use Brush Strength', invert_checkbox=True) layout.prop(material.node_tree.nodes['Use Strength'], 'mute', text='Use Brush Strength', invert_checkbox=True)
layout.prop(material.node_tree.nodes['Color Variation'].inputs[0], 'default_value', text='Color Variation') layout.prop(material.node_tree.nodes['Color Variation'].inputs[0], 'default_value', text='Color Variation')
layout.prop(material.node_tree.nodes['Principled BSDF'].inputs[1], 'default_value', text='Metallic') layout.prop(material.node_tree.nodes['Principled BSDF'].inputs[1], 'default_value', text='Metallic')
layout.prop(material.node_tree.nodes['Principled BSDF'].inputs[2], 'default_value', text='Roughness') layout.prop(material.node_tree.nodes['Principled BSDF'].inputs[2], 'default_value', text='Roughness')
layout.prop(material.node_tree.nodes['Bump'], 'mute', text='Bump', invert_checkbox=True)
layout.prop(material.node_tree.nodes['Bump'].inputs[0], 'default_value', text='Bump Strength')
brush_header, brush_panel = layout.panel('brush_panel', default_closed = True)
brush_header.label(text='Brush Style', icon='BRUSHES_ALL')
if brush_panel:
#brush_panel.prop_search(material.node_tree.nodes['Brush Style'], 'node_tree', settings, 'styles', icon='BRUSHES_ALL')
#brush_panel.template_node_inputs(material.node_tree.nodes['Brush Style'])
brush_panel.prop(material, 'brush_style')
brush_panel.template_node_inputs(material.node_tree.nodes['Brush Curve'])
effects_header, effects_panel = layout.panel('effects_panel', default_closed = True) effects_header, effects_panel = layout.panel('effects_panel', default_closed = True)
effects_header.label(text='Effects', icon='SHADERFX') effects_header.label(text='Effects', icon='SHADERFX')