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:
parent
785e7ddf10
commit
fb27a9bb98
Notes:
blender-bot
2023-02-18 06:46:29 +01:00
Referenced by commit08c4f134d2
, Fix T92783: Light size controller doesn't update position Referenced by commit5c6cc931b2
, 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 commit46e13cf8a5
, Fix #104817: Camera lens gizmo out of sync when navigating via gizmos
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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). */
|
||||
|
|
Loading…
Reference in New Issue