This repository has been archived on 2023-10-09. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
blender-archive/source/blender/editors/mask/mask_edit.c
Simon Lenz df2ab4e758 Mask Editor: Add toggle for mask spline drawing
Adds an overlay option to show/hide the spline points & lines of masks in the Mask Editor.

It also moves the "smooth" option up (its position left of the selection dropdown was missleading).

{F11847272}

This emerged from a discussion in https://developer.blender.org/D12776

Differential Revision: https://developer.blender.org/D13314
2022-06-22 10:45:18 +02:00

239 lines
7.3 KiB
C

/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright 2012 Blender Foundation. All rights reserved. */
/** \file
* \ingroup edmask
*/
#include "BKE_context.h"
#include "BKE_mask.h"
#include "DNA_scene_types.h"
#include "WM_api.h"
#include "WM_types.h"
#include "ED_clip.h"
#include "ED_image.h"
#include "ED_mask.h" /* own include */
#include "ED_sequencer.h"
#include "RNA_access.h"
#include "mask_intern.h" /* own include */
/* -------------------------------------------------------------------- */
/** \name Poll Functions
* \{ */
bool ED_maskedit_poll(bContext *C)
{
ScrArea *area = CTX_wm_area(C);
if (area) {
switch (area->spacetype) {
case SPACE_CLIP:
return ED_space_clip_maskedit_poll(C);
case SPACE_SEQ:
return ED_space_sequencer_maskedit_poll(C);
case SPACE_IMAGE:
return ED_space_image_maskedit_poll(C);
}
}
return false;
}
bool ED_maskedit_visible_splines_poll(bContext *C)
{
ScrArea *area = CTX_wm_area(C);
if (area) {
switch (area->spacetype) {
case SPACE_CLIP:
return ED_space_clip_maskedit_visible_splines_poll(C);
case SPACE_SEQ:
return ED_space_sequencer_maskedit_poll(C);
case SPACE_IMAGE:
return ED_space_image_maskedit_visible_splines_poll(C);
}
}
return false;
}
bool ED_maskedit_mask_poll(bContext *C)
{
ScrArea *area = CTX_wm_area(C);
if (area) {
switch (area->spacetype) {
case SPACE_CLIP:
return ED_space_clip_maskedit_mask_poll(C);
case SPACE_SEQ:
return ED_space_sequencer_maskedit_mask_poll(C);
case SPACE_IMAGE:
return ED_space_image_maskedit_mask_poll(C);
}
}
return false;
}
bool ED_maskedit_mask_visible_splines_poll(bContext *C)
{
const ScrArea *area = CTX_wm_area(C);
if (area) {
switch (area->spacetype) {
case SPACE_CLIP:
return ED_space_clip_maskedit_mask_visible_splines_poll(C);
case SPACE_SEQ:
return ED_space_sequencer_maskedit_mask_poll(C);
case SPACE_IMAGE:
return ED_space_image_maskedit_mask_visible_splines_poll(C);
}
}
return false;
}
/** \} */
/* -------------------------------------------------------------------- */
/** \name Registration
* \{ */
void ED_operatortypes_mask(void)
{
WM_operatortype_append(MASK_OT_new);
/* mask layers */
WM_operatortype_append(MASK_OT_layer_new);
WM_operatortype_append(MASK_OT_layer_remove);
/* add */
WM_operatortype_append(MASK_OT_add_vertex);
WM_operatortype_append(MASK_OT_add_feather_vertex);
WM_operatortype_append(MASK_OT_primitive_circle_add);
WM_operatortype_append(MASK_OT_primitive_square_add);
/* geometry */
WM_operatortype_append(MASK_OT_switch_direction);
WM_operatortype_append(MASK_OT_normals_make_consistent);
WM_operatortype_append(MASK_OT_delete);
/* select */
WM_operatortype_append(MASK_OT_select);
WM_operatortype_append(MASK_OT_select_all);
WM_operatortype_append(MASK_OT_select_box);
WM_operatortype_append(MASK_OT_select_lasso);
WM_operatortype_append(MASK_OT_select_circle);
WM_operatortype_append(MASK_OT_select_linked_pick);
WM_operatortype_append(MASK_OT_select_linked);
WM_operatortype_append(MASK_OT_select_more);
WM_operatortype_append(MASK_OT_select_less);
/* hide/reveal */
WM_operatortype_append(MASK_OT_hide_view_clear);
WM_operatortype_append(MASK_OT_hide_view_set);
/* feather */
WM_operatortype_append(MASK_OT_feather_weight_clear);
/* shape */
WM_operatortype_append(MASK_OT_slide_point);
WM_operatortype_append(MASK_OT_slide_spline_curvature);
WM_operatortype_append(MASK_OT_cyclic_toggle);
WM_operatortype_append(MASK_OT_handle_type_set);
/* relationships */
WM_operatortype_append(MASK_OT_parent_set);
WM_operatortype_append(MASK_OT_parent_clear);
/* Shape-keys. */
WM_operatortype_append(MASK_OT_shape_key_insert);
WM_operatortype_append(MASK_OT_shape_key_clear);
WM_operatortype_append(MASK_OT_shape_key_feather_reset);
WM_operatortype_append(MASK_OT_shape_key_rekey);
/* layers */
WM_operatortype_append(MASK_OT_layer_move);
/* duplicate */
WM_operatortype_append(MASK_OT_duplicate);
/* clipboard */
WM_operatortype_append(MASK_OT_copy_splines);
WM_operatortype_append(MASK_OT_paste_splines);
}
void ED_keymap_mask(wmKeyConfig *keyconf)
{
wmKeyMap *keymap = WM_keymap_ensure(keyconf, "Mask Editing", 0, 0);
keymap->poll = ED_maskedit_poll;
}
void ED_operatormacros_mask(void)
{
wmOperatorType *ot;
wmOperatorTypeMacro *otmacro;
ot = WM_operatortype_append_macro("MASK_OT_add_vertex_slide",
"Add Vertex and Slide",
"Add new vertex and slide it",
OPTYPE_UNDO | OPTYPE_REGISTER);
ot->description = "Add new vertex and slide it";
WM_operatortype_macro_define(ot, "MASK_OT_add_vertex");
otmacro = WM_operatortype_macro_define(ot, "MASK_OT_slide_point");
RNA_boolean_set(otmacro->ptr, "is_new_point", true);
ot = WM_operatortype_append_macro("MASK_OT_add_feather_vertex_slide",
"Add Feather Vertex and Slide",
"Add new vertex to feather and slide it",
OPTYPE_UNDO | OPTYPE_REGISTER);
ot->description = "Add new feather vertex and slide it";
WM_operatortype_macro_define(ot, "MASK_OT_add_feather_vertex");
otmacro = WM_operatortype_macro_define(ot, "MASK_OT_slide_point");
RNA_boolean_set(otmacro->ptr, "slide_feather", true);
ot = WM_operatortype_append_macro("MASK_OT_duplicate_move",
"Add Duplicate",
"Duplicate mask and move",
OPTYPE_UNDO | OPTYPE_REGISTER);
WM_operatortype_macro_define(ot, "MASK_OT_duplicate");
otmacro = WM_operatortype_macro_define(ot, "TRANSFORM_OT_translate");
RNA_boolean_set(otmacro->ptr, "use_proportional_edit", false);
RNA_boolean_set(otmacro->ptr, "mirror", false);
}
/** \} */
/* -------------------------------------------------------------------- */
/** \name Lock-to-selection viewport preservation
* \{ */
void ED_mask_view_lock_state_store(const bContext *C, MaskViewLockState *state)
{
SpaceClip *space_clip = CTX_wm_space_clip(C);
if (space_clip != NULL) {
ED_clip_view_lock_state_store(C, &state->space_clip_state);
}
}
void ED_mask_view_lock_state_restore_no_jump(const bContext *C, const MaskViewLockState *state)
{
SpaceClip *space_clip = CTX_wm_space_clip(C);
if (space_clip != NULL) {
if ((space_clip->flag & SC_LOCK_SELECTION) == 0) {
/* Early output if the editor is not locked to selection.
* Avoids forced dependency graph evaluation here. */
return;
}
/* Mask's lock-to-selection requires deformed splines to be evaluated to calculate bounds of
* points after animation has been evaluated. The restore-no-jump type of function does
* calculation of new offset for the view for an updated state of mask to cancel the offset out
* by modifying locked offset. In order to do such calculation mask needs to be evaluated after
* modification by an operator. */
struct Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
(void)depsgraph;
ED_clip_view_lock_state_restore_no_jump(C, &state->space_clip_state);
}
}
/** \} */