Gizmo: show groups flagged with SHOW_MODAL_ALL during interaction

Follow up to fix for T73684,
which allowed some modal gizmos to hide all others.

Also resolve an issue from 917a972b56
where shear the shear gizmo would be visible during interaction.

Internally there are some changes to gizmo behavior

- The gizmo with modal interaction wont draw if it's poll function fails.
- The WM_GIZMOGROUPTYPE_DRAW_MODAL_ALL flag now causes these gizmo
  groups to draw when another group is being interacted with.
This commit is contained in:
Campbell Barton 2021-09-15 17:44:35 +10:00
parent 785e7ddf10
commit fb27a9bb98
Notes: blender-bot 2023-02-18 06:46:29 +01:00
Referenced by commit 08c4f134d2, Fix T92783: Light size controller doesn't update position
Referenced by commit 5c6cc931b2, Gizmo: add flag to hide the gizmo group during interaction
Referenced by issue #94857, Regression: 'Gizmo Operator' from python templates is spining in accumulative way, when dragged.
Referenced by issue #93594, Regression: Header transform options hide on modal operation
Referenced by issue #92783, light size controller not update position
Referenced by issue #104817, Regression: Drawing bug of the Camera Lens gizmo when using the 3D Viewport Axis
Referenced by commit 46e13cf8a5, Fix #104817: Camera lens gizmo out of sync when navigating via gizmos
3 changed files with 12 additions and 16 deletions

View File

@ -1401,7 +1401,7 @@ static void rna_def_gizmogroup(BlenderRNA *brna)
"SHOW_MODAL_ALL",
0,
"Show Modal All",
"Show all while interacting"},
"Show all while interacting, as well as this group when another is being interacted with"},
{WM_GIZMOGROUPTYPE_TOOL_INIT,
"TOOL_INIT",
0,

View File

@ -115,7 +115,10 @@ typedef enum eWM_GizmoFlagGroupTypeFlag {
WM_GIZMOGROUPTYPE_SELECT = (1 << 3),
/** The gizmo group is to be kept (not removed on loading a new file for eg). */
WM_GIZMOGROUPTYPE_PERSISTENT = (1 << 4),
/** Show all other gizmos when interacting. */
/**
* Show all other gizmos when interacting.
* Also show this group when another group is being interacted with.
*/
WM_GIZMOGROUPTYPE_DRAW_MODAL_ALL = (1 << 5),
/**
* When used with tool, only run when activating the tool,

View File

@ -381,20 +381,6 @@ static void gizmomap_prepare_drawing(wmGizmoMap *gzmap,
wmGizmo *gz_modal = gzmap->gzmap_context.modal;
/* only active gizmo needs updating */
if (gz_modal) {
if ((gz_modal->parent_gzgroup->type->flag & WM_GIZMOGROUPTYPE_DRAW_MODAL_ALL) == 0) {
if ((gz_modal->parent_gzgroup->hide.any == 0) &&
wm_gizmogroup_is_visible_in_drawstep(gz_modal->parent_gzgroup, drawstep)) {
if (gizmo_prepare_drawing(gzmap, gz_modal, C, draw_gizmos, drawstep)) {
gzmap->update_flag[drawstep] &= ~GIZMOMAP_IS_PREPARE_DRAW;
}
}
/* don't draw any other gizmos */
return;
}
}
/* Allow refresh functions to ask to be refreshed again, clear before the loop below. */
const bool do_refresh = gzmap->update_flag[drawstep] & GIZMOMAP_IS_REFRESH_CALLBACK;
gzmap->update_flag[drawstep] &= ~GIZMOMAP_IS_REFRESH_CALLBACK;
@ -406,6 +392,13 @@ static void gizmomap_prepare_drawing(wmGizmoMap *gzmap,
continue;
}
/* When modal only show other gizmo groups tagged with #WM_GIZMOGROUPTYPE_DRAW_MODAL_ALL. */
if (gz_modal && (gzgroup != gz_modal->parent_gzgroup)) {
if ((gzgroup->type->flag & WM_GIZMOGROUPTYPE_DRAW_MODAL_ALL) == 0) {
continue;
}
}
/* Needs to be initialized on first draw. */
/* XXX weak: Gizmo-group may skip refreshing if it's invisible
* (map gets untagged nevertheless). */