From 493434cd33dbbea1defea48fe9e9b8f908cf88e1 Mon Sep 17 00:00:00 2001 From: chsh2 <110356534+chsh2@users.noreply.github.com> Date: Mon, 8 Jan 2024 22:01:04 -0800 Subject: [PATCH] WIP --- README.md | 30 ++++- __init__.py | 2 +- operators/__init__.py | 0 op_driver.py => operators/op_playback.py | 19 +-- .../op_shader_nodes.py | 121 ++++++++++++++---- res/assets.blend | Bin 493629 -> 530973 bytes utils.py | 58 --------- utils/asset.py | 25 ++++ utils/driver.py | 23 ++++ utils/node.py | 32 +++++ 10 files changed, 209 insertions(+), 101 deletions(-) create mode 100644 operators/__init__.py rename op_driver.py => operators/op_playback.py (92%) rename op_shader_nodes.py => operators/op_shader_nodes.py (78%) delete mode 100644 utils.py create mode 100644 utils/asset.py create mode 100644 utils/driver.py create mode 100644 utils/node.py diff --git a/README.md b/README.md index 1d525d0..aeed6a7 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,31 @@ # Texture VFX Control: Blender Add-on -WIP \ No newline at end of file +This Blender add-on provides with shader-based effects on image/sequence/movie textures. It enables users to perform video composition directly in the 3D space without using the compositor or the sequencer. + +The functionalities of this add-on include: + +- Texture Playback Control + - Setting the speed and loop mode of sequence/movie textures +- VFX Shaders + - Blur + - Chroma Key + - Outline + + +## Requirements + +Blender 3.3+ or Blender 4.0 + +## Installation + +WIP + +## Usage + +WIP + +### Playback Control Driver + +### VFX Shader Node Groups + +## Credits \ No newline at end of file diff --git a/__init__.py b/__init__.py index 96b923b..e0d9e7f 100644 --- a/__init__.py +++ b/__init__.py @@ -5,7 +5,7 @@ "description" : "Shader-based video playback control and composition VFXs", "blender" : (3, 3, 0), "version" : (0, 1, 0), - "location" : "Node Editor", + "location" : "View3D > Object > Quick Effects, or Shader Editor > Add", "warning" : "This addon is still in an early stage of development", "doc_url": "", "wiki_url": "", diff --git a/operators/__init__.py b/operators/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/op_driver.py b/operators/op_playback.py similarity index 92% rename from op_driver.py rename to operators/op_playback.py index 9261987..539de0c 100644 --- a/op_driver.py +++ b/operators/op_playback.py @@ -1,12 +1,6 @@ import bpy -from .utils import get_target_node - -def add_driver_variable(driver, id, data_path, name): - var = driver.variables.new() - var.name = name - var.type = 'SINGLE_PROP' - var.targets[0].id = id - var.targets[0].data_path = f'["{data_path}"]' +from ..utils.driver import add_driver_variable +from ..utils.node import get_target_node class AddTexturePlaybackDriverOperator(bpy.types.Operator): """Map the playback of a movie/sequence texture to a custom float property by adding a driver to the offset value""" @@ -114,13 +108,8 @@ def add_driver_to_node(node): add_driver_variable(playback_driver.driver, obj, datapath_start, 's') add_driver_variable(playback_driver.driver, obj, datapath_playhead, 'p') add_driver_variable(playback_driver.driver, obj, datapath_duration, 'd') - - scene_var = playback_driver.driver.variables.new() - scene_var.name = 't' - scene_var.type = 'SINGLE_PROP' - scene_var.targets[0].id_type = 'SCENE' - scene_var.targets[0].id = bpy.context.scene - scene_var.targets[0].data_path = 'frame_current' + add_driver_variable(playback_driver.driver, bpy.context.scene, 'frame_current', 't', + id_type='SCENE', custom_property=False) playback_driver.driver.expression = 'min(max(floor(p*d)+s-t, s-t), s+d-t-1)' diff --git a/op_shader_nodes.py b/operators/op_shader_nodes.py similarity index 78% rename from op_shader_nodes.py rename to operators/op_shader_nodes.py index d80db86..e5f237d 100644 --- a/op_shader_nodes.py +++ b/operators/op_shader_nodes.py @@ -1,16 +1,8 @@ import bpy -from .utils import append_node_group, get_target_node, copy_driver - -def add_node_group(node_tree, name, location=(0,0)) -> bpy.types.ShaderNodeGroup: - node = node_tree.nodes.new('ShaderNodeGroup') - node.node_tree = append_node_group(name) - node.location = location - return node - -def add_uv_input(node_tree, location=(0,0)) -> bpy.types.ShaderNodeUVMap: - node = node_tree.nodes.new('ShaderNodeUVMap') - node.location = location - return node +import math +from ..utils.asset import append_node_group +from ..utils.node import * +from ..utils.driver import copy_driver, add_driver_variable def get_fx_chain_info(tex_node, fx_types=['tfx_ChromaKey']): """ @@ -283,10 +275,10 @@ class OutlineOperator(bpy.types.Operator): default = (1.0,1.0,.0,1.0), min = 0.0, max = 1.0, size = 4, ) - outline_size: bpy.props.FloatVectorProperty( + outline_size: bpy.props.FloatProperty( name = "Size", - default = (0.5, 0.5), - min = 0, soft_max = 5, size = 2, step = 1 + default = 0.5, + min = 0, soft_max = 5, step = 1 ) outline_outer: bpy.props.BoolProperty( name = "Outer Contour", @@ -300,15 +292,45 @@ class OutlineOperator(bpy.types.Operator): name='Blur', default=0, min=0, max=0.1, step=1 ) - + directional: bpy.props.BoolProperty( + name='Directional', + default = False + ) + direction: bpy.props.EnumProperty( + name='Direction', + items=[('FIXED', 'Fixed Angle', ''), + ('REF', 'Following a Light', '')], + default='FIXED' + ) + angle: bpy.props.FloatProperty( + name='Angle', + default=0.25*math.pi, min=-2*math.pi, max=2*math.pi, + unit='ROTATION', + ) + light_name: bpy.props.StringProperty( + name='Source', + default='', + search=lambda self, context, edit_text: [obj.name for obj in context.scene.objects] + ) + def draw(self, context): layout = self.layout layout.prop(self, 'outline_color') layout.prop(self, 'outline_size') - layout.prop(self, 'outline_outer') - layout.prop(self, 'outline_inner') + row = layout.row() + row.prop(self, 'outline_outer') + row.prop(self, 'outline_inner') layout.prop(self, 'blur_strength') - + layout.prop(self, 'directional') + if self.directional: + layout.prop(self, 'direction') + if self.direction == 'FIXED': + layout.prop(self, 'angle') + else: + layout.label(text="Light Information:") + box = layout.box() + box.prop(self, 'light_name') + def invoke(self, context, event): return context.window_manager.invoke_props_dialog(self) @@ -323,7 +345,9 @@ def execute(self, context): if not tex_node: self.report({"WARNING"}, "Cannot find any eligible texture node to perform the operation.") return {'FINISHED'} - + if tex_node.extension == 'CLIP': + tex_node.extension = 'EXTEND' + # Duplicate nodes for edge detection node_chain, inside_links, output_color_links, output_alpha_links, \ output_color_socket, output_alpha_socket = get_fx_chain_info(tex_node) @@ -359,18 +383,63 @@ def execute(self, context): post_node = add_node_group(target_node_tree, 'tfx_OutlinePost', location=(node_chain[-1].location[0] + 200, node_chain[-1].location[1])) + post_node.inputs['Color'].default_value = self.outline_color + post_node.inputs['Inner'].default_value = float(self.outline_inner) + post_node.inputs['Outer'].default_value = float(self.outline_outer) + + # Set offset values considering different factors + ratio = tex_node.image.size[0] / tex_node.image.size[1] + converted_outline_size = [self.outline_size / 100.0, self.outline_size * ratio / 100.0] if ratio < 1 \ + else [self.outline_size / ratio / 100.0, self.outline_size / 100.0] + if self.directional and self.direction == 'FIXED': + pre_node.inputs['U_Offset'].default_value = converted_outline_size[0] * math.cos(self.angle) + pre_node.inputs['V_Offset'].default_value = converted_outline_size[1] * math.sin(self.angle) + else: + pre_node.inputs['U_Offset'].default_value = converted_outline_size[0] + pre_node.inputs['V_Offset'].default_value = converted_outline_size[1] + + # If use a light source, add extra node groups and drivers + if self.directional and self.direction == 'REF': + light_obj = context.scene.objects[self.light_name] if self.light_name in context.scene.objects else None + if light_obj: + light_node = add_node_group(target_node_tree, 'tfx_LightVector', + location=(pre_node.location[0] - 200, + pre_node.location[1] - 150)) + # Set light direction: currently only supports point light + target_node_tree.links.new(light_node.outputs['X'], pre_node.inputs['U_Offset']) + target_node_tree.links.new(light_node.outputs['Y'], pre_node.inputs['V_Offset']) + light_loc_drivers = light_node.inputs['Light'].driver_add('default_value') + for i,dr in enumerate(light_loc_drivers): + dr.driver.type = 'SCRIPTED' + add_driver_variable(dr.driver, light_obj, f'location[{i}]', 'var', custom_property=False) + dr.driver.expression = 'var' + # Set light strength + light_node.inputs['Scale'].default_value[0] = converted_outline_size[0] + light_node.inputs['Scale'].default_value[1] = converted_outline_size[1] + + # Set light color: disabled for now + if False and light_obj.type == 'LIGHT': + light_color_drivers = post_node.inputs['Color'].driver_add('default_value') + for i,dr in enumerate(light_color_drivers): + dr.driver.type = 'SCRIPTED' + if i < 3: + add_driver_variable(dr.driver, light_obj.data, f'color[{i}]', 'var', + id_type='LIGHT', custom_property=False) + dr.driver.expression = 'var' + else: + dr.driver.expression = '1.0' + + # Connect to the FX nodes target_node_tree.links.new(uv_socket, pre_node.inputs['UV']) for tag in ['U+', 'U-', 'V+', 'V-']: target_node_tree.links.new(pre_node.outputs[tag], offset_uv_inputs[tag]) target_node_tree.links.new(offset_alpha_outputs[tag], post_node.inputs[tag]) target_node_tree.links.new(output_color_socket, post_node.inputs['Image']) target_node_tree.links.new(output_alpha_socket, post_node.inputs['Alpha']) - pre_node.inputs['U_Offset'].default_value = self.outline_size[0] / 100.0 - pre_node.inputs['V_Offset'].default_value = self.outline_size[1] / 100.0 - post_node.inputs['Color'].default_value = self.outline_color - post_node.inputs['Inner'].default_value = float(self.outline_inner) - post_node.inputs['Outer'].default_value = float(self.outline_outer) - + if self.directional: + target_node_tree.links.new(output_alpha_socket, post_node.inputs['U-']) + target_node_tree.links.new(output_alpha_socket, post_node.inputs['V-']) + # Reconnect output sockets for link in output_color_links: target_node_tree.links.new(post_node.outputs['Image'], link.to_socket) diff --git a/res/assets.blend b/res/assets.blend index 44d8a49eaf49b5bd56da56a69f6f447390f83225..cde68e2717cdcc38924856bb7734c398871f4b2a 100644 GIT binary patch delta 95049 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 R2fntoeb?8vE;{e){|{n2r}h8< diff --git a/utils.py b/utils.py deleted file mode 100644 index b857a5b..0000000 --- a/utils.py +++ /dev/null @@ -1,58 +0,0 @@ -import bpy -import os - -def get_target_node(node_tree, - filter = lambda node: (node.type == 'TEX_IMAGE' and node.image) - ): - """ - Find the shader node to perform operations. - First, check the active node. If it is not qualified, search through all nodes to find the first eligible one - """ - nodes = node_tree.nodes - if nodes.active and filter(nodes.active): - return nodes.active, node_tree - # Search recursively for node groups - elif nodes.active and nodes.active.type=='GROUP' and nodes.active.node_tree: - return get_target_node(nodes.active.node_tree, filter) - else: - for node in nodes: - if filter(node): - return node, node_tree - return None, None - -def copy_driver(src, dst): - """ - Copy all attributes of the source driver to an empty destination driver - """ - dst.type = src.type - for src_var in src.variables: - dst_var = dst.variables.new() - dst_var.name = src_var.name - dst_var.type = src_var.type - dst_var.targets[0].id_type = src_var.targets[0].id_type - dst_var.targets[0].id = src_var.targets[0].id - dst_var.targets[0].data_path = src_var.targets[0].data_path - dst.expression = src.expression - -def get_library_blend_file(): - file_name = 'res/assets.blend' - script_file = os.path.realpath(__file__) - directory = os.path.dirname(script_file) - file_path = os.path.join(directory, file_name) - return file_path - -def append_node_group(node_group_name): - if node_group_name in bpy.data.node_groups: - return bpy.data.node_groups[node_group_name] - - mode = bpy.context.mode - bpy.ops.object.mode_set(mode='OBJECT') - file_path = get_library_blend_file() - inner_path = 'NodeTree' - bpy.ops.wm.append( - filepath=os.path.join(file_path, inner_path, node_group_name), - directory=os.path.join(file_path, inner_path), - filename=node_group_name - ) - bpy.ops.object.mode_set(mode=mode) - return bpy.data.node_groups[node_group_name] \ No newline at end of file diff --git a/utils/asset.py b/utils/asset.py new file mode 100644 index 0000000..87b7fa2 --- /dev/null +++ b/utils/asset.py @@ -0,0 +1,25 @@ +import bpy +import os + +def get_library_blend_file(): + file_name = '../res/assets.blend' + script_file = os.path.realpath(__file__) + directory = os.path.dirname(script_file) + file_path = os.path.join(directory, file_name) + return file_path + +def append_node_group(node_group_name): + if node_group_name in bpy.data.node_groups: + return bpy.data.node_groups[node_group_name] + + mode = bpy.context.mode + bpy.ops.object.mode_set(mode='OBJECT') + file_path = get_library_blend_file() + inner_path = 'NodeTree' + bpy.ops.wm.append( + filepath=os.path.join(file_path, inner_path, node_group_name), + directory=os.path.join(file_path, inner_path), + filename=node_group_name + ) + bpy.ops.object.mode_set(mode=mode) + return bpy.data.node_groups[node_group_name] \ No newline at end of file diff --git a/utils/driver.py b/utils/driver.py new file mode 100644 index 0000000..d83062a --- /dev/null +++ b/utils/driver.py @@ -0,0 +1,23 @@ +import bpy + +def add_driver_variable(driver, id, data_path, name, id_type='OBJECT', custom_property = True): + var = driver.variables.new() + var.name = name + var.type = 'SINGLE_PROP' + var.targets[0].id_type = id_type + var.targets[0].id = id + var.targets[0].data_path = f'["{data_path}"]' if custom_property else data_path + +def copy_driver(src, dst): + """ + Copy all attributes of the source driver to an empty destination driver + """ + dst.type = src.type + for src_var in src.variables: + dst_var = dst.variables.new() + dst_var.name = src_var.name + dst_var.type = src_var.type + dst_var.targets[0].id_type = src_var.targets[0].id_type + dst_var.targets[0].id = src_var.targets[0].id + dst_var.targets[0].data_path = src_var.targets[0].data_path + dst.expression = src.expression \ No newline at end of file diff --git a/utils/node.py b/utils/node.py new file mode 100644 index 0000000..a2356fd --- /dev/null +++ b/utils/node.py @@ -0,0 +1,32 @@ +import bpy +from ..utils.asset import append_node_group + +def get_target_node(node_tree, + filter = lambda node: (node.type == 'TEX_IMAGE' and node.image) + ): + """ + Find the shader node to perform operations. + First, check the active node. If it is not qualified, search through all nodes to find the first eligible one + """ + nodes = node_tree.nodes + if nodes.active and filter(nodes.active): + return nodes.active, node_tree + # Search recursively for node groups + elif nodes.active and nodes.active.type=='GROUP' and nodes.active.node_tree: + return get_target_node(nodes.active.node_tree, filter) + else: + for node in nodes: + if filter(node): + return node, node_tree + return None, None + +def add_node_group(node_tree, name, location=(0,0)) -> bpy.types.ShaderNodeGroup: + node = node_tree.nodes.new('ShaderNodeGroup') + node.node_tree = append_node_group(name) + node.location = location + return node + +def add_uv_input(node_tree, location=(0,0)) -> bpy.types.ShaderNodeUVMap: + node = node_tree.nodes.new('ShaderNodeUVMap') + node.location = location + return node \ No newline at end of file