diff options
Diffstat (limited to 'source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c')
-rw-r--r-- | source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c | 86 |
1 files changed, 80 insertions, 6 deletions
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c index 08200b03466..4f068bef59e 100644 --- a/source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c +++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c @@ -41,6 +41,7 @@ #include "BKE_armature.h" #include "BKE_context.h" #include "BKE_gpencil.h" +#include "BKE_gpencil_curve.h" #include "BKE_gpencil_geom.h" #include "BKE_gpencil_modifier.h" #include "BKE_lib_query.h" @@ -77,7 +78,9 @@ static void copyData(const GpencilModifierData *md, GpencilModifierData *target) BKE_gpencil_modifier_copydata_generic(md, target); } -static void gpencil_deform_verts(ArmatureGpencilModifierData *mmd, Object *target, bGPDstroke *gps) +static void gpencil_deform_polyline_verts(ArmatureGpencilModifierData *mmd, + Object *target, + bGPDstroke *gps) { bGPDspoint *pt = gps->points; float(*vert_coords)[3] = MEM_mallocN(sizeof(float[3]) * gps->totpoints, __func__); @@ -110,8 +113,73 @@ static void gpencil_deform_verts(ArmatureGpencilModifierData *mmd, Object *targe MEM_freeN(vert_coords); } +static void gpencil_deform_bezier_verts(ArmatureGpencilModifierData *mmd, + Object *target, + bGPDstroke *gps) +{ + bGPDcurve *gpc = gps->editcurve; + const int totpoints = gpc->tot_curve_points * 3; + float(*vert_coords)[3] = MEM_mallocN(sizeof(float[3]) * totpoints, __func__); + + BKE_gpencil_dvert_ensure(gps); + + /* prepare array of points */ + for (int i = 0; i < gpc->tot_curve_points; i++) { + bGPDcurve_point *pt = &gpc->curve_points[i]; + BezTriple *bezt = &pt->bezt; + int idx = i * 3; + copy_v3_v3(vert_coords[idx], bezt->vec[0]); + copy_v3_v3(vert_coords[idx + 1], bezt->vec[1]); + copy_v3_v3(vert_coords[idx + 2], bezt->vec[2]); + } + + /* deform verts */ + BKE_armature_deform_coords_with_gpencil_stroke(mmd->object, + target, + vert_coords, + NULL, + totpoints, + mmd->deformflag, + mmd->vert_coords_prev, + mmd->vgname, + gps); + + /* Apply deformed coordinates */ + for (int i = 0; i < gpc->tot_curve_points; i++) { + bGPDcurve_point *pt = &gpc->curve_points[i]; + BezTriple *bezt = &pt->bezt; + int idx = i * 3; + copy_v3_v3(bezt->vec[0], vert_coords[idx]); + copy_v3_v3(bezt->vec[1], vert_coords[idx + 1]); + copy_v3_v3(bezt->vec[2], vert_coords[idx + 2]); + } + + /* Recalculate the handles. */ + BKE_gpencil_editcurve_recalculate_handles(gps); + + MEM_freeN(vert_coords); +} + /* deform stroke */ -static void deformStroke(GpencilModifierData *md, +static void deformPolyline(GpencilModifierData *md, + Depsgraph *UNUSED(depsgraph), + Object *ob, + bGPDlayer *UNUSED(gpl), + bGPDframe *UNUSED(gpf), + bGPDstroke *gps) +{ + ArmatureGpencilModifierData *mmd = (ArmatureGpencilModifierData *)md; + if (!mmd->object) { + return; + } + bGPdata *gpd = ob->data; + + gpencil_deform_polyline_verts(mmd, ob, gps); + /* Calc geometry data. */ + BKE_gpencil_stroke_geometry_update(gpd, gps, GP_GEO_UPDATE_DEFAULT); +} + +static void deformBezier(GpencilModifierData *md, Depsgraph *UNUSED(depsgraph), Object *ob, bGPDlayer *UNUSED(gpl), @@ -124,9 +192,9 @@ static void deformStroke(GpencilModifierData *md, } bGPdata *gpd = ob->data; - gpencil_deform_verts(mmd, ob, gps); + gpencil_deform_bezier_verts(mmd, ob, gps); /* Calc geometry data. */ - BKE_gpencil_stroke_geometry_update(gpd, gps); + BKE_gpencil_stroke_geometry_update(gpd, gps, GP_GEO_UPDATE_DEFAULT); } static void bakeModifier(Main *UNUSED(bmain), @@ -155,7 +223,12 @@ static void bakeModifier(Main *UNUSED(bmain), /* compute armature effects on this frame */ LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) { - deformStroke(md_eval, depsgraph, object_eval, gpl, gpf, gps); + if (!GPENCIL_STROKE_TYPE_BEZIER(gps)) { + deformPolyline(md_eval, depsgraph, object_eval, gpl, gpf, gps); + } + else { + deformBezier(md_eval, depsgraph, object_eval, gpl, gpf, gps); + } } } } @@ -236,7 +309,8 @@ GpencilModifierTypeInfo modifierType_Gpencil_Armature = { /* copyData */ copyData, - /* deformStroke */ deformStroke, + /* deformPolyline */ deformPolyline, + /* deformBezier */ deformBezier, /* generateStrokes */ NULL, /* bakeModifier */ bakeModifier, /* remapTime */ NULL, |