Commit: 4bc27fcdf0fa48a7cb824721a2a2d54c533223b9 Author: Jacques Lucke Date: Tue Aug 3 11:48:51 2021 +0200 Branches: temp-geometry-nodes-expandable-geometry-socket-prototype https://developer.blender.org/rB4bc27fcdf0fa48a7cb824721a2a2d54c533223b9
initial support for adding geometry expander outputs =================================================================== M source/blender/editors/space_node/node_edit.cc M source/blender/editors/space_node/node_intern.h M source/blender/editors/space_node/node_ops.c M source/blender/makesdna/DNA_node_types.h M source/blender/nodes/geometry/nodes/node_geo_geometry_expander.cc =================================================================== diff --git a/source/blender/editors/space_node/node_edit.cc b/source/blender/editors/space_node/node_edit.cc index cbf03f553f6..70f41d979bc 100644 --- a/source/blender/editors/space_node/node_edit.cc +++ b/source/blender/editors/space_node/node_edit.cc @@ -22,6 +22,7 @@ */ #include <algorithm> +#include <string> #include "MEM_guardedalloc.h" @@ -2976,3 +2977,52 @@ void NODE_OT_cryptomatte_layer_remove(wmOperatorType *ot) /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } + +/* ****************** Geometry Expander Add Output ******************* */ + +static int node_geometry_expander_output_add_exec(bContext *C, wmOperator *UNUSED(op)) +{ + SpaceNode *snode = CTX_wm_space_node(C); + PointerRNA ptr = CTX_data_pointer_get(C, "node"); + bNode *node = (bNode *)ptr.data; + bNodeTree *ntree = (bNodeTree *)ptr.owner_id; + NodeGeometryGeometryExpander *storage = (NodeGeometryGeometryExpander *)node->storage; + + auto to_identifier = [](int id) { return "out_" + std::to_string(id); }; + + int id = 0; + while (nodeFindSocket(node, SOCK_OUT, to_identifier(id).c_str()) != nullptr) { + id++; + } + const std::string identifier = to_identifier(id); + + GeometryExpanderOutput *expander_output = (GeometryExpanderOutput *)MEM_callocN( + sizeof(GeometryExpanderOutput), __func__); + expander_output->data_identifier = BLI_strdup("position"); + expander_output->socket_identifier = BLI_strdup(identifier.c_str()); + expander_output->socket_type = SOCK_FLOAT; + BLI_addtail(&storage->outputs, expander_output); + + nodeUpdate(ntree, node); + ntreeUpdateTree(CTX_data_main(C), ntree); + + snode_notify(C, snode); + snode_dag_update(C, snode); + + return OPERATOR_FINISHED; +} + +void NODE_OT_geometry_expander_output_add(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Add Geometry Expander Output"; + ot->description = "Add geometry expander output"; + ot->idname = "NODE_OT_geometry_expander_output_add"; + + /* callbacks */ + ot->exec = node_geometry_expander_output_add_exec; + ot->poll = ED_operator_node_editable; + + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; +} diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h index df20420e472..73520bf3262 100644 --- a/source/blender/editors/space_node/node_intern.h +++ b/source/blender/editors/space_node/node_intern.h @@ -312,6 +312,8 @@ void NODE_GGT_backdrop_corner_pin(struct wmGizmoGroupType *gzgt); void NODE_OT_cryptomatte_layer_add(struct wmOperatorType *ot); void NODE_OT_cryptomatte_layer_remove(struct wmOperatorType *ot); +void NODE_OT_geometry_expander_output_add(struct wmOperatorType *ot); + /* node_geometry_attribute_search.cc */ void node_geometry_add_attribute_search_button(const struct bContext *C, const struct bNodeTree *node_tree, diff --git a/source/blender/editors/space_node/node_ops.c b/source/blender/editors/space_node/node_ops.c index 610c2889e7a..ffe8e9469da 100644 --- a/source/blender/editors/space_node/node_ops.c +++ b/source/blender/editors/space_node/node_ops.c @@ -124,6 +124,8 @@ void node_operatortypes(void) WM_operatortype_append(NODE_OT_cryptomatte_layer_add); WM_operatortype_append(NODE_OT_cryptomatte_layer_remove); + + WM_operatortype_append(NODE_OT_geometry_expander_output_add); } void ED_operatormacros_node(void) diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index d2bc3d3eb06..22906bc7229 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -1419,9 +1419,14 @@ typedef struct NodeGeometryRaycast { } NodeGeometryRaycast; typedef struct GeometryExpanderOutput { + struct GeometryExpanderOutput *next, *prev; + /* AttributeDomain. */ int8_t domain; + /* GeometryComponentType. */ int8_t component_type; - char _pad[6]; + /* eNodeSocketDatatype. */ + int8_t socket_type; + char _pad[5]; char *data_identifier; char *socket_identifier; } GeometryExpanderOutput; diff --git a/source/blender/nodes/geometry/nodes/node_geo_geometry_expander.cc b/source/blender/nodes/geometry/nodes/node_geo_geometry_expander.cc index d9a048ae218..3298f4b4f95 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_geometry_expander.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_geometry_expander.cc @@ -31,10 +31,11 @@ static bNodeSocketTemplate geo_node_geometry_expander_in[] = { namespace blender::nodes { -static void geo_node_geometry_expander_layout(uiLayout *UNUSED(layout), +static void geo_node_geometry_expander_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *UNUSED(ptr)) { + uiItemO(layout, "Add", ICON_ADD, "node.geometry_expander_output_add"); } static void geo_node_geometry_expander_exec(GeoNodeExecParams params) @@ -50,6 +51,24 @@ static void geo_node_geometry_expander_init(bNodeTree *UNUSED(ntree), bNode *nod node->storage = storage; } +static void geo_node_geometry_expander_update(bNodeTree *ntree, bNode *node) +{ + NodeGeometryGeometryExpander *storage = (NodeGeometryGeometryExpander *)node->storage; + LISTBASE_FOREACH_MUTABLE (bNodeSocket *, socket, &node->outputs) { + nodeRemoveSocket(ntree, node, socket); + } + LISTBASE_FOREACH (GeometryExpanderOutput *, expander_output, &storage->outputs) { + const char *idname = nodeStaticSocketType(expander_output->socket_type, PROP_NONE); + nodeAddSocket(ntree, + node, + SOCK_OUT, + idname, + expander_output->socket_identifier, + expander_output->data_identifier); + } + // nodeAddSocket(ntree, node, SOCK_OUT, "NodeSocketFloat", "") +} + static void geo_node_geometry_expander_storage_free(bNode *node) { NodeGeometryGeometryExpander *storage = (NodeGeometryGeometryExpander *)node->storage; @@ -74,7 +93,7 @@ static void geo_node_geometry_expander_storage_copy(bNodeTree *UNUSED(dest_ntree *dst_output = *src_output; dst_output->data_identifier = (char *)MEM_dupallocN(src_output->data_identifier); dst_output->socket_identifier = (char *)MEM_dupallocN(src_output->socket_identifier); - BLI_addtail(&dst_storage->outputs, src_output); + BLI_addtail(&dst_storage->outputs, dst_output); } dst_node->storage = dst_storage; } @@ -93,6 +112,7 @@ void register_node_type_geo_geometry_expander() "NodeGeometryGeometryExpander", blender::nodes::geo_node_geometry_expander_storage_free, blender::nodes::geo_node_geometry_expander_storage_copy); + node_type_update(&ntype, blender::nodes::geo_node_geometry_expander_update); ntype.geometry_node_execute = blender::nodes::geo_node_geometry_expander_exec; ntype.draw_buttons = blender::nodes::geo_node_geometry_expander_layout; nodeRegisterType(&ntype); _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs