From 1d5f298e28b018909ee070ca6df9cdd017d9a705 Mon Sep 17 00:00:00 2001
From: tobias <tobias@5a81b35b-ba03-0410-adc8-b2c5c5119f08>
Date: Wed, 14 Apr 2010 12:45:09 +0000
Subject: [PATCH] allow inversion of stereo in quad-buffered mode

git-svn-id: https://dng.biozentrum.unibas.ch/svn/openstructure/trunk@1997 5a81b35b-ba03-0410-adc8-b2c5c5119f08
---
 examples/dokk/glwin.py            |  1 +
 modules/gfx/pymod/export_scene.cc |  2 +-
 modules/gfx/src/scene.cc          | 19 +++++++++++++++++--
 modules/gfx/src/scene.hh          |  7 ++++++-
 4 files changed, 25 insertions(+), 4 deletions(-)

diff --git a/examples/dokk/glwin.py b/examples/dokk/glwin.py
index 032099420..62d05abfb 100644
--- a/examples/dokk/glwin.py
+++ b/examples/dokk/glwin.py
@@ -169,6 +169,7 @@ class DokkGLWin(gfx.GLWinBase):
         self.canvas.show()
         
     def SetStereo(self, mode):
+      gfx.Scene().SetStereoInverted(True)
       gfx.Scene().Stereo(mode)
     
     def SetLockInput(self, lock):
diff --git a/modules/gfx/pymod/export_scene.cc b/modules/gfx/pymod/export_scene.cc
index 5bd9c75e0..9cae54473 100644
--- a/modules/gfx/pymod/export_scene.cc
+++ b/modules/gfx/pymod/export_scene.cc
@@ -72,7 +72,6 @@ void export_Scene()
   void (Scene::*center_on1)(const String&) = &Scene::CenterOn;
   void (Scene::*center_on2)(const GfxObjP&) = &Scene::CenterOn;
 
-
   class_<Scene, boost::noncopyable>("SceneSingleton",no_init)
     .def("Add", &Scene::Add, 
          scene_add_overloads())
@@ -106,6 +105,7 @@ void export_Scene()
     .def("GetFOV",&Scene::GetFOV)
     .def("SetFogOffsets",&Scene::SetFogOffsets)
     .def("Stereo",&Scene::Stereo)
+    .def("SetStereoInverted",&Scene::SetStereoInverted)
     .def("Apply", apply)
     .def("SetStereoEye",&Scene::SetStereoEye)
     .def("SetLightDir",&Scene::SetLightDir)
diff --git a/modules/gfx/src/scene.cc b/modules/gfx/src/scene.cc
index 0b62cbeb4..c85abc13d 100644
--- a/modules/gfx/src/scene.cc
+++ b/modules/gfx/src/scene.cc
@@ -124,6 +124,7 @@ Scene::Scene():
   blur_count_(0),
   blur_buffer_(),
   stereo_(0),
+  stereo_inverted_(false),
   stereo_eye_(0),
   stereo_eye_dist_(150.0),
   stereo_eye_offset_(10.0)
@@ -1061,6 +1062,11 @@ void Scene::Stereo(unsigned int m)
   RequestRedraw();
 }
 
+void Scene::SetStereoInverted(bool f)
+{
+  stereo_inverted_=f;
+}
+
 void Scene::SetStereoEye(unsigned int m)
 {
   stereo_eye_= (m>2) ? 0: m;
@@ -1737,12 +1743,21 @@ void Scene::render_quad_buffered_stereo()
   glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
   glDrawBuffer(GL_BACK_LEFT);
   glClear(GL_DEPTH_BUFFER_BIT);
-  stereo_projection(stereo_==1 ? 1: 2);
+  if (stereo_inverted_) {
+    stereo_projection(stereo_==1 ? 2 : 1);
+  } else {
+    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);
+  if (stereo_inverted_) {
+    stereo_projection(stereo_==1 ? 1 : 2);
+  } else {
+    stereo_projection(stereo_==1 ? 2 : 1);
+  }
   this->render_scene_with_glow();
+  glDrawBuffer(GL_BACK);
 }
 
 }} // ns
diff --git a/modules/gfx/src/scene.hh b/modules/gfx/src/scene.hh
index c373f3e81..d86e46a6a 100644
--- a/modules/gfx/src/scene.hh
+++ b/modules/gfx/src/scene.hh
@@ -155,11 +155,15 @@ class DLLEXPORT_OST_GFX Scene {
   /// \brief switch stereo mode
   /*
     0=off
-    1=quad-buffered (unsupported)
+    1=quad-buffered
     2=interlaced variant #1
     3=interlaced variant #2
   */
   void Stereo(unsigned int);
+
+  /// \brief invert stereo eyes for stereo mode=0
+  void SetStereoInverted(bool f);
+
   /// \brief eye mode, 0=center, 1=left, 2=right
   void SetStereoEye(unsigned int);
 
@@ -393,6 +397,7 @@ private:
   std::vector<boost::shared_array<unsigned char> > blur_buffer_;
   GLuint  glow_tex_;
   unsigned int stereo_;
+  bool stereo_inverted_;
   unsigned int stereo_eye_;
   float stereo_eye_dist_,stereo_eye_offset_;
 
-- 
GitLab