diff --git a/source/blender/include/BIF_glutil.h b/source/blender/include/BIF_glutil.h index 48d4d903d28..db2b55aab86 100644 --- a/source/blender/include/BIF_glutil.h +++ b/source/blender/include/BIF_glutil.h @@ -198,12 +198,14 @@ void gla2DGetMap(gla2DDrawInfo *di, struct rctf *rect); void gla2DSetMap(gla2DDrawInfo *di, struct rctf *rect); -/* use this for platform hacks. for now glPointSize is solved here */ +/* use this for platform hacks. glPointSize is solved here */ void bglBegin(int mode); void bglEnd(void); void bglVertex3fv(float *vec); void bglVertex3f(float x, float y, float z); void bglVertex2fv(float *vec); +/* intel gfx cards frontbuffer problem */ +void bglFlush(void); void set_inverted_drawing(int enable); diff --git a/source/blender/include/BIF_screen.h b/source/blender/include/BIF_screen.h index c76f961014a..e97d10b2455 100644 --- a/source/blender/include/BIF_screen.h +++ b/source/blender/include/BIF_screen.h @@ -125,12 +125,6 @@ int do_screenhandlers(struct bScreen *sc); int has_screenhandler(struct bScreen *sc, short eventcode); /***/ - -/** - * Draw @a text in the header of each info window - * of the given screen. - */ -void screen_draw_info_text(struct bScreen *sc, char *text); /* return all layers of all 3d windows in a screen */ unsigned int screen_view3d_layers(void); diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h index 105218a0cab..98ca418cdde 100644 --- a/source/blender/makesdna/DNA_space_types.h +++ b/source/blender/makesdna/DNA_space_types.h @@ -323,6 +323,7 @@ typedef struct SpaceNode { /* snode->flag */ #define SNODE_DO_PREVIEW 1 +#define SNODE_BACKDRAW 2 # # diff --git a/source/blender/src/drawnode.c b/source/blender/src/drawnode.c index 0fc2b207f5b..81b2433ee8e 100644 --- a/source/blender/src/drawnode.c +++ b/source/blender/src/drawnode.c @@ -37,6 +37,7 @@ #include "DNA_action_types.h" #include "DNA_ipo_types.h" #include "DNA_ID.h" +#include "DNA_image_types.h" #include "DNA_material_types.h" #include "DNA_node_types.h" #include "DNA_object_types.h" @@ -76,6 +77,7 @@ #include "MEM_guardedalloc.h" #include "RE_pipeline.h" +#include "IMB_imbuf_types.h" #include "blendef.h" #include "butspace.h" @@ -1117,6 +1119,33 @@ static void draw_nodespace_grid(SpaceNode *snode) glEnd(); } +static void draw_nodespace_back(ScrArea *sa, SpaceNode *snode) +{ + Image *ima; + + draw_nodespace_grid(snode); + + if(snode->flag & SNODE_BACKDRAW) { + ima= (Image *)find_id("IM", "Viewer Node"); + if(ima && ima->ibuf) { + /* somehow the offset has to be calculated inverse */ + + glaDefine2DArea(&sa->winrct); + /* ortho at pixel level curarea */ + myortho2(-0.375, sa->winx-0.375, -0.375, sa->winy-0.375); + + if(ima->ibuf->rect) + glaDrawPixelsSafe((sa->winx-ima->ibuf->x)/2, (sa->winy-ima->ibuf->y)/2, ima->ibuf->x, ima->ibuf->y, ima->ibuf->x, GL_RGBA, GL_UNSIGNED_BYTE, ima->ibuf->rect); + else + glaDrawPixelsSafe((sa->winx-ima->ibuf->x)/2, (sa->winy-ima->ibuf->y)/2, ima->ibuf->x, ima->ibuf->y, ima->ibuf->x, GL_RGBA, GL_FLOAT, ima->ibuf->rect_float); + + /* sort this out, this should not be needed */ + myortho2(snode->v2d.cur.xmin, snode->v2d.cur.xmax, snode->v2d.cur.ymin, snode->v2d.cur.ymax); + bwin_clear_viewmat(sa->win); /* clear buttons view */ + glLoadIdentity(); + } + } +} static void nodeshadow(rctf *rct, float radius, float aspect, int select) { @@ -1545,9 +1574,11 @@ static void node_draw_basis(ScrArea *sa, SpaceNode *snode, bNode *node) snode_drawstring(snode, node->name, (int)(iconofs - rct->xmin-18.0f)); /* body */ - BIF_ThemeColor(TH_NODE); + BIF_ThemeColor4(TH_NODE); + glEnable(GL_BLEND); uiSetRoundBox(8); uiRoundBox(rct->xmin, rct->ymin, rct->xmax, rct->ymax-NODE_DY, BASIS_RAD); + glDisable(GL_BLEND); /* scaling indicator */ node_scaling_widget(TH_NODE, snode->aspect, rct->xmax-BASIS_RAD*snode->aspect, rct->ymin, rct->xmax, rct->ymin+BASIS_RAD*snode->aspect); @@ -1958,7 +1989,7 @@ void drawnodespace(ScrArea *sa, void *spacedata) snode->curfont= uiSetCurFont_ext(snode->aspect); /* backdrop */ - draw_nodespace_grid(snode); + draw_nodespace_back(sa, snode); /* nodes */ snode_set_context(snode); diff --git a/source/blender/src/drawobject.c b/source/blender/src/drawobject.c index 9d990f97d16..53337651249 100644 --- a/source/blender/src/drawobject.c +++ b/source/blender/src/drawobject.c @@ -4069,7 +4069,7 @@ void draw_object_ext(Base *base) G.f &= ~G_DRAW_EXT; - glFlush(); /* reveil frontbuffer drawing */ + bglFlush(); /* reveil frontbuffer drawing */ glDrawBuffer(GL_BACK); if(G.vd->zbuf) { diff --git a/source/blender/src/drawtext.c b/source/blender/src/drawtext.c index 5025b08de1e..c2c6aa89e7d 100644 --- a/source/blender/src/drawtext.c +++ b/source/blender/src/drawtext.c @@ -64,6 +64,7 @@ #include "BKE_main.h" #include "BIF_gl.h" +#include "BIF_glutil.h" #include "BIF_keyval.h" #include "BIF_interface.h" #include "BIF_drawtext.h" @@ -820,6 +821,7 @@ static void do_textscroll(SpaceText *st, int mode) glDrawBuffer(GL_FRONT); uiEmboss(st->txtbar.xmin, st->txtbar.ymin, st->txtbar.xmax, st->txtbar.ymax, st->flags & ST_SCROLL_SELECT); + bglFlush(); glDrawBuffer(GL_BACK); getmouseco_areawin(mval); @@ -857,6 +859,7 @@ static void do_textscroll(SpaceText *st, int mode) glDrawBuffer(GL_FRONT); uiEmboss(st->txtbar.xmin, st->txtbar.ymin, st->txtbar.xmax, st->txtbar.ymax, st->flags & ST_SCROLL_SELECT); + bglFlush(); glDrawBuffer(GL_BACK); } diff --git a/source/blender/src/editmesh_loop.c b/source/blender/src/editmesh_loop.c index 609b68b5cf5..8a88e40cb78 100644 --- a/source/blender/src/editmesh_loop.c +++ b/source/blender/src/editmesh_loop.c @@ -506,7 +506,7 @@ static CutCurve *get_mouse_trail(int *len, char mode) if( event==ESCKEY || event==RIGHTMOUSE ) { if (curve) MEM_freeN(curve); *len=0; - glFlush(); + bglFlush(); glDrawBuffer(GL_BACK); return(NULL); break; @@ -586,7 +586,7 @@ static CutCurve *get_mouse_trail(int *len, char mode) } } - glFlush(); + bglFlush(); glDrawBuffer(GL_BACK); persp(PERSP_VIEW); diff --git a/source/blender/src/editmesh_mods.c b/source/blender/src/editmesh_mods.c index ba6dce0001f..57b481e3191 100644 --- a/source/blender/src/editmesh_mods.c +++ b/source/blender/src/editmesh_mods.c @@ -696,7 +696,7 @@ static void unified_select_draw(EditVert *eve, EditEdge *eed, EditFace *efa) glPointSize(1.0); glPopMatrix(); - glFlush(); + bglFlush(); glDrawBuffer(GL_BACK); if(G.vd->flag & V3D_CLIPPING) diff --git a/source/blender/src/editmesh_tools.c b/source/blender/src/editmesh_tools.c index d7bcf39a1cf..3ce7ef4cd16 100644 --- a/source/blender/src/editmesh_tools.c +++ b/source/blender/src/editmesh_tools.c @@ -75,6 +75,7 @@ editmesh_tool.c: UI called tools for editmesh, geometry changes here, otherwise #include "BIF_cursors.h" #include "BIF_editmesh.h" #include "BIF_gl.h" +#include "BIF_glutil.h" #include "BIF_graphics.h" #include "BIF_interface.h" #include "BIF_mywindow.h" @@ -4583,7 +4584,7 @@ void bevel_menu() setlinestyle(0); persp(PERSP_VIEW); - glFlush(); // flush display for frontbuffer + bglFlush(); // flush display for frontbuffer glDrawBuffer(GL_BACK); } while(qtest()) { diff --git a/source/blender/src/editscreen.c b/source/blender/src/editscreen.c index 7ae0bdfac5e..ca5037f5986 100644 --- a/source/blender/src/editscreen.c +++ b/source/blender/src/editscreen.c @@ -712,7 +712,7 @@ void splash(void *data, int datasize, char *string) BMF_DrawString(font, string); } - glFlush(); + bglFlush(); glDrawBuffer(GL_BACK); IMB_freeImBuf(bbuf); @@ -2750,7 +2750,7 @@ static void joinarea_interactive(ScrArea *area, ScrEdge *onedge) scrarea_draw_shape_dark(scr,'d'); else if(scr==down) scrarea_draw_shape_dark(scr,'u'); - glFlush(); + bglFlush(); /* "never ending loop" of interactive selection */ while(!ok) { @@ -2793,7 +2793,7 @@ static void joinarea_interactive(ScrArea *area, ScrEdge *onedge) /* cancel joining of joining */ if(val && (event==ESCKEY || event==RIGHTMOUSE)) ok= -1; - glFlush(); + bglFlush(); } glReadBuffer(GL_BACK); @@ -3074,12 +3074,12 @@ static void splitarea_interactive(ScrArea *area, ScrEdge *onedge) if(val && (event==ESCKEY || event==RIGHTMOUSE)) { ok= -1; } - glFlush(); + bglFlush(); } if (!first) { scrarea_draw_splitpoint(sa, dir, fac); - glFlush(); + bglFlush(); } glReadBuffer(GL_BACK); glDrawBuffer(GL_BACK); @@ -3390,7 +3390,7 @@ static void moveareas(ScrEdge *edge) delta= (dir=='h')?(mval[1]-mvalo[1]):(mval[0]-mvalo[0]); delta= CLAMPIS(delta, -smaller, bigger); draw_front_xor_dirdist_line(dir, edge_position+delta, edge_start, edge_end); - glFlush(); + bglFlush(); } else if (event==LEFTMOUSE) { doit= 1; @@ -3405,7 +3405,7 @@ static void moveareas(ScrEdge *edge) } draw_front_xor_dirdist_line(dir, edge_position+delta, edge_start, edge_end); - glFlush(); + bglFlush(); glReadBuffer(GL_BACK); glDrawBuffer(GL_BACK); @@ -3638,47 +3638,6 @@ void initscreen(void) default_twosplit(); } -/***/ - -void screen_draw_info_text(bScreen *sc, char *text) { - Window *oldactwin= winlay_get_active_window(); - ScrArea *sa; - - /* - * Because this is called from within rendering - * internals it is possible our window is not - * active. - */ - window_make_active(mainwin); - - for (sa= sc->areabase.first; sa; sa= sa->next) { - if (sa->spacetype==SPACE_INFO) { - int x= sa->headbutlen - 28; - int y= 6; - - areawinset(sa->headwin); - glDrawBuffer(GL_FRONT); - - cpack(0xA08060); - glRecti(x-11, y-6, x+55, y+13); - - cpack(0x909090); - glRecti(x+55, y-6, x+1280, y+14); - - cpack(0x0); - glRasterPos2i(x, y); - BMF_DrawString(G.fonts, text); - - glFlush(); - glDrawBuffer(GL_BACK); - - sa->head_swap= WIN_FRONT_OK; - } - } - - if (oldactwin && oldactwin!=mainwin) window_make_active(oldactwin); -} - static int curcursor; int get_cursor(void) { diff --git a/source/blender/src/editsima.c b/source/blender/src/editsima.c index 6785a0e607f..25454eece40 100644 --- a/source/blender/src/editsima.c +++ b/source/blender/src/editsima.c @@ -68,6 +68,7 @@ #include "BKE_utildefines.h" #include "BIF_gl.h" +#include "BIF_glutil.h" #include "BIF_interface.h" #include "BIF_screen.h" #include "BIF_drawimage.h" @@ -911,6 +912,7 @@ void uvedit_selectionCB(short selecting, Object *editobj, short *mval, float rad else { /* force_draw() is no good here... */ glDrawBuffer(GL_FRONT); draw_tfaces(); + bglFlush(); glDrawBuffer(GL_BACK); } } diff --git a/source/blender/src/editview.c b/source/blender/src/editview.c index c5bf0e9c487..19a644c5c7b 100644 --- a/source/blender/src/editview.c +++ b/source/blender/src/editview.c @@ -766,7 +766,7 @@ int gesture(void) if(i) { if(lasso) draw_lasso_select(mcords, i, 0); else sdrawXORline(mcords[i-1][0], mcords[i-1][1], mcords[i][0], mcords[i][1]); - glFlush(); + bglFlush(); } i++; } @@ -1777,7 +1777,7 @@ void borderselect(void) } } /* frontbuffer flush */ - glFlush(); + bglFlush(); MEM_freeN(vbuffer); diff --git a/source/blender/src/glutil.c b/source/blender/src/glutil.c index ef6728c1a0a..dced81579c3 100644 --- a/source/blender/src/glutil.c +++ b/source/blender/src/glutil.c @@ -32,6 +32,7 @@ * ***** END GPL/BL DUAL LICENSE BLOCK ***** */ +#include #include #include "MEM_guardedalloc.h" @@ -46,6 +47,7 @@ #include "BIF_gl.h" #include "BIF_glutil.h" +#include "BIF_mywindow.h" /* Invert line handling */ @@ -621,6 +623,24 @@ void bglPolygonOffset(float dist) } } - +static int is_a_really_crappy_intel_card(void) +{ + static int well_is_it= -1; + + /* Do you understand the implication? Do you? */ + if (well_is_it==-1) + well_is_it= (strcmp((char*) glGetString(GL_VENDOR), "Intel Inc.") == 0); + + return well_is_it; +} + +void bglFlush(void) +{ + glFlush(); +#ifdef __APPLE__ + if(is_a_really_crappy_intel_card()) + myswapbuffers(); //hack to get mac intel graphics to show frontbuffer +#endif +} diff --git a/source/blender/src/header_node.c b/source/blender/src/header_node.c index 91e421736f2..d639d9b0bea 100644 --- a/source/blender/src/header_node.c +++ b/source/blender/src/header_node.c @@ -602,6 +602,8 @@ void node_buttons(ScrArea *sa) xco+= 80; uiDefButBitS(block, TOG, R_COMP_FREE, B_NOP, "Free Unused", xco+5,0,80,19, &G.scene->r.scemode, 0.0f, 0.0f, 0, 0, "Free Nodes that are not used while composite"); xco+= 80; + uiDefButBitS(block, TOG, SNODE_BACKDRAW, B_NOP, "Backdrop", xco+5,0,80,19, &snode->flag, 0.0f, 0.0f, 0, 0, "Use active Viewer Node output as backdrop"); + xco+= 80; } /* always as last */ diff --git a/source/blender/src/interface.c b/source/blender/src/interface.c index b456e1d315c..3a4a15a723a 100644 --- a/source/blender/src/interface.c +++ b/source/blender/src/interface.c @@ -300,18 +300,6 @@ static uiOverDraw *ui_begin_overdraw(int minx, int miny, int maxx, int maxy) return od; } -#ifdef __APPLE__ -static int is_a_really_crappy_intel_card(void) { - static int well_is_it= -1; - - /* Do you understand the implication? Do you? */ - if (well_is_it==-1) - well_is_it= (strcmp((char*) glGetString(GL_VENDOR), "Intel Inc.") == 0); - - return well_is_it; -} -#endif - static void ui_flush_overdraw(uiOverDraw *od) { @@ -322,11 +310,7 @@ static void ui_flush_overdraw(uiOverDraw *od) glRasterPos2s(od->x, od->y); myglCopyPixels(od->x, od->y, od->sx, od->sy, GL_COLOR); glEnable(GL_DITHER); - glFlush(); -#ifdef __APPLE__ - if (is_a_really_crappy_intel_card()) - myswapbuffers(); //hack to get mac intel graphics to show menus -#endif + bglFlush(); glDrawBuffer(GL_BACK); } @@ -371,7 +355,7 @@ static void ui_end_overdraw(uiOverDraw *od) glRasterPos2s(od->x, od->y); glDrawPixels(od->sx, od->sy, GL_RGBA, GL_UNSIGNED_BYTE, od->rect); - glFlush(); + bglFlush(); glDrawBuffer(GL_BACK); glEnable(GL_DITHER); @@ -394,7 +378,7 @@ void ui_block_flush_back(uiBlock *block) /* exception, when we cannot use backbuffer for draw... */ if(block->flag & UI_BLOCK_FRONTBUFFER) { - glFlush(); + bglFlush(); glDrawBuffer(GL_BACK); block->needflush= 0; return; @@ -423,7 +407,7 @@ void ui_block_flush_back(uiBlock *block) myglCopyPixels(minx, miny, sizex, sizey, GL_COLOR); #endif glEnable(GL_DITHER); - glFlush(); + bglFlush(); glDrawBuffer(GL_BACK); mywinset(block->win); @@ -4051,7 +4035,7 @@ static void ui_do_active_linklines(uiBlock *block, short *mval) } but= but->next; } - glFlush(); + bglFlush(); glDrawBuffer(GL_BACK); } } diff --git a/source/blender/src/previewrender.c b/source/blender/src/previewrender.c index 5bf0a295403..a6e0d2ef27e 100644 --- a/source/blender/src/previewrender.c +++ b/source/blender/src/previewrender.c @@ -382,7 +382,7 @@ static void previewrender_progress(RenderResult *rr, volatile rcti *renrect) glDrawBuffer(GL_FRONT); glaDrawPixelsSafe_to32(ofsx, ofsy, rr->rectx, rr->recty, rr->rectx, rl->rectf); - glFlush(); + bglFlush(); glDrawBuffer(GL_BACK); } @@ -626,7 +626,7 @@ static void view3d_previewrender_progress(RenderResult *rr, volatile rcti *renre glDrawBuffer(GL_FRONT); glaDefine2DArea(&curarea->winrct); glaDrawPixelsSafe_to32(ofsx, ofsy, rr->rectx, rr->recty, rr->rectx, rl->rectf); - glFlush(); + bglFlush(); glDrawBuffer(GL_BACK); } diff --git a/source/blender/src/space.c b/source/blender/src/space.c index aa3536ec2ba..91d67ceb5d0 100644 --- a/source/blender/src/space.c +++ b/source/blender/src/space.c @@ -2421,7 +2421,7 @@ static void info_user_themebuts(uiBlock *block, short y1, short y2, short y3) } else { uiBlockBeginAlign(block); - if ELEM7(th_curcol, TH_PANEL, TH_LAMP, TH_FACE, TH_FACE_SELECT, TH_MENU_BACK, TH_MENU_HILITE, TH_MENU_ITEM) { + if ELEM8(th_curcol, TH_PANEL, TH_LAMP, TH_FACE, TH_FACE_SELECT, TH_MENU_BACK, TH_MENU_HILITE, TH_MENU_ITEM, TH_NODE) { uiDefButC(block, NUMSLI, B_UPDATE_THEME,"A ", 465,y3+25,200,20, col+3, 0.0, 255.0, B_THEMECOL, 0, ""); } uiDefButC(block, NUMSLI, B_UPDATE_THEME,"R ", 465,y3,200,20, col, 0.0, 255.0, B_THEMECOL, 0, ""); diff --git a/source/blender/src/transform.c b/source/blender/src/transform.c index f450628b640..76e6c7eaf51 100755 --- a/source/blender/src/transform.c +++ b/source/blender/src/transform.c @@ -64,6 +64,7 @@ #include "BIF_editview.h" /* arrows_move_cursor */ #include "BIF_gl.h" +#include "BIF_glutil.h" #include "BIF_mywindow.h" #include "BIF_resources.h" #include "BIF_screen.h" @@ -135,7 +136,7 @@ static void helpline(TransInfo *t, float *vec) setlinestyle(0); persp(PERSP_VIEW); - glFlush(); // flush display for frontbuffer + bglFlush(); // flush display for frontbuffer glDrawBuffer(GL_BACK); } }