diff options
Diffstat (limited to 'source/blender/gpencil_modifiers/intern/MOD_gpencilmirror.c')
-rw-r--r-- | source/blender/gpencil_modifiers/intern/MOD_gpencilmirror.c | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilmirror.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilmirror.c index 1dc09cf1f74..d7e5458ef98 100644 --- a/source/blender/gpencil_modifiers/intern/MOD_gpencilmirror.c +++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilmirror.c @@ -39,6 +39,7 @@ #include "BKE_context.h" #include "BKE_gpencil.h" +#include "BKE_gpencil_geom.h" #include "BKE_gpencil_modifier.h" #include "BKE_lib_query.h" #include "BKE_main.h" @@ -74,13 +75,25 @@ static void copyData(const GpencilModifierData *md, GpencilModifierData *target) /* Mirror is using current object as origin. */ static void update_mirror_local(bGPDstroke *gps, int axis) { - int i; - bGPDspoint *pt; float factor[3] = {1.0f, 1.0f, 1.0f}; factor[axis] = -1.0f; - for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) { - mul_v3_v3(&pt->x, factor); + if (GPENCIL_STROKE_TYPE_BEZIER(gps)) { + bGPDcurve *gpc = gps->editcurve; + for (int i = 0; i < gpc->tot_curve_points; i++) { + bGPDcurve_point *pt = &gpc->curve_points[i]; + BezTriple *bezt = &pt->bezt; + for (int j = 0; j < 3; j++) { + mul_v3_v3(bezt->vec[j], factor); + } + } + } + else { + int i; + bGPDspoint *pt; + for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) { + mul_v3_v3(&pt->x, factor); + } } } @@ -101,8 +114,20 @@ static void update_mirror_object(Object *ob, invert_m4_m4(itmp, tmp); mul_m4_series(mtx, itmp, mtx, tmp); - for (int i = 0; i < gps->totpoints; i++) { - mul_m4_v3(mtx, &gps->points[i].x); + if (GPENCIL_STROKE_TYPE_BEZIER(gps)) { + bGPDcurve *gpc = gps->editcurve; + for (int i = 0; i < gpc->tot_curve_points; i++) { + bGPDcurve_point *pt = &gpc->curve_points[i]; + BezTriple *bezt = &pt->bezt; + for (int j = 0; j < 3; j++) { + mul_m4_v3(mtx, bezt->vec[j]); + } + } + } + else { + for (int i = 0; i < gps->totpoints; i++) { + mul_m4_v3(mtx, &gps->points[i].x); + } } } @@ -120,6 +145,7 @@ static void generate_geometry(GpencilModifierData *md, Object *ob, bGPDlayer *gp { MirrorGpencilModifierData *mmd = (MirrorGpencilModifierData *)md; bGPDstroke *gps, *gps_new = NULL; + bGPdata *gpd = ob->data; int tot_strokes; int i; @@ -145,6 +171,7 @@ static void generate_geometry(GpencilModifierData *md, Object *ob, bGPDlayer *gp mmd->flag & GP_MIRROR_INVERT_MATERIAL)) { gps_new = BKE_gpencil_stroke_duplicate(gps, true, true); update_position(ob, mmd, gps_new, xi); + BKE_gpencil_stroke_geometry_update(gpd, gps_new, GP_GEO_UPDATE_DEFAULT); BLI_addtail(&gpf->strokes, gps_new); } } @@ -261,7 +288,8 @@ GpencilModifierTypeInfo modifierType_Gpencil_Mirror = { /* copyData */ copyData, - /* deformStroke */ NULL, + /* deformPolyline */ NULL, + /* deformBezier */ NULL, /* generateStrokes */ generateStrokes, /* bakeModifier */ bakeModifier, /* remapTime */ NULL, |