diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h index 3dc5ec0ebce..f1be219242e 100644 --- a/source/blender/editors/include/ED_screen.h +++ b/source/blender/editors/include/ED_screen.h @@ -74,8 +74,6 @@ void ED_region_visible_rect(struct ARegion *ar, struct rcti *rect); void ED_spacetypes_keymap(struct wmKeyConfig *keyconf); int ED_area_header_switchbutton(const struct bContext *C, struct uiBlock *block, int yco); int ED_area_header_standardbuttons(const struct bContext *C, struct uiBlock *block, int yco); -void ED_area_overdraw(struct bContext *C); -void ED_area_overdraw_flush(struct ScrArea *sa, struct ARegion *ar); /* areas */ diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c index 82ba0568823..9196fdc1980 100644 --- a/source/blender/editors/screen/area.c +++ b/source/blender/editors/screen/area.c @@ -149,25 +149,6 @@ void ED_area_do_refresh(bContext *C, ScrArea *sa) sa->do_refresh = FALSE; } -/* based on screen region draw tags, set draw tags in azones, and future region tabs etc */ -/* only exported for WM */ -void ED_area_overdraw_flush(ScrArea *sa, ARegion *ar) -{ - AZone *az; - - for (az = sa->actionzones.first; az; az = az->next) { - int xs, ys; - - xs = (az->x1 + az->x2) / 2; - ys = (az->y1 + az->y2) / 2; - - /* test if inside */ - if (BLI_rcti_isect_pt(&ar->winrct, xs, ys)) { - az->do_draw = TRUE; - } - } -} - /** * \brief Corner widgets use for dragging and splitting the view. */ @@ -347,49 +328,50 @@ static void region_draw_azone_tria(AZone *az) glDisable(GL_BLEND); } -/* only exported for WM */ -void ED_area_overdraw(bContext *C) +static void region_draw_azones(ScrArea *sa, ARegion *ar) { - wmWindow *win = CTX_wm_window(C); - bScreen *screen = CTX_wm_screen(C); - ScrArea *sa; - - /* Draw AZones, in screenspace */ - wmSubWindowSet(win, screen->mainwin); + AZone *az; + + if (!sa) + return; glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + glPushMatrix(); + glTranslatef(-ar->winrct.xmin, -ar->winrct.ymin, 0.0f); - for (sa = screen->areabase.first; sa; sa = sa->next) { - AZone *az; - for (az = sa->actionzones.first; az; az = az->next) { - if (az->do_draw) { - if (az->type == AZONE_AREA) { - area_draw_azone(az->x1, az->y1, az->x2, az->y2); - } - else if (az->type == AZONE_REGION) { - - if (az->ar) { - /* only display tab or icons when the region is hidden */ - if (az->ar->flag & (RGN_FLAG_HIDDEN | RGN_FLAG_TOO_SMALL)) { - if (G.debug_value == 3) - region_draw_azone_icon(az); - else if (G.debug_value == 2) - region_draw_azone_tria(az); - else if (G.debug_value == 1) - region_draw_azone_tab(az); - else - region_draw_azone_tab_plus(az); - } + for (az = sa->actionzones.first; az; az = az->next) { + /* test if action zone is over this region */ + rcti azrct; + BLI_rcti_init(&azrct, az->x1, az->x2, az->y1, az->y2); + + if (BLI_rcti_isect(&ar->drawrct, &azrct, NULL)) { + if (az->type == AZONE_AREA) { + area_draw_azone(az->x1, az->y1, az->x2, az->y2); + } + else if (az->type == AZONE_REGION) { + + if (az->ar) { + /* only display tab or icons when the region is hidden */ + if (az->ar->flag & (RGN_FLAG_HIDDEN | RGN_FLAG_TOO_SMALL)) { + if (G.debug_value == 3) + region_draw_azone_icon(az); + else if (G.debug_value == 2) + region_draw_azone_tria(az); + else if (G.debug_value == 1) + region_draw_azone_tab(az); + else + region_draw_azone_tab_plus(az); } } - - az->do_draw = FALSE; } } } + + glPopMatrix(); + glDisable(GL_BLEND); - } /* only exported for WM */ @@ -454,6 +436,8 @@ void ED_region_do_draw(bContext *C, ARegion *ar) ED_region_draw_cb_draw(C, ar, REGION_DRAW_POST_PIXEL); + region_draw_azones(sa, ar); + /* for debugging unneeded area redraws and partial redraw */ #if 0 glEnable(GL_BLEND); diff --git a/source/blender/windowmanager/intern/wm_draw.c b/source/blender/windowmanager/intern/wm_draw.c index 438004b5d76..3e9dc0f10c8 100644 --- a/source/blender/windowmanager/intern/wm_draw.c +++ b/source/blender/windowmanager/intern/wm_draw.c @@ -167,7 +167,6 @@ static void wm_method_draw_full(bContext *C, wmWindow *win) CTX_wm_region_set(C, ar); ED_region_do_draw(C, ar); wm_paintcursor_draw(C, ar); - ED_area_overdraw_flush(sa, ar); CTX_wm_region_set(C, NULL); } } @@ -177,7 +176,6 @@ static void wm_method_draw_full(bContext *C, wmWindow *win) } ED_screen_draw(win); - ED_area_overdraw(C); /* draw overlapping regions */ for (ar = screen->regionbase.first; ar; ar = ar->next) { @@ -282,7 +280,6 @@ static void wm_method_draw_overlap_all(bContext *C, wmWindow *win, int exchange) CTX_wm_region_set(C, ar); ED_region_do_draw(C, ar); wm_paintcursor_draw(C, ar); - ED_area_overdraw_flush(sa, ar); CTX_wm_region_set(C, NULL); if (exchange) @@ -293,7 +290,6 @@ static void wm_method_draw_overlap_all(bContext *C, wmWindow *win, int exchange) CTX_wm_region_set(C, ar); ED_region_do_draw(C, ar); wm_paintcursor_draw(C, ar); - ED_area_overdraw_flush(sa, ar); CTX_wm_region_set(C, NULL); ar->swap = WIN_BOTH_OK; @@ -328,8 +324,6 @@ static void wm_method_draw_overlap_all(bContext *C, wmWindow *win, int exchange) screen->swap = WIN_BOTH_OK; } - ED_area_overdraw(C); - /* draw marked overlapping regions */ for (ar = screen->regionbase.first; ar; ar = ar->next) { if (ar->swinid && ar->do_draw) { @@ -621,7 +615,6 @@ static void wm_method_draw_triple(bContext *C, wmWindow *win) if (ar->overlap == 0) { CTX_wm_region_set(C, ar); ED_region_do_draw(C, ar); - ED_area_overdraw_flush(sa, ar); CTX_wm_region_set(C, NULL); copytex = 1; } @@ -634,7 +627,6 @@ static void wm_method_draw_triple(bContext *C, wmWindow *win) if (copytex) { wmSubWindowSet(win, screen->mainwin); - ED_area_overdraw(C); wm_triple_copy_textures(win, triple); }