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_gpencilmirror.c')
-rw-r--r--source/blender/gpencil_modifiers/intern/MOD_gpencilmirror.c42
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,