diff --git a/scripts/startup/bl_ui/node_add_menu_geometry.py b/scripts/startup/bl_ui/node_add_menu_geometry.py index 52d3d3e77d3..bd275f29c9c 100644 --- a/scripts/startup/bl_ui/node_add_menu_geometry.py +++ b/scripts/startup/bl_ui/node_add_menu_geometry.py @@ -610,6 +610,7 @@ class NODE_MT_category_utilities_matrix(Menu): node_add_menu.add_node_type(layout, "FunctionNodeCombineTransform") node_add_menu.add_node_type(layout, "FunctionNodeInvertMatrix") node_add_menu.add_node_type(layout, "FunctionNodeMatrixMultiply") + node_add_menu.add_node_type(layout, "FunctionNodeProjectPoint") node_add_menu.add_node_type(layout, "FunctionNodeSeparateTransform") node_add_menu.add_node_type(layout, "FunctionNodeTransformDirection") node_add_menu.add_node_type(layout, "FunctionNodeTransformPoint") diff --git a/source/blender/blenkernel/BKE_node.hh b/source/blender/blenkernel/BKE_node.hh index 7baefcc2b72..da8bf5f785e 100644 --- a/source/blender/blenkernel/BKE_node.hh +++ b/source/blender/blenkernel/BKE_node.hh @@ -1320,6 +1320,7 @@ void BKE_nodetree_remove_layer_n(bNodeTree *ntree, Scene *scene, int layer_index #define FN_NODE_SEPARATE_TRANSFORM 1236 #define FN_NODE_INVERT_MATRIX 1237 #define FN_NODE_TRANSPOSE_MATRIX 1238 +#define FN_NODE_PROJECT_POINT 1239 /** \} */ diff --git a/source/blender/nodes/NOD_static_types.h b/source/blender/nodes/NOD_static_types.h index fff18d44a50..9613abd3f99 100644 --- a/source/blender/nodes/NOD_static_types.h +++ b/source/blender/nodes/NOD_static_types.h @@ -280,6 +280,7 @@ DefNode(FunctionNode, FN_NODE_INPUT_VECTOR, def_fn_input_vector, "INPUT_VECTOR", DefNode(FunctionNode, FN_NODE_INVERT_MATRIX, 0, "INVERT_MATRIX", InvertMatrix, "Invert Matrix", "") DefNode(FunctionNode, FN_NODE_INVERT_ROTATION, 0, "INVERT_ROTATION", InvertRotation, "Invert Rotation", "") DefNode(FunctionNode, FN_NODE_MATRIX_MULTIPLY, 0, "MATRIX_MULTIPLY", MatrixMultiply, "Multiply Matrices", "") +DefNode(FunctionNode, FN_NODE_PROJECT_POINT, 0, "PROJECT_POINT", ProjectPoint, "Project Point", "Project a point using a matrix, using location, rotation, scale, and perspective divide") 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_ROTATE_EULER, def_fn_rotate_euler, "ROTATE_EULER", RotateEuler, "Rotate Euler", "") diff --git a/source/blender/nodes/function/CMakeLists.txt b/source/blender/nodes/function/CMakeLists.txt index 03bd7118884..2807d84d110 100644 --- a/source/blender/nodes/function/CMakeLists.txt +++ b/source/blender/nodes/function/CMakeLists.txt @@ -35,6 +35,7 @@ set(SRC nodes/node_fn_invert_matrix.cc nodes/node_fn_invert_rotation.cc nodes/node_fn_matrix_multiply.cc + nodes/node_fn_project_point.cc nodes/node_fn_quaternion_to_rotation.cc nodes/node_fn_random_value.cc nodes/node_fn_replace_string.cc diff --git a/source/blender/nodes/function/nodes/node_fn_project_point.cc b/source/blender/nodes/function/nodes/node_fn_project_point.cc new file mode 100644 index 00000000000..3cc9362c383 --- /dev/null +++ b/source/blender/nodes/function/nodes/node_fn_project_point.cc @@ -0,0 +1,37 @@ +/* SPDX-FileCopyrightText: 2024 Blender Authors + * + * SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "BLI_math_matrix.hh" + +#include "node_function_util.hh" + +namespace blender::nodes::node_fn_project_point_cc { + +static void node_declare(NodeDeclarationBuilder &b) +{ + b.is_function_node(); + b.add_input("Vector").subtype(PROP_XYZ); + b.add_input("Transform"); + b.add_output("Vector").subtype(PROP_XYZ); +} + +static void node_build_multi_function(NodeMultiFunctionBuilder &builder) +{ + static auto fn = mf::build::SI2_SO( + "Project Point", + [](float3 point, float4x4 matrix) { return math::project_point(matrix, point); }); + builder.set_matching_fn(fn); +} + +static void node_register() +{ + static bNodeType ntype; + fn_node_type_base(&ntype, FN_NODE_PROJECT_POINT, "Project Point", NODE_CLASS_CONVERTER); + ntype.declare = node_declare; + ntype.build_multi_function = node_build_multi_function; + nodeRegisterType(&ntype); +} +NOD_REGISTER_NODE(node_register) + +} // namespace blender::nodes::node_fn_project_point_cc