From 968b98be560f847d1cf6d797df477bf5329e8493 Mon Sep 17 00:00:00 2001 From: Iliya Katueshenock Date: Mon, 6 May 2024 19:04:30 +0200 Subject: [PATCH] Geometry Nodes: new Input Rotation node This adds a new node input node for a constant rotation. Similar nodes exist for vector, integer, boolean, etc. already. Pull Request: https://projects.blender.org/blender/blender/pulls/120345 --- .../startup/bl_ui/node_add_menu_geometry.py | 1 + source/blender/blenkernel/BKE_node.hh | 1 + source/blender/makesdna/DNA_node_types.h | 4 ++ .../blender/makesrna/intern/rna_nodetree.cc | 12 ++++ source/blender/nodes/NOD_static_types.h | 1 + source/blender/nodes/function/CMakeLists.txt | 1 + .../function/nodes/node_fn_input_rotation.cc | 57 +++++++++++++++++++ 7 files changed, 77 insertions(+) create mode 100644 source/blender/nodes/function/nodes/node_fn_input_rotation.cc diff --git a/scripts/startup/bl_ui/node_add_menu_geometry.py b/scripts/startup/bl_ui/node_add_menu_geometry.py index 4a313d2c964..1aecad347db 100644 --- a/scripts/startup/bl_ui/node_add_menu_geometry.py +++ b/scripts/startup/bl_ui/node_add_menu_geometry.py @@ -262,6 +262,7 @@ def draw(self, _context): node_add_menu.add_node_type(layout, "GeometryNodeInputImage") node_add_menu.add_node_type(layout, "FunctionNodeInputInt") node_add_menu.add_node_type(layout, "GeometryNodeInputMaterial") + node_add_menu.add_node_type(layout, "FunctionNodeInputRotation") node_add_menu.add_node_type(layout, "FunctionNodeInputString") node_add_menu.add_node_type(layout, "ShaderNodeValue") node_add_menu.add_node_type(layout, "FunctionNodeInputVector") diff --git a/source/blender/blenkernel/BKE_node.hh b/source/blender/blenkernel/BKE_node.hh index d50743b1efa..b97ba0c2c78 100644 --- a/source/blender/blenkernel/BKE_node.hh +++ b/source/blender/blenkernel/BKE_node.hh @@ -1342,6 +1342,7 @@ void BKE_nodetree_remove_layer_n(bNodeTree *ntree, Scene *scene, int layer_index #define FN_NODE_ALIGN_ROTATION_TO_VECTOR 1240 #define FN_NODE_COMBINE_MATRIX 1241 #define FN_NODE_SEPARATE_MATRIX 1242 +#define FN_NODE_INPUT_ROTATION 1243 /** \} */ diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index c7fb4e0815b..0f4afd05b4f 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -1559,6 +1559,10 @@ typedef struct NodeInputInt { int integer; } NodeInputInt; +typedef struct NodeInputRotation { + float rotation_euler[3]; +} NodeInputRotation; + typedef struct NodeInputVector { float vector[3]; } NodeInputVector; diff --git a/source/blender/makesrna/intern/rna_nodetree.cc b/source/blender/makesrna/intern/rna_nodetree.cc index 72a9524f742..5a5279a5aa0 100644 --- a/source/blender/makesrna/intern/rna_nodetree.cc +++ b/source/blender/makesrna/intern/rna_nodetree.cc @@ -4490,6 +4490,18 @@ static void def_fn_input_int(StructRNA *srna) RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); } +static void def_fn_input_rotation(StructRNA *srna) +{ + PropertyRNA *prop; + + RNA_def_struct_sdna_from(srna, "NodeInputRotation", "storage"); + + prop = RNA_def_property(srna, "rotation_euler", PROP_FLOAT, PROP_EULER); + RNA_def_property_float_sdna(prop, nullptr, "rotation_euler"); + RNA_def_property_ui_text(prop, "Rotation", "Input value used for unconnected socket"); + RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update"); +} + static void def_fn_input_vector(StructRNA *srna) { PropertyRNA *prop; diff --git a/source/blender/nodes/NOD_static_types.h b/source/blender/nodes/NOD_static_types.h index 63021a3a881..5f09091a805 100644 --- a/source/blender/nodes/NOD_static_types.h +++ b/source/blender/nodes/NOD_static_types.h @@ -277,6 +277,7 @@ DefNode(FunctionNode, FN_NODE_FLOAT_TO_INT, def_float_to_int, "FLOAT_TO_INT", Fl DefNode(FunctionNode, FN_NODE_INPUT_BOOL, def_fn_input_bool, "INPUT_BOOL", InputBool, "Boolean", "") DefNode(FunctionNode, FN_NODE_INPUT_COLOR, def_fn_input_color, "INPUT_COLOR", InputColor, "Color", "") DefNode(FunctionNode, FN_NODE_INPUT_INT, def_fn_input_int, "INPUT_INT", InputInt, "Integer", "") +DefNode(FunctionNode, FN_NODE_INPUT_ROTATION, def_fn_input_rotation, "INPUT_ROTATION", InputRotation, "Rotation", "") DefNode(FunctionNode, FN_NODE_INPUT_SPECIAL_CHARACTERS, 0, "INPUT_SPECIAL_CHARACTERS", InputSpecialCharacters, "Special Characters", "") DefNode(FunctionNode, FN_NODE_INPUT_STRING, def_fn_input_string, "INPUT_STRING", InputString, "String", "") DefNode(FunctionNode, FN_NODE_INPUT_VECTOR, def_fn_input_vector, "INPUT_VECTOR", InputVector, "Vector", "") diff --git a/source/blender/nodes/function/CMakeLists.txt b/source/blender/nodes/function/CMakeLists.txt index 68d4ce662fa..9924eef424f 100644 --- a/source/blender/nodes/function/CMakeLists.txt +++ b/source/blender/nodes/function/CMakeLists.txt @@ -31,6 +31,7 @@ set(SRC nodes/node_fn_input_bool.cc nodes/node_fn_input_color.cc nodes/node_fn_input_int.cc + nodes/node_fn_input_rotation.cc nodes/node_fn_input_special_characters.cc nodes/node_fn_input_string.cc nodes/node_fn_input_vector.cc diff --git a/source/blender/nodes/function/nodes/node_fn_input_rotation.cc b/source/blender/nodes/function/nodes/node_fn_input_rotation.cc new file mode 100644 index 00000000000..d7db37916b7 --- /dev/null +++ b/source/blender/nodes/function/nodes/node_fn_input_rotation.cc @@ -0,0 +1,57 @@ +/* SPDX-FileCopyrightText: 2024 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "BLI_math_euler.hh" +#include "BLI_math_quaternion.hh" + +#include "NOD_socket_search_link.hh" + +#include "node_function_util.hh" + +namespace blender::nodes::node_fn_input_rotation_cc { + +static void node_declare(NodeDeclarationBuilder &b) +{ + b.add_output("Rotation"); +} + +static void node_layout(uiLayout *layout, bContext * /*C*/, PointerRNA *ptr) +{ + uiLayout *col = uiLayoutColumn(layout, true); + uiItemR(col, ptr, "rotation_euler", UI_ITEM_R_EXPAND, "", ICON_NONE); +} + +static void node_build_multi_function(NodeMultiFunctionBuilder &builder) +{ + const bNode &bnode = builder.node(); + const NodeInputRotation &node_storage = *static_cast(bnode.storage); + const math::EulerXYZ euler_rotation(node_storage.rotation_euler[0], + node_storage.rotation_euler[1], + node_storage.rotation_euler[2]); + builder.construct_and_set_matching_fn>( + math::to_quaternion(euler_rotation)); +} + +static void node_init(bNodeTree * /*tree*/, bNode *node) +{ + NodeInputRotation *data = MEM_cnew(__func__); + node->storage = data; +} + +static void node_register() +{ + static bNodeType ntype; + + fn_node_type_base(&ntype, FN_NODE_INPUT_ROTATION, "Rotation", 0); + ntype.declare = node_declare; + ntype.initfunc = node_init; + node_type_storage( + &ntype, "NodeInputRotation", node_free_standard_storage, node_copy_standard_storage); + ntype.build_multi_function = node_build_multi_function; + ntype.draw_buttons = node_layout; + nodeRegisterType(&ntype); +} +NOD_REGISTER_NODE(node_register) + +} // namespace blender::nodes::node_fn_input_rotation_cc