From c1b4abf527f102ca20114e8179eca511d90784b3 Mon Sep 17 00:00:00 2001 From: Johnny Matthews Date: Mon, 11 Oct 2021 11:03:57 -0500 Subject: Geometry Nodes: Add Nodes to Get/Set Built-in Attributes This commit implements T91780, adding nodes to get and set builtin attributes. Individual set nodes are used so that the values can be exposed for direct editing, which is useful for attributes like shade smooth and spline resolution. Individual input nodes are used to allow reusing nodes for multiple components, and to allow grouping multiple outputs conceptually in the same node in the future. Input Nodes - Radius - Curve Tilt - Curve Handle Positions - Is Shade Smooth - Spline Resolution - Is Spline Cyclic 'Set' Nodes - Curve Radius - Point Radius - Curve Tilt - Curve Handle Positions - Is Shade Smooth - Spline Resolution - Is Spline Cyclic Using hardcoded categories is necessary to add separators to the node menu. Differential Revision: https://developer.blender.org/D12687 --- release/scripts/startup/nodeitems_builtins.py | 152 +++++++++++++++++--------- 1 file changed, 103 insertions(+), 49 deletions(-) (limited to 'release') diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py index d73fbe5dc76..b6bc70e36fc 100644 --- a/release/scripts/startup/nodeitems_builtins.py +++ b/release/scripts/startup/nodeitems_builtins.py @@ -80,6 +80,104 @@ node_tree_group_type = { 'GeometryNodeTree': 'GeometryNodeGroup', } +# Custom Menu for Geometry Node Curves +def curve_node_items(context): + if context is None: + return + space = context.space_data + if not space: + return + if not space.edit_tree: + return + + if geometry_nodes_legacy_poll(context): + yield NodeItem("GeometryNodeLegacyCurveEndpoints") + yield NodeItem("GeometryNodeLegacyCurveReverse") + yield NodeItem("GeometryNodeLegacyCurveSubdivide") + yield NodeItem("GeometryNodeLegacyCurveToPoints") + yield NodeItem("GeometryNodeLegacyMeshToCurve") + yield NodeItem("GeometryNodeLegacyCurveSelectHandles") + yield NodeItem("GeometryNodeLegacyCurveSetHandles") + yield NodeItem("GeometryNodeLegacyCurveSplineType") + yield NodeItemCustom(draw=lambda self, layout, context: layout.separator()) + + yield NodeItem("GeometryNodeCurveFill") + yield NodeItem("GeometryNodeCurveFillet") + yield NodeItem("GeometryNodeCurveLength") + yield NodeItem("GeometryNodeCurveReverse") + yield NodeItem("GeometryNodeCurveSample") + yield NodeItem("GeometryNodeCurveSubdivide") + yield NodeItem("GeometryNodeCurveToMesh") + yield NodeItem("GeometryNodeCurveTrim") + yield NodeItem("GeometryNodeCurveResample") + yield NodeItemCustom(draw=lambda self, layout, context: layout.separator()) + yield NodeItem("GeometryNodeInputCurveHandlePositions") + yield NodeItem("GeometryNodeCurveParameter") + yield NodeItem("GeometryNodeInputTangent") + yield NodeItem("GeometryNodeInputCurveTilt") + yield NodeItem("GeometryNodeCurveHandleTypeSelection") + yield NodeItem("GeometryNodeInputSplineCyclic") + yield NodeItem("GeometryNodeSplineLength") + yield NodeItem("GeometryNodeInputSplineResolution") + yield NodeItemCustom(draw=lambda self, layout, context: layout.separator()) + yield NodeItem("GeometryNodeSetCurveRadius") + yield NodeItem("GeometryNodeSetCurveTilt") + yield NodeItem("GeometryNodeSetCurveHandlePositions") + yield NodeItem("GeometryNodeCurveSetHandles") + yield NodeItem("GeometryNodeSetSplineCyclic") + yield NodeItem("GeometryNodeSetSplineResolution") + yield NodeItem("GeometryNodeCurveSplineType") + +# Custom Menu for Geometry Node Curves +def mesh_node_items(context): + if context is None: + return + space = context.space_data + if not space: + return + if not space.edit_tree: + return + + if geometry_nodes_legacy_poll(context): + yield NodeItem("GeometryNodeLegacyEdgeSplit", poll=geometry_nodes_legacy_poll) + yield NodeItem("GeometryNodeLegacySubdivisionSurface", poll=geometry_nodes_legacy_poll) + yield NodeItemCustom(draw=lambda self, layout, context: layout.separator()) + + yield NodeItem("GeometryNodeBoolean") + yield NodeItem("GeometryNodeMeshSubdivide") + yield NodeItem("GeometryNodePointsToVertices") + yield NodeItem("GeometryNodeTriangulate") + yield NodeItemCustom(draw=lambda self, layout, context: layout.separator()) + yield NodeItem("GeometryNodeInputShadeSmooth") + yield NodeItemCustom(draw=lambda self, layout, context: layout.separator()) + yield NodeItem("GeometryNodeSetShadeSmooth") + +# Custom Menu for Geometry Node Curves +def point_node_items(context): + if context is None: + return + space = context.space_data + if not space: + return + if not space.edit_tree: + return + + if geometry_nodes_legacy_poll(context): + yield NodeItem("GeometryNodeLegacyAlignRotationToVector", poll=geometry_nodes_legacy_poll) + yield NodeItem("GeometryNodeLegacyPointDistribute", poll=geometry_nodes_legacy_poll) + yield NodeItem("GeometryNodeLegacyPointInstance", poll=geometry_nodes_legacy_poll) + yield NodeItem("GeometryNodeLegacyPointScale", poll=geometry_nodes_legacy_poll) + yield NodeItem("GeometryNodeLegacyPointSeparate", poll=geometry_nodes_legacy_poll) + yield NodeItem("GeometryNodeLegacyPointTranslate", poll=geometry_nodes_legacy_poll) + yield NodeItem("GeometryNodeLegacyRotatePoints", poll=geometry_nodes_legacy_poll) + yield NodeItemCustom(draw=lambda self, layout, context: layout.separator()) + + yield NodeItem("GeometryNodeDistributePointsOnFaces") + yield NodeItem("GeometryNodeInstanceOnPoints") + yield NodeItem("GeometryNodeMeshToPoints") + yield NodeItemCustom(draw=lambda self, layout, context: layout.separator()) + yield NodeItemCustom(draw=lambda self, layout, context: layout.separator()) + yield NodeItem("GeometryNodeSetPointRadius") # generic node group items generator for shader, compositor, geometry and texture node groups def node_group_items(context): @@ -510,32 +608,7 @@ geometry_node_categories = [ NodeItem("ShaderNodeSeparateRGB"), NodeItem("ShaderNodeCombineRGB"), ]), - GeometryNodeCategory("GEO_CURVE", "Curve", items=[ - NodeItem("GeometryNodeLegacyCurveSubdivide", poll=geometry_nodes_legacy_poll), - NodeItem("GeometryNodeLegacyCurveReverse", poll=geometry_nodes_legacy_poll), - NodeItem("GeometryNodeLegacyCurveSplineType", poll=geometry_nodes_legacy_poll), - NodeItem("GeometryNodeLegacyCurveSetHandles", poll=geometry_nodes_legacy_poll), - NodeItem("GeometryNodeLegacyCurveSelectHandles", poll=geometry_nodes_legacy_poll), - NodeItem("GeometryNodeLegacyMeshToCurve", poll=geometry_nodes_legacy_poll), - NodeItem("GeometryNodeLegacyCurveToPoints", poll=geometry_nodes_legacy_poll), - NodeItem("GeometryNodeLegacyCurveEndpoints", poll=geometry_nodes_legacy_poll), - - NodeItem("GeometryNodeCurveToMesh"), - NodeItem("GeometryNodeCurveResample"), - NodeItem("GeometryNodeCurveFill"), - NodeItem("GeometryNodeCurveTrim"), - NodeItem("GeometryNodeCurveLength"), - NodeItem("GeometryNodeCurveSplineType"), - NodeItem("GeometryNodeSplineLength"), - NodeItem("GeometryNodeCurveSubdivide"), - NodeItem("GeometryNodeCurveParameter"), - NodeItem("GeometryNodeCurveSetHandles"), - NodeItem("GeometryNodeInputTangent"), - NodeItem("GeometryNodeCurveSample"), - NodeItem("GeometryNodeCurveHandleTypeSelection"), - NodeItem("GeometryNodeCurveFillet"), - NodeItem("GeometryNodeCurveReverse"), - ]), + GeometryNodeCategory("GEO_CURVE", "Curve", items=curve_node_items), GeometryNodeCategory("GEO_PRIMITIVES_CURVE", "Curve Primitives", items=[ NodeItem("GeometryNodeCurvePrimitiveLine"), NodeItem("GeometryNodeCurvePrimitiveCircle"), @@ -562,7 +635,6 @@ geometry_node_categories = [ ]), GeometryNodeCategory("GEO_INPUT", "Input", items=[ NodeItem("FunctionNodeLegacyRandomFloat", poll=geometry_nodes_legacy_poll), - NodeItem("GeometryNodeObjectInfo"), NodeItem("GeometryNodeCollectionInfo"), NodeItem("ShaderNodeValue"), @@ -570,8 +642,9 @@ geometry_node_categories = [ NodeItem("FunctionNodeInputVector"), NodeItem("GeometryNodeInputMaterial"), NodeItem("GeometryNodeIsViewport"), - NodeItem("GeometryNodeInputPosition"), NodeItem("GeometryNodeInputIndex"), + NodeItem("GeometryNodeInputPosition"), + NodeItem("GeometryNodeInputRadius"), NodeItem("GeometryNodeInputNormal"), ]), GeometryNodeCategory("GEO_MATERIAL", "Material", items=[ @@ -582,15 +655,7 @@ geometry_node_categories = [ NodeItem("GeometryNodeMaterialSelection"), NodeItem("GeometryNodeMaterialReplace"), ]), - GeometryNodeCategory("GEO_MESH", "Mesh", items=[ - NodeItem("GeometryNodeLegacyEdgeSplit", poll=geometry_nodes_legacy_poll), - NodeItem("GeometryNodeLegacySubdivisionSurface", poll=geometry_nodes_legacy_poll), - - NodeItem("GeometryNodeBoolean"), - NodeItem("GeometryNodeTriangulate"), - NodeItem("GeometryNodeMeshSubdivide"), - NodeItem("GeometryNodePointsToVertices"), - ]), + GeometryNodeCategory("GEO_MESH", "Mesh", items=mesh_node_items), GeometryNodeCategory("GEO_PRIMITIVES_MESH", "Mesh Primitives", items=[ NodeItem("GeometryNodeMeshCircle"), NodeItem("GeometryNodeMeshCone"), @@ -601,18 +666,7 @@ geometry_node_categories = [ NodeItem("GeometryNodeMeshLine"), NodeItem("GeometryNodeMeshUVSphere"), ]), - GeometryNodeCategory("GEO_POINT", "Point", items=[ - NodeItem("GeometryNodeMeshToPoints"), - NodeItem("GeometryNodeInstanceOnPoints"), - NodeItem("GeometryNodeDistributePointsOnFaces"), - NodeItem("GeometryNodeLegacyPointDistribute", poll=geometry_nodes_legacy_poll), - NodeItem("GeometryNodeLegacyPointInstance", poll=geometry_nodes_legacy_poll), - NodeItem("GeometryNodeLegacyPointSeparate", poll=geometry_nodes_legacy_poll), - NodeItem("GeometryNodeLegacyPointScale", poll=geometry_nodes_legacy_poll), - NodeItem("GeometryNodeLegacyPointTranslate", poll=geometry_nodes_legacy_poll), - NodeItem("GeometryNodeLegacyRotatePoints", poll=geometry_nodes_legacy_poll), - NodeItem("GeometryNodeLegacyAlignRotationToVector", poll=geometry_nodes_legacy_poll), - ]), + GeometryNodeCategory("GEO_POINT", "Point", items=point_node_items), GeometryNodeCategory("GEO_TEXT", "Text", items=[ NodeItem("FunctionNodeStringLength"), NodeItem("FunctionNodeStringSubstring"), -- cgit v1.2.3