diff options
Diffstat (limited to 'source/blender/nodes')
-rw-r--r-- | source/blender/nodes/CMakeLists.txt | 1 | ||||
-rw-r--r-- | source/blender/nodes/NOD_function.h | 1 | ||||
-rw-r--r-- | source/blender/nodes/NOD_static_types.h | 1 | ||||
-rw-r--r-- | source/blender/nodes/function/nodes/node_fn_input_string.cc | 84 |
4 files changed, 87 insertions, 0 deletions
diff --git a/source/blender/nodes/CMakeLists.txt b/source/blender/nodes/CMakeLists.txt index c9eb0c43bba..8c5081555fc 100644 --- a/source/blender/nodes/CMakeLists.txt +++ b/source/blender/nodes/CMakeLists.txt @@ -135,6 +135,7 @@ set(SRC function/nodes/node_fn_combine_strings.cc function/nodes/node_fn_float_compare.cc function/nodes/node_fn_group_instance_id.cc + function/nodes/node_fn_input_string.cc function/nodes/node_fn_input_vector.cc function/nodes/node_fn_object_transforms.cc function/nodes/node_fn_random_float.cc diff --git a/source/blender/nodes/NOD_function.h b/source/blender/nodes/NOD_function.h index b5279f7d914..6b184f04af7 100644 --- a/source/blender/nodes/NOD_function.h +++ b/source/blender/nodes/NOD_function.h @@ -24,6 +24,7 @@ void register_node_type_fn_boolean_math(void); void register_node_type_fn_combine_strings(void); void register_node_type_fn_float_compare(void); void register_node_type_fn_group_instance_id(void); +void register_node_type_fn_input_string(void); void register_node_type_fn_input_vector(void); void register_node_type_fn_object_transforms(void); void register_node_type_fn_random_float(void); diff --git a/source/blender/nodes/NOD_static_types.h b/source/blender/nodes/NOD_static_types.h index 962ad70eda4..35550bdec48 100644 --- a/source/blender/nodes/NOD_static_types.h +++ b/source/blender/nodes/NOD_static_types.h @@ -267,6 +267,7 @@ DefNode(FunctionNode, FN_NODE_COMBINE_STRINGS, 0, "COMBINE_STRINGS DefNode(FunctionNode, FN_NODE_OBJECT_TRANSFORMS, 0, "OBJECT_TRANSFORMS", ObjectTransforms, "Object Transforms", "") DefNode(FunctionNode, FN_NODE_RANDOM_FLOAT, 0, "RANDOM_FLOAT", RandomFloat, "Random Float", "") DefNode(FunctionNode, FN_NODE_INPUT_VECTOR, def_fn_input_vector, "INPUT_VECTOR", InputVector, "Vector", "") +DefNode(FunctionNode, FN_NODE_INPUT_STRING, def_fn_input_string, "INPUT_STRING", InputString, "String", "") DefNode(GeometryNode, GEO_NODE_TRIANGULATE, def_geo_triangulate, "TRIANGULATE", Triangulate, "Triangulate", "") DefNode(GeometryNode, GEO_NODE_EDGE_SPLIT, 0, "EDGE_SPLIT", EdgeSplit, "Edge Split", "") diff --git a/source/blender/nodes/function/nodes/node_fn_input_string.cc b/source/blender/nodes/function/nodes/node_fn_input_string.cc new file mode 100644 index 00000000000..f16bdef2f38 --- /dev/null +++ b/source/blender/nodes/function/nodes/node_fn_input_string.cc @@ -0,0 +1,84 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "node_function_util.hh" + +#include "UI_interface.h" +#include "UI_resources.h" + +static bNodeSocketTemplate fn_node_input_string_out[] = { + {SOCK_STRING, N_("String")}, + {-1, ""}, +}; + +static void fn_node_input_string_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiItemR(layout, ptr, "string", 0, "", ICON_NONE); +} + +static void fn_node_input_string_expand_in_mf_network( + blender::nodes::NodeMFNetworkBuilder &builder) +{ + bNode &bnode = builder.bnode(); + NodeInputString *node_storage = static_cast<NodeInputString *>(bnode.storage); + std::string string = std::string((node_storage->string) ? node_storage->string : ""); + + builder.construct_and_set_matching_fn<blender::fn::CustomMF_Constant<std::string>>(string); +} + +static void fn_node_input_string_init(bNodeTree *UNUSED(ntree), bNode *node) +{ + node->storage = MEM_callocN(sizeof(NodeInputString), __func__); +} + +static void fn_node_input_string_free(bNode *node) +{ + NodeInputString *storage = (NodeInputString *)node->storage; + if (storage == nullptr) { + return; + } + if (storage->string != nullptr) { + MEM_freeN(storage->string); + } + MEM_freeN(storage); +} + +static void fn_node_string_copy(bNodeTree *UNUSED(dest_ntree), + bNode *dest_node, + const bNode *src_node) +{ + NodeInputString *source_storage = (NodeInputString *)src_node->storage; + NodeInputString *destination_storage = (NodeInputString *)MEM_dupallocN(source_storage); + + if (source_storage->string) { + destination_storage->string = (char *)MEM_dupallocN(source_storage->string); + } + + dest_node->storage = destination_storage; +} + +void register_node_type_fn_input_string() +{ + static bNodeType ntype; + + fn_node_type_base(&ntype, FN_NODE_INPUT_STRING, "String", NODE_CLASS_INPUT, 0); + node_type_socket_templates(&ntype, nullptr, fn_node_input_string_out); + node_type_init(&ntype, fn_node_input_string_init); + node_type_storage(&ntype, "NodeInputString", fn_node_input_string_free, fn_node_string_copy); + ntype.expand_in_mf_network = fn_node_input_string_expand_in_mf_network; + ntype.draw_buttons = fn_node_input_string_layout; + nodeRegisterType(&ntype); +} |