Fix for problem drawing second level popup menus due to recent commit,
[blender.git] / source / blender / windowmanager / intern / wm_subwindow.c
index 255d22191e2c991a6551d20452c32e29dc68416a..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);
@@ -256,11 +260,9 @@ void wmSubWindowScissorSet(wmWindow *win, int swinid, rcti *srct)
        else
                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]);
-       
+       wmOrtho2(-0.375, (float)width-0.375, -0.375, (float)height-0.375);
+       glLoadIdentity();
+
        glFlush();
 }
 
@@ -271,97 +273,22 @@ void wmSubWindowSet(wmWindow *win, int swinid)
        wmSubWindowScissorSet(win, swinid, NULL);
 }
 
-void wmLoadMatrix(float mat[][4])
-{
-       if(_curswin==NULL) return;
-       
-       glLoadMatrixf(mat);
-       
-       if (glaGetOneInteger(GL_MATRIX_MODE)==GL_MODELVIEW)
-               Mat4CpyMat4(_curswin->viewmat, mat);
-       else
-               Mat4CpyMat4(_curswin->winmat, mat);
-}
-
-void wmGetMatrix(float mat[][4])
-{
-       if(_curswin==NULL) return;
-       
-       if (glaGetOneInteger(GL_MATRIX_MODE)==GL_MODELVIEW) {
-               Mat4CpyMat4(mat, _curswin->viewmat);
-       } else {
-               Mat4CpyMat4(mat, _curswin->winmat);
-       }
-}
-
-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);
-}
-
-void wmGetSingleMatrix(float mat[][4])
-{
-       if(_curswin)
-               Mat4MulMat4(mat, _curswin->viewmat, _curswin->winmat);
-}
-
-void wmScale(float x, float y, float z)
-{
-       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);
-       
-}
-
-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();
 
-               glMatrixMode(GL_PROJECTION);
-               glLoadIdentity();
-               glFrustum(x1, x2, y1, y2, n, f);
+       glOrtho(x1, x2, y1, y2, n, f);
 
-               glGetFloatv(GL_PROJECTION_MATRIX, (float *)_curswin->winmat);
-               glMatrixMode(GL_MODELVIEW);
-       }
-}
-
-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)
@@ -369,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)
@@ -401,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;
 
@@ -431,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;
        
@@ -490,15 +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
-