From 62151ffaebaa3fd88ba73b3d99f882d03cc8624a Mon Sep 17 00:00:00 2001 From: Falk David Date: Fri, 26 Apr 2024 15:16:43 +0200 Subject: [PATCH] Fix: GPv3: Thickness modifier conversion of "uniform thickness" The "uniform thickness" was still in the legacy "pixel" space. The fix makes sure that value is always converted to the right radius space. We also convert the potentially animated property for the thickness and scale the fcurves to be in the right space. Pull Request: https://projects.blender.org/blender/blender/pulls/121128 --- .../intern/grease_pencil_convert_legacy.cc | 77 ++++++++++++++----- 1 file changed, 58 insertions(+), 19 deletions(-) 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);