Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2019-07-01 16:23:42 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2019-07-01 17:15:07 +0300
commit31b2c4c10a413b93551ba313fd93c77698207216 (patch)
tree5f0cf3d5d4f139c305dc30b4f6c40f7b53a92989 /source/blender/windowmanager
parentbbbb5cad319e0e2c853b089cd3e1cbb83b447f67 (diff)
Fix T60289: changing gizmo properties causes excessive redraws
Diffstat (limited to 'source/blender/windowmanager')
-rw-r--r--source/blender/windowmanager/gizmo/WM_gizmo_types.h3
-rw-r--r--source/blender/windowmanager/intern/wm_draw.c44
2 files changed, 43 insertions, 4 deletions
diff --git a/source/blender/windowmanager/gizmo/WM_gizmo_types.h b/source/blender/windowmanager/gizmo/WM_gizmo_types.h
index 68ecdeea936..2b74677a1a2 100644
--- a/source/blender/windowmanager/gizmo/WM_gizmo_types.h
+++ b/source/blender/windowmanager/gizmo/WM_gizmo_types.h
@@ -248,6 +248,9 @@ struct wmGizmo {
struct IDProperty *properties;
+ /** Redraw tag. */
+ bool do_draw;
+
/** Temporary data (assume dirty). */
union {
float f;
diff --git a/source/blender/windowmanager/intern/wm_draw.c b/source/blender/windowmanager/intern/wm_draw.c
index 56fc38160f0..fc669c9543e 100644
--- a/source/blender/windowmanager/intern/wm_draw.c
+++ b/source/blender/windowmanager/intern/wm_draw.c
@@ -188,6 +188,26 @@ static void wm_area_mark_invalid_backbuf(ScrArea *sa)
}
}
+static void wm_region_test_gizmo_do_draw(ARegion *ar, bool tag_redraw)
+{
+ if (ar->gizmo_map == NULL) {
+ return;
+ }
+
+ wmGizmoMap *gzmap = ar->gizmo_map;
+ for (wmGizmoGroup *gzgroup = WM_gizmomap_group_list(gzmap)->first; gzgroup;
+ gzgroup = gzgroup->next) {
+ for (wmGizmo *gz = gzgroup->gizmos.first; gz; gz = gz->next) {
+ if (gz->do_draw) {
+ if (tag_redraw) {
+ ED_region_tag_redraw_no_rebuild(ar);
+ }
+ gz->do_draw = false;
+ }
+ }
+ }
+}
+
static void wm_region_test_render_do_draw(const Scene *scene,
struct Depsgraph *depsgraph,
ScrArea *sa,
@@ -817,6 +837,7 @@ static bool wm_draw_update_test_window(wmWindow *win)
ED_screen_areas_iter(win, screen, sa)
{
for (ar = sa->regionbase.first; ar; ar = ar->next) {
+ wm_region_test_gizmo_do_draw(ar, true);
wm_region_test_render_do_draw(scene, depsgraph, sa, ar);
if (ar->visible && ar->do_draw) {
@@ -848,6 +869,24 @@ static bool wm_draw_update_test_window(wmWindow *win)
return false;
}
+/* Clear drawing flags, after drawing is complete so any draw flags set during
+ * drawing don't cause any additional redraws. */
+static void wm_draw_update_clear_window(wmWindow *win)
+{
+ bScreen *screen = WM_window_get_active_screen(win);
+
+ ED_screen_areas_iter(win, screen, sa)
+ {
+ for (ARegion *ar = sa->regionbase.first; ar; ar = ar->next) {
+ wm_region_test_gizmo_do_draw(ar, false);
+ }
+ }
+
+ screen->do_draw_gesture = false;
+ screen->do_draw_paintcursor = false;
+ screen->do_draw_drag = false;
+}
+
void WM_paint_cursor_tag_redraw(wmWindow *win, ARegion *UNUSED(ar))
{
if (win) {
@@ -893,10 +932,7 @@ void wm_draw_update(bContext *C)
ED_screen_ensure_updated(wm, win, screen);
wm_draw_window(C, win);
-
- screen->do_draw_gesture = false;
- screen->do_draw_paintcursor = false;
- screen->do_draw_drag = false;
+ wm_draw_update_clear_window(win);
wm_window_swap_buffers(win);