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(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; } }