Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c')
-rw-r--r--source/blender/gpencil_modifiers/intern/MOD_gpencilarmature.c86
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,