From d8c3aad8004c57650bc095803c869c2aac6d541f Mon Sep 17 00:00:00 2001 From: Antonio Vazquez Date: Thu, 7 May 2020 15:12:08 +0200 Subject: GPencil: Add support for Link Modifiers This adds support to the Link modifiers data. This was missing. Also I did a small cleanup using LISTBASE_FOREACH macro. Related to T76478 Reviewed By: campbellbarton Differential Revision: https://developer.blender.org/D7643 --- source/blender/blenkernel/intern/object.c | 83 ++++++++++++++++++------------- 1 file changed, 49 insertions(+), 34 deletions(-) (limited to 'source/blender/blenkernel') diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index f68b1a4d314..de34b0cba69 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -175,9 +175,6 @@ static void object_copy_data(Main *bmain, ID *id_dst, const ID *id_src, const in { Object *ob_dst = (Object *)id_dst; const Object *ob_src = (const Object *)id_src; - ModifierData *md; - GpencilModifierData *gmd; - ShaderFxData *fx; /* Do not copy runtime data. */ BKE_object_runtime_reset_on_copy(ob_dst, flag); @@ -207,7 +204,7 @@ static void object_copy_data(Main *bmain, ID *id_dst, const ID *id_src, const in BLI_listbase_clear(&ob_dst->modifiers); - for (md = ob_src->modifiers.first; md; md = md->next) { + LISTBASE_FOREACH (ModifierData *, md, &ob_src->modifiers) { ModifierData *nmd = modifier_new(md->type); BLI_strncpy(nmd->name, md->name, sizeof(nmd->name)); modifier_copyData_ex(md, nmd, flag_subdata); @@ -216,7 +213,7 @@ static void object_copy_data(Main *bmain, ID *id_dst, const ID *id_src, const in BLI_listbase_clear(&ob_dst->greasepencil_modifiers); - for (gmd = ob_src->greasepencil_modifiers.first; gmd; gmd = gmd->next) { + LISTBASE_FOREACH (GpencilModifierData *, gmd, &ob_src->greasepencil_modifiers) { GpencilModifierData *nmd = BKE_gpencil_modifier_new(gmd->type); BLI_strncpy(nmd->name, gmd->name, sizeof(nmd->name)); BKE_gpencil_modifier_copyData_ex(gmd, nmd, flag_subdata); @@ -225,7 +222,7 @@ static void object_copy_data(Main *bmain, ID *id_dst, const ID *id_src, const in BLI_listbase_clear(&ob_dst->shader_fx); - for (fx = ob_src->shader_fx.first; fx; fx = fx->next) { + LISTBASE_FOREACH (ShaderFxData *, fx, &ob_src->shader_fx) { ShaderFxData *nfx = BKE_shaderfx_new(fx->type); BLI_strncpy(nfx->name, fx->name, sizeof(nfx->name)); BKE_shaderfx_copyData_ex(fx, nfx, flag_subdata); @@ -533,48 +530,66 @@ bool BKE_object_support_modifier_type_check(const Object *ob, int modifier_type) void BKE_object_link_modifiers(struct Object *ob_dst, const struct Object *ob_src) { - ModifierData *md; BKE_object_free_modifiers(ob_dst, 0); - if (!ELEM(ob_dst->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_LATTICE)) { + if (!ELEM(ob_dst->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_LATTICE, OB_GPENCIL)) { /* only objects listed above can have modifiers and linking them to objects * which doesn't have modifiers stack is quite silly */ return; } - for (md = ob_src->modifiers.first; md; md = md->next) { - ModifierData *nmd = NULL; + /* No grease pencil modifiers. */ + if ((ob_src->type != OB_GPENCIL) && (ob_dst->type != OB_GPENCIL)) { + LISTBASE_FOREACH (ModifierData *, md, &ob_src->modifiers) { + ModifierData *nmd = NULL; - if (ELEM(md->type, eModifierType_Hook, eModifierType_Collision)) { - continue; - } + if (ELEM(md->type, eModifierType_Hook, eModifierType_Collision)) { + continue; + } - if (!BKE_object_support_modifier_type_check(ob_dst, md->type)) { - continue; - } + if (!BKE_object_support_modifier_type_check(ob_dst, md->type)) { + continue; + } - switch (md->type) { - case eModifierType_Softbody: - BKE_object_copy_softbody(ob_dst, ob_src, 0); - break; - case eModifierType_Skin: - /* ensure skin-node customdata exists */ - BKE_mesh_ensure_skin_customdata(ob_dst->data); - break; - } + switch (md->type) { + case eModifierType_Softbody: + BKE_object_copy_softbody(ob_dst, ob_src, 0); + break; + case eModifierType_Skin: + /* ensure skin-node customdata exists */ + BKE_mesh_ensure_skin_customdata(ob_dst->data); + break; + } - nmd = modifier_new(md->type); - BLI_strncpy(nmd->name, md->name, sizeof(nmd->name)); + nmd = modifier_new(md->type); + BLI_strncpy(nmd->name, md->name, sizeof(nmd->name)); - if (md->type == eModifierType_Multires) { - /* Has to be done after mod creation, but *before* we actually copy its settings! */ - multiresModifier_sync_levels_ex( - ob_dst, (MultiresModifierData *)md, (MultiresModifierData *)nmd); + if (md->type == eModifierType_Multires) { + /* Has to be done after mod creation, but *before* we actually copy its settings! */ + multiresModifier_sync_levels_ex( + ob_dst, (MultiresModifierData *)md, (MultiresModifierData *)nmd); + } + + modifier_copyData(md, nmd); + BLI_addtail(&ob_dst->modifiers, nmd); + modifier_unique_name(&ob_dst->modifiers, nmd); } + } - modifier_copyData(md, nmd); - BLI_addtail(&ob_dst->modifiers, nmd); - modifier_unique_name(&ob_dst->modifiers, nmd); + /* Copy grease pencil modifiers. */ + if ((ob_src->type == OB_GPENCIL) && (ob_dst->type == OB_GPENCIL)) { + LISTBASE_FOREACH (GpencilModifierData *, md, &ob_src->greasepencil_modifiers) { + GpencilModifierData *nmd = NULL; + + nmd = BKE_gpencil_modifier_new(md->type); + BLI_strncpy(nmd->name, md->name, sizeof(nmd->name)); + + const GpencilModifierTypeInfo *mti = BKE_gpencil_modifierType_getInfo(md->type); + mti->copyData(md, nmd); + + BLI_addtail(&ob_dst->greasepencil_modifiers, nmd); + BKE_gpencil_modifier_unique_name(&ob_dst->greasepencil_modifiers, nmd); + } } BKE_object_copy_particlesystems(ob_dst, ob_src, 0); -- cgit v1.2.3