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.c105
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,
};