diff --git a/source/blender/blenkernel/intern/grease_pencil_convert_legacy.cc b/source/blender/blenkernel/intern/grease_pencil_convert_legacy.cc index c25fef7aa5d..d21baf1fd0e 100644 --- a/source/blender/blenkernel/intern/grease_pencil_convert_legacy.cc +++ b/source/blender/blenkernel/intern/grease_pencil_convert_legacy.cc @@ -1207,6 +1207,61 @@ static void thickness_factor_to_modifier(ConversionData &conversion_data, animdata_thickness_transfer.fcurves_convert_finalize(); } +static void fcurve_convert_thickness_cb(FCurve &fcurve) +{ + if (fcurve.bezt) { + for (uint i = 0; i < fcurve.totvert; i++) { + BezTriple &bezier_triple = fcurve.bezt[i]; + bezier_triple.vec[0][1] *= LEGACY_RADIUS_CONVERSION_FACTOR; + bezier_triple.vec[1][1] *= LEGACY_RADIUS_CONVERSION_FACTOR; + bezier_triple.vec[2][1] *= LEGACY_RADIUS_CONVERSION_FACTOR; + } + } + if (fcurve.fpt) { + for (uint i = 0; i < fcurve.totvert; i++) { + FPoint &fpoint = fcurve.fpt[i]; + fpoint.vec[1] *= LEGACY_RADIUS_CONVERSION_FACTOR; + } + } + fcurve.flag &= ~FCURVE_INT_VALUES; + BKE_fcurve_handles_recalc(&fcurve); +} + +static void legacy_object_thickness_modifier_thickness_anim(ConversionData &conversion_data, + Object &object) +{ + if (BKE_animdata_from_id(&object.id) == nullptr) { + return; + } + + /* Note: At this point, the animation was already transferred to the destination object. Now we + * just need to convert the fcurve data to be in the right space. */ + AnimDataConvertor animdata_convert_thickness( + conversion_data, + object.id, + object.id, + {{".thickness", ".thickness", fcurve_convert_thickness_cb}}); + + LISTBASE_FOREACH (ModifierData *, tmd, &object.modifiers) { + if (ModifierType(tmd->type) != eModifierType_GreasePencilThickness) { + continue; + } + + char modifier_name[MAX_NAME * 2]; + BLI_str_escape(modifier_name, tmd->name, sizeof(modifier_name)); + animdata_convert_thickness.root_path_src = fmt::format("modifiers[\"{}\"]", modifier_name); + animdata_convert_thickness.root_path_dst = fmt::format("modifiers[\"{}\"]", modifier_name); + + if (!animdata_convert_thickness.source_has_animation_to_convert()) { + continue; + } + animdata_convert_thickness.fcurves_convert(); + } + + animdata_convert_thickness.fcurves_convert_finalize(); + DEG_relations_tag_update(&conversion_data.bmain); +} + static void layer_adjustments_to_modifiers(ConversionData &conversion_data, bGPdata &src_object_data, Object &dst_object) @@ -1219,24 +1274,6 @@ static void layer_adjustments_to_modifiers(ConversionData &conversion_data, src_object_data.id, {{".tint_color", ".color"}, {".tint_factor", ".factor"}}); - auto fcurve_convert_thickness_cb = [&](FCurve &fcurve) { - if (fcurve.bezt) { - for (uint i = 0; i < fcurve.totvert; i++) { - BezTriple &bezier_triple = fcurve.bezt[i]; - bezier_triple.vec[0][1] *= LEGACY_RADIUS_CONVERSION_FACTOR; - bezier_triple.vec[1][1] *= LEGACY_RADIUS_CONVERSION_FACTOR; - bezier_triple.vec[2][1] *= LEGACY_RADIUS_CONVERSION_FACTOR; - } - } - if (fcurve.fpt) { - for (uint i = 0; i < fcurve.totvert; i++) { - FPoint &fpoint = fcurve.fpt[i]; - fpoint.vec[1] *= LEGACY_RADIUS_CONVERSION_FACTOR; - } - } - fcurve.flag &= ~FCURVE_INT_VALUES; - BKE_fcurve_handles_recalc(&fcurve); - }; AnimDataConvertor animdata_thickness_transfer( conversion_data, dst_object.id, @@ -2244,7 +2281,7 @@ static void legacy_object_modifier_thickness(ConversionData &conversion_data, md_thickness.flag |= MOD_GREASE_PENCIL_THICK_WEIGHT_FACTOR; } md_thickness.thickness_fac = legacy_md_thickness.thickness_fac; - md_thickness.thickness = legacy_md_thickness.thickness; + md_thickness.thickness = legacy_md_thickness.thickness * LEGACY_RADIUS_CONVERSION_FACTOR; legacy_object_modifier_influence(md_thickness.influence, legacy_md_thickness.layername, @@ -2906,6 +2943,8 @@ static void legacy_gpencil_object_ex(ConversionData &conversion_data, Object &ob } legacy_object_modifiers(conversion_data, object); + /* Convert the animation of the "uniform thickness" setting of the thickness modifier. */ + legacy_object_thickness_modifier_thickness_anim(conversion_data, object); /* Layer adjustments should be added after all other modifiers. */ layer_adjustments_to_modifiers(conversion_data, *gpd, object);