diff options
author | Dalai Felinto <dfelinto@gmail.com> | 2015-04-10 02:43:59 +0300 |
---|---|---|
committer | Dalai Felinto <dfelinto@gmail.com> | 2015-04-10 02:44:03 +0300 |
commit | 52f511269b98efa804ce7fcc99039ef22190cf29 (patch) | |
tree | 45ada3345c3c26bc5628508f3ed7c7599ed415f0 | |
parent | 33028d17a006dc9fd8f806fe40a97c14b3b69fd8 (diff) |
Multiview: remove option to preview the selected stereo 3d mode and error when quadbuffer not supported
This was causing glitches when switching from/to fullscreen modes (e.g.,
side by side to anaglyph).
As for the quadbuffer errors this is part of a more complete solution to
be committed later.
-rw-r--r-- | source/blender/windowmanager/intern/wm_stereo.c | 55 |
1 files changed, 34 insertions, 21 deletions
diff --git a/source/blender/windowmanager/intern/wm_stereo.c b/source/blender/windowmanager/intern/wm_stereo.c index 240e35b2e3d..38f1cf68ac8 100644 --- a/source/blender/windowmanager/intern/wm_stereo.c +++ b/source/blender/windowmanager/intern/wm_stereo.c @@ -352,6 +352,13 @@ void wm_method_draw_stereo3d(const bContext *UNUSED(C), wmWindow *win) } } +static bool wm_stereo3d_quadbuffer_supported() +{ + int gl_stereo = 0; + glGetBooleanv(GL_STEREO, (GLboolean *)&gl_stereo); + return gl_stereo != 0; +} + static bool wm_stereo3d_is_fullscreen_required(eStereoDisplayMode stereo_display) { return ELEM(stereo_display, @@ -364,11 +371,14 @@ bool WM_stereo3d_enabled(wmWindow *win, bool skip_stereo3d_check) { bScreen *screen = win->screen; - if ((skip_stereo3d_check == false) && (ED_screen_stereo3d_required(screen) == false)) + if ((skip_stereo3d_check == false) && (ED_screen_stereo3d_required(screen) == false)) { return false; + } if (wm_stereo3d_is_fullscreen_required(win->stereo3d_format->display_mode)) { - return (GHOST_GetWindowState(win->ghostwin) == GHOST_kWindowStateFullScreen); + if (GHOST_GetWindowState(win->ghostwin) != GHOST_kWindowStateFullScreen) { + return false; + } } return true; @@ -379,10 +389,10 @@ typedef struct Stereo3dData { Stereo3dFormat stereo3d_format; } Stereo3dData; -static bool wm_stereo3d_set_properties(bContext *C, wmOperator *op) +static bool wm_stereo3d_set_properties(bContext *UNUSED(C), wmOperator *op) { - wmWindow *win = CTX_wm_window(C); - Stereo3dFormat *s3d = win->stereo3d_format; + Stereo3dData *s3dd = op->customdata; + Stereo3dFormat *s3d = &s3dd->stereo3d_format; PropertyRNA *prop; bool is_set = false; @@ -441,12 +451,24 @@ int wm_stereo3d_set_exec(bContext *C, wmOperator *op) wmWindowManager *wm = CTX_wm_manager(C); wmWindow *win = CTX_wm_window(C); const bool is_fullscreen = WM_window_is_fullscreen(win); + char display_mode = win->stereo3d_format->display_mode; if (G.background) return OPERATOR_CANCELLED; - /* pagelfip requires a new window to be created with the proper OS flags */ + if (op->customdata) { + Stereo3dData *s3dd = op->customdata; + *win->stereo3d_format = s3dd->stereo3d_format; + } + + /* pageflip requires a new window to be created with the proper OS flags */ if (win->stereo3d_format->display_mode == S3D_DISPLAY_PAGEFLIP) { + if (wm_stereo3d_quadbuffer_supported() == false) { + BKE_reportf(op->reports, RPT_ERROR, + "Quadbuffer not supported by the system"); + win->stereo3d_format->display_mode = display_mode; + return OPERATOR_CANCELLED; + } if (wm_window_duplicate_exec(C, op) == OPERATOR_FINISHED) { wm_window_close(C, wm, win); win = wm->windows.last; @@ -454,6 +476,7 @@ int wm_stereo3d_set_exec(bContext *C, wmOperator *op) else { BKE_reportf(op->reports, RPT_ERROR, "Fail to create a window compatible with time sequential (page-flip) display method"); + win->stereo3d_format->display_mode = display_mode; return OPERATOR_CANCELLED; } } @@ -482,21 +505,19 @@ int wm_stereo3d_set_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(ev return WM_operator_props_dialog_popup(C, op, 250, 100); } -void wm_stereo3d_set_draw(bContext *C, wmOperator *op) +void wm_stereo3d_set_draw(bContext *UNUSED(C), wmOperator *op) { - wmWindow *win = CTX_wm_window(C); - Stereo3dFormat *stereo3d_format; + Stereo3dData *s3dd = op->customdata; PointerRNA stereo3d_format_ptr; uiLayout *layout = op->layout; uiLayout *col; - stereo3d_format = win->stereo3d_format; - RNA_pointer_create(NULL, &RNA_Stereo3dDisplay, stereo3d_format, &stereo3d_format_ptr); + RNA_pointer_create(NULL, &RNA_Stereo3dDisplay, &s3dd->stereo3d_format, &stereo3d_format_ptr); col = uiLayoutColumn(layout, false); uiItemR(col, &stereo3d_format_ptr, "display_mode", 0, NULL, ICON_NONE); - switch (stereo3d_format->display_mode) { + switch (s3dd->stereo3d_format.display_mode) { case S3D_DISPLAY_ANAGLYPH: { uiItemR(col, &stereo3d_format_ptr, "anaglyph_type", 0, NULL, ICON_NONE); @@ -530,16 +551,8 @@ bool wm_stereo3d_set_check(bContext *UNUSED(C), wmOperator *UNUSED(op)) return true; } -void wm_stereo3d_set_cancel(bContext *C, wmOperator *op) +void wm_stereo3d_set_cancel(bContext *UNUSED(C), wmOperator *op) { - Stereo3dData *s3dd = op->customdata; - wmWindow *win = CTX_wm_window(C); - - /* roll back to the original */ - if (win) { - *win->stereo3d_format = s3dd->stereo3d_format; - } - MEM_freeN(op->customdata); op->customdata = NULL; } |