[Bf-blender-cvs] [5a5f5a1350d] temp-geometry-nodes-expandable-geometry-socket-prototype: initial geometry expander node storage

Jacques Lucke noreply at git.blender.org
Tue Aug 3 10:50:23 CEST 2021


Commit: 5a5f5a1350dcfe24f22ec1a7869ab9b82d192596
Author: Jacques Lucke
Date:   Mon Aug 2 16:37:22 2021 +0200
Branches: temp-geometry-nodes-expandable-geometry-socket-prototype
https://developer.blender.org/rB5a5f5a1350dcfe24f22ec1a7869ab9b82d192596

initial geometry expander node storage

===================================================================

M	source/blender/blenkernel/intern/node.cc
M	source/blender/makesdna/DNA_node_types.h
M	source/blender/nodes/geometry/nodes/node_geo_geometry_expander.cc

===================================================================

diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc
index 1a79ef41a7e..9840a30dd07 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -572,6 +572,15 @@ void ntreeBlendWrite(BlendWriter *writer, bNodeTree *ntree)
         }
         BLO_write_struct_by_name(writer, node->typeinfo->storagename, storage);
       }
+      else if (node->type == GEO_NODE_GEOMETRY_EXPANDER) {
+        NodeGeometryGeometryExpander *storage = (NodeGeometryGeometryExpander *)node->storage;
+        BLO_write_struct(writer, NodeGeometryGeometryExpander, storage);
+        BLO_write_struct_list(writer, GeometryExpanderOutput, &storage->outputs);
+        LISTBASE_FOREACH (const GeometryExpanderOutput *, expander_output, &storage->outputs) {
+          BLO_write_string(writer, expander_output->data_identifier);
+          BLO_write_string(writer, expander_output->socket_identifier);
+        }
+      }
       else if (node->typeinfo != &NodeTypeUndefined) {
         BLO_write_struct_by_name(writer, node->typeinfo->storagename, node->storage);
       }
@@ -751,6 +760,15 @@ void ntreeBlendReadData(BlendDataReader *reader, bNodeTree *ntree)
           BLO_read_data_address(reader, &storage->string);
           break;
         }
+        case GEO_NODE_GEOMETRY_EXPANDER: {
+          NodeGeometryGeometryExpander *storage = (NodeGeometryGeometryExpander *)node->storage;
+          BLO_read_list(reader, &storage->outputs);
+          LISTBASE_FOREACH (GeometryExpanderOutput *, expander_output, &storage->outputs) {
+            BLO_read_data_address(reader, &expander_output->socket_identifier);
+            BLO_read_data_address(reader, &expander_output->data_identifier);
+          }
+          break;
+        }
         default:
           break;
       }
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index 5152098f57a..d2bc3d3eb06 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -1418,6 +1418,18 @@ typedef struct NodeGeometryRaycast {
   char _pad[1];
 } NodeGeometryRaycast;
 
+typedef struct GeometryExpanderOutput {
+  int8_t domain;
+  int8_t component_type;
+  char _pad[6];
+  char *data_identifier;
+  char *socket_identifier;
+} GeometryExpanderOutput;
+
+typedef struct NodeGeometryGeometryExpander {
+  ListBase outputs;
+} NodeGeometryExpander;
+
 /* script node mode */
 #define NODE_SCRIPT_INTERNAL 0
 #define NODE_SCRIPT_EXTERNAL 1
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 588b6d0a75c..d9a048ae218 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_geometry_expander.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_geometry_expander.cc
@@ -31,9 +31,52 @@ static bNodeSocketTemplate geo_node_geometry_expander_in[] = {
 
 namespace blender::nodes {
 
+static void geo_node_geometry_expander_layout(uiLayout *UNUSED(layout),
+                                              bContext *UNUSED(C),
+                                              PointerRNA *UNUSED(ptr))
+{
+}
+
 static void geo_node_geometry_expander_exec(GeoNodeExecParams params)
 {
-  UNUSED_VARS(params);
+  NodeGeometryGeometryExpander *storage = (NodeGeometryGeometryExpander *)params.node().storage;
+  UNUSED_VARS(storage);
+}
+
+static void geo_node_geometry_expander_init(bNodeTree *UNUSED(ntree), bNode *node)
+{
+  NodeGeometryGeometryExpander *storage = (NodeGeometryGeometryExpander *)MEM_callocN(
+      sizeof(NodeGeometryGeometryExpander), __func__);
+  node->storage = storage;
+}
+
+static void geo_node_geometry_expander_storage_free(bNode *node)
+{
+  NodeGeometryGeometryExpander *storage = (NodeGeometryGeometryExpander *)node->storage;
+  LISTBASE_FOREACH_MUTABLE (GeometryExpanderOutput *, expander_output, &storage->outputs) {
+    MEM_freeN(expander_output->data_identifier);
+    MEM_freeN(expander_output->socket_identifier);
+    MEM_freeN(expander_output);
+  }
+  MEM_freeN(storage);
+}
+
+static void geo_node_geometry_expander_storage_copy(bNodeTree *UNUSED(dest_ntree),
+                                                    bNode *dst_node,
+                                                    const bNode *src_node)
+{
+  NodeGeometryGeometryExpander *src_storage = (NodeGeometryGeometryExpander *)src_node->storage;
+  NodeGeometryGeometryExpander *dst_storage = (NodeGeometryGeometryExpander *)MEM_callocN(
+      sizeof(NodeGeometryGeometryExpander), __func__);
+  LISTBASE_FOREACH (GeometryExpanderOutput *, src_output, &src_storage->outputs) {
+    GeometryExpanderOutput *dst_output = (GeometryExpanderOutput *)MEM_callocN(
+        sizeof(GeometryExpanderOutput), __func__);
+    *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);
+  }
+  dst_node->storage = dst_storage;
 }
 
 }  // namespace blender::nodes
@@ -45,6 +88,12 @@ void register_node_type_geo_geometry_expander()
   geo_node_type_base(
       &ntype, GEO_NODE_GEOMETRY_EXPANDER, "Geometry Expander", NODE_CLASS_GEOMETRY, 0);
   node_type_socket_templates(&ntype, geo_node_geometry_expander_in, nullptr);
+  node_type_init(&ntype, blender::nodes::geo_node_geometry_expander_init);
+  node_type_storage(&ntype,
+                    "NodeGeometryGeometryExpander",
+                    blender::nodes::geo_node_geometry_expander_storage_free,
+                    blender::nodes::geo_node_geometry_expander_storage_copy);
   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