2 * ***** BEGIN GPL LICENSE BLOCK *****
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software Foundation,
16 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 * The Original Code is Copyright (C) 2012 Blender Foundation.
19 * All rights reserved.
22 * Contributor(s): Blender Foundation,
25 * ***** END GPL LICENSE BLOCK *****
28 /** \file blender/editors/mask/mask_edit.c
35 #include "BKE_context.h"
38 #include "DNA_scene_types.h"
43 #include "ED_screen.h"
44 #include "ED_mask.h" /* own include */
45 #include "ED_object.h" /* ED_keymap_proportional_maskmode only */
47 #include "ED_transform.h"
49 #include "RNA_access.h"
51 #include "mask_intern.h" /* own include */
53 /********************** generic poll functions *********************/
55 int ED_maskedit_poll(bContext *C)
57 SpaceClip *sc = CTX_wm_space_clip(C);
60 return ED_space_clip_maskedit_poll(C);
66 int ED_maskedit_mask_poll(bContext *C)
68 SpaceClip *sc = CTX_wm_space_clip(C);
71 return ED_space_clip_maskedit_mask_poll(C);
77 /********************** registration *********************/
79 void ED_mask_mouse_pos(bContext *C, wmEvent *event, float co[2])
81 SpaceClip *sc = CTX_wm_space_clip(C);
84 ED_clip_mouse_pos(C, event, co);
85 BKE_mask_coord_from_movieclip(sc->clip, &sc->user, co, co);
88 /* possible other spaces from which mask editing is available */
93 /* input: x/y - mval space
94 * output: xr/yr - mask point space */
95 void ED_mask_point_pos(bContext *C, float x, float y, float *xr, float *yr)
97 SpaceClip *sc = CTX_wm_space_clip(C);
101 ED_clip_point_stable_pos(C, x, y, &co[0], &co[1]);
102 BKE_mask_coord_from_movieclip(sc->clip, &sc->user, co, co);
105 /* possible other spaces from which mask editing is available */
113 void ED_mask_point_pos__reverse(bContext *C, float x, float y, float *xr, float *yr)
115 SpaceClip *sc = CTX_wm_space_clip(C);
116 ARegion *ar = CTX_wm_region(C);
123 BKE_mask_coord_to_movieclip(sc->clip, &sc->user, co, co);
124 ED_clip_point_stable_pos__reverse(sc, ar, co, co);
127 /* possible other spaces from which mask editing is available */
135 void ED_mask_size(bContext *C, int *width, int *height)
137 ScrArea *sa = CTX_wm_area(C);
138 if (sa && sa->spacedata.first) {
139 if (sa->spacetype == SPACE_CLIP) {
140 SpaceClip *sc = sa->spacedata.first;
141 ED_space_clip_mask_size(sc, width, height);
144 else if (sa->spacetype == SPACE_SEQ) {
145 Scene *scene = CTX_data_scene(C);
146 *width = (scene->r.size * scene->r.xsch) / 100;
147 *height = (scene->r.size * scene->r.ysch) / 100;
152 /* possible other spaces from which mask editing is available */
157 void ED_mask_aspect(bContext *C, float *aspx, float *aspy)
159 SpaceClip *sc = CTX_wm_space_clip(C);
162 ED_space_clip_mask_aspect(sc, aspx, aspy);
165 /* possible other spaces from which mask editing is available */
171 void ED_mask_pixelspace_factor(bContext *C, float *scalex, float *scaley)
173 SpaceClip *sc = CTX_wm_space_clip(C);
176 ARegion *ar = CTX_wm_region(C);
178 float zoomx, zoomy, aspx, aspy;
180 ED_space_clip_size(sc, &width, &height);
181 ED_space_clip_zoom(sc, ar, &zoomx, &zoomy);
182 ED_space_clip_aspect(sc, &aspx, &aspy);
184 *scalex = ((float)width * aspx) * zoomx;
185 *scaley = ((float)height * aspy) * zoomy;
188 /* possible other spaces from which mask editing is available */
194 /********************** registration *********************/
196 void ED_operatortypes_mask(void)
198 WM_operatortype_append(MASK_OT_new);
201 WM_operatortype_append(MASK_OT_layer_new);
202 WM_operatortype_append(MASK_OT_layer_remove);
205 WM_operatortype_append(MASK_OT_add_vertex);
206 WM_operatortype_append(MASK_OT_add_feather_vertex);
209 WM_operatortype_append(MASK_OT_switch_direction);
210 WM_operatortype_append(MASK_OT_normals_make_consistent);
211 WM_operatortype_append(MASK_OT_delete);
214 WM_operatortype_append(MASK_OT_select);
215 WM_operatortype_append(MASK_OT_select_all);
216 WM_operatortype_append(MASK_OT_select_border);
217 WM_operatortype_append(MASK_OT_select_lasso);
218 WM_operatortype_append(MASK_OT_select_circle);
219 WM_operatortype_append(MASK_OT_select_linked_pick);
220 WM_operatortype_append(MASK_OT_select_linked);
223 WM_operatortype_append(MASK_OT_hide_view_clear);
224 WM_operatortype_append(MASK_OT_hide_view_set);
227 WM_operatortype_append(MASK_OT_feather_weight_clear);
230 WM_operatortype_append(MASK_OT_slide_point);
231 WM_operatortype_append(MASK_OT_cyclic_toggle);
232 WM_operatortype_append(MASK_OT_handle_type_set);
235 WM_operatortype_append(MASK_OT_parent_set);
236 WM_operatortype_append(MASK_OT_parent_clear);
239 WM_operatortype_append(MASK_OT_shape_key_insert);
240 WM_operatortype_append(MASK_OT_shape_key_clear);
241 WM_operatortype_append(MASK_OT_shape_key_feather_reset);
244 void ED_keymap_mask(wmKeyConfig *keyconf)
249 keymap = WM_keymap_find(keyconf, "Mask Editing", 0, 0);
250 keymap->poll = ED_maskedit_poll;
252 WM_keymap_add_item(keymap, "MASK_OT_new", NKEY, KM_PRESS, KM_ALT, 0);
254 /* mask mode supports PET now */
255 ED_keymap_proportional_cycle(keyconf, keymap);
256 ED_keymap_proportional_maskmode(keyconf, keymap);
259 WM_keymap_add_item(keymap, "MASK_OT_add_vertex_slide", LEFTMOUSE, KM_PRESS, KM_CTRL, 0);
260 WM_keymap_add_item(keymap, "MASK_OT_add_feather_vertex_slide", LEFTMOUSE, KM_PRESS, KM_SHIFT, 0);
261 WM_keymap_add_item(keymap, "MASK_OT_delete", XKEY, KM_PRESS, 0, 0);
262 WM_keymap_add_item(keymap, "MASK_OT_delete", DELKEY, KM_PRESS, 0, 0);
265 kmi = WM_keymap_add_item(keymap, "MASK_OT_select", SELECTMOUSE, KM_PRESS, 0, 0);
266 RNA_boolean_set(kmi->ptr, "extend", FALSE);
267 RNA_boolean_set(kmi->ptr, "deselect", FALSE);
268 RNA_boolean_set(kmi->ptr, "toggle", FALSE);
269 kmi = WM_keymap_add_item(keymap, "MASK_OT_select", SELECTMOUSE, KM_PRESS, KM_SHIFT, 0);
270 RNA_boolean_set(kmi->ptr, "extend", FALSE);
271 RNA_boolean_set(kmi->ptr, "deselect", FALSE);
272 RNA_boolean_set(kmi->ptr, "toggle", TRUE);
274 kmi = WM_keymap_add_item(keymap, "MASK_OT_select_all", AKEY, KM_PRESS, 0, 0);
275 RNA_enum_set(kmi->ptr, "action", SEL_TOGGLE);
276 kmi = WM_keymap_add_item(keymap, "MASK_OT_select_all", IKEY, KM_PRESS, KM_CTRL, 0);
277 RNA_enum_set(kmi->ptr, "action", SEL_INVERT);
279 WM_keymap_add_item(keymap, "MASK_OT_select_linked", LKEY, KM_PRESS, KM_CTRL, 0);
280 kmi = WM_keymap_add_item(keymap, "MASK_OT_select_linked_pick", LKEY, KM_PRESS, 0, 0);
281 RNA_boolean_set(kmi->ptr, "deselect", FALSE);
282 kmi = WM_keymap_add_item(keymap, "MASK_OT_select_linked_pick", LKEY, KM_PRESS, KM_SHIFT, 0);
283 RNA_boolean_set(kmi->ptr, "deselect", TRUE);
285 WM_keymap_add_item(keymap, "MASK_OT_select_border", BKEY, KM_PRESS, 0, 0);
286 WM_keymap_add_item(keymap, "MASK_OT_select_circle", CKEY, KM_PRESS, 0, 0);
288 kmi = WM_keymap_add_item(keymap, "MASK_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_CTRL | KM_ALT, 0);
289 RNA_boolean_set(kmi->ptr, "deselect", FALSE);
290 kmi = WM_keymap_add_item(keymap, "MASK_OT_select_lasso", EVT_TWEAK_A, KM_ANY, KM_CTRL | KM_SHIFT | KM_ALT, 0);
291 RNA_boolean_set(kmi->ptr, "deselect", TRUE);
294 WM_keymap_add_item(keymap, "MASK_OT_hide_view_clear", HKEY, KM_PRESS, KM_ALT, 0);
295 kmi = WM_keymap_add_item(keymap, "MASK_OT_hide_view_set", HKEY, KM_PRESS, 0, 0);
296 RNA_boolean_set(kmi->ptr, "unselected", FALSE);
298 kmi = WM_keymap_add_item(keymap, "MASK_OT_hide_view_set", HKEY, KM_PRESS, KM_SHIFT, 0);
299 RNA_boolean_set(kmi->ptr, "unselected", TRUE);
301 /* select clip while in maker view,
302 * this matches View3D functionality where you can select an
303 * object while in editmode to allow vertex parenting */
304 kmi = WM_keymap_add_item(keymap, "CLIP_OT_select", SELECTMOUSE, KM_PRESS, KM_CTRL, 0);
305 RNA_boolean_set(kmi->ptr, "extend", FALSE);
308 WM_keymap_add_item(keymap, "MASK_OT_cyclic_toggle", CKEY, KM_PRESS, KM_ALT, 0);
309 WM_keymap_add_item(keymap, "MASK_OT_slide_point", LEFTMOUSE, KM_PRESS, 0, 0);
310 WM_keymap_add_item(keymap, "MASK_OT_handle_type_set", VKEY, KM_PRESS, 0, 0);
311 WM_keymap_add_item(keymap, "MASK_OT_normals_make_consistent", NKEY, KM_PRESS, KM_CTRL, 0);
312 // WM_keymap_add_item(keymap, "MASK_OT_feather_weight_clear", SKEY, KM_PRESS, KM_ALT, 0);
313 /* ... matches curve editmode */
314 RNA_enum_set(WM_keymap_add_item(keymap, "TRANSFORM_OT_transform", SKEY, KM_PRESS, KM_ALT, 0)->ptr, "mode", TFM_MASK_SHRINKFATTEN);
317 WM_keymap_add_item(keymap, "MASK_OT_parent_set", PKEY, KM_PRESS, KM_CTRL, 0);
318 WM_keymap_add_item(keymap, "MASK_OT_parent_clear", PKEY, KM_PRESS, KM_ALT, 0);
320 WM_keymap_add_item(keymap, "MASK_OT_shape_key_insert", IKEY, KM_PRESS, 0, 0);
321 WM_keymap_add_item(keymap, "MASK_OT_shape_key_clear", IKEY, KM_PRESS, KM_ALT, 0);
324 transform_keymap_for_space(keyconf, keymap, SPACE_CLIP);
327 void ED_operatormacros_mask(void)
329 /* XXX: just for sample */
331 wmOperatorTypeMacro *otmacro;
333 ot = WM_operatortype_append_macro("MASK_OT_add_vertex_slide", "Add Vertex and Slide", "Add new vertex and slide it", OPTYPE_UNDO | OPTYPE_REGISTER);
334 ot->description = "Add new vertex and slide it";
335 WM_operatortype_macro_define(ot, "MASK_OT_add_vertex");
336 otmacro = WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate");
337 RNA_boolean_set(otmacro->ptr, "release_confirm", TRUE);
339 ot = WM_operatortype_append_macro("MASK_OT_add_feather_vertex_slide", "Add Feather Vertex and Slide", "Add new vertex to feater and slide it", OPTYPE_UNDO | OPTYPE_REGISTER);
340 ot->description = "Add new feather vertex and slide it";
341 WM_operatortype_macro_define(ot, "MASK_OT_add_feather_vertex");
342 otmacro = WM_operatortype_macro_define(ot, "MASK_OT_slide_point");
343 RNA_boolean_set(otmacro->ptr, "slide_feather", TRUE);