Fix for problem drawing second level popup menus due to recent commit,
[blender.git] / source / blender / windowmanager / intern / wm_subwindow.c
index 29baf9f4cc56ea0cc05013d0b1ccf99522a499b1..97b3d3e800cd33e9c2a2ef75fb4ad2fe5d93d0bc 100644 (file)
@@ -1,5 +1,5 @@
 /**
- * $Id: mywindow.c 9584 2007-01-03 13:45:03Z ton $
+ * $Id$
  *
  * ***** BEGIN GPL LICENSE BLOCK *****
  *
@@ -38,7 +38,7 @@
 #include "DNA_screen_types.h"
 
 #include "BLI_blenlib.h"
-#include "BLI_arithb.h"
+#include "BLI_math.h"
 
 #include "BKE_context.h"
 #include "BKE_global.h"
@@ -66,8 +66,6 @@ typedef struct wmSubWindow {
        
        rcti winrct;
        int swinid;
-       
-       float viewmat[4][4], winmat[4][4];
 } wmSubWindow;
 
 
@@ -131,8 +129,17 @@ void wm_subwindow_getmatrix(wmWindow *win, int swinid, float mat[][4])
 {
        wmSubWindow *swin= swin_from_swinid(win, swinid);
 
-       if(swin)
-               Mat4MulMat4(mat, swin->viewmat, swin->winmat);
+       if(swin) {
+               /* used by UI, should find a better way to get the matrix there */
+               if(swinid == win->screen->mainwin) {
+                       int width, height;
+
+                       wm_subwindow_getsize(win, swin->swinid, &width, &height);
+                       orthographic_m4(mat, -0.375, (float)width-0.375, -0.375, (float)height-0.375, -100, 100);
+               }
+               else
+                       glGetFloatv(GL_PROJECTION_MATRIX, (float*)mat);
+       }
 }
 
 /* always sets pixel-precise 2D window/view matrices */
@@ -154,16 +161,13 @@ int wm_subwindow_open(wmWindow *win, rcti *winrct)
        swin->swinid= freewinid;
        swin->winrct= *winrct;
 
-       Mat4One(swin->viewmat);
-       Mat4One(swin->winmat);
-       
        /* and we appy it all right away */
        wmSubWindowSet(win, swin->swinid);
        
        /* extra service */
        wm_subwindow_getsize(win, swin->swinid, &width, &height);
        wmOrtho2(-0.375, (float)width-0.375, -0.375, (float)height-0.375);
-       wmLoadIdentity();
+       glLoadIdentity();
 
        return swin->swinid;
 }
@@ -209,10 +213,10 @@ void wm_subwindow_position(wmWindow *win, int swinid, rcti *winrct)
                    * fixed it). - zr  (2001!)
                        */
                
-               if (swin->winrct.xmax >= win->sizex)
-                       swin->winrct.xmax= win->sizex-1;
-               if (swin->winrct.ymax >= win->sizey)
-                       swin->winrct.ymax= win->sizey-1;
+               if (swin->winrct.xmax > win->sizex)
+                       swin->winrct.xmax= win->sizex;
+               if (swin->winrct.ymax > win->sizey)
+                       swin->winrct.ymax= win->sizey;
                
                /* extra service */
                wmSubWindowSet(win, swinid);
@@ -231,8 +235,7 @@ void wm_subwindow_position(wmWindow *win, int swinid, rcti *winrct)
 static wmWindow *_curwindow= NULL;
 static wmSubWindow *_curswin= NULL;
 
-/* enable the WM versions of opengl calls */
-void wmSubWindowSet(wmWindow *win, int swinid)
+void wmSubWindowScissorSet(wmWindow *win, int swinid, rcti *srct)
 {
        int width, height;
        _curswin= swin_from_swinid(win, swinid);
@@ -248,108 +251,44 @@ void wmSubWindowSet(wmWindow *win, int swinid)
        width= _curswin->winrct.xmax - _curswin->winrct.xmin + 1;
        height= _curswin->winrct.ymax - _curswin->winrct.ymin + 1;
        glViewport(_curswin->winrct.xmin, _curswin->winrct.ymin, width, height);
-       glScissor(_curswin->winrct.xmin, _curswin->winrct.ymin, width, height);
-       
-       glMatrixMode(GL_PROJECTION);
-       glLoadMatrixf(&_curswin->winmat[0][0]);
-       glMatrixMode(GL_MODELVIEW);
-       glLoadMatrixf(&_curswin->viewmat[0][0]);
-       
-       glFlush();
-       
-}
 
-void wmLoadMatrix(float mat[][4])
-{
-       if(_curswin==NULL) return;
-       
-       glLoadMatrixf(mat);
-       
-       if (glaGetOneInteger(GL_MATRIX_MODE)==GL_MODELVIEW)
-               Mat4CpyMat4(_curswin->viewmat, mat);
+       if(srct) {
+               width= srct->xmax - srct->xmin + 1;
+               height= srct->ymax - srct->ymin + 1;
+               glScissor(srct->xmin, srct->ymin, width, height);
+       }
        else
-               Mat4CpyMat4(_curswin->winmat, mat);
-}
-
-void wmGetMatrix(float mat[][4])
-{
-       if(_curswin==NULL) return;
+               glScissor(_curswin->winrct.xmin, _curswin->winrct.ymin, width, height);
        
-       if (glaGetOneInteger(GL_MATRIX_MODE)==GL_MODELVIEW) {
-               Mat4CpyMat4(mat, _curswin->viewmat);
-       } else {
-               Mat4CpyMat4(mat, _curswin->winmat);
-       }
-}
+       wmOrtho2(-0.375, (float)width-0.375, -0.375, (float)height-0.375);
+       glLoadIdentity();
 
-void wmMultMatrix(float mat[][4])
-{
-       if(_curswin==NULL) return;
-       
-       glMultMatrixf((float*) mat);
-       
-       if (glaGetOneInteger(GL_MATRIX_MODE)==GL_MODELVIEW)
-               glGetFloatv(GL_MODELVIEW_MATRIX, (float *)_curswin->viewmat);
-       else
-               glGetFloatv(GL_MODELVIEW_MATRIX, (float *)_curswin->winmat);
+       glFlush();
 }
 
-void wmGetSingleMatrix(float mat[][4])
-{
-       if(_curswin)
-               Mat4MulMat4(mat, _curswin->viewmat, _curswin->winmat);
-}
 
-void wmScale(float x, float y, float z)
+/* enable the WM versions of opengl calls */
+void wmSubWindowSet(wmWindow *win, int swinid)
 {
-       if(_curswin==NULL) return;
-       
-       glScalef(x, y, z);
-       
-       if (glaGetOneInteger(GL_MATRIX_MODE)==GL_MODELVIEW)
-               glGetFloatv(GL_MODELVIEW_MATRIX, (float *)_curswin->viewmat);
-       else
-               glGetFloatv(GL_MODELVIEW_MATRIX, (float *)_curswin->winmat);
-       
+       wmSubWindowScissorSet(win, swinid, NULL);
 }
 
-void wmLoadIdentity(void)
+void wmFrustum(float x1, float x2, float y1, float y2, float n, float f)
 {
-       if(_curswin==NULL) return;
-       
-       if (glaGetOneInteger(GL_MATRIX_MODE)==GL_MODELVIEW)
-               Mat4One(_curswin->viewmat);
-       else
-               Mat4One(_curswin->winmat);
-       
+       glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
+       glFrustum(x1, x2, y1, y2, n, f);
+       glMatrixMode(GL_MODELVIEW);
 }
 
-void wmFrustum(float x1, float x2, float y1, float y2, float n, float f)
+void wmOrtho(float x1, float x2, float y1, float y2, float n, float f)
 {
-       if(_curswin) {
-
-               glMatrixMode(GL_PROJECTION);
-               glLoadIdentity();
-               glFrustum(x1, x2, y1, y2, n, f);
+       glMatrixMode(GL_PROJECTION);
+       glLoadIdentity();
 
-               glGetFloatv(GL_PROJECTION_MATRIX, (float *)_curswin->winmat);
-               glMatrixMode(GL_MODELVIEW);
-       }
-}
+       glOrtho(x1, x2, y1, y2, n, f);
 
-void wmOrtho(float x1, float x2, float y1, float y2, float n, float f)
-{
-       if(_curswin) {
-               
-               glMatrixMode(GL_PROJECTION);
-               glLoadIdentity();
-               
-               glOrtho(x1, x2, y1, y2, n, f);
-               
-               glGetFloatv(GL_PROJECTION_MATRIX, (float *)_curswin->winmat);
-               glMatrixMode(GL_MODELVIEW);
-       }
+       glMatrixMode(GL_MODELVIEW);
 }
 
 void wmOrtho2(float x1, float x2, float y1, float y2)
@@ -357,10 +296,10 @@ void wmOrtho2(float x1, float x2, float y1, float y2)
        /* prevent opengl from generating errors */
        if(x1==x2) x2+=1.0;
        if(y1==y2) y2+=1.0;
+
        wmOrtho(x1, x2, y1, y2, -100, 100);
 }
 
-
 /* *************************** Framebuffer color depth, for selection codes ********************** */
 
 static int wm_get_colordepth(void)
@@ -389,7 +328,7 @@ static int wm_get_colordepth(void)
 
 /* apple seems to round colors to below and up on some configs */
 
-static unsigned int index_to_framebuffer(int index)
+unsigned int index_to_framebuffer(int index)
 {
        unsigned int i= index;
 
@@ -419,7 +358,7 @@ static unsigned int index_to_framebuffer(int index)
 
 /* this is the old method as being in use for ages.... seems to work? colors are rounded to lower values */
 
-static unsigned int index_to_framebuffer(int index)
+unsigned int index_to_framebuffer(int index)
 {
        unsigned int i= index;
        
@@ -478,58 +417,3 @@ int WM_framebuffer_to_index(unsigned int col)
 
 /* ********** END MY WINDOW ************** */
 
-#ifdef WIN32
-static int is_a_really_crappy_nvidia_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), "NVIDIA Corporation") == 0);
-
-       return well_is_it;
-}
-#endif
-
-void myswapbuffers(void)       /* XXX */
-{
-       ScrArea *sa;
-       
-       sa= G.curscreen->areabase.first;
-       while(sa) {
-//             if(sa->win_swap==WIN_BACK_OK) sa->win_swap= WIN_FRONT_OK;
-//             if(sa->head_swap==WIN_BACK_OK) sa->head_swap= WIN_FRONT_OK;
-               
-               sa= sa->next;
-       }
-
-       /* HACK, some windows drivers feel they should honor the scissor
-        * test when swapping buffers, disable the test while swapping
-        * on WIN32. (namely Matrox and NVidia's new drivers around Oct 1 2001)
-        * - zr
-        */
-
-#ifdef WIN32
-               /* HACK, in some NVidia driver release some kind of
-                * fancy optimiziation (I presume) was put in which for
-                * some reason causes parts of the buffer not to be
-                * swapped. One way to defeat it is the following wierd
-                * code (which we only do for nvidia cards). This should
-                * be removed if NVidia fixes their drivers. - zr
-                */
-       if (is_a_really_crappy_nvidia_card()) {
-               glDrawBuffer(GL_FRONT);
-
-               glBegin(GL_LINES);
-               glEnd();
-
-               glDrawBuffer(GL_BACK);
-       }
-
-       glDisable(GL_SCISSOR_TEST);
-//     window_swap_buffers(winlay_mainwindow);
-       glEnable(GL_SCISSOR_TEST);
-#else
-//     window_swap_buffers(winlay_mainwindow);
-#endif
-}
-