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
This commit is contained in:
committed by
Jacques Lucke
parent
2a0a6f18cc
commit
968b98be56
@@ -262,6 +262,7 @@ class NODE_MT_geometry_node_GEO_INPUT_CONSTANT(Menu):
|
||||
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")
|
||||
|
||||
@@ -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
|
||||
|
||||
/** \} */
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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", "")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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<decl::Rotation>("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<const NodeInputRotation *>(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<mf::CustomMF_Constant<math::Quaternion>>(
|
||||
math::to_quaternion(euler_rotation));
|
||||
}
|
||||
|
||||
static void node_init(bNodeTree * /*tree*/, bNode *node)
|
||||
{
|
||||
NodeInputRotation *data = MEM_cnew<NodeInputRotation>(__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
|
||||
Reference in New Issue
Block a user