[Bf-blender-cvs] [8f934852f04] geometry-nodes: Geometry Nodes: initial support for displaying group inputs in modifier

Jacques Lucke noreply at git.blender.org
Tue Oct 27 13:44:54 CET 2020


Commit: 8f934852f04758fef1c4aafbadad1ae599c84503
Author: Jacques Lucke
Date:   Tue Oct 27 13:44:46 2020 +0100
Branches: geometry-nodes
https://developer.blender.org/rB8f934852f04758fef1c4aafbadad1ae599c84503

Geometry Nodes: initial support for displaying group inputs in modifier

This uses the previously added id properties on the nodes modifier
to store values that are passed into the geometry node group.

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

M	source/blender/blenkernel/BKE_node.h
M	source/blender/blenkernel/intern/lib_remap.c
M	source/blender/blenkernel/intern/node.c
M	source/blender/makesrna/RNA_access.h
M	source/blender/makesrna/intern/CMakeLists.txt
M	source/blender/makesrna/intern/rna_modifier.c
M	source/blender/modifiers/CMakeLists.txt
M	source/blender/modifiers/intern/MOD_nodes.cc
A	source/blender/modifiers/intern/MOD_nodes.h

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

diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index 3d8db9a7199..6b63dfe11fb 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -451,7 +451,7 @@ bool ntreeHasType(const struct bNodeTree *ntree, int type);
 bool ntreeHasTree(const struct bNodeTree *ntree, const struct bNodeTree *lookup);
 void ntreeUpdateTree(struct Main *main, struct bNodeTree *ntree);
 void ntreeUpdateAllNew(struct Main *main);
-void ntreeUpdateAllUsers(struct Main *main, struct ID *ngroup);
+void ntreeUpdateAllUsers(struct Main *main, struct bNodeTree *ngroup);
 
 void ntreeGetDependencyList(struct bNodeTree *ntree, struct bNode ***deplist, int *totnodes);
 
diff --git a/source/blender/blenkernel/intern/lib_remap.c b/source/blender/blenkernel/intern/lib_remap.c
index f0031d4191d..9e3189afee9 100644
--- a/source/blender/blenkernel/intern/lib_remap.c
+++ b/source/blender/blenkernel/intern/lib_remap.c
@@ -342,7 +342,7 @@ static void libblock_remap_data_postprocess_obdata_relink(Main *bmain, Object *o
 static void libblock_remap_data_postprocess_nodetree_update(Main *bmain, ID *new_id)
 {
   /* Update all group nodes using a node group. */
-  ntreeUpdateAllUsers(bmain, new_id);
+  ntreeUpdateAllUsers(bmain, (bNodeTree *)new_id);
 }
 
 /**
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index c4fc0745eee..d0d09ea6d21 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -39,6 +39,7 @@
 #include "DNA_light_types.h"
 #include "DNA_linestyle_types.h"
 #include "DNA_material_types.h"
+#include "DNA_modifier_types.h"
 #include "DNA_node_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_simulation_types.h"
@@ -84,6 +85,8 @@
 
 #include "BLO_read_write.h"
 
+#include "intern/MOD_nodes.h"
+
 #define NODE_DEFAULT_MAX_WIDTH 700
 
 /* Fallback types for undefined tree, nodes, sockets */
@@ -3954,14 +3957,14 @@ void ntreeUpdateAllNew(Main *main)
   FOREACH_NODETREE_END;
 }
 
-void ntreeUpdateAllUsers(Main *main, ID *ngroup)
+void ntreeUpdateAllUsers(Main *main, bNodeTree *ngroup)
 {
   /* Update all users of ngroup, to add/remove sockets as needed. */
   FOREACH_NODETREE_BEGIN (main, ntree, owner_id) {
     bool need_update = false;
 
     LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
-      if (node->id == ngroup) {
+      if (node->id == &ngroup->id) {
         if (node->typeinfo->group_update_func) {
           node->typeinfo->group_update_func(ntree, node);
         }
@@ -3975,6 +3978,19 @@ void ntreeUpdateAllUsers(Main *main, ID *ngroup)
     }
   }
   FOREACH_NODETREE_END;
+
+  if (ngroup->type == NTREE_GEOMETRY) {
+    LISTBASE_FOREACH (Object *, object, &main->objects) {
+      LISTBASE_FOREACH (ModifierData *, md, &object->modifiers) {
+        if (md->type == eModifierType_Nodes) {
+          NodesModifierData *nmd = (NodesModifierData *)md;
+          if (nmd->node_group == ngroup) {
+            MOD_nodes_update_interface(nmd);
+          }
+        }
+      }
+    }
+  }
 }
 
 void ntreeUpdateTree(Main *bmain, bNodeTree *ntree)
@@ -4018,7 +4034,7 @@ void ntreeUpdateTree(Main *bmain, bNodeTree *ntree)
   }
 
   if (bmain) {
-    ntreeUpdateAllUsers(bmain, &ntree->id);
+    ntreeUpdateAllUsers(bmain, ntree);
   }
 
   if (ntree->update & (NTREE_UPDATE_LINKS | NTREE_UPDATE_NODES)) {
diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h
index a6601951e3b..bc25a404de8 100644
--- a/source/blender/makesrna/RNA_access.h
+++ b/source/blender/makesrna/RNA_access.h
@@ -567,6 +567,7 @@ extern StructRNA RNA_SimplifyGpencilModifier;
 extern StructRNA RNA_Simulation;
 #ifdef WITH_GEOMETRY_NODES
 extern StructRNA RNA_NodesModifier;
+extern StructRNA RNA_NodesModifierSettings;
 #endif
 extern StructRNA RNA_GeometryNode;
 extern StructRNA RNA_GeometryNodeTree;
diff --git a/source/blender/makesrna/intern/CMakeLists.txt b/source/blender/makesrna/intern/CMakeLists.txt
index d8029ff16a0..1c2f130025d 100644
--- a/source/blender/makesrna/intern/CMakeLists.txt
+++ b/source/blender/makesrna/intern/CMakeLists.txt
@@ -373,6 +373,7 @@ blender_include_dirs(
   ../../ikplugin
   ../../imbuf
   ../../makesdna
+  ../../modifiers
   ../../nodes/
   ../../sequencer
   ../../simulation
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index dde14f6fb47..4c511cd44ac 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -57,6 +57,8 @@
 #include "WM_api.h"
 #include "WM_types.h"
 
+#include "intern/MOD_nodes.h"
+
 const EnumPropertyItem rna_enum_object_modifier_type_items[] = {
     {0, "", 0, N_("Modify"), ""},
     {eModifierType_DataTransfer,
@@ -1606,6 +1608,13 @@ static bool rna_NodesModifier_node_group_poll(PointerRNA *ptr, PointerRNA value)
   return true;
 }
 
+static void rna_NodesModifier_node_group_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+  NodesModifierData *nmd = ptr->data;
+  rna_Modifier_dependency_update(bmain, scene, ptr);
+  MOD_nodes_update_interface(nmd);
+}
+
 static IDProperty *rna_NodesModifierSettings_properties(PointerRNA *ptr, bool create)
 {
   NodesModifierSettings *settings = ptr->data;
@@ -6967,7 +6976,7 @@ static void rna_def_modifier_nodes(BlenderRNA *brna)
   RNA_def_property_ui_text(prop, "Node Group", "Node group that controls what this modifier does");
   RNA_def_property_pointer_funcs(prop, NULL, NULL, NULL, "rna_NodesModifier_node_group_poll");
   RNA_def_property_flag(prop, PROP_EDITABLE);
-  RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
+  RNA_def_property_update(prop, 0, "rna_NodesModifier_node_group_update");
 
   prop = RNA_def_property(srna, "settings", PROP_POINTER, PROP_NONE);
   RNA_def_property_flag(prop, PROP_NEVER_NULL);
diff --git a/source/blender/modifiers/CMakeLists.txt b/source/blender/modifiers/CMakeLists.txt
index bacde95ee20..c5232950453 100644
--- a/source/blender/modifiers/CMakeLists.txt
+++ b/source/blender/modifiers/CMakeLists.txt
@@ -117,6 +117,7 @@ set(SRC
 
   MOD_modifiertypes.h
   intern/MOD_meshcache_util.h
+  intern/MOD_nodes.h
   intern/MOD_solidify_util.h
   intern/MOD_ui_common.h
   intern/MOD_util.h
diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc
index 5c13b6f7ba5..867e29cc093 100644
--- a/source/blender/modifiers/intern/MOD_nodes.cc
+++ b/source/blender/modifiers/intern/MOD_nodes.cc
@@ -62,6 +62,7 @@
 #include "DEG_depsgraph_query.h"
 
 #include "MOD_modifiertypes.h"
+#include "MOD_nodes.h"
 #include "MOD_ui_common.h"
 
 #include "NOD_derived_node_tree.hh"
@@ -323,6 +324,59 @@ class GeometryNodesEvaluator {
   }
 };
 
+static bool get_socket_property_info(bNodeSocket &socket,
+                                     int *r_property_type,
+                                     IDPropertyTemplate *r_default_value)
+{
+  switch (socket.type) {
+    case SOCK_FLOAT: {
+      *r_property_type = IDP_FLOAT;
+      r_default_value->f = ((bNodeSocketValueFloat *)socket.default_value)->value;
+      return true;
+    }
+    case SOCK_INT: {
+      *r_property_type = IDP_INT;
+      r_default_value->i = ((bNodeSocketValueInt *)socket.default_value)->value;
+      return true;
+    }
+    default: {
+      return false;
+    }
+  }
+}
+
+void MOD_nodes_update_interface(NodesModifierData *nmd)
+{
+  if (nmd->node_group == nullptr) {
+    return;
+  }
+  if (nmd->settings.properties == nullptr) {
+    IDPropertyTemplate val = {0};
+    nmd->settings.properties = IDP_New(IDP_GROUP, &val, "Nodes Modifier Settings");
+  }
+
+  LISTBASE_FOREACH (bNodeSocket *, socket, &nmd->node_group->inputs) {
+    const char *identifier = socket->identifier;
+
+    IDPropertyTemplate default_value = {0};
+    int property_type;
+    const bool is_supported = get_socket_property_info(*socket, &property_type, &default_value);
+    if (!is_supported) {
+      continue;
+    }
+
+    IDProperty *property = IDP_GetPropertyFromGroup(nmd->settings.properties, identifier);
+    if (property != nullptr && property->type != property_type) {
+      IDP_FreeFromGroup(nmd->settings.properties, property);
+      property = nullptr;
+    }
+    if (property == nullptr) {
+      property = IDP_New(property_type, &default_value, identifier);
+      IDP_AddToGroup(nmd->settings.properties, property);
+    }
+  }
+}
+
 /**
  * Evaluate a node group to compute the output geometry.
  * Currently, this uses a fairly basic and inefficient algorithm that might compute things more
@@ -469,17 +523,34 @@ static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *UNUSED(ctx)
 
 static void panel_draw(const bContext *UNUSED(C), Panel *panel)
 {
+#ifdef WITH_GEOMETRY_NODES
   uiLayout *layout = panel->layout;
 
   PointerRNA ob_ptr;
   PointerRNA *ptr = modifier_panel_get_property_pointers(panel, &ob_ptr);
+  NodesModifierData *nmd = static_cast<NodesModifierData *>(ptr->data);
 
   uiLayoutSetPropSep(layout, true);
   uiLayoutSetPropDecorate(layout, false);
 
   uiItemR(layout, ptr, "node_group", 0, NULL, ICON_MESH_DATA);
 
+  if (nmd->node_group != nullptr && nmd->settings.properties != nullptr) {
+    PointerRNA settings_ptr;
+    RNA_pointer_create(ptr->owner_id, &RNA_NodesModifierSettings, &nmd->settings, &settings_ptr);
+    LISTBASE_FOREACH (bNodeSocket *, socket, &nmd->node_group->inputs) {
+      IDProperty *property = IDP_GetPropertyFromGroup(nmd->settings.properties,
+                                                      socket->identifier);
+      if (property != nullptr) {
+        char rna_path[128];
+        BLI_snprintf(rna_path, ARRAY_SIZE(rna_path), "[\"%s\"]", socket->identifier);
+        uiItemR(layout, &settings_ptr, rna_path, 0, socket->name, ICON_NONE);
+      }
+    }
+  }
+
   modifier_panel_end(layout, ptr);
+#endif
 }
 
 static void panelRegister(ARegionType *region_type)
diff --git a/source/blender/modifiers/intern/MOD_nodes.h b/source/blender/modifiers/intern/MOD_nodes.h
new file mode 100644
index 00000000000..c218dfd04dc
--- /dev/null
+++ b/source/blender/modifiers/intern/MOD_nodes.h
@@ -0,0 +1,29 @@
+/*
+ * This program is free software; you 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list