From e0dcf4d2ce8a8896e270a219468fabbf9a89581d Mon Sep 17 00:00:00 2001 From: tobias <tobias@5a81b35b-ba03-0410-adc8-b2c5c5119f08> Date: Thu, 11 Mar 2010 10:42:17 +0000 Subject: [PATCH] enable quadbuffered sequential stereo (using scene.Stereo(1)) git-svn-id: https://dng.biozentrum.unibas.ch/svn/openstructure/trunk@1807 5a81b35b-ba03-0410-adc8-b2c5c5119f08 --- modules/gfx/src/glwin_base.hh | 2 ++ modules/gfx/src/scene.cc | 23 +++++++++++++++++++---- modules/gfx/src/scene.hh | 1 + modules/gui/src/gl_canvas.cc | 6 ++++++ modules/gui/src/gl_canvas.hh | 1 + 5 files changed, 29 insertions(+), 4 deletions(-) diff --git a/modules/gfx/src/glwin_base.hh b/modules/gfx/src/glwin_base.hh index 1e9029ec7..69ce40525 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 1b7304b5c..0b62cbeb4 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 655d207d9..c373f3e81 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 cd563cc1f..ebcbd0d38 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 1b7f51f91..87137dcc1 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, -- GitLab