diff options
Diffstat (limited to 'source/blender/gpencil_modifiers/intern/MOD_gpencilmirror.c')
-rw-r--r-- | source/blender/gpencil_modifiers/intern/MOD_gpencilmirror.c | 105 |
1 files changed, 59 insertions, 46 deletions
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencilmirror.c b/source/blender/gpencil_modifiers/intern/MOD_gpencilmirror.c index 10f0dd763b1..c99ca64325c 100644 --- a/source/blender/gpencil_modifiers/intern/MOD_gpencilmirror.c +++ b/source/blender/gpencil_modifiers/intern/MOD_gpencilmirror.c @@ -28,12 +28,16 @@ #include "BLI_listbase.h" #include "BLI_math.h" +#include "BLT_translation.h" + #include "DNA_gpencil_modifier_types.h" #include "DNA_gpencil_types.h" #include "DNA_meshdata_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" +#include "DNA_screen_types.h" +#include "BKE_context.h" #include "BKE_deform.h" #include "BKE_gpencil.h" #include "BKE_gpencil_modifier.h" @@ -43,10 +47,17 @@ #include "BKE_modifier.h" #include "BKE_object.h" #include "BKE_scene.h" +#include "BKE_screen.h" #include "MEM_guardedalloc.h" +#include "UI_interface.h" +#include "UI_resources.h" + +#include "RNA_access.h" + #include "MOD_gpencil_modifiertypes.h" +#include "MOD_gpencil_ui_common.h" #include "MOD_gpencil_util.h" #include "DEG_depsgraph.h" @@ -86,52 +97,19 @@ static void update_mirror_object(Object *ob, bGPDstroke *gps, int axis) { - /* Calculate local matrix transformation. */ - float mat[3][3], inv_mat[3][3]; - BKE_object_to_mat3(ob, mat); - invert_m3_m3(inv_mat, mat); - - int i; - bGPDspoint *pt; - float factor[3] = {1.0f, 1.0f, 1.0f}; - factor[axis] = -1.0f; - - float clear[3] = {0.0f, 0.0f, 0.0f}; - clear[axis] = 1.0f; - - float ob_origin[3]; - float pt_origin[3]; - float half_origin[3]; - float rot_mat[3][3]; - - float eul[3]; - mat4_to_eul(eul, mmd->object->obmat); - mul_v3_fl(eul, 2.0f); - eul_to_mat3(rot_mat, eul); - sub_v3_v3v3(ob_origin, ob->obmat[3], mmd->object->obmat[3]); - - /* Only works with current axis. */ - mul_v3_v3(ob_origin, clear); - - /* Invert the origin. */ - mul_v3_v3fl(pt_origin, ob_origin, -2.0f); - mul_v3_v3fl(half_origin, pt_origin, 0.5f); - - for (i = 0, pt = gps->points; i < gps->totpoints; i++, pt++) { - /* Apply any local transformation. */ - mul_m3_v3(mat, &pt->x); - - /* Apply mirror effect. */ - mul_v3_v3(&pt->x, factor); - /* Apply location. */ - add_v3_v3(&pt->x, pt_origin); - /* Apply rotation (around new center). */ - sub_v3_v3(&pt->x, half_origin); - mul_m3_v3(rot_mat, &pt->x); - add_v3_v3(&pt->x, half_origin); - - /* Undo local transformation to avoid double transform in drawing. */ - mul_m3_v3(inv_mat, &pt->x); + float mtx[4][4]; + unit_m4(mtx); + mtx[axis][axis] = -1.0f; + + float tmp[4][4]; + float itmp[4][4]; + invert_m4_m4(tmp, mmd->object->obmat); + mul_m4_m4m4(tmp, tmp, ob->obmat); + 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); } } @@ -254,6 +232,40 @@ static void foreachIDLink(GpencilModifierData *md, Object *ob, IDWalkFunc walk, foreachObjectLink(md, ob, (ObjectWalkFunc)walk, userData); } +static void panel_draw(const bContext *C, Panel *panel) +{ + uiLayout *row; + uiLayout *layout = panel->layout; + int toggles_flag = UI_ITEM_R_TOGGLE | UI_ITEM_R_FORCE_BLANK_DECORATE; + + PointerRNA ptr; + gpencil_modifier_panel_get_property_pointers(C, panel, NULL, &ptr); + + uiLayoutSetPropSep(layout, true); + + row = uiLayoutRowWithHeading(layout, true, IFACE_("Axis")); + uiItemR(row, &ptr, "x_axis", toggles_flag, NULL, ICON_NONE); + uiItemR(row, &ptr, "y_axis", toggles_flag, NULL, ICON_NONE); + uiItemR(row, &ptr, "z_axis", toggles_flag, NULL, ICON_NONE); + + uiItemR(layout, &ptr, "object", 0, NULL, ICON_NONE); + + gpencil_modifier_panel_end(layout, &ptr); +} + +static void mask_panel_draw(const bContext *C, Panel *panel) +{ + gpencil_modifier_masking_panel_draw(C, panel, true, false); +} + +static void panelRegister(ARegionType *region_type) +{ + PanelType *panel_type = gpencil_modifier_panel_register( + region_type, eGpencilModifierType_Mirror, panel_draw); + gpencil_modifier_subpanel_register( + region_type, "mask", "Influence", NULL, mask_panel_draw, panel_type); +} + GpencilModifierTypeInfo modifierType_Gpencil_Mirror = { /* name */ "Mirror", /* structName */ "MirrorGpencilModifierData", @@ -276,4 +288,5 @@ GpencilModifierTypeInfo modifierType_Gpencil_Mirror = { /* foreachObjectLink */ foreachObjectLink, /* foreachIDLink */ foreachIDLink, /* foreachTexLink */ NULL, + /* panelRegister */ panelRegister, }; |