UI: Allow gizmo-only redraw tagging

NOTE: This change shouldn't have any visible effect. It's just the
first (easiest) step towards decoupling gizmo redraws from viewport
redraws.

We currently redraw the entire region whenever a gizmo needs redrawing,
which would be nice to avoid in the future, see T73198. The first step
towards this would be having a separate tag for them, which is what
this patch implements.
The term "editor-overlays" was chosen because for the forseeable future,
we'll also have to redraw non-gizmo overlays in-between drawing 3D and
2D gizmos. Namely annotations.

Reviewed By: brecht

Differential Revision: https://developer.blender.org/D6838
This commit is contained in:
Julian Eisel 2020-02-14 15:36:12 +01:00
parent 8645b73cd8
commit c4b9cb0af0
15 changed files with 42 additions and 21 deletions

View File

@ -353,7 +353,7 @@ static int gizmo_arrow_modal(bContext *C,
}
/* tag the region for redraw */
ED_region_tag_redraw(ar);
ED_region_tag_redraw_editor_overlays(ar);
WM_event_add_mousemove(C);
return OPERATOR_RUNNING_MODAL;

View File

@ -1086,7 +1086,7 @@ static int gizmo_cage2d_modal(bContext *C,
}
/* tag the region for redraw */
ED_region_tag_redraw(CTX_wm_region(C));
ED_region_tag_redraw_editor_overlays(CTX_wm_region(C));
WM_event_add_mousemove(C);
return OPERATOR_RUNNING_MODAL;

View File

@ -585,7 +585,7 @@ static int gizmo_cage3d_modal(bContext *C,
}
/* tag the region for redraw */
ED_region_tag_redraw(CTX_wm_region(C));
ED_region_tag_redraw_editor_overlays(CTX_wm_region(C));
WM_event_add_mousemove(C);
return OPERATOR_RUNNING_MODAL;

View File

@ -303,7 +303,7 @@ static int gizmo_move_modal(bContext *C,
zero_v3(move->prop_co);
}
ED_region_tag_redraw(ar);
ED_region_tag_redraw_editor_overlays(ar);
inter->prev.tweak_flag = tweak_flag;

View File

@ -75,6 +75,7 @@ void ED_region_tag_redraw_partial(struct ARegion *ar, const struct rcti *rct, bo
void ED_region_tag_redraw_overlay(struct ARegion *ar);
void ED_region_tag_redraw_no_rebuild(struct ARegion *ar);
void ED_region_tag_refresh_ui(struct ARegion *ar);
void ED_region_tag_redraw_editor_overlays(struct ARegion *ar);
void ED_region_panels_init(struct wmWindowManager *wm, struct ARegion *ar);
void ED_region_panels_ex(const struct bContext *C,

View File

@ -629,7 +629,7 @@ void ED_region_tag_redraw(ARegion *ar)
* but python scripts can cause this to happen indirectly */
if (ar && !(ar->do_draw & RGN_DRAWING)) {
/* zero region means full region redraw */
ar->do_draw &= ~(RGN_DRAW_PARTIAL | RGN_DRAW_NO_REBUILD);
ar->do_draw &= ~(RGN_DRAW_PARTIAL | RGN_DRAW_NO_REBUILD | RGN_DRAW_EDITOR_OVERLAYS);
ar->do_draw |= RGN_DRAW;
memset(&ar->drawrct, 0, sizeof(ar->drawrct));
}
@ -645,7 +645,7 @@ void ED_region_tag_redraw_overlay(ARegion *ar)
void ED_region_tag_redraw_no_rebuild(ARegion *ar)
{
if (ar && !(ar->do_draw & (RGN_DRAWING | RGN_DRAW))) {
ar->do_draw &= ~RGN_DRAW_PARTIAL;
ar->do_draw &= ~(RGN_DRAW_PARTIAL | RGN_DRAW_EDITOR_OVERLAYS);
ar->do_draw |= RGN_DRAW_NO_REBUILD;
memset(&ar->drawrct, 0, sizeof(ar->drawrct));
}
@ -658,6 +658,22 @@ void ED_region_tag_refresh_ui(ARegion *ar)
}
}
/**
* Tag editor overlays to be redrawn. If in doubt about which parts need to be redrawn (partial
* clipping rectangle set), redraw everything.
*/
void ED_region_tag_redraw_editor_overlays(struct ARegion *ar)
{
if (ar && !(ar->do_draw & (RGN_DRAWING | RGN_DRAW))) {
if (ar->do_draw & RGN_DRAW_PARTIAL) {
ED_region_tag_redraw(ar);
}
else {
ar->do_draw |= RGN_DRAW_EDITOR_OVERLAYS;
}
}
}
void ED_region_tag_redraw_partial(ARegion *ar, const rcti *rct, bool rebuild)
{
if (ar && !(ar->do_draw & RGN_DRAWING)) {

View File

@ -227,7 +227,7 @@ static int gizmo_preselect_elem_test_select(bContext *C, wmGizmo *gz, const int
if (best.ele) {
ARegion *ar = CTX_wm_region(C);
ED_region_tag_redraw(ar);
ED_region_tag_redraw_editor_overlays(ar);
}
// return best.eed ? 0 : -1;
@ -383,7 +383,7 @@ static int gizmo_preselect_edgering_test_select(bContext *C, wmGizmo *gz, const
RNA_int_set(gz->ptr, "edge_index", gz_ring->edge_index);
ARegion *ar = CTX_wm_region(C);
ED_region_tag_redraw(ar);
ED_region_tag_redraw_editor_overlays(ar);
}
// return best.eed ? 0 : -1;

View File

@ -933,7 +933,7 @@ static int gizmo_ruler_modal(bContext *C,
ruler_info->drag_state_prev.do_thickness = do_thickness;
if (do_draw) {
ED_region_tag_redraw(ar);
ED_region_tag_redraw_editor_overlays(ar);
}
return exit_code;
}
@ -1187,7 +1187,7 @@ static int view3d_ruler_remove_invoke(bContext *C, wmOperator *op, const wmEvent
/* Update the annotation layer. */
view3d_ruler_to_gpencil(C, gzgroup);
ED_region_tag_redraw(ar);
ED_region_tag_redraw_editor_overlays(ar);
return OPERATOR_FINISHED;
}
}

View File

@ -276,7 +276,7 @@ static int gizmo2d_modal(bContext *C,
gizmo2d_origin_to_region(ar, origin);
WM_gizmo_set_matrix_location(widget, origin);
ED_region_tag_redraw(ar);
ED_region_tag_redraw_editor_overlays(ar);
return OPERATOR_RUNNING_MODAL;
}

View File

@ -1567,7 +1567,7 @@ static int gizmo_modal(bContext *C,
WM_gizmo_set_matrix_location(widget, rv3d->twmat[3]);
}
ED_region_tag_redraw(ar);
ED_region_tag_redraw_editor_overlays(ar);
return OPERATOR_RUNNING_MODAL;
}

View File

@ -678,6 +678,9 @@ enum {
RGN_DRAWING = 8,
/* For popups, to refresh UI layout along with drawing. */
RGN_REFRESH_UI = 16,
/* Only editor overlays (currently gizmos only!) should be redrawn. */
RGN_DRAW_EDITOR_OVERLAYS = 32,
};
#endif /* __DNA_SCREEN_TYPES_H__ */

View File

@ -310,7 +310,7 @@ void WM_gizmo_group_remove_by_tool(bContext *C,
if (gzgroup->type == gzgt) {
BLI_assert(gzgroup->parent_gzmap == gzmap);
wm_gizmogroup_free(C, gzgroup);
ED_region_tag_redraw(ar);
ED_region_tag_redraw_editor_overlays(ar);
}
}
}
@ -391,7 +391,7 @@ static int gizmo_select_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSE
}
if (redraw) {
ED_region_tag_redraw(ar);
ED_region_tag_redraw_editor_overlays(ar);
}
return OPERATOR_FINISHED;
@ -941,7 +941,7 @@ wmGizmoGroup *WM_gizmomaptype_group_init_runtime_with_region(wmGizmoMapType *gzm
wm_gizmomap_highlight_set(gzmap, NULL, NULL, 0);
ED_region_tag_redraw(ar);
ED_region_tag_redraw_editor_overlays(ar);
return gzgroup;
}
@ -973,7 +973,7 @@ void WM_gizmomaptype_group_unlink(bContext *C,
if (gzgroup->type == gzgt) {
BLI_assert(gzgroup->parent_gzmap == gzmap);
wm_gizmogroup_free(C, gzgroup);
ED_region_tag_redraw(ar);
ED_region_tag_redraw_editor_overlays(ar);
}
}
}

View File

@ -1047,7 +1047,7 @@ bool wm_gizmomap_highlight_set(wmGizmoMap *gzmap, const bContext *C, wmGizmo *gz
/* tag the region for redraw */
if (C) {
ARegion *ar = CTX_wm_region(C);
ED_region_tag_redraw(ar);
ED_region_tag_redraw_editor_overlays(ar);
}
return true;
@ -1135,7 +1135,7 @@ void wm_gizmomap_modal_set(
WM_cursor_warp(win, UNPACK2(gzmap->gzmap_context.event_xy));
}
}
ED_region_tag_redraw(CTX_wm_region(C));
ED_region_tag_redraw_editor_overlays(CTX_wm_region(C));
WM_event_add_mousemove(C);
}
@ -1385,7 +1385,7 @@ void WM_gizmoconfig_update(struct Main *bmain)
gzgroup_next = gzgroup->next;
if (gzgroup->tag_remove) {
wm_gizmogroup_free(NULL, gzgroup);
ED_region_tag_redraw(ar);
ED_region_tag_redraw_editor_overlays(ar);
}
}
}

View File

@ -318,7 +318,8 @@ void WM_gizmo_do_msg_notify_tag_refresh(bContext *UNUSED(C),
ARegion *ar = msg_val->owner;
wmGizmoMap *gzmap = msg_val->user_data;
ED_region_tag_redraw(ar);
ED_region_tag_redraw(ar); /* Could possibly avoid a full redraw and only tag for editor overlays
redraw in some cases, see ED_region_tag_redraw_editor_overlays(). */
WM_gizmomap_tag_refresh(gzmap);
}

View File

@ -148,7 +148,7 @@ static void gizmotype_unlink(bContext *C, Main *bmain, wmGizmoType *gzt)
BLI_assert(gzgroup->parent_gzmap == gzmap);
if (gz->type == gzt) {
WM_gizmo_unlink(&gzgroup->gizmos, gzgroup->parent_gzmap, gz, C);
ED_region_tag_redraw(ar);
ED_region_tag_redraw_editor_overlays(ar);
}
}
}