diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2010-02-01 18:32:55 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2010-02-01 18:32:55 +0300 |
commit | 81cd4edfb66569f25d518d1fb3526acf7701c773 (patch) | |
tree | 57091c1d5d1c1cd8189c932a881ed203eb595d3d /source/blender/windowmanager/intern/wm_subwindow.c | |
parent | 90e2b22feeb142d190b7aa2dd1e98fdd48f572bc (diff) |
Fix #20891: opengl animation render could mess up the view.
The problem was that wmPushMatrix/wmOrtho/.. and similar functions did not
work well for offscreen rendering. It would have been possible to make a
fake subwindow for this, but I decided to just remove this extra layer as
it does not seem to have much purpose and has been quite confusing when
trying to fix other bugs. The relevant matrices are already stored in
RegionView3D so there will be no increase in calls to glGetFloat, which may
have been a performance reason to use this system in the past.
Diffstat (limited to 'source/blender/windowmanager/intern/wm_subwindow.c')
-rw-r--r-- | source/blender/windowmanager/intern/wm_subwindow.c | 160 |
1 files changed, 21 insertions, 139 deletions
diff --git a/source/blender/windowmanager/intern/wm_subwindow.c b/source/blender/windowmanager/intern/wm_subwindow.c index 68f53a8367f..349cc26b618 100644 --- a/source/blender/windowmanager/intern/wm_subwindow.c +++ b/source/blender/windowmanager/intern/wm_subwindow.c @@ -66,9 +66,6 @@ typedef struct wmSubWindow { rcti winrct; int swinid; - - float viewmat[4][4], winmat[4][4]; - float viewmat1[4][4], winmat1[4][4]; } wmSubWindow; @@ -132,8 +129,15 @@ void wm_subwindow_getmatrix(wmWindow *win, int swinid, float mat[][4]) { wmSubWindow *swin= swin_from_swinid(win, swinid); - if(swin) - mul_m4_m4m4(mat, swin->viewmat, swin->winmat); + if(swin) { + /* used by UI, should find a better way to get the matrix there */ + float viewmat[4][4], winmat[4][4]; + + glGetFloatv(GL_MODELVIEW_MATRIX, (float*)winmat); + glGetFloatv(GL_PROJECTION_MATRIX, (float*)viewmat); + + mul_m4_m4m4(mat, viewmat, winmat); + } } /* always sets pixel-precise 2D window/view matrices */ @@ -155,16 +159,13 @@ int wm_subwindow_open(wmWindow *win, rcti *winrct) swin->swinid= freewinid; swin->winrct= *winrct; - unit_m4(swin->viewmat); - unit_m4(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; } @@ -257,11 +258,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(); } @@ -272,129 +271,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) - copy_m4_m4(_curswin->viewmat, mat); - else - copy_m4_m4(_curswin->winmat, mat); -} - -void wmGetMatrix(float mat[][4]) -{ - if(_curswin==NULL) return; - - if (glaGetOneInteger(GL_MATRIX_MODE)==GL_MODELVIEW) { - copy_m4_m4(mat, _curswin->viewmat); - } else { - copy_m4_m4(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); -} - -static int debugpush= 0; - -void wmPushMatrix(void) -{ - if(_curswin==NULL) return; - - if(debugpush) - printf("wmPushMatrix error already pushed\n"); - debugpush= 1; - - copy_m4_m4(_curswin->viewmat1, _curswin->viewmat); - copy_m4_m4(_curswin->winmat1, _curswin->winmat); -} - -void wmPopMatrix(void) +void wmFrustum(float x1, float x2, float y1, float y2, float n, float f) { - if(_curswin==NULL) return; - - if(debugpush==0) - printf("wmPopMatrix error nothing popped\n"); - debugpush= 0; - - copy_m4_m4(_curswin->viewmat, _curswin->viewmat1); - copy_m4_m4(_curswin->winmat, _curswin->winmat1); - glMatrixMode(GL_PROJECTION); - glLoadMatrixf(&_curswin->winmat[0][0]); + glLoadIdentity(); + glFrustum(x1, x2, y1, y2, n, f); glMatrixMode(GL_MODELVIEW); - glLoadMatrixf(&_curswin->viewmat[0][0]); - -} - -void wmGetSingleMatrix(float mat[][4]) -{ - if(_curswin) - mul_m4_m4m4(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 wmOrtho(float x1, float x2, float y1, float y2, float n, float f) { - if(_curswin==NULL) return; - - if (glaGetOneInteger(GL_MATRIX_MODE)==GL_MODELVIEW) - unit_m4(_curswin->viewmat); - else - unit_m4(_curswin->winmat); - + glMatrixMode(GL_PROJECTION); glLoadIdentity(); -} -void wmFrustum(float x1, float x2, float y1, float y2, float n, float f) -{ - if(_curswin) { + glOrtho(x1, x2, y1, y2, n, f); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(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) @@ -402,18 +294,8 @@ 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); -} -void wmOrthoPixelSpace(void) -{ - if(_curswin) { - int width, height; - - wm_subwindow_getsize(_curwindow, _curswin->swinid, &width, &height); - wmOrtho2(-0.375, (float)width-0.375, -0.375, (float)height-0.375); - wmLoadIdentity(); - } + wmOrtho(x1, x2, y1, y2, -100, 100); } /* *************************** Framebuffer color depth, for selection codes ********************** */ |