Geometry Nodes: Don't require geometry input for "Mode to Nodes"
It's valid for modifier node groups to not have a geometry input, since they can just be generators. The operator used to give a warning and cancel itself when there was no geometry input. Now it works, and skips adding the geometry input and the group input node to the new group.
This commit is contained in:
@@ -12,32 +12,37 @@ from bpy.props import (
|
||||
)
|
||||
|
||||
|
||||
def build_default_empty_geometry_node_group(name):
|
||||
def add_empty_geometry_node_group(name):
|
||||
group = bpy.data.node_groups.new(name, 'GeometryNodeTree')
|
||||
group.interface.new_socket(data_("Geometry"), in_out='OUTPUT', socket_type='NodeSocketGeometry')
|
||||
|
||||
group.interface.new_socket(data_("Geometry"), in_out='INPUT', socket_type='NodeSocketGeometry')
|
||||
input_node = group.nodes.new('NodeGroupInput')
|
||||
input_node.select = False
|
||||
input_node.location.x = -200 - input_node.width
|
||||
|
||||
group.interface.new_socket(data_("Geometry"), in_out='OUTPUT', socket_type='NodeSocketGeometry')
|
||||
output_node = group.nodes.new('NodeGroupOutput')
|
||||
output_node.is_active_output = True
|
||||
|
||||
input_node.select = False
|
||||
output_node.select = False
|
||||
|
||||
input_node.location.x = -200 - input_node.width
|
||||
output_node.location.x = 200
|
||||
|
||||
return group
|
||||
|
||||
|
||||
def geometry_node_group_empty_new():
|
||||
group = build_default_empty_geometry_node_group(data_("Geometry Nodes"))
|
||||
def geometry_node_group_empty_new(name):
|
||||
group = add_empty_geometry_node_group(name)
|
||||
group.links.new(group.nodes[data_("Group Input")].outputs[0], group.nodes[data_("Group Output")].inputs[0])
|
||||
return group
|
||||
|
||||
|
||||
def geometry_node_group_empty_modifier_new(name):
|
||||
group = geometry_node_group_empty_new(data_("Tool"))
|
||||
group.is_modifier = True
|
||||
return group
|
||||
|
||||
|
||||
def geometry_node_group_empty_tool_new(context):
|
||||
group = build_default_empty_geometry_node_group(data_("Tool"))
|
||||
group.links.new(group.nodes[data_("Group Input")].outputs[0], group.nodes[data_("Group Output")].inputs[0])
|
||||
group = geometry_node_group_empty_new(data_("Tool"))
|
||||
group.asset_mark()
|
||||
group.is_tool = True
|
||||
|
||||
@@ -147,17 +152,30 @@ class MoveModifierToNodes(Operator):
|
||||
return {'CANCELLED'}
|
||||
|
||||
wrapper_name = old_group.name + ".wrapper"
|
||||
group = build_default_empty_geometry_node_group(wrapper_name)
|
||||
group = bpy.data.node_groups.new(wrapper_name, 'GeometryNodeTree')
|
||||
group.interface.new_socket(data_("Geometry"), in_out='OUTPUT', socket_type='NodeSocketGeometry')
|
||||
group.is_modifier = True
|
||||
|
||||
first_geometry_input = next((item for item in old_group.interface.items_tree if item.item_type == 'SOCKET' and
|
||||
item.in_out == 'INPUT' and
|
||||
item.bl_socket_idname == 'NodeSocketGeometry'), None)
|
||||
if first_geometry_input:
|
||||
group.interface.new_socket(data_("Geometry"), in_out='INPUT', socket_type='NodeSocketGeometry')
|
||||
group_input_node = group.nodes.new('NodeGroupInput')
|
||||
group_input_node.location.x = -200 - group_input_node.width
|
||||
group_input_node.select = False
|
||||
|
||||
group_output_node = group.nodes.new('NodeGroupOutput')
|
||||
group_output_node.is_active_output = True
|
||||
group_output_node.location.x = 200
|
||||
group_output_node.select = False
|
||||
|
||||
group_node = group.nodes.new("GeometryNodeGroup")
|
||||
group_node.node_tree = old_group
|
||||
group_node.update()
|
||||
|
||||
group_input_node = group.nodes[data_("Group Input")]
|
||||
group_output_node = group.nodes[data_("Group Output")]
|
||||
|
||||
# Copy default values for inputs and create named attribute input nodes.
|
||||
input_nodes = []
|
||||
first_geometry_input = None
|
||||
for input_socket in old_group.interface.items_tree:
|
||||
if input_socket.item_type != 'SOCKET' or (input_socket.in_out not in {'INPUT', 'BOTH'}):
|
||||
continue
|
||||
@@ -173,21 +191,17 @@ class MoveModifierToNodes(Operator):
|
||||
group.links.new(output_socket, group_node_input)
|
||||
elif hasattr(input_socket, "default_value"):
|
||||
group_node_input.default_value = modifier[identifier]
|
||||
elif input_socket.bl_socket_idname == 'NodeSocketGeometry':
|
||||
if not first_geometry_input:
|
||||
first_geometry_input = group_node_input
|
||||
|
||||
if not first_geometry_input:
|
||||
self.report({'WARNING'}, "Node group must have a geometry input")
|
||||
return {'CANCELLED'}
|
||||
group.links.new(group_input_node.outputs[0], first_geometry_input)
|
||||
if first_geometry_input:
|
||||
group.links.new(group_input_node.outputs[0],
|
||||
get_socket_with_identifier(group_node.inputs, first_geometry_input.identifier))
|
||||
|
||||
# Adjust locations of named attribute input nodes and group input node to make some space.
|
||||
if input_nodes:
|
||||
for i, node in enumerate(input_nodes):
|
||||
node.location.x = -175
|
||||
node.location.y = i * -50
|
||||
group_input_node.location.x = -350
|
||||
# Adjust locations of named attribute input nodes and group input node to make some space.
|
||||
if input_nodes:
|
||||
for i, node in enumerate(input_nodes):
|
||||
node.location.x = -175
|
||||
node.location.y = i * -50
|
||||
group_input_node.location.x = -350
|
||||
|
||||
# Connect outputs to store named attribute nodes to replace modifier attribute outputs.
|
||||
store_nodes = []
|
||||
@@ -251,8 +265,7 @@ class NewGeometryNodesModifier(Operator):
|
||||
if not modifier:
|
||||
return {'CANCELLED'}
|
||||
|
||||
group = geometry_node_group_empty_new()
|
||||
group.is_modifier = True
|
||||
group = geometry_node_group_empty_modifier_new(data_("Geometry Nodes"))
|
||||
modifier.node_group = group
|
||||
|
||||
return {'FINISHED'}
|
||||
@@ -274,8 +287,7 @@ class NewGeometryNodeTreeAssign(Operator):
|
||||
modifier = get_context_modifier(context)
|
||||
if not modifier:
|
||||
return {'CANCELLED'}
|
||||
group = geometry_node_group_empty_new()
|
||||
group.is_modifier = True
|
||||
group = geometry_node_group_empty_modifier_new(data_("Geometry Nodes"))
|
||||
modifier.node_group = group
|
||||
|
||||
return {'FINISHED'}
|
||||
|
||||
Reference in New Issue
Block a user