[Bf-blender-cvs] [b6c0c06420a] temp-geometry-nodes-expandable-geometry-socket-prototype: support outputting attribute to modifier

Jacques Lucke noreply at git.blender.org
Fri Aug 6 16:07:12 CEST 2021


Commit: b6c0c06420aebf1d060cd03e7b47198b4881bf40
Author: Jacques Lucke
Date:   Fri Aug 6 16:00:48 2021 +0200
Branches: temp-geometry-nodes-expandable-geometry-socket-prototype
https://developer.blender.org/rBb6c0c06420aebf1d060cd03e7b47198b4881bf40

support outputting attribute to modifier

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

M	source/blender/modifiers/intern/MOD_nodes.cc

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

diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc
index afbddba2294..291efaeb6dd 100644
--- a/source/blender/modifiers/intern/MOD_nodes.cc
+++ b/source/blender/modifiers/intern/MOD_nodes.cc
@@ -79,6 +79,8 @@
 #include "MOD_nodes_evaluator.hh"
 #include "MOD_ui_common.h"
 
+#include "FN_array_cpp_type.hh"
+
 #include "ED_spreadsheet.h"
 
 #include "NOD_derived_node_tree.hh"
@@ -685,6 +687,22 @@ void MOD_nodes_update_interface(Object *object, NodesModifierData *nmd)
       }
     }
   }
+  LISTBASE_FOREACH (bNodeSocket *, socket, &nmd->node_group->outputs) {
+    if (!ELEM(socket->type, SOCK_FLOAT, SOCK_VECTOR, SOCK_BOOLEAN, SOCK_INT, SOCK_RGBA)) {
+      continue;
+    }
+    IDPropertyTemplate prop_template = {0};
+
+    IDProperty *new_prop = IDP_New(IDP_STRING, &prop_template, socket->identifier);
+    IDP_AddToGroup(nmd->settings.properties, new_prop);
+
+    if (old_properties != nullptr) {
+      IDProperty *old_prop = IDP_GetPropertyFromGroup(old_properties, socket->identifier);
+      if (old_prop != nullptr) {
+        IDP_CopyPropertyContent(new_prop, old_prop);
+      }
+    }
+  }
 
   if (old_properties != nullptr) {
     IDP_FreeProperty(old_properties);
@@ -865,7 +883,7 @@ static void clear_runtime_data(NodesModifierData *nmd)
  */
 static GeometrySet compute_geometry(const DerivedNodeTree &tree,
                                     Span<const NodeRef *> group_input_nodes,
-                                    const InputSocketRef &socket_to_compute,
+                                    const NodeRef *group_output_node,
                                     GeometrySet input_geometry_set,
                                     NodesModifierData *nmd,
                                     const ModifierEvalContext *ctx)
@@ -911,7 +929,9 @@ static GeometrySet compute_geometry(const DerivedNodeTree &tree,
   input_geometry_set.clear();
 
   Vector<DInputSocket> group_outputs;
-  group_outputs.append({root_context, &socket_to_compute});
+  for (const InputSocketRef *socket_ref : group_output_node->inputs().drop_back(1)) {
+    group_outputs.append({root_context, socket_ref});
+  }
 
   std::optional<geo_log::GeoLogger> geo_logger;
 
@@ -939,10 +959,43 @@ static GeometrySet compute_geometry(const DerivedNodeTree &tree,
     clear_runtime_data(nmd_orig);
     nmd_orig->runtime_eval_log = new geo_log::ModifierLog(*geo_logger);
   }
+  BLI_assert(eval_params.r_output_values.size() >= 1);
+
+  GMutablePointer result_geometry_ptr = eval_params.r_output_values[0];
+  GeometrySet result_geometry = result_geometry_ptr.relocate_out<GeometrySet>();
 
-  BLI_assert(eval_params.r_output_values.size() == 1);
-  GMutablePointer result = eval_params.r_output_values[0];
-  return result.relocate_out<GeometrySet>();
+  if (result_geometry.has_mesh()) {
+    const GeometryComponentType component_type = GEO_COMPONENT_TYPE_MESH;
+    const AttributeDomain attribute_domain = ATTR_DOMAIN_POINT;
+    GeometryComponent &result_component = result_geometry.get_component_for_write(component_type);
+    const int domain_size = result_component.attribute_domain_size(attribute_domain);
+
+    int output_index = 0;
+    LISTBASE_FOREACH_INDEX (bNodeSocket *, socket, &nmd->node_group->outputs, output_index) {
+      if (!ELEM(socket->type, SOCK_FLOAT, SOCK_VECTOR, SOCK_RGBA, SOCK_INT, SOCK_BOOLEAN)) {
+        continue;
+      }
+      IDProperty *prop = IDP_GetPropertyFromGroup(nmd->settings.properties, socket->identifier);
+      if (prop == nullptr) {
+        continue;
+      }
+      const char *attribute_name = IDP_String(prop);
+      if (StringRef(attribute_name).is_empty()) {
+        continue;
+      }
+
+      GMutablePointer array_ptr = eval_params.r_output_values[output_index];
+      const blender::fn::ArrayCPPType *array_cpp_type =
+          dynamic_cast<const blender::fn::ArrayCPPType *>(array_ptr.type());
+      blender::fn::GVArray_For_RepeatedGSpan array_repeated{
+          domain_size, array_cpp_type->array_span(array_ptr.get())};
+      const CustomDataType data_type = blender::bke::cpp_type_to_custom_data_type(
+          array_cpp_type->element_type());
+      result_component.attribute_try_create(
+          attribute_name, attribute_domain, data_type, AttributeInitVArray{&array_repeated});
+    }
+  }
+  return result_geometry;
 }
 
 /**
@@ -1018,19 +1071,18 @@ static void modifyGeometry(ModifierData *md,
     return;
   }
 
-  Span<const InputSocketRef *> group_outputs = output_nodes[0]->inputs().drop_back(1);
-
-  if (group_outputs.size() == 0) {
+  const NodeRef *output_node = output_nodes[0];
+  if (output_node->inputs().size() <= 1) {
     return;
   }
 
-  const InputSocketRef *group_output = group_outputs[0];
-  if (group_output->idname() != "NodeSocketGeometry") {
+  const InputSocketRef &geometry_output_socket = output_node->input(0);
+  if (geometry_output_socket.idname() != "NodeSocketGeometry") {
     return;
   }
 
   geometry_set = compute_geometry(
-      tree, input_nodes, *group_outputs[0], std::move(geometry_set), nmd, ctx);
+      tree, input_nodes, output_node, std::move(geometry_set), nmd, ctx);
 }
 
 static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
@@ -1149,6 +1201,21 @@ static void panel_draw(const bContext *C, Panel *panel)
     LISTBASE_FOREACH (bNodeSocket *, socket, &nmd->node_group->inputs) {
       draw_property_for_socket(layout, &bmain_ptr, ptr, nmd->settings.properties, *socket);
     }
+    uiItemS(layout);
+    LISTBASE_FOREACH (bNodeSocket *, socket, &nmd->node_group->outputs) {
+      IDProperty *property = IDP_GetPropertyFromGroup(nmd->settings.properties,
+                                                      socket->identifier);
+      if (property == nullptr) {
+        continue;
+      }
+      char socket_id_esc[sizeof(socket->identifier) * 2];
+      BLI_str_escape(socket_id_esc, socket->identifier, sizeof(socket_id_esc));
+
+      char rna_path[1024];
+      BLI_snprintf(rna_path, ARRAY_SIZE(rna_path), "[\"%s\"]", socket_id_esc);
+
+      uiItemR(layout, ptr, rna_path, 0, socket->name, ICON_NONE);
+    }
   }
 
   /* Draw node warnings. */



More information about the Bf-blender-cvs mailing list