[Bf-blender-cvs] [76c356c12ec] geometry-nodes: Geometry Nodes: store id properties in nodes modifier

Jacques Lucke noreply at git.blender.org
Mon Oct 26 17:55:37 CET 2020


Commit: 76c356c12ec734d4d42347b39994fc38dc345c28
Author: Jacques Lucke
Date:   Mon Oct 26 17:53:44 2020 +0100
Branches: geometry-nodes
https://developer.blender.org/rB76c356c12ec734d4d42347b39994fc38dc345c28

Geometry Nodes: store id properties in nodes modifier

The properties are not used yet, but can already be accessed with Python
using `modifier.settings['setting name']`.

The plan is to use id properties to store the parameters that the modifier
passes into the geometry node group.

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

M	source/blender/makesdna/DNA_modifier_types.h
M	source/blender/makesrna/intern/rna_modifier.c
M	source/blender/modifiers/intern/MOD_nodes.cc

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

diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index a077e3c3f43..bb4aa5f2f30 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -2219,10 +2219,17 @@ enum {
 #define MOD_MESHSEQ_READ_ALL \
   (MOD_MESHSEQ_READ_VERT | MOD_MESHSEQ_READ_POLY | MOD_MESHSEQ_READ_UV | MOD_MESHSEQ_READ_COLOR)
 
+typedef struct NodesModifierSettings {
+  /* This stores data that is passed into the node group. */
+  struct IDProperty *properties;
+} NodesModifierSettings;
+
 typedef struct NodesModifierData {
   ModifierData modifier;
   struct bNodeTree *node_group;
 
+  struct NodesModifierSettings settings;
+
   /* This property exists only temporary for testing purposes. */
   float test_float_input;
   char _pad[4];
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index af5892d8933..d1696c8ee60 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -42,6 +42,7 @@
 #include "BKE_dynamicpaint.h"
 #include "BKE_effect.h"
 #include "BKE_fluid.h" /* For BKE_fluid_modifier_free & BKE_fluid_modifier_create_type_data */
+#include "BKE_idprop.h"
 #include "BKE_mesh_mapping.h"
 #include "BKE_mesh_remap.h"
 #include "BKE_multires.h"
@@ -1605,6 +1606,21 @@ static bool rna_NodesModifier_node_group_poll(PointerRNA *ptr, PointerRNA value)
   return true;
 }
 
+static IDProperty *rna_NodesModifierSettings_properties(PointerRNA *ptr, bool create)
+{
+  NodesModifierSettings *settings = ptr->data;
+  if (create && settings->properties == NULL) {
+    IDPropertyTemplate val = {0};
+    settings->properties = IDP_New(IDP_GROUP, &val, "Nodes Modifier Settings");
+  }
+  return settings->properties;
+}
+
+static char *rna_NodesModifierSettings_path(PointerRNA *UNUSED(ptr))
+{
+  return BLI_strdup("settings");
+}
+
 #else
 
 /* NOTE: *MUST* return subdivision_type property. */
@@ -6923,6 +6939,18 @@ static void rna_def_modifier_weightednormal(BlenderRNA *brna)
 }
 
 #  ifdef WITH_GEOMETRY_NODES
+static void rna_def_modifier_nodes_settings(BlenderRNA *brna)
+{
+  StructRNA *srna;
+
+  srna = RNA_def_struct(brna, "NodesModifierSettings", NULL);
+  RNA_def_struct_nested(brna, srna, "NodesModifier");
+  RNA_def_struct_path_func(srna, "rna_NodesModifierSettings_path");
+  RNA_def_struct_ui_text(
+      srna, "Nodes Modifier Settings", "Settings that are passed into the node group");
+  RNA_def_struct_idprops_func(srna, "rna_NodesModifierSettings_properties");
+}
+
 static void rna_def_modifier_nodes(BlenderRNA *brna)
 {
   StructRNA *srna;
@@ -6941,11 +6969,17 @@ static void rna_def_modifier_nodes(BlenderRNA *brna)
   RNA_def_property_flag(prop, PROP_EDITABLE);
   RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
 
+  prop = RNA_def_property(srna, "settings", PROP_POINTER, PROP_NONE);
+  RNA_def_property_flag(prop, PROP_NEVER_NULL);
+  RNA_def_property_ui_text(prop, "Settings", "Settings that are passed into the node group");
+
   prop = RNA_def_property(srna, "test_float_input", PROP_FLOAT, PROP_NONE);
   RNA_def_property_ui_text(prop, "Float Input", "Temporary float input for testing purposes");
   RNA_def_property_update(prop, 0, "rna_Modifier_dependency_update");
 
   RNA_define_lib_overridable(false);
+
+  rna_def_modifier_nodes_settings(brna);
 }
 #  endif
 
diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc
index 5a368f7087f..42c9fd25b88 100644
--- a/source/blender/modifiers/intern/MOD_nodes.cc
+++ b/source/blender/modifiers/intern/MOD_nodes.cc
@@ -43,6 +43,7 @@
 #include "DNA_screen_types.h"
 
 #include "BKE_customdata.h"
+#include "BKE_idprop.h"
 #include "BKE_lib_query.h"
 #include "BKE_mesh.h"
 #include "BKE_modifier.h"
@@ -85,12 +86,30 @@ static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphConte
   if (nmd->node_group != nullptr) {
     DEG_add_node_tree_relation(ctx->node, nmd->node_group, "Nodes Modifier");
   }
+
+  /* TODO: Add relations for IDs in settings. */
 }
 
 static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
 {
   NodesModifierData *nmd = reinterpret_cast<NodesModifierData *>(md);
   walk(userData, ob, (ID **)&nmd->node_group, IDWALK_CB_USER);
+
+  struct ForeachSettingData {
+    IDWalkFunc walk;
+    void *userData;
+    Object *ob;
+  } settings = {walk, userData, ob};
+
+  IDP_foreach_property(
+      nmd->settings.properties,
+      IDP_TYPE_FILTER_ID,
+      [](IDProperty *id_prop, void *user_data) {
+        ForeachSettingData *settings = (ForeachSettingData *)user_data;
+        settings->walk(
+            settings->userData, settings->ob, (ID **)&id_prop->data.pointer, IDWALK_CB_USER);
+      },
+      &settings);
 }
 
 static bool isDisabled(const struct Scene *UNUSED(scene),
@@ -432,28 +451,37 @@ static void panelRegister(ARegionType *region_type)
 static void blendWrite(BlendWriter *writer, const ModifierData *md)
 {
   const NodesModifierData *nmd = reinterpret_cast<const NodesModifierData *>(md);
-  UNUSED_VARS(nmd, writer);
+  if (nmd->settings.properties != nullptr) {
+    IDP_BlendWrite(writer, nmd->settings.properties);
+  }
 }
 
 static void blendRead(BlendDataReader *reader, ModifierData *md)
 {
   NodesModifierData *nmd = reinterpret_cast<NodesModifierData *>(md);
-  UNUSED_VARS(nmd, reader);
+  BLO_read_data_address(reader, &nmd->settings.properties);
+  IDP_BlendDataRead(reader, &nmd->settings.properties);
 }
 
 static void copyData(const ModifierData *md, ModifierData *target, const int flag)
 {
   const NodesModifierData *nmd = reinterpret_cast<const NodesModifierData *>(md);
   NodesModifierData *tnmd = reinterpret_cast<NodesModifierData *>(target);
-  UNUSED_VARS(nmd, tnmd);
 
   BKE_modifier_copydata_generic(md, target, flag);
+
+  if (nmd->settings.properties != nullptr) {
+    tnmd->settings.properties = IDP_CopyProperty_ex(nmd->settings.properties, flag);
+  }
 }
 
 static void freeData(ModifierData *md)
 {
   NodesModifierData *nmd = reinterpret_cast<NodesModifierData *>(md);
-  UNUSED_VARS(nmd);
+  if (nmd->settings.properties != nullptr) {
+    IDP_FreeProperty_ex(nmd->settings.properties, false);
+    nmd->settings.properties = nullptr;
+  }
 }
 
 ModifierTypeInfo modifierType_Nodes = {



More information about the Bf-blender-cvs mailing list