Matrix operations and sockets for geometry nodes #105408
|
@ -564,6 +564,7 @@ class NODE_MT_category_GEO_UTILITIES_MATRIX(Menu):
|
||||||
node_add_menu.add_node_type(layout, "FunctionNodeSeparateMatrix")
|
node_add_menu.add_node_type(layout, "FunctionNodeSeparateMatrix")
|
||||||
node_add_menu.add_node_type(layout, "FunctionNodeDecomposeMatrix")
|
node_add_menu.add_node_type(layout, "FunctionNodeDecomposeMatrix")
|
||||||
node_add_menu.add_node_type(layout, "FunctionNodeMatrixMath")
|
node_add_menu.add_node_type(layout, "FunctionNodeMatrixMath")
|
||||||
|
node_add_menu.add_node_type(layout, "FunctionNodeMatrixTransform")
|
||||||
node_add_menu.add_node_type(layout, "FunctionNodeRotateMatrix")
|
node_add_menu.add_node_type(layout, "FunctionNodeRotateMatrix")
|
||||||
node_add_menu.add_node_type(layout, "FunctionNodeScaleMatrix")
|
node_add_menu.add_node_type(layout, "FunctionNodeScaleMatrix")
|
||||||
node_add_menu.add_node_type(layout, "FunctionNodeTranslateMatrix")
|
node_add_menu.add_node_type(layout, "FunctionNodeTranslateMatrix")
|
||||||
|
|
|
@ -1588,6 +1588,7 @@ void BKE_nodetree_remove_layer_n(struct bNodeTree *ntree, struct Scene *scene, i
|
||||||
#define FN_NODE_ROTATE_MATRIX 1229
|
#define FN_NODE_ROTATE_MATRIX 1229
|
||||||
#define FN_NODE_SCALE_MATRIX 1230
|
#define FN_NODE_SCALE_MATRIX 1230
|
||||||
#define FN_NODE_TRANSLATE_MATRIX 1231
|
#define FN_NODE_TRANSLATE_MATRIX 1231
|
||||||
|
#define FN_NODE_MATRIX_TRANSFORM 1232
|
||||||
|
|
||||||
/** \} */
|
/** \} */
|
||||||
|
|
||||||
|
|
|
@ -1919,6 +1919,12 @@ typedef enum NodeMatrixMathOperation {
|
||||||
//NODE_MATRIX_MATH_IS_ORTHOGONAL = 10,
|
//NODE_MATRIX_MATH_IS_ORTHOGONAL = 10,
|
||||||
} NodeMatrixMathOperation;
|
} NodeMatrixMathOperation;
|
||||||
|
|
||||||
|
typedef enum NodeMatrixTransformVectorMode {
|
||||||
|
NODE_MATRIX_TRANSFORM_POINT = 0,
|
||||||
|
NODE_MATRIX_TRANSFORM_DIRECTION = 1,
|
||||||
|
NODE_MATRIX_TRANSFORM_NORMAL = 2,
|
||||||
|
} NodeMatrixTransformVectorMode;
|
||||||
|
|
||||||
typedef enum NodeBooleanMathOperation {
|
typedef enum NodeBooleanMathOperation {
|
||||||
NODE_BOOLEAN_MATH_AND = 0,
|
NODE_BOOLEAN_MATH_AND = 0,
|
||||||
NODE_BOOLEAN_MATH_OR = 1,
|
NODE_BOOLEAN_MATH_OR = 1,
|
||||||
|
|
|
@ -308,6 +308,13 @@ const EnumPropertyItem rna_enum_node_matrix_math_items[] = {
|
||||||
{0, NULL, 0, NULL, NULL},
|
{0, NULL, 0, NULL, NULL},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const EnumPropertyItem rna_enum_node_matrix_transform_vector_mode_items[] = {
|
||||||
|
{NODE_MATRIX_TRANSFORM_POINT, "POINT", 0, "Point", "Apply translation, rotation and scale"},
|
||||||
|
{NODE_MATRIX_TRANSFORM_DIRECTION, "DIRECTION", 0, "Direction", "Apply only rotation and scale"},
|
||||||
|
{NODE_MATRIX_TRANSFORM_NORMAL, "NORMAL", 0, "Normal", "Apply inverse transpose of the matrix for surface normals"},
|
||||||
|
{0, NULL, 0, NULL, NULL},
|
||||||
|
};
|
||||||
|
|
||||||
const EnumPropertyItem rna_enum_node_boolean_math_items[] = {
|
const EnumPropertyItem rna_enum_node_boolean_math_items[] = {
|
||||||
{NODE_BOOLEAN_MATH_AND, "AND", 0, "And", "True when both inputs are true"},
|
{NODE_BOOLEAN_MATH_AND, "AND", 0, "And", "True when both inputs are true"},
|
||||||
{NODE_BOOLEAN_MATH_OR, "OR", 0, "Or", "True when at least one input is true"},
|
{NODE_BOOLEAN_MATH_OR, "OR", 0, "Or", "True when at least one input is true"},
|
||||||
|
@ -5291,6 +5298,17 @@ static void def_fn_matrix_math(StructRNA *srna)
|
||||||
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
|
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void def_fn_matrix_transform(StructRNA *srna)
|
||||||
|
{
|
||||||
|
PropertyRNA *prop;
|
||||||
|
|
||||||
|
prop = RNA_def_property(srna, "vector_mode", PROP_ENUM, PROP_NONE);
|
||||||
|
RNA_def_property_enum_sdna(prop, NULL, "custom1");
|
||||||
|
RNA_def_property_enum_items(prop, rna_enum_node_matrix_transform_vector_mode_items);
|
||||||
|
RNA_def_property_ui_text(prop, "Vector Mode", "");
|
||||||
|
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
|
||||||
|
}
|
||||||
|
|
||||||
/* -- Shader Nodes ---------------------------------------------------------- */
|
/* -- Shader Nodes ---------------------------------------------------------- */
|
||||||
|
|
||||||
static void def_sh_output(StructRNA *srna)
|
static void def_sh_output(StructRNA *srna)
|
||||||
|
|
|
@ -276,6 +276,7 @@ DefNode(FunctionNode, FN_NODE_INPUT_SPECIAL_CHARACTERS, 0, "INPUT_SPECIAL_CHARAC
|
||||||
DefNode(FunctionNode, FN_NODE_INPUT_STRING, def_fn_input_string, "INPUT_STRING", InputString, "String", "")
|
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", "")
|
DefNode(FunctionNode, FN_NODE_INPUT_VECTOR, def_fn_input_vector, "INPUT_VECTOR", InputVector, "Vector", "")
|
||||||
DefNode(FunctionNode, FN_NODE_MATRIX_MATH, def_fn_matrix_math, "MATRIX_MATH", MatrixMath, "Matrix Math", "")
|
DefNode(FunctionNode, FN_NODE_MATRIX_MATH, def_fn_matrix_math, "MATRIX_MATH", MatrixMath, "Matrix Math", "")
|
||||||
|
DefNode(FunctionNode, FN_NODE_MATRIX_TRANSFORM, def_fn_matrix_transform, "MATRIX_TRANSFORM", MatrixTransform, "Matrix Transform", "")
|
||||||
DefNode(FunctionNode, FN_NODE_RANDOM_VALUE, def_fn_random_value, "RANDOM_VALUE", RandomValue, "Random Value", "")
|
DefNode(FunctionNode, FN_NODE_RANDOM_VALUE, def_fn_random_value, "RANDOM_VALUE", RandomValue, "Random Value", "")
|
||||||
DefNode(FunctionNode, FN_NODE_REPLACE_STRING, 0, "REPLACE_STRING", ReplaceString, "Replace String", "")
|
DefNode(FunctionNode, FN_NODE_REPLACE_STRING, 0, "REPLACE_STRING", ReplaceString, "Replace String", "")
|
||||||
DefNode(FunctionNode, FN_NODE_ROTATE_EULER, def_fn_rotate_euler, "ROTATE_EULER", RotateEuler, "Rotate Euler", "")
|
DefNode(FunctionNode, FN_NODE_ROTATE_EULER, def_fn_rotate_euler, "ROTATE_EULER", RotateEuler, "Rotate Euler", "")
|
||||||
|
|
|
@ -35,6 +35,7 @@ set(SRC
|
||||||
nodes/node_fn_input_string.cc
|
nodes/node_fn_input_string.cc
|
||||||
nodes/node_fn_input_vector.cc
|
nodes/node_fn_input_vector.cc
|
||||||
nodes/node_fn_matrix_math.cc
|
nodes/node_fn_matrix_math.cc
|
||||||
|
nodes/node_fn_matrix_transform.cc
|
||||||
nodes/node_fn_random_value.cc
|
nodes/node_fn_random_value.cc
|
||||||
nodes/node_fn_replace_string.cc
|
nodes/node_fn_replace_string.cc
|
||||||
nodes/node_fn_rotate_euler.cc
|
nodes/node_fn_rotate_euler.cc
|
||||||
|
|
|
@ -21,6 +21,7 @@ void register_function_nodes()
|
||||||
register_node_type_fn_input_string();
|
register_node_type_fn_input_string();
|
||||||
register_node_type_fn_input_vector();
|
register_node_type_fn_input_vector();
|
||||||
register_node_type_fn_matrix_math();
|
register_node_type_fn_matrix_math();
|
||||||
|
register_node_type_fn_matrix_transform();
|
||||||
register_node_type_fn_random_value();
|
register_node_type_fn_random_value();
|
||||||
register_node_type_fn_replace_string();
|
register_node_type_fn_replace_string();
|
||||||
register_node_type_fn_rotate_euler();
|
register_node_type_fn_rotate_euler();
|
||||||
|
|
|
@ -17,6 +17,7 @@ void register_node_type_fn_input_special_characters();
|
||||||
void register_node_type_fn_input_string();
|
void register_node_type_fn_input_string();
|
||||||
void register_node_type_fn_input_vector();
|
void register_node_type_fn_input_vector();
|
||||||
void register_node_type_fn_matrix_math();
|
void register_node_type_fn_matrix_math();
|
||||||
|
void register_node_type_fn_matrix_transform();
|
||||||
void register_node_type_fn_random_value();
|
void register_node_type_fn_random_value();
|
||||||
void register_node_type_fn_replace_string();
|
void register_node_type_fn_replace_string();
|
||||||
void register_node_type_fn_rotate_euler();
|
void register_node_type_fn_rotate_euler();
|
||||||
|
|
|
@ -0,0 +1,87 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||||
|
|
||||||
|
#include "node_function_util.hh"
|
||||||
|
|
||||||
|
#include "BLI_math_matrix.hh"
|
||||||
|
|
||||||
|
#include "UI_interface.h"
|
||||||
|
#include "UI_resources.h"
|
||||||
|
|
||||||
|
namespace blender::nodes::node_fn_matrix_transform_cc {
|
||||||
|
|
||||||
|
static void node_declare(NodeDeclarationBuilder &b)
|
||||||
|
{
|
||||||
|
b.is_function_node();
|
||||||
|
b.add_input<decl::Matrix4x4>(N_("Matrix"));
|
||||||
|
b.add_input<decl::Vector>(N_("Vector"));
|
||||||
|
b.add_output<decl::Vector>(N_("Vector"));
|
||||||
|
};
|
||||||
|
|
||||||
|
static void node_layout(uiLayout *layout, bContext * /*C*/, PointerRNA *ptr)
|
||||||
|
{
|
||||||
|
uiItemR(layout, ptr, "vector_mode", UI_ITEM_R_SPLIT_EMPTY_NAME, "", ICON_NONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void node_init(bNodeTree * /*tree*/, bNode *node)
|
||||||
|
{
|
||||||
|
node->custom1 = NODE_MATRIX_TRANSFORM_POINT;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const mf::MultiFunction *get_multi_function(NodeMatrixTransformVectorMode vector_mode)
|
||||||
|
{
|
||||||
|
static auto exec_preset = mf::build::exec_presets::AllSpanOrSingle();
|
||||||
|
|
||||||
|
switch (vector_mode) {
|
||||||
|
case NODE_MATRIX_TRANSFORM_POINT: {
|
||||||
|
static auto fn = mf::build::SI2_SO<float4x4, float3, float3>(
|
||||||
|
"transform_point",
|
||||||
|
[](const float4x4 &m, const float3 &v) -> float3 { return math::transform_point(m, v); },
|
||||||
|
exec_preset);
|
||||||
|
return &fn;
|
||||||
|
}
|
||||||
|
case NODE_MATRIX_TRANSFORM_DIRECTION: {
|
||||||
|
static auto fn = mf::build::SI2_SO<float4x4, float3, float3>(
|
||||||
|
"transform_direction",
|
||||||
|
[](const float4x4 &m, const float3 &v) -> float3 { return math::transform_direction(m, v); },
|
||||||
|
exec_preset);
|
||||||
|
return &fn;
|
||||||
|
}
|
||||||
|
case NODE_MATRIX_TRANSFORM_NORMAL: {
|
||||||
|
static auto fn = mf::build::SI2_SO<float4x4, float3, float3>(
|
||||||
|
"transform_normal",
|
||||||
|
[](const float4x4 &m, const float3 &v) -> float3 {
|
||||||
|
const float3x3 transpose_inverse = math::transpose(
|
||||||
|
math::invert(float3x3(m.view<3, 3>())));
|
||||||
|
return math::transform_direction(transpose_inverse, v);
|
||||||
|
},
|
||||||
|
exec_preset);
|
||||||
|
return &fn;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void node_build_multi_function(NodeMultiFunctionBuilder &builder)
|
||||||
|
{
|
||||||
|
const NodeMatrixTransformVectorMode vector_mode = (NodeMatrixTransformVectorMode)builder.node().custom1;
|
||||||
|
const mf::MultiFunction *fn = get_multi_function(vector_mode);
|
||||||
|
builder.set_matching_fn(fn);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace blender::nodes::node_fn_matrix_transform_cc
|
||||||
|
|
||||||
|
void register_node_type_fn_matrix_transform(void)
|
||||||
|
{
|
||||||
|
namespace file_ns = blender::nodes::node_fn_matrix_transform_cc;
|
||||||
|
|
||||||
|
static bNodeType ntype;
|
||||||
|
|
||||||
|
fn_node_type_base(&ntype, FN_NODE_MATRIX_TRANSFORM, "Matrix Transform", NODE_CLASS_CONVERTER);
|
||||||
|
ntype.declare = file_ns::node_declare;
|
||||||
|
ntype.initfunc = file_ns::node_init;
|
||||||
|
ntype.draw_buttons = file_ns::node_layout;
|
||||||
|
ntype.build_multi_function = file_ns::node_build_multi_function;
|
||||||
|
|
||||||
|
nodeRegisterType(&ntype);
|
||||||
|
}
|
Loading…
Reference in New Issue