diff --git a/modules/gfx/src/glwin_base.hh b/modules/gfx/src/glwin_base.hh index 1e9029ec77430d95d5d4b2c0238f2757c6930602..69ce405252c271a4ba32f57467a5e0b0df484e58 100644 --- a/modules/gfx/src/glwin_base.hh +++ b/modules/gfx/src/glwin_base.hh @@ -36,6 +36,8 @@ public: virtual void DoRefresh() = 0; virtual void StatusMessage(const String& m) = 0; + + virtual void SetStereo(bool s) = 0; }; }} diff --git a/modules/gfx/src/scene.cc b/modules/gfx/src/scene.cc index 1b7304b5c9537d5a7d16e0152b684d76faad3393..0b62cbeb49b1038bf144b567a1899aefab166945 100644 --- a/modules/gfx/src/scene.cc +++ b/modules/gfx/src/scene.cc @@ -447,6 +447,8 @@ void Scene::RenderGL() if(stereo_==2 || stereo_==3) { render_interlaced_stereo(); + } else if (stereo_==1) { + this->render_quad_buffered_stereo(); } else { this->render_scene_with_glow(); } @@ -1047,13 +1049,14 @@ void Scene::SetFogOffsets(float no, float fo) void Scene::Stereo(unsigned int m) { if(m==1) { - // unsupported quad-buffer stereo - LOGN_ERROR("quad buffer stereo not supported"); - stereo_=0; + stereo_=m; + if(win_) win_->SetStereo(true); } else if(m==2 || m==3) { stereo_=m; + if(win_) win_->SetStereo(false); } else { stereo_=0; + if(win_) win_->SetStereo(false); } RequestRedraw(); } @@ -1728,6 +1731,18 @@ void Scene::render_interlaced_stereo() glPopAttrib(); } - +void Scene::render_quad_buffered_stereo() +{ + glDrawBuffer(GL_BACK); + glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); + glDrawBuffer(GL_BACK_LEFT); + glClear(GL_DEPTH_BUFFER_BIT); + stereo_projection(stereo_==1 ? 1: 2); + this->render_scene_with_glow(); + glDrawBuffer(GL_BACK_RIGHT); + glClear(GL_DEPTH_BUFFER_BIT); + stereo_projection(stereo_==1 ? 2 : 1); + this->render_scene_with_glow(); +} }} // ns diff --git a/modules/gfx/src/scene.hh b/modules/gfx/src/scene.hh index 655d207d991a56559ce7c9fd55524aa3d0301c93..c373f3e816a927d16b23d4eb83e7cbef19b3a435 100644 --- a/modules/gfx/src/scene.hh +++ b/modules/gfx/src/scene.hh @@ -405,6 +405,7 @@ private: void prep_blur(); void stereo_projection(unsigned int view); void render_interlaced_stereo(); + void render_quad_buffered_stereo(); void render_scene_with_glow(); bool IsNameAvailable(String name); }; diff --git a/modules/gui/src/gl_canvas.cc b/modules/gui/src/gl_canvas.cc index cd563cc1fde6255c352a9e3cb96f215dd5dffda2..ebcbd0d38dd57ce21890229eda10f2b7da21bfb6 100644 --- a/modules/gui/src/gl_canvas.cc +++ b/modules/gui/src/gl_canvas.cc @@ -71,6 +71,12 @@ void GLCanvas::StatusMessage(const String& m) glwin_->StatusMessage(m); } +void GLCanvas::SetStereo(bool s) +{ + QGLFormat f=this->format(); + f.setStereo(s); + this->setFormat(f); +} void GLCanvas::OnTransform(gfx::InputCommand com, int indx, gfx::TransformTarget trg, Real val) diff --git a/modules/gui/src/gl_canvas.hh b/modules/gui/src/gl_canvas.hh index 1b7f51f910460a0c15c4cb258b7ffa77904aaf8a..87137dcc1d10ca9d968221829dff29aba112ff9a 100644 --- a/modules/gui/src/gl_canvas.hh +++ b/modules/gui/src/gl_canvas.hh @@ -53,6 +53,7 @@ public: // gfx::GLWinBase interface virtual void DoRefresh(); virtual void StatusMessage(const String& m); + virtual void SetStereo(bool s); // central point for sending input to the gfx layer void OnTransform(gfx::InputCommand, int indx,