diff options
author | Germano Cavalcante <mano-wii> | 2022-03-11 00:33:04 +0300 |
---|---|---|
committer | Germano Cavalcante <germano.costa@ig.com.br> | 2022-03-11 00:47:38 +0300 |
commit | e3de755ae31503284277681b52947c02aef5d411 (patch) | |
tree | 481eb60ba38e1a2fe3522501e162cb599c5468f6 | |
parent | edcb2ad7b3a07f9cd09243cc5fbf5e563e853964 (diff) |
Transform/UI: individualize the option to use snap per editor type
`3DView`'s `use_snap` option has little or nothing to do with using
snapping in `UV`, `Nodes` or `Sequencer`.
So there are no real advantages to keeping these options in sync.
Therefore, individualize the option to use snap for each "spacetype".
Reviewed By: brecht
Differential Revision: https://developer.blender.org/D13310
-rw-r--r-- | release/scripts/presets/keyconfig/keymap_data/blender_default.py | 4 | ||||
-rw-r--r-- | release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py | 2 | ||||
-rw-r--r-- | release/scripts/startup/bl_ui/space_image.py | 2 | ||||
-rw-r--r-- | release/scripts/startup/bl_ui/space_node.py | 2 | ||||
-rw-r--r-- | source/blender/blenloader/intern/versioning_300.c | 15 | ||||
-rw-r--r-- | source/blender/editors/animation/anim_ops.c | 2 | ||||
-rw-r--r-- | source/blender/editors/transform/transform.c | 36 | ||||
-rw-r--r-- | source/blender/editors/transform/transform.h | 3 | ||||
-rw-r--r-- | source/blender/editors/transform/transform_snap.c | 43 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_scene_types.h | 16 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_scene.c | 26 |
11 files changed, 109 insertions, 42 deletions
diff --git a/release/scripts/presets/keyconfig/keymap_data/blender_default.py b/release/scripts/presets/keyconfig/keymap_data/blender_default.py index 94454ad50e8..5a12d5c79f9 100644 --- a/release/scripts/presets/keyconfig/keymap_data/blender_default.py +++ b/release/scripts/presets/keyconfig/keymap_data/blender_default.py @@ -1224,7 +1224,7 @@ def km_uv_editor(params): ("transform.shear", {"type": 'S', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, None), ("transform.mirror", {"type": 'M', "value": 'PRESS', "ctrl": True}, None), ("wm.context_toggle", {"type": 'TAB', "value": 'PRESS', "shift": True}, - {"properties": [("data_path", 'tool_settings.use_snap')]}), + {"properties": [("data_path", 'tool_settings.use_snap_uv')]}), ("wm.context_menu_enum", {"type": 'TAB', "value": 'PRESS', "shift": True, "ctrl": True}, {"properties": [("data_path", 'tool_settings.snap_uv_element')]}), *_template_items_context_menu("IMAGE_MT_uvs_context_menu", params.context_menu_event), @@ -2089,7 +2089,7 @@ def km_node_editor(params): {"type": params.select_mouse, "value": 'CLICK_DRAG', "alt": True}, {"properties": [("TRANSFORM_OT_translate", [("view2d_edge_pan", True)])]}), ("wm.context_toggle", {"type": 'TAB', "value": 'PRESS', "shift": True}, - {"properties": [("data_path", 'tool_settings.use_snap')]}), + {"properties": [("data_path", 'tool_settings.use_snap_node')]}), ("wm.context_menu_enum", {"type": 'TAB', "value": 'PRESS', "shift": True, "ctrl": True}, {"properties": [("data_path", 'tool_settings.snap_node_element')]}), ("wm.context_toggle", {"type": 'Z', "value": 'PRESS', "alt": True, "shift": True}, diff --git a/release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py b/release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py index 3469dbdc175..55ee91af7cd 100644 --- a/release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py +++ b/release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py @@ -1152,7 +1152,7 @@ def km_node_editor(params): ("node.move_detach_links_release", {"type": params.action_mouse, "value": 'CLICK_DRAG', "alt": True}, None), ("node.move_detach_links", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG', "alt": True}, None), ("wm.context_toggle", {"type": 'X', "value": 'PRESS'}, - {"properties": [("data_path", 'tool_settings.use_snap')]}), + {"properties": [("data_path", 'tool_settings.use_snap_node')]}), ]) return keymap diff --git a/release/scripts/startup/bl_ui/space_image.py b/release/scripts/startup/bl_ui/space_image.py index 65d624a253d..785a841a0e6 100644 --- a/release/scripts/startup/bl_ui/space_image.py +++ b/release/scripts/startup/bl_ui/space_image.py @@ -724,7 +724,7 @@ class IMAGE_HT_header(Header): act_snap_uv_element = tool_settings.bl_rna.properties['snap_uv_element'].enum_items[snap_uv_element] row = layout.row(align=True) - row.prop(tool_settings, "use_snap", text="") + row.prop(tool_settings, "use_snap_uv", text="") sub = row.row(align=True) sub.popover( diff --git a/release/scripts/startup/bl_ui/space_node.py b/release/scripts/startup/bl_ui/space_node.py index a89b201d648..7c88006a4d6 100644 --- a/release/scripts/startup/bl_ui/space_node.py +++ b/release/scripts/startup/bl_ui/space_node.py @@ -185,7 +185,7 @@ class NODE_HT_header(Header): # Snap row = layout.row(align=True) - row.prop(tool_settings, "use_snap", text="") + row.prop(tool_settings, "use_snap_node", text="") row.prop(tool_settings, "snap_node_element", icon_only=True) if tool_settings.snap_node_element != 'GRID': row.prop(tool_settings, "snap_target", text="") diff --git a/source/blender/blenloader/intern/versioning_300.c b/source/blender/blenloader/intern/versioning_300.c index 32dcb977110..37356e58132 100644 --- a/source/blender/blenloader/intern/versioning_300.c +++ b/source/blender/blenloader/intern/versioning_300.c @@ -1481,6 +1481,10 @@ static void version_liboverride_rnacollections_insertion_animdata(ID *id) /* NOLINTNEXTLINE: readability-function-size */ void blo_do_versions_300(FileData *fd, Library *UNUSED(lib), Main *bmain) { + /* The #SCE_SNAP_SEQ flag has been removed in favor of the #SCE_SNAP which can be used for each + * snap_flag member individually. */ + const int SCE_SNAP_SEQ = (1 << 7); + if (!MAIN_VERSION_ATLEAST(bmain, 300, 1)) { /* Set default value for the new bisect_threshold parameter in the mirror modifier. */ if (!DNA_struct_elem_find(fd->filesdna, "MirrorModifierData", "float", "bisect_threshold")) { @@ -2585,5 +2589,16 @@ void blo_do_versions_300(FileData *fd, Library *UNUSED(lib), Main *bmain) ts->uv_relax_method = UV_SCULPT_TOOL_RELAX_LAPLACIAN; } } + LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) { + ToolSettings *tool_settings = scene->toolsettings; + tool_settings->snap_flag_seq = tool_settings->snap_flag & ~(SCE_SNAP | SCE_SNAP_SEQ); + if (tool_settings->snap_flag & SCE_SNAP_SEQ) { + tool_settings->snap_flag_seq |= SCE_SNAP; + tool_settings->snap_flag &= ~SCE_SNAP_SEQ; + } + + tool_settings->snap_flag_node = tool_settings->snap_flag; + tool_settings->snap_uv_flag |= tool_settings->snap_flag & SCE_SNAP; + } } } diff --git a/source/blender/editors/animation/anim_ops.c b/source/blender/editors/animation/anim_ops.c index 1e8f46fd490..5b0c5eac11b 100644 --- a/source/blender/editors/animation/anim_ops.c +++ b/source/blender/editors/animation/anim_ops.c @@ -233,7 +233,7 @@ static bool use_sequencer_snapping(bContext *C) Scene *scene = CTX_data_scene(C); short snap_flag = SEQ_tool_settings_snap_flag_get(scene); - return (scene->toolsettings->snap_flag & SCE_SNAP_SEQ) && + return (scene->toolsettings->snap_flag_seq & SCE_SNAP) && (snap_flag & SEQ_SNAP_CURRENT_FRAME_TO_STRIPS); } diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index bb80109d8c9..92d312cebce 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -1513,14 +1513,42 @@ void saveTransform(bContext *C, TransInfo *t, wmOperator *op) if (t->flag & T_MODAL) { /* do we check for parameter? */ if (transformModeUseSnap(t)) { - if (!(t->modifiers & MOD_SNAP) != !(ts->snap_flag & SCE_SNAP)) { + if (!(t->modifiers & MOD_SNAP) != !(t->tsnap.flag & SCE_SNAP)) { + char *snap_flag_ptr; + + wmMsgParams_RNA msg_key_params = {{0}}; + RNA_pointer_create(&t->scene->id, &RNA_ToolSettings, ts, &msg_key_params.ptr); + + _WM_MESSAGE_EXTERN_BEGIN; + extern PropertyRNA rna_ToolSettings_use_snap; + extern PropertyRNA rna_ToolSettings_use_snap_node; + extern PropertyRNA rna_ToolSettings_use_snap_sequencer; + extern PropertyRNA rna_ToolSettings_use_snap_uv; + _WM_MESSAGE_EXTERN_END; + if (t->spacetype == SPACE_NODE) { + snap_flag_ptr = &ts->snap_flag_node; + msg_key_params.prop = &rna_ToolSettings_use_snap_node; + } + else if (t->spacetype == SPACE_IMAGE) { + snap_flag_ptr = &ts->snap_uv_flag; + msg_key_params.prop = &rna_ToolSettings_use_snap_uv; + } + else if (t->spacetype == SPACE_SEQ) { + snap_flag_ptr = &ts->snap_flag_seq; + msg_key_params.prop = &rna_ToolSettings_use_snap_sequencer; + } + else { + snap_flag_ptr = &ts->snap_flag; + msg_key_params.prop = &rna_ToolSettings_use_snap; + } + if (t->modifiers & MOD_SNAP) { - ts->snap_flag |= SCE_SNAP; + *snap_flag_ptr |= SCE_SNAP; } else { - ts->snap_flag &= ~SCE_SNAP; + *snap_flag_ptr &= ~SCE_SNAP; } - WM_msg_publish_rna_prop(t->mbus, &t->scene->id, ts, ToolSettings, use_snap); + WM_msg_publish_rna_params(t->mbus, &msg_key_params); } } } diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h index 21592032af2..713cf487ac7 100644 --- a/source/blender/editors/transform/transform.h +++ b/source/blender/editors/transform/transform.h @@ -295,7 +295,8 @@ typedef struct TransSnapPoint { } TransSnapPoint; typedef struct TransSnap { - short mode; + char flag; + char mode; short target; short modePoint; short modeSelect; diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c index 2f3c021ba38..7ace6343985 100644 --- a/source/blender/editors/transform/transform_snap.c +++ b/source/blender/editors/transform/transform_snap.c @@ -561,7 +561,22 @@ static bool bm_face_is_snap_target(BMFace *f, void *UNUSED(user_data)) return true; } -static short snap_mode_from_scene(TransInfo *t) +static char snap_flag_from_spacetype(TransInfo *t) +{ + ToolSettings *ts = t->settings; + if (t->spacetype == SPACE_NODE) { + return ts->snap_flag_node; + } + else if (t->spacetype == SPACE_IMAGE) { + return ts->snap_uv_flag; + } + else if (t->spacetype == SPACE_SEQ) { + return ts->snap_flag_seq; + } + return ts->snap_flag; +} + +static short snap_mode_from_spacetype(TransInfo *t) { ToolSettings *ts = t->settings; short r_snap_mode = SCE_SNAP_MODE_INCREMENT; @@ -580,7 +595,7 @@ static short snap_mode_from_scene(TransInfo *t) else if (t->spacetype == SPACE_SEQ) { r_snap_mode = SEQ_tool_settings_snap_mode_get(t->scene); } - else if (ELEM(t->spacetype, SPACE_VIEW3D, SPACE_IMAGE) && !(t->options & CTX_CAMERA)) { + else if ((t->spacetype == SPACE_VIEW3D) && !(t->options & CTX_CAMERA)) { /* All obedit types will match. */ const int obedit_type = t->obedit_type; if ((t->options & (CTX_GPENCIL_STROKES | CTX_CURSOR | CTX_OBMODE_XFORM_OBDATA)) || @@ -652,7 +667,7 @@ static short snap_select_type_get(TransInfo *t) static void initSnappingMode(TransInfo *t) { ToolSettings *ts = t->settings; - t->tsnap.mode = snap_mode_from_scene(t); + t->tsnap.mode = snap_mode_from_spacetype(t); t->tsnap.modeSelect = snap_select_type_get(t); if ((t->spacetype != SPACE_VIEW3D) || !(ts->snap_mode & SCE_SNAP_MODE_FACE)) { @@ -701,10 +716,9 @@ static void initSnappingMode(TransInfo *t) void initSnapping(TransInfo *t, wmOperator *op) { - ToolSettings *ts = t->settings; - short snap_target = t->settings->snap_target; - resetSnapping(t); + t->tsnap.flag = snap_flag_from_spacetype(t); + short snap_target = t->settings->snap_target; /* if snap property exists */ PropertyRNA *prop; @@ -745,19 +759,14 @@ void initSnapping(TransInfo *t, wmOperator *op) } /* use scene defaults only when transform is modal */ else if (t->flag & T_MODAL) { - if (ELEM(t->spacetype, SPACE_VIEW3D, SPACE_IMAGE, SPACE_NODE)) { - if (transformModeUseSnap(t) && (ts->snap_flag & SCE_SNAP)) { - t->modifiers |= MOD_SNAP; - } - - t->tsnap.align = ((t->settings->snap_flag & SCE_SNAP_ROTATE) != 0); - t->tsnap.project = ((t->settings->snap_flag & SCE_SNAP_PROJECT) != 0); - t->tsnap.snap_self = !((t->settings->snap_flag & SCE_SNAP_NO_SELF) != 0); - t->tsnap.peel = ((t->settings->snap_flag & SCE_SNAP_PROJECT) != 0); - } - else if ((t->spacetype == SPACE_SEQ) && (ts->snap_flag & SCE_SNAP_SEQ)) { + if (transformModeUseSnap(t) && (t->tsnap.flag & SCE_SNAP)) { t->modifiers |= MOD_SNAP; } + + t->tsnap.align = ((t->tsnap.flag & SCE_SNAP_ROTATE) != 0); + t->tsnap.project = ((t->tsnap.flag & SCE_SNAP_PROJECT) != 0); + t->tsnap.snap_self = !((t->tsnap.flag & SCE_SNAP_NO_SELF) != 0); + t->tsnap.peel = ((t->tsnap.flag & SCE_SNAP_PROJECT) != 0); } t->tsnap.target = snap_target; diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index 512be41ce2c..2f8d1c5eafe 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -1469,13 +1469,18 @@ typedef struct ToolSettings { /* Transform */ char transform_pivot_point; char transform_flag; + /** Snap elements (per spacetype). */ char snap_mode; char snap_node_mode; char snap_uv_mode; + /** Generic flags (per spacetype). */ char snap_flag; - /** UV equivalent of `snap_flag`, limited to: #SCE_SNAP_ABS_GRID. */ + char snap_flag_node; + char snap_flag_seq; char snap_uv_flag; + /** Default snap source. */ char snap_target; + /** Snap mask for transform modes. */ char snap_transform_mode_flag; char proportional_edit, prop_mode; @@ -1505,16 +1510,14 @@ typedef struct ToolSettings { char gpencil_selectmode_vertex; /* UV painting */ - char _pad2[1]; char uv_sculpt_settings; char uv_relax_method; - /* XXX: these sculpt_paint_* fields are deprecated, use the - * unified_paint_settings field instead! */ - short sculpt_paint_settings DNA_DEPRECATED; char workspace_tool_type; - char _pad5[1]; + /* XXX: these sculpt_paint_* fields are deprecated, use the + * unified_paint_settings field instead! */ + short sculpt_paint_settings DNA_DEPRECATED; int sculpt_paint_unified_size DNA_DEPRECATED; float sculpt_paint_unified_unprojected_radius DNA_DEPRECATED; float sculpt_paint_unified_alpha DNA_DEPRECATED; @@ -2055,7 +2058,6 @@ enum { #define SCE_SNAP_NO_SELF (1 << 4) #define SCE_SNAP_ABS_GRID (1 << 5) #define SCE_SNAP_BACKFACE_CULLING (1 << 6) -#define SCE_SNAP_SEQ (1 << 7) /** #ToolSettings.snap_target */ #define SCE_SNAP_TARGET_CLOSEST 0 diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 209331065ac..d398dadbec7 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -3149,6 +3149,25 @@ static void rna_def_tool_settings(BlenderRNA *brna) RNA_def_property_ui_icon(prop, ICON_SNAP_OFF, 1); RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); /* header redraw */ + prop = RNA_def_property(srna, "use_snap_node", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "snap_flag_node", SCE_SNAP); + RNA_def_property_ui_text(prop, "Snap", "Snap Node during transform"); + RNA_def_property_ui_icon(prop, ICON_SNAP_OFF, 1); + RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); /* header redraw */ + + prop = RNA_def_property(srna, "use_snap_sequencer", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "snap_flag_seq", SCE_SNAP); + RNA_def_property_ui_text(prop, "Use Snapping", "Snap to strip edges or current frame"); + RNA_def_property_ui_icon(prop, ICON_SNAP_OFF, 1); + RNA_def_property_boolean_default(prop, true); + RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); /* Publish message-bus. */ + + prop = RNA_def_property(srna, "use_snap_uv", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "snap_uv_flag", SCE_SNAP); + RNA_def_property_ui_text(prop, "Snap", "Snap UV during transform"); + RNA_def_property_ui_icon(prop, ICON_SNAP_OFF, 1); + RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); /* header redraw */ + prop = RNA_def_property(srna, "use_snap_align_rotation", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "snap_flag", SCE_SNAP_ROTATE); RNA_def_property_ui_text( @@ -3163,13 +3182,6 @@ static void rna_def_tool_settings(BlenderRNA *brna) "Absolute grid alignment while translating (based on the pivot center)"); RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); /* header redraw */ - prop = RNA_def_property(srna, "use_snap_sequencer", PROP_BOOLEAN, PROP_NONE); - RNA_def_property_boolean_sdna(prop, NULL, "snap_flag", SCE_SNAP_SEQ); - RNA_def_property_ui_text(prop, "Use Snapping", "Snap to strip edges or current frame"); - RNA_def_property_ui_icon(prop, ICON_SNAP_OFF, 1); - RNA_def_property_boolean_default(prop, true); - RNA_def_property_update(prop, NC_SCENE | ND_TOOLSETTINGS, NULL); /* Publish message-bus. */ - prop = RNA_def_property(srna, "snap_elements", PROP_ENUM, PROP_NONE); RNA_def_property_enum_bitflag_sdna(prop, NULL, "snap_mode"); RNA_def_property_enum_items(prop, rna_enum_snap_element_items); |