Skip to content
Snippets Groups Projects
Commit d1d570d3 authored by Hans Goudey's avatar Hans Goudey
Browse files

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.
parent c1954f98
No related branches found
No related tags found
No related merge requests found
......@@ -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,14 +191,10 @@ 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:
......@@ -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'}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment