[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