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@pandora.be>2013-05-15 21:59:55 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2013-05-15 21:59:55 +0400
commitac433977674d64cbb513ecdb01d8245a5950a027 (patch)
treea193c91a6e80e6a4281b1c16fbaa22c222da272b
parenta4b5c05aadf5a258fdc4e52596e20c9ca88607f2 (diff)
Fix action zones not drawing properly while sculpting, due to recent bugfix.
Partial redraw doesn't work so well with these, now I've changed the action zones to just draw as part of regions instead of as a special overdraw done at the end, which fits better with partial redraw by avoiding any special exceptions.
-rw-r--r--source/blender/editors/include/ED_screen.h2
-rw-r--r--source/blender/editors/screen/area.c86
-rw-r--r--source/blender/windowmanager/intern/wm_draw.c8
3 files changed, 35 insertions, 61 deletions
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);
}