[Bf-blender-cvs] [4bc27fcdf0f] temp-geometry-nodes-expandable-geometry-socket-prototype: initial support for adding geometry expander outputs
Jacques Lucke
noreply at git.blender.org
Tue Aug 3 12:08:34 CEST 2021
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);
More information about the Bf-blender-cvs
mailing list