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
6 changed files with 37 additions and 14 deletions
Showing only changes of commit d5d2916670 - Show all commits

View File

@ -17,6 +17,9 @@ def register():
# Add addon asset library # Add addon asset library
utils.register_asset_lib() utils.register_asset_lib()
# Get available brush styles
#utils.refresh_brushstroke_styles(bpy.context)
def unregister(): def unregister():
# un-register modules # un-register modules
for m in reversed(modules): for m in reversed(modules):

View File

@ -4,6 +4,18 @@ import os
def update_resource_path(self, context): def update_resource_path(self, context):
utils.update_asset_lib_path() utils.update_asset_lib_path()
class BSBST_OT_refresh_brushstroke_styles(bpy.types.Operator):
"""
"""
bl_idname = "brushstroke_tools.refresh_styles"
bl_label = "Refresh Brushstroke Styles"
bl_description = "Refresh available brushstroke styles from library."
bl_options = {"REGISTER", "UNDO"}
def execute(self, context):
utils.refresh_brushstroke_styles(context)
return {"FINISHED"}
class BSBST_OT_copy_resources_to_path(bpy.types.Operator): class BSBST_OT_copy_resources_to_path(bpy.types.Operator):
""" """
Copy Resources to Directory. Copy Resources to Directory.
@ -33,6 +45,10 @@ class BSBST_OT_copy_resources_to_path(bpy.types.Operator):
layout.label(text='This will overwrite files in the target directory!', icon='ERROR') layout.label(text='This will overwrite files in the target directory!', icon='ERROR')
layout.label(text=utils.get_resource_directory()) layout.label(text=utils.get_resource_directory())
class BSBST_brush_style(bpy.types.PropertyGroup):
name: bpy.props.StringProperty(default='')
file_path: bpy.props.StringProperty(default='')
class BSBST_preferences(bpy.types.AddonPreferences): class BSBST_preferences(bpy.types.AddonPreferences):
bl_idname = __package__ bl_idname = __package__
@ -42,6 +58,7 @@ class BSBST_preferences(bpy.types.AddonPreferences):
items= [('APPEND', 'Append', 'Append data-blocks and pack image data as local to this file.', 'APPEND_BLEND', 0),\ items= [('APPEND', 'Append', 'Append data-blocks and pack image data as local to this file.', 'APPEND_BLEND', 0),\
('LINK', 'Link', 'Link data-blocks from resource directory.', 'LINK_BLEND', 1), ('LINK', 'Link', 'Link data-blocks from resource directory.', 'LINK_BLEND', 1),
]) ])
brush_styles: bpy.props.CollectionProperty(type=BSBST_brush_style)
def draw(self, context): def draw(self, context):
layout = self.layout layout = self.layout
@ -90,8 +107,10 @@ class BSBST_preferences(bpy.types.AddonPreferences):
classes = [ classes = [
BSBST_brush_style,
BSBST_preferences, BSBST_preferences,
BSBST_OT_copy_resources_to_path, BSBST_OT_copy_resources_to_path,
BSBST_OT_refresh_brushstroke_styles,
] ]
def register(): def register():

View File

@ -124,23 +124,13 @@ def set_active_context_brushstrokes_index(self, value):
def get_brush_style(self): def get_brush_style(self):
name = self.node_tree.nodes['Brush Style'].node_tree.name name = self.node_tree.nodes['Brush Style'].node_tree.name
return '.'.join(name.split('.')[1:]) return name
def set_brush_style(self, value): def set_brush_style(self, value):
ng = bpy.data.node_groups.get(f'BSBST-brushstroke.{value}') ng = bpy.data.node_groups.get(f'{value}')
self.node_tree.nodes['Brush Style'].node_tree = ng self.node_tree.nodes['Brush Style'].node_tree = ng
self["brush_style"] = value 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),\
@ -250,7 +240,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.types.Material.brush_style = bpy.props.StringProperty(get=get_brush_style, set=set_brush_style, search_options={'SORT'})
bpy.app.handlers.depsgraph_update_post.append(utils.find_context_brushstrokes) bpy.app.handlers.depsgraph_update_post.append(utils.find_context_brushstrokes)

View File

@ -125,6 +125,8 @@ 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, surface_object=None): def draw_material_settings(layout, material, surface_object=None):
addon_prefs = bpy.context.preferences.addons[__package__].preferences
layout.prop(material, 'diffuse_color', text='Viewport Color') layout.prop(material, 'diffuse_color', text='Viewport Color')
# draw color options # draw color options
try: try:
@ -202,7 +204,9 @@ def draw_material_settings(layout, material, surface_object=None):
brush_header, brush_panel = layout.panel('brush_panel', default_closed = True) brush_header, brush_panel = layout.panel('brush_panel', default_closed = True)
brush_header.label(text='Brush Style', icon='BRUSHES_ALL') brush_header.label(text='Brush Style', icon='BRUSHES_ALL')
if brush_panel: if brush_panel:
brush_panel.prop(material, 'brush_style', text='', icon='BRUSHES_ALL') row = brush_panel.row(align=True)
row.prop_search(material, 'brush_style', addon_prefs, 'brush_styles', text='', icon='BRUSHES_ALL')
row.operator('brushstroke_tools.refresh_styles', text='', icon='FILE_REFRESH')
brush_panel.template_node_inputs(n2) brush_panel.template_node_inputs(n2)
except: except:
pass pass

View File

@ -294,6 +294,13 @@ def update_asset_lib_path():
lib = asset_libs[asset_lib_name] lib = asset_libs[asset_lib_name]
lib.path = get_resource_directory() lib.path = get_resource_directory()
def refresh_brushstroke_styles(context):
addon_prefs = context.preferences.addons[__package__].preferences
for ng in bpy.data.node_groups:
if 'BSBST-brushstroke' in ng.keys():
b_style = addon_prefs.brush_styles.add()
b_style.name = ng.name
def transfer_modifier(modifier_name, target_obj, source_obj): def transfer_modifier(modifier_name, target_obj, source_obj):
""" """
Core taken from https://projects.blender.org/studio/blender-studio-pipeline Core taken from https://projects.blender.org/studio/blender-studio-pipeline