GPv3: Update names of layers in modifier filters when layer name changes

This adds additional logic to `GreasePencil::rename_node` to rename
the strings in the modifier influence data.

This is similar to how `ED_armature_bone_rename` handles renaming of
strings.

Resolves #123321.

Pull Request: https://projects.blender.org/blender/blender/pulls/123365
This commit is contained in:
Falk David
2024-06-19 18:57:09 +02:00
committed by Falk David
parent accf947183
commit bd67c3b8ef
4 changed files with 161 additions and 8 deletions

View File

@@ -21,6 +21,7 @@
#include "BKE_idtype.hh"
#include "BKE_lib_id.hh"
#include "BKE_lib_query.hh"
#include "BKE_main.hh"
#include "BKE_material.h"
#include "BKE_modifier.hh"
#include "BKE_object.hh"
@@ -3068,17 +3069,139 @@ blender::IndexMask GreasePencil::layer_selection_by_name(const blender::StringRe
return {};
}
void GreasePencil::rename_node(blender::bke::greasepencil::TreeNode &node,
static GreasePencilModifierInfluenceData *influence_data_from_modifier(ModifierData *md)
{
switch (md->type) {
case eModifierType_GreasePencilArmature: {
auto *amd = reinterpret_cast<GreasePencilArmatureModifierData *>(md);
return &amd->influence;
}
case eModifierType_GreasePencilArray: {
auto *mmd = reinterpret_cast<GreasePencilArrayModifierData *>(md);
return &mmd->influence;
}
case eModifierType_GreasePencilBuild: {
auto *bmd = reinterpret_cast<GreasePencilBuildModifierData *>(md);
return &bmd->influence;
}
case eModifierType_GreasePencilColor: {
auto *cmd = reinterpret_cast<GreasePencilColorModifierData *>(md);
return &cmd->influence;
}
case eModifierType_GreasePencilDash: {
auto *dmd = reinterpret_cast<GreasePencilDashModifierData *>(md);
return &dmd->influence;
}
case eModifierType_GreasePencilEnvelope: {
auto *emd = reinterpret_cast<GreasePencilEnvelopeModifierData *>(md);
return &emd->influence;
}
case eModifierType_GreasePencilHook: {
auto *hmd = reinterpret_cast<GreasePencilHookModifierData *>(md);
return &hmd->influence;
}
case eModifierType_GreasePencilLattice: {
auto *lmd = reinterpret_cast<GreasePencilLatticeModifierData *>(md);
return &lmd->influence;
}
case eModifierType_GreasePencilLength: {
auto *lmd = reinterpret_cast<GreasePencilLengthModifierData *>(md);
return &lmd->influence;
}
case eModifierType_GreasePencilMirror: {
auto *mmd = reinterpret_cast<GreasePencilMirrorModifierData *>(md);
return &mmd->influence;
}
case eModifierType_GreasePencilMultiply: {
auto *mmd = reinterpret_cast<GreasePencilMultiModifierData *>(md);
return &mmd->influence;
}
case eModifierType_GreasePencilNoise: {
auto *nmd = reinterpret_cast<GreasePencilNoiseModifierData *>(md);
return &nmd->influence;
}
case eModifierType_GreasePencilOffset: {
auto *omd = reinterpret_cast<GreasePencilOffsetModifierData *>(md);
return &omd->influence;
}
case eModifierType_GreasePencilOpacity: {
auto *omd = reinterpret_cast<GreasePencilOpacityModifierData *>(md);
return &omd->influence;
}
case eModifierType_GreasePencilOutline: {
auto *omd = reinterpret_cast<GreasePencilOutlineModifierData *>(md);
return &omd->influence;
}
case eModifierType_GreasePencilShrinkwrap: {
auto *smd = reinterpret_cast<GreasePencilShrinkwrapModifierData *>(md);
return &smd->influence;
}
case eModifierType_GreasePencilSimplify: {
auto *smd = reinterpret_cast<GreasePencilSimplifyModifierData *>(md);
return &smd->influence;
}
case eModifierType_GreasePencilSmooth: {
auto *smd = reinterpret_cast<GreasePencilSmoothModifierData *>(md);
return &smd->influence;
}
case eModifierType_GreasePencilSubdiv: {
auto *smd = reinterpret_cast<GreasePencilSubdivModifierData *>(md);
return &smd->influence;
}
case eModifierType_GreasePencilTexture: {
auto *tmd = reinterpret_cast<GreasePencilTextureModifierData *>(md);
return &tmd->influence;
}
case eModifierType_GreasePencilThickness: {
auto *tmd = reinterpret_cast<GreasePencilThickModifierData *>(md);
return &tmd->influence;
}
case eModifierType_GreasePencilTime: {
auto *tmd = reinterpret_cast<GreasePencilTimeModifierData *>(md);
return &tmd->influence;
}
case eModifierType_GreasePencilTint: {
auto *tmd = reinterpret_cast<GreasePencilTintModifierData *>(md);
return &tmd->influence;
}
case eModifierType_GreasePencilWeightAngle: {
auto *wmd = reinterpret_cast<GreasePencilWeightAngleModifierData *>(md);
return &wmd->influence;
}
case eModifierType_GreasePencilWeightProximity: {
auto *wmd = reinterpret_cast<GreasePencilWeightProximityModifierData *>(md);
return &wmd->influence;
}
case eModifierType_GreasePencilLineart:
ATTR_FALLTHROUGH;
default:
return nullptr;
}
return nullptr;
}
void GreasePencil::rename_node(Main &bmain,
blender::bke::greasepencil::TreeNode &node,
blender::StringRefNull new_name)
{
using namespace blender;
if (node.name() == new_name) {
return;
}
/* Rename the node. */
std::string old_name = node.name();
if (node.is_layer()) {
node.set_name(unique_layer_name(*this, new_name));
}
else if (node.is_group()) {
node.set_name(unique_layer_group_name(*this, new_name));
}
/* Update layer name dependencies. */
if (node.is_layer()) {
BKE_animdata_fix_paths_rename_all(&this->id, "layers", old_name.c_str(), node.name().c_str());
/* Update names in layer masks. */
for (bke::greasepencil::Layer *layer : this->layers_for_write()) {
LISTBASE_FOREACH (GreasePencilLayerMask *, mask, &layer->masks) {
if (STREQ(mask->layer_name, old_name.c_str())) {
@@ -3087,8 +3210,33 @@ void GreasePencil::rename_node(blender::bke::greasepencil::TreeNode &node,
}
}
}
else if (node.is_group()) {
node.set_name(unique_layer_group_name(*this, new_name));
/* Update name dependencies outside of the ID. */
LISTBASE_FOREACH (Object *, object, &bmain.objects) {
if (object->data != this) {
continue;
}
/* Update the layer name of the influence data of the modifiers. */
LISTBASE_FOREACH (ModifierData *, md, &object->modifiers) {
char *dst_layer_name = nullptr;
size_t dst_layer_name_len = 0;
/* LineArt doesn't use the `GreasePencilModifierInfluenceData` struct. */
if (md->type == eModifierType_GreasePencilLineart) {
auto *lmd = reinterpret_cast<GreasePencilLineartModifierData *>(md);
dst_layer_name = lmd->target_layer;
dst_layer_name_len = sizeof(lmd->target_layer);
}
else if (GreasePencilModifierInfluenceData *influence_data = influence_data_from_modifier(
md))
{
dst_layer_name = influence_data->layer_name;
dst_layer_name_len = sizeof(influence_data->layer_name);
}
if (dst_layer_name && STREQ(dst_layer_name, old_name.c_str())) {
BLI_strncpy(dst_layer_name, node.name().c_str(), dst_layer_name_len);
}
}
}
}

View File

@@ -858,7 +858,7 @@ static void namebutton_fn(bContext *C, void *tsep, char *oldname)
* function. */
std::string new_name(node.name());
node.set_name(oldname);
grease_pencil.rename_node(node, new_name);
grease_pencil.rename_node(*bmain, node, new_name);
DEG_id_tag_update(&grease_pencil.id, ID_RECALC_SYNC_TO_EVAL);
WM_event_add_notifier(C, NC_ID | NA_RENAME, nullptr);
break;

View File

@@ -47,6 +47,7 @@ typedef struct GreasePencilLayerRuntimeHandle GreasePencilLayerRuntimeHandle;
typedef struct GreasePencilLayerGroupRuntimeHandle GreasePencilLayerGroupRuntimeHandle;
#endif
struct Main;
struct GreasePencil;
struct BlendDataReader;
struct BlendWriter;
@@ -575,7 +576,9 @@ typedef struct GreasePencil {
blender::IndexMask layer_selection_by_name(const blender::StringRefNull name,
blender::IndexMaskMemory &memory) const;
void rename_node(blender::bke::greasepencil::TreeNode &node, blender::StringRefNull new_name);
void rename_node(Main &bmain,
blender::bke::greasepencil::TreeNode &node,
blender::StringRefNull new_name);
void remove_layer(blender::bke::greasepencil::Layer &layer);
void remove_group(blender::bke::greasepencil::LayerGroup &group, bool keep_children = false);

View File

@@ -6,6 +6,8 @@
* \ingroup RNA
*/
#include "BKE_global.hh"
#include "BLI_string.h"
#include "DNA_grease_pencil_types.h"
@@ -101,7 +103,7 @@ static void rna_grease_pencil_layer_mask_name_set(PointerRNA *ptr, const char *v
const std::string oldname(mask->layer_name);
if (bke::greasepencil::TreeNode *node = grease_pencil->find_node_by_name(oldname)) {
grease_pencil->rename_node(*node, value);
grease_pencil->rename_node(*G_MAIN, *node, value);
}
}
@@ -194,7 +196,7 @@ static void rna_GreasePencilLayer_name_set(PointerRNA *ptr, const char *value)
GreasePencil *grease_pencil = rna_grease_pencil(ptr);
GreasePencilLayer *layer = static_cast<GreasePencilLayer *>(ptr->data);
grease_pencil->rename_node(layer->wrap().as_node(), value);
grease_pencil->rename_node(*G_MAIN, layer->wrap().as_node(), value);
}
static int rna_GreasePencilLayer_pass_index_get(PointerRNA *ptr)
@@ -516,7 +518,7 @@ static void rna_GreasePencilLayerGroup_name_set(PointerRNA *ptr, const char *val
GreasePencil *grease_pencil = rna_grease_pencil(ptr);
GreasePencilLayerTreeGroup *group = static_cast<GreasePencilLayerTreeGroup *>(ptr->data);
grease_pencil->rename_node(group->wrap().as_node(), value);
grease_pencil->rename_node(*G_MAIN, group->wrap().as_node(), value);
}
static void rna_iterator_grease_pencil_layer_groups_begin(CollectionPropertyIterator *iter,