Page MenuHome
Paste P1904

Alternate solution for T83063 that keeps "Settings" struct in RNA
ActivePublic

Authored by Hans Goudey (HooglyBoogly) on Jan 22 2021, 7:16 AM.
diff --git a/source/blender/blenloader/intern/versioning_290.c b/source/blender/blenloader/intern/versioning_290.c
index 627eecddeaa..15056a23bee 100644
--- a/source/blender/blenloader/intern/versioning_290.c
+++ b/source/blender/blenloader/intern/versioning_290.c
@@ -1622,5 +1622,17 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain)
*/
{
/* Keep this block, even when empty. */
+
+ /* Initialize the nodes modifier settings pointer back to the modifier. */
+ if (!DNA_struct_elem_find(fd->filesdna, "NodesModifierSettings", "modifier", "ModifierData")) {
+ LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
+ LISTBASE_FOREACH (ModifierData *, md, &ob->modifiers) {
+ if (md->type == eModifierType_Nodes) {
+ NodesModifierData *nmd = (NodesModifierData *)md;
+ nmd->settings.modifier = md;
+ }
+ }
+ }
+ }
}
}
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index 29421430e5d..0d448af905a 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -2245,6 +2245,8 @@ enum {
typedef struct NodesModifierSettings {
/* This stores data that is passed into the node group. */
struct IDProperty *properties;
+ /** Pointer back to the modifier, just to get its name for the RNA path. */
+ ModifierData *modifier;
} NodesModifierSettings;
typedef struct NodesModifierData {
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index 88953e8fddf..15e72ed58ab 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -1627,9 +1627,14 @@ static IDProperty *rna_NodesModifierSettings_properties(PointerRNA *ptr, bool cr
return settings->properties;
}
-static char *rna_NodesModifierSettings_path(PointerRNA *UNUSED(ptr))
+static char *rna_NodesModifierSettings_path(PointerRNA *ptr)
{
- return BLI_strdup("settings");
+ const NodesModifierSettings *settings = ptr->data;
+ const ModifierData *md = settings->modifier;
+ char name_esc[sizeof(md->name) * 2];
+
+ BLI_str_escape(name_esc, md->name, sizeof(name_esc));
+ return BLI_sprintfN("modifiers[\"%s\"].settings", name_esc);
}
#else
diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc
index 6da2ecba6a7..683383bc1c0 100644
--- a/source/blender/modifiers/intern/MOD_nodes.cc
+++ b/source/blender/modifiers/intern/MOD_nodes.cc
@@ -1163,6 +1163,7 @@ static void blendRead(BlendDataReader *reader, ModifierData *md)
NodesModifierData *nmd = reinterpret_cast<NodesModifierData *>(md);
BLO_read_data_address(reader, &nmd->settings.properties);
IDP_BlendDataRead(reader, &nmd->settings.properties);
+ nmd->settings.modifier = md;
}
static void copyData(const ModifierData *md, ModifierData *target, const int flag)
@@ -1174,6 +1175,7 @@ static void copyData(const ModifierData *md, ModifierData *target, const int fla
if (nmd->settings.properties != nullptr) {
tnmd->settings.properties = IDP_CopyProperty_ex(nmd->settings.properties, flag);
+ tnmd->settings.modifier = target;
}
}