Node Wrangler: Fix #104555, multiple operators using virtual sockets #104560
@ -3,7 +3,7 @@
|
|||||||
bl_info = {
|
bl_info = {
|
||||||
"name": "Node Wrangler",
|
"name": "Node Wrangler",
|
||||||
"author": "Bartek Skorupa, Greg Zaal, Sebastian Koenig, Christian Brinkmann, Florian Meyer",
|
"author": "Bartek Skorupa, Greg Zaal, Sebastian Koenig, Christian Brinkmann, Florian Meyer",
|
||||||
"version": (3, 45),
|
"version": (3, 46),
|
||||||
"blender": (3, 6, 0),
|
"blender": (3, 6, 0),
|
||||||
"location": "Node Editor Toolbar or Shift-W",
|
"location": "Node Editor Toolbar or Shift-W",
|
||||||
"description": "Various tools to enhance and speed up node-based workflow",
|
"description": "Various tools to enhance and speed up node-based workflow",
|
||||||
|
@ -13,6 +13,7 @@ from bpy.props import (
|
|||||||
CollectionProperty,
|
CollectionProperty,
|
||||||
)
|
)
|
||||||
from bpy_extras.io_utils import ImportHelper, ExportHelper
|
from bpy_extras.io_utils import ImportHelper, ExportHelper
|
||||||
|
from bpy_extras.node_utils import connect_sockets
|
||||||
from mathutils import Vector
|
from mathutils import Vector
|
||||||
from os import path
|
from os import path
|
||||||
from glob import glob
|
from glob import glob
|
||||||
@ -368,13 +369,13 @@ class NWSwapLinks(Operator, NWBase):
|
|||||||
|
|
||||||
for connection in n1_outputs:
|
for connection in n1_outputs:
|
||||||
try:
|
try:
|
||||||
links.new(n2.outputs[connection[0]], connection[1])
|
connect_sockets(n2.outputs[connection[0]], connection[1])
|
||||||
except:
|
except:
|
||||||
self.report({'WARNING'},
|
self.report({'WARNING'},
|
||||||
"Some connections have been lost due to differing numbers of output sockets")
|
"Some connections have been lost due to differing numbers of output sockets")
|
||||||
for connection in n2_outputs:
|
for connection in n2_outputs:
|
||||||
try:
|
try:
|
||||||
links.new(n1.outputs[connection[0]], connection[1])
|
connect_sockets(n1.outputs[connection[0]], connection[1])
|
||||||
except:
|
except:
|
||||||
self.report({'WARNING'},
|
self.report({'WARNING'},
|
||||||
"Some connections have been lost due to differing numbers of output sockets")
|
"Some connections have been lost due to differing numbers of output sockets")
|
||||||
@ -412,8 +413,8 @@ class NWSwapLinks(Operator, NWBase):
|
|||||||
i1t = pair[0].links[0].to_socket
|
i1t = pair[0].links[0].to_socket
|
||||||
i2f = pair[1].links[0].from_socket
|
i2f = pair[1].links[0].from_socket
|
||||||
i2t = pair[1].links[0].to_socket
|
i2t = pair[1].links[0].to_socket
|
||||||
links.new(i1f, i2t)
|
connect_sockets(i1f, i2t)
|
||||||
links.new(i2f, i1t)
|
connect_sockets(i2f, i1t)
|
||||||
if t[1] == 1:
|
if t[1] == 1:
|
||||||
if len(types) == 1:
|
if len(types) == 1:
|
||||||
fs = t[0].links[0].from_socket
|
fs = t[0].links[0].from_socket
|
||||||
@ -424,14 +425,14 @@ class NWSwapLinks(Operator, NWBase):
|
|||||||
i += 1
|
i += 1
|
||||||
while n1.inputs[i].is_linked:
|
while n1.inputs[i].is_linked:
|
||||||
i += 1
|
i += 1
|
||||||
links.new(fs, n1.inputs[i])
|
connect_sockets(fs, n1.inputs[i])
|
||||||
elif len(types) == 2:
|
elif len(types) == 2:
|
||||||
i1f = types[0][0].links[0].from_socket
|
i1f = types[0][0].links[0].from_socket
|
||||||
i1t = types[0][0].links[0].to_socket
|
i1t = types[0][0].links[0].to_socket
|
||||||
i2f = types[1][0].links[0].from_socket
|
i2f = types[1][0].links[0].from_socket
|
||||||
i2t = types[1][0].links[0].to_socket
|
i2t = types[1][0].links[0].to_socket
|
||||||
links.new(i1f, i2t)
|
connect_sockets(i1f, i2t)
|
||||||
links.new(i2f, i1t)
|
connect_sockets(i2f, i1t)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
self.report({'WARNING'}, "This node has no input connections to swap!")
|
self.report({'WARNING'}, "This node has no input connections to swap!")
|
||||||
@ -702,7 +703,7 @@ class NWPreviewNode(Operator, NWBase):
|
|||||||
make_links.append((active.outputs[out_i], geometryoutput.inputs[geometryoutindex]))
|
make_links.append((active.outputs[out_i], geometryoutput.inputs[geometryoutindex]))
|
||||||
output_socket = geometryoutput.inputs[geometryoutindex]
|
output_socket = geometryoutput.inputs[geometryoutindex]
|
||||||
for li_from, li_to in make_links:
|
for li_from, li_to in make_links:
|
||||||
base_node_tree.links.new(li_from, li_to)
|
connect_sockets(li_from, li_to)
|
||||||
tree = base_node_tree
|
tree = base_node_tree
|
||||||
link_end = output_socket
|
link_end = output_socket
|
||||||
while tree.nodes.active != active:
|
while tree.nodes.active != active:
|
||||||
@ -713,11 +714,11 @@ class NWPreviewNode(Operator, NWBase):
|
|||||||
node_socket = node.node_tree.outputs[index]
|
node_socket = node.node_tree.outputs[index]
|
||||||
if node_socket in delete_sockets:
|
if node_socket in delete_sockets:
|
||||||
delete_sockets.remove(node_socket)
|
delete_sockets.remove(node_socket)
|
||||||
tree.links.new(link_start, link_end)
|
connect_sockets(link_start, link_end)
|
||||||
# Iterate
|
# Iterate
|
||||||
link_end = self.ensure_group_output(node.node_tree).inputs[index]
|
link_end = self.ensure_group_output(node.node_tree).inputs[index]
|
||||||
tree = tree.nodes.active.node_tree
|
tree = tree.nodes.active.node_tree
|
||||||
tree.links.new(active.outputs[out_i], link_end)
|
connect_sockets(active.outputs[out_i], link_end)
|
||||||
|
|
||||||
# Delete sockets
|
# Delete sockets
|
||||||
for socket in delete_sockets:
|
for socket in delete_sockets:
|
||||||
@ -776,7 +777,7 @@ class NWPreviewNode(Operator, NWBase):
|
|||||||
make_links.append((active.outputs[out_i], materialout.inputs[materialout_index]))
|
make_links.append((active.outputs[out_i], materialout.inputs[materialout_index]))
|
||||||
output_socket = materialout.inputs[materialout_index]
|
output_socket = materialout.inputs[materialout_index]
|
||||||
for li_from, li_to in make_links:
|
for li_from, li_to in make_links:
|
||||||
base_node_tree.links.new(li_from, li_to)
|
connect_sockets(li_from, li_to)
|
||||||
|
|
||||||
# Create links through node groups until we reach the active node
|
# Create links through node groups until we reach the active node
|
||||||
tree = base_node_tree
|
tree = base_node_tree
|
||||||
@ -789,11 +790,11 @@ class NWPreviewNode(Operator, NWBase):
|
|||||||
node_socket = node.node_tree.outputs[index]
|
node_socket = node.node_tree.outputs[index]
|
||||||
if node_socket in delete_sockets:
|
if node_socket in delete_sockets:
|
||||||
delete_sockets.remove(node_socket)
|
delete_sockets.remove(node_socket)
|
||||||
tree.links.new(link_start, link_end)
|
connect_sockets(link_start, link_end)
|
||||||
# Iterate
|
# Iterate
|
||||||
link_end = self.ensure_group_output(node.node_tree).inputs[index]
|
link_end = self.ensure_group_output(node.node_tree).inputs[index]
|
||||||
tree = tree.nodes.active.node_tree
|
tree = tree.nodes.active.node_tree
|
||||||
tree.links.new(active.outputs[out_i], link_end)
|
connect_sockets(active.outputs[out_i], link_end)
|
||||||
|
|
||||||
# Delete sockets
|
# Delete sockets
|
||||||
for socket in delete_sockets:
|
for socket in delete_sockets:
|
||||||
@ -1064,31 +1065,31 @@ class NWSwitchNodeType(Operator, NWBase):
|
|||||||
if node.inputs[src_i].links and not new_node.inputs[dst_i].links:
|
if node.inputs[src_i].links and not new_node.inputs[dst_i].links:
|
||||||
in_src_link = node.inputs[src_i].links[0]
|
in_src_link = node.inputs[src_i].links[0]
|
||||||
in_dst_socket = new_node.inputs[dst_i]
|
in_dst_socket = new_node.inputs[dst_i]
|
||||||
links.new(in_src_link.from_socket, in_dst_socket)
|
connect_sockets(in_src_link.from_socket, in_dst_socket)
|
||||||
links.remove(in_src_link)
|
links.remove(in_src_link)
|
||||||
# OUTPUTS: Base on matches in proper order.
|
# OUTPUTS: Base on matches in proper order.
|
||||||
for (src_i, src_dval), (dst_i, dst_dval) in matches['OUTPUTS'][tp]:
|
for (src_i, src_dval), (dst_i, dst_dval) in matches['OUTPUTS'][tp]:
|
||||||
for out_src_link in node.outputs[src_i].links:
|
for out_src_link in node.outputs[src_i].links:
|
||||||
out_dst_socket = new_node.outputs[dst_i]
|
out_dst_socket = new_node.outputs[dst_i]
|
||||||
links.new(out_dst_socket, out_src_link.to_socket)
|
connect_sockets(out_dst_socket, out_src_link.to_socket)
|
||||||
# relink rest inputs if possible, no criteria
|
# relink rest inputs if possible, no criteria
|
||||||
for src_inp in node.inputs:
|
for src_inp in node.inputs:
|
||||||
for dst_inp in new_node.inputs:
|
for dst_inp in new_node.inputs:
|
||||||
if src_inp.links and not dst_inp.links:
|
if src_inp.links and not dst_inp.links:
|
||||||
src_link = src_inp.links[0]
|
src_link = src_inp.links[0]
|
||||||
links.new(src_link.from_socket, dst_inp)
|
connect_sockets(src_link.from_socket, dst_inp)
|
||||||
links.remove(src_link)
|
links.remove(src_link)
|
||||||
# relink rest outputs if possible, base on node kind if any left.
|
# relink rest outputs if possible, base on node kind if any left.
|
||||||
for src_o in node.outputs:
|
for src_o in node.outputs:
|
||||||
for out_src_link in src_o.links:
|
for out_src_link in src_o.links:
|
||||||
for dst_o in new_node.outputs:
|
for dst_o in new_node.outputs:
|
||||||
if src_o.type == dst_o.type:
|
if src_o.type == dst_o.type:
|
||||||
links.new(dst_o, out_src_link.to_socket)
|
connect_sockets(dst_o, out_src_link.to_socket)
|
||||||
# relink rest outputs no criteria if any left. Link all from first output.
|
# relink rest outputs no criteria if any left. Link all from first output.
|
||||||
for src_o in node.outputs:
|
for src_o in node.outputs:
|
||||||
for out_src_link in src_o.links:
|
for out_src_link in src_o.links:
|
||||||
if new_node.outputs:
|
if new_node.outputs:
|
||||||
links.new(new_node.outputs[0], out_src_link.to_socket)
|
connect_sockets(new_node.outputs[0], out_src_link.to_socket)
|
||||||
nodes.remove(node)
|
nodes.remove(node)
|
||||||
force_update(context)
|
force_update(context)
|
||||||
return {'FINISHED'}
|
return {'FINISHED'}
|
||||||
@ -1177,16 +1178,16 @@ class NWMergeNodes(Operator, NWBase):
|
|||||||
# outputs to the multi input socket.
|
# outputs to the multi input socket.
|
||||||
if i < len(socket_indices) - 1:
|
if i < len(socket_indices) - 1:
|
||||||
ind = socket_indices[i]
|
ind = socket_indices[i]
|
||||||
links.new(node.outputs[0], new_node.inputs[ind])
|
connect_sockets(node.outputs[0], new_node.inputs[ind])
|
||||||
else:
|
else:
|
||||||
outputs_for_multi_input.insert(0, node.outputs[0])
|
outputs_for_multi_input.insert(0, node.outputs[0])
|
||||||
if outputs_for_multi_input != []:
|
if outputs_for_multi_input != []:
|
||||||
ind = socket_indices[-1]
|
ind = socket_indices[-1]
|
||||||
for output in outputs_for_multi_input:
|
for output in outputs_for_multi_input:
|
||||||
links.new(output, new_node.inputs[ind])
|
connect_sockets(output, new_node.inputs[ind])
|
||||||
if prev_links != []:
|
if prev_links != []:
|
||||||
for link in prev_links:
|
for link in prev_links:
|
||||||
links.new(new_node.outputs[0], link.to_node.inputs[0])
|
connect_sockets(new_node.outputs[0], link.to_node.inputs[0])
|
||||||
return new_node
|
return new_node
|
||||||
|
|
||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
@ -1447,19 +1448,19 @@ class NWMergeNodes(Operator, NWBase):
|
|||||||
# Prevent cyclic dependencies when nodes to be merged are linked to one another.
|
# Prevent cyclic dependencies when nodes to be merged are linked to one another.
|
||||||
# Link only if "to_node" index not in invalid indexes list.
|
# Link only if "to_node" index not in invalid indexes list.
|
||||||
if not self.link_creates_cycle(ss_link, invalid_nodes):
|
if not self.link_creates_cycle(ss_link, invalid_nodes):
|
||||||
links.new(get_first_enabled_output(last_add), ss_link.to_socket)
|
connect_sockets(get_first_enabled_output(last_add), ss_link.to_socket)
|
||||||
# add links from last_add to all links 'to_socket' of out links of first selected.
|
# add links from last_add to all links 'to_socket' of out links of first selected.
|
||||||
for fs_link in first_selected_output.links:
|
for fs_link in first_selected_output.links:
|
||||||
# Link only if "to_node" index not in invalid indexes list.
|
# Link only if "to_node" index not in invalid indexes list.
|
||||||
if not self.link_creates_cycle(fs_link, invalid_nodes):
|
if not self.link_creates_cycle(fs_link, invalid_nodes):
|
||||||
links.new(get_first_enabled_output(last_add), fs_link.to_socket)
|
connect_sockets(get_first_enabled_output(last_add), fs_link.to_socket)
|
||||||
# add link from "first" selected and "first" add node
|
# add link from "first" selected and "first" add node
|
||||||
node_to = nodes[count_after - 1]
|
node_to = nodes[count_after - 1]
|
||||||
links.new(first_selected_output, node_to.inputs[first])
|
connect_sockets(first_selected_output, node_to.inputs[first])
|
||||||
if node_to.type == 'ZCOMBINE':
|
if node_to.type == 'ZCOMBINE':
|
||||||
for fs_out in first_selected.outputs:
|
for fs_out in first_selected.outputs:
|
||||||
if fs_out != first_selected_output and fs_out.name in ('Z', 'Depth'):
|
if fs_out != first_selected_output and fs_out.name in ('Z', 'Depth'):
|
||||||
links.new(fs_out, node_to.inputs[1])
|
connect_sockets(fs_out, node_to.inputs[1])
|
||||||
break
|
break
|
||||||
# add links between added ADD nodes and between selected and ADD nodes
|
# add links between added ADD nodes and between selected and ADD nodes
|
||||||
for i in range(count_adds):
|
for i in range(count_adds):
|
||||||
@ -1468,21 +1469,21 @@ class NWMergeNodes(Operator, NWBase):
|
|||||||
node_to = nodes[index - 1]
|
node_to = nodes[index - 1]
|
||||||
node_to_input_i = first
|
node_to_input_i = first
|
||||||
node_to_z_i = 1 # if z combine - link z to first z input
|
node_to_z_i = 1 # if z combine - link z to first z input
|
||||||
links.new(get_first_enabled_output(node_from), node_to.inputs[node_to_input_i])
|
connect_sockets(get_first_enabled_output(node_from), node_to.inputs[node_to_input_i])
|
||||||
if node_to.type == 'ZCOMBINE':
|
if node_to.type == 'ZCOMBINE':
|
||||||
for from_out in node_from.outputs:
|
for from_out in node_from.outputs:
|
||||||
if from_out != get_first_enabled_output(node_from) and from_out.name in ('Z', 'Depth'):
|
if from_out != get_first_enabled_output(node_from) and from_out.name in ('Z', 'Depth'):
|
||||||
links.new(from_out, node_to.inputs[node_to_z_i])
|
connect_sockets(from_out, node_to.inputs[node_to_z_i])
|
||||||
if len(nodes_list) > 1:
|
if len(nodes_list) > 1:
|
||||||
node_from = nodes[nodes_list[i + 1][0]]
|
node_from = nodes[nodes_list[i + 1][0]]
|
||||||
node_to = nodes[index]
|
node_to = nodes[index]
|
||||||
node_to_input_i = second
|
node_to_input_i = second
|
||||||
node_to_z_i = 3 # if z combine - link z to second z input
|
node_to_z_i = 3 # if z combine - link z to second z input
|
||||||
links.new(get_first_enabled_output(node_from), node_to.inputs[node_to_input_i])
|
connect_sockets(get_first_enabled_output(node_from), node_to.inputs[node_to_input_i])
|
||||||
if node_to.type == 'ZCOMBINE':
|
if node_to.type == 'ZCOMBINE':
|
||||||
for from_out in node_from.outputs:
|
for from_out in node_from.outputs:
|
||||||
if from_out != get_first_enabled_output(node_from) and from_out.name in ('Z', 'Depth'):
|
if from_out != get_first_enabled_output(node_from) and from_out.name in ('Z', 'Depth'):
|
||||||
links.new(from_out, node_to.inputs[node_to_z_i])
|
connect_sockets(from_out, node_to.inputs[node_to_z_i])
|
||||||
index -= 1
|
index -= 1
|
||||||
# set "last" of added nodes as active
|
# set "last" of added nodes as active
|
||||||
nodes.active = last_add
|
nodes.active = last_add
|
||||||
@ -1690,7 +1691,7 @@ class NWCopySettings(Operator, NWBase):
|
|||||||
new_node.location = node_loc
|
new_node.location = node_loc
|
||||||
|
|
||||||
for str_from, str_to in reconnections:
|
for str_from, str_to in reconnections:
|
||||||
node_tree.links.new(eval(str_from), eval(str_to))
|
node_tree.connect_sockets(eval(str_from), eval(str_to))
|
||||||
|
|
||||||
success_names.append(new_node.name)
|
success_names.append(new_node.name)
|
||||||
|
|
||||||
@ -1859,7 +1860,7 @@ class NWAddTextureSetup(Operator, NWBase):
|
|||||||
x_offset = x_offset + image_texture_node.width + padding
|
x_offset = x_offset + image_texture_node.width + padding
|
||||||
image_texture_node.location = [locx - x_offset, locy]
|
image_texture_node.location = [locx - x_offset, locy]
|
||||||
nodes.active = image_texture_node
|
nodes.active = image_texture_node
|
||||||
links.new(image_texture_node.outputs[0], target_input)
|
connect_sockets(image_texture_node.outputs[0], target_input)
|
||||||
|
|
||||||
# The mapping setup following this will connect to the first input of this image texture.
|
# The mapping setup following this will connect to the first input of this image texture.
|
||||||
target_input = image_texture_node.inputs[0]
|
target_input = image_texture_node.inputs[0]
|
||||||
@ -1871,7 +1872,7 @@ class NWAddTextureSetup(Operator, NWBase):
|
|||||||
mapping_node = nodes.new('ShaderNodeMapping')
|
mapping_node = nodes.new('ShaderNodeMapping')
|
||||||
x_offset = x_offset + mapping_node.width + padding
|
x_offset = x_offset + mapping_node.width + padding
|
||||||
mapping_node.location = [locx - x_offset, locy]
|
mapping_node.location = [locx - x_offset, locy]
|
||||||
links.new(mapping_node.outputs[0], target_input)
|
connect_sockets(mapping_node.outputs[0], target_input)
|
||||||
|
|
||||||
# Add Texture Coordinates node.
|
# Add Texture Coordinates node.
|
||||||
tex_coord_node = nodes.new('ShaderNodeTexCoord')
|
tex_coord_node = nodes.new('ShaderNodeTexCoord')
|
||||||
@ -1881,7 +1882,7 @@ class NWAddTextureSetup(Operator, NWBase):
|
|||||||
is_procedural_texture = is_texture_node and node.type != 'TEX_IMAGE'
|
is_procedural_texture = is_texture_node and node.type != 'TEX_IMAGE'
|
||||||
use_generated_coordinates = is_procedural_texture or use_environment_texture
|
use_generated_coordinates = is_procedural_texture or use_environment_texture
|
||||||
tex_coord_output = tex_coord_node.outputs[0 if use_generated_coordinates else 2]
|
tex_coord_output = tex_coord_node.outputs[0 if use_generated_coordinates else 2]
|
||||||
links.new(tex_coord_output, mapping_node.inputs[0])
|
connect_sockets(tex_coord_output, mapping_node.inputs[0])
|
||||||
|
|
||||||
return {'FINISHED'}
|
return {'FINISHED'}
|
||||||
|
|
||||||
@ -2006,7 +2007,7 @@ class NWAddPrincipledSetup(Operator, NWBase, ImportHelper):
|
|||||||
disp_node = nodes.new(type='ShaderNodeDisplacement')
|
disp_node = nodes.new(type='ShaderNodeDisplacement')
|
||||||
# Align the Displacement node under the active Principled BSDF node
|
# Align the Displacement node under the active Principled BSDF node
|
||||||
disp_node.location = active_node.location + Vector((100, -700))
|
disp_node.location = active_node.location + Vector((100, -700))
|
||||||
link = links.new(disp_node.inputs[0], disp_texture.outputs[0])
|
link = connect_sockets(disp_node.inputs[0], disp_texture.outputs[0])
|
||||||
|
|
||||||
# TODO Turn on true displacement in the material
|
# TODO Turn on true displacement in the material
|
||||||
# Too complicated for now
|
# Too complicated for now
|
||||||
@ -2015,7 +2016,7 @@ class NWAddPrincipledSetup(Operator, NWBase, ImportHelper):
|
|||||||
output_node = [n for n in nodes if n.bl_idname == 'ShaderNodeOutputMaterial']
|
output_node = [n for n in nodes if n.bl_idname == 'ShaderNodeOutputMaterial']
|
||||||
if output_node:
|
if output_node:
|
||||||
if not output_node[0].inputs[2].is_linked:
|
if not output_node[0].inputs[2].is_linked:
|
||||||
link = links.new(output_node[0].inputs[2], disp_node.outputs[0])
|
link = connect_sockets(output_node[0].inputs[2], disp_node.outputs[0])
|
||||||
|
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@ -2045,13 +2046,13 @@ class NWAddPrincipledSetup(Operator, NWBase, ImportHelper):
|
|||||||
if match_normal:
|
if match_normal:
|
||||||
# If Normal add normal node in between
|
# If Normal add normal node in between
|
||||||
normal_node = nodes.new(type='ShaderNodeNormalMap')
|
normal_node = nodes.new(type='ShaderNodeNormalMap')
|
||||||
link = links.new(normal_node.inputs[1], texture_node.outputs[0])
|
link = connect_sockets(normal_node.inputs[1], texture_node.outputs[0])
|
||||||
elif match_bump:
|
elif match_bump:
|
||||||
# If Bump add bump node in between
|
# If Bump add bump node in between
|
||||||
normal_node = nodes.new(type='ShaderNodeBump')
|
normal_node = nodes.new(type='ShaderNodeBump')
|
||||||
link = links.new(normal_node.inputs[2], texture_node.outputs[0])
|
link = connect_sockets(normal_node.inputs[2], texture_node.outputs[0])
|
||||||
|
|
||||||
link = links.new(active_node.inputs[sname[0]], normal_node.outputs[0])
|
link = connect_sockets(active_node.inputs[sname[0]], normal_node.outputs[0])
|
||||||
normal_node_texture = texture_node
|
normal_node_texture = texture_node
|
||||||
|
|
||||||
elif sname[0] == 'Roughness':
|
elif sname[0] == 'Roughness':
|
||||||
@ -2062,19 +2063,19 @@ class NWAddPrincipledSetup(Operator, NWBase, ImportHelper):
|
|||||||
|
|
||||||
if match_rough:
|
if match_rough:
|
||||||
# If Roughness nothing to to
|
# If Roughness nothing to to
|
||||||
link = links.new(active_node.inputs[sname[0]], texture_node.outputs[0])
|
link = connect_sockets(active_node.inputs[sname[0]], texture_node.outputs[0])
|
||||||
|
|
||||||
elif match_gloss:
|
elif match_gloss:
|
||||||
# If Gloss Map add invert node
|
# If Gloss Map add invert node
|
||||||
invert_node = nodes.new(type='ShaderNodeInvert')
|
invert_node = nodes.new(type='ShaderNodeInvert')
|
||||||
link = links.new(invert_node.inputs[1], texture_node.outputs[0])
|
link = connect_sockets(invert_node.inputs[1], texture_node.outputs[0])
|
||||||
|
|
||||||
link = links.new(active_node.inputs[sname[0]], invert_node.outputs[0])
|
link = connect_sockets(active_node.inputs[sname[0]], invert_node.outputs[0])
|
||||||
roughness_node = texture_node
|
roughness_node = texture_node
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# This is a simple connection Texture --> Input slot
|
# This is a simple connection Texture --> Input slot
|
||||||
link = links.new(active_node.inputs[sname[0]], texture_node.outputs[0])
|
link = connect_sockets(active_node.inputs[sname[0]], texture_node.outputs[0])
|
||||||
|
|
||||||
# Use non-color for all but 'Base Color' Textures
|
# Use non-color for all but 'Base Color' Textures
|
||||||
if not sname[0] in ['Base Color', 'Emission'] and texture_node.image:
|
if not sname[0] in ['Base Color', 'Emission'] and texture_node.image:
|
||||||
@ -2119,15 +2120,15 @@ class NWAddPrincipledSetup(Operator, NWBase, ImportHelper):
|
|||||||
sum(n.location.y for n in texture_nodes) / len(texture_nodes)))
|
sum(n.location.y for n in texture_nodes) / len(texture_nodes)))
|
||||||
reroute.location = tex_coords + Vector((-50, -120))
|
reroute.location = tex_coords + Vector((-50, -120))
|
||||||
for texture_node in texture_nodes:
|
for texture_node in texture_nodes:
|
||||||
link = links.new(texture_node.inputs[0], reroute.outputs[0])
|
link = connect_sockets(texture_node.inputs[0], reroute.outputs[0])
|
||||||
link = links.new(reroute.inputs[0], mapping.outputs[0])
|
link = connect_sockets(reroute.inputs[0], mapping.outputs[0])
|
||||||
else:
|
else:
|
||||||
link = links.new(texture_nodes[0].inputs[0], mapping.outputs[0])
|
link = connect_sockets(texture_nodes[0].inputs[0], mapping.outputs[0])
|
||||||
|
|
||||||
# Connect texture_coordiantes to mapping node
|
# Connect texture_coordiantes to mapping node
|
||||||
texture_input = nodes.new(type='ShaderNodeTexCoord')
|
texture_input = nodes.new(type='ShaderNodeTexCoord')
|
||||||
texture_input.location = mapping.location + Vector((-200, 0))
|
texture_input.location = mapping.location + Vector((-200, 0))
|
||||||
link = links.new(mapping.inputs[0], texture_input.outputs[2])
|
link = connect_sockets(mapping.inputs[0], texture_input.outputs[2])
|
||||||
|
|
||||||
# Create frame around tex coords and mapping
|
# Create frame around tex coords and mapping
|
||||||
frame = nodes.new(type='NodeFrame')
|
frame = nodes.new(type='NodeFrame')
|
||||||
@ -2231,8 +2232,8 @@ class NWAddReroutes(Operator, NWBase):
|
|||||||
n = nodes.new('NodeReroute')
|
n = nodes.new('NodeReroute')
|
||||||
nodes.active = n
|
nodes.active = n
|
||||||
for link in output.links:
|
for link in output.links:
|
||||||
links.new(n.outputs[0], link.to_socket)
|
connect_sockets(n.outputs[0], link.to_socket)
|
||||||
links.new(output, n.inputs[0])
|
connect_sockets(output, n.inputs[0])
|
||||||
n.location = loc
|
n.location = loc
|
||||||
post_select.append(n)
|
post_select.append(n)
|
||||||
reroutes_count += 1
|
reroutes_count += 1
|
||||||
@ -2324,7 +2325,7 @@ class NWLinkActiveToSelected(Operator, NWBase):
|
|||||||
for input in node.inputs:
|
for input in node.inputs:
|
||||||
if input.type == out.type or node.type == 'REROUTE':
|
if input.type == out.type or node.type == 'REROUTE':
|
||||||
if replace or not input.is_linked:
|
if replace or not input.is_linked:
|
||||||
links.new(out, input)
|
connect_sockets(out, input)
|
||||||
if not use_node_name and not use_outputs_names:
|
if not use_node_name and not use_outputs_names:
|
||||||
doit = False
|
doit = False
|
||||||
break
|
break
|
||||||
@ -2521,7 +2522,7 @@ class NWLinkToOutputNode(Operator):
|
|||||||
elif tree_type == 'GeometryNodeTree':
|
elif tree_type == 'GeometryNodeTree':
|
||||||
if active.outputs[output_index].type != 'GEOMETRY':
|
if active.outputs[output_index].type != 'GEOMETRY':
|
||||||
return {'CANCELLED'}
|
return {'CANCELLED'}
|
||||||
links.new(active.outputs[output_index], output_node.inputs[out_input_index])
|
connect_sockets(active.outputs[output_index], output_node.inputs[out_input_index])
|
||||||
|
|
||||||
force_update(context) # viewport render does not update
|
force_update(context) # viewport render does not update
|
||||||
|
|
||||||
@ -2542,7 +2543,7 @@ class NWMakeLink(Operator, NWBase):
|
|||||||
n1 = nodes[context.scene.NWLazySource]
|
n1 = nodes[context.scene.NWLazySource]
|
||||||
n2 = nodes[context.scene.NWLazyTarget]
|
n2 = nodes[context.scene.NWLazyTarget]
|
||||||
|
|
||||||
links.new(n1.outputs[self.from_socket], n2.inputs[self.to_socket])
|
connect_sockets(n1.outputs[self.from_socket], n2.inputs[self.to_socket])
|
||||||
|
|
||||||
force_update(context)
|
force_update(context)
|
||||||
|
|
||||||
@ -2566,7 +2567,7 @@ class NWCallInputsMenu(Operator, NWBase):
|
|||||||
if len(n2.inputs) > 1:
|
if len(n2.inputs) > 1:
|
||||||
bpy.ops.wm.call_menu("INVOKE_DEFAULT", name=NWConnectionListInputs.bl_idname)
|
bpy.ops.wm.call_menu("INVOKE_DEFAULT", name=NWConnectionListInputs.bl_idname)
|
||||||
elif len(n2.inputs) == 1:
|
elif len(n2.inputs) == 1:
|
||||||
links.new(n1.outputs[self.from_socket], n2.inputs[0])
|
connect_sockets(n1.outputs[self.from_socket], n2.inputs[0])
|
||||||
return {'FINISHED'}
|
return {'FINISHED'}
|
||||||
|
|
||||||
|
|
||||||
@ -2950,7 +2951,7 @@ class NWResetNodes(bpy.types.Operator):
|
|||||||
new_node.location = node_loc
|
new_node.location = node_loc
|
||||||
|
|
||||||
for str_from, str_to in reconnections:
|
for str_from, str_to in reconnections:
|
||||||
node_tree.links.new(eval(str_from), eval(str_to))
|
connect_sockets(eval(str_from), eval(str_to))
|
||||||
|
|
||||||
new_node.select = False
|
new_node.select = False
|
||||||
success_names.append(new_node.name)
|
success_names.append(new_node.name)
|
||||||
|
Loading…
Reference in New Issue
Block a user