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