From 2058e022e22d69d42626990d74b63019c334c4e0 Mon Sep 17 00:00:00 2001
From: Ansgar Philippsen <ansgar.philippsen@gmail.com>
Date: Fri, 28 Dec 2012 14:11:57 -0500
Subject: [PATCH] workaround for glPushAttrib / multisample bug

---
 modules/gfx/src/scene.cc | 39 ++++++++++++++++++++++++++-------------
 modules/gfx/src/scene.hh |  3 +++
 2 files changed, 29 insertions(+), 13 deletions(-)

diff --git a/modules/gfx/src/scene.cc b/modules/gfx/src/scene.cc
index aaff9c1e9..5840c68a1 100644
--- a/modules/gfx/src/scene.cc
+++ b/modules/gfx/src/scene.cc
@@ -141,6 +141,7 @@ Scene::Scene():
   bg_grad_(),
   bg_bm_(),
   bg_tex_(),
+  ms_flag_(false),
   export_aspect_(1.0),
   show_export_aspect_(false)
 {
@@ -477,7 +478,9 @@ void Scene::InitGL(bool full)
     glDisable(GL_POINT_SMOOTH);
     glDisable(GL_POLYGON_SMOOTH);
     glEnable(GL_MULTISAMPLE);
+    ms_flag_=true;
   } else {
+    ms_flag_=false;
     glEnable(GL_LINE_SMOOTH);
     glDisable(GL_POINT_SMOOTH);
     glDisable(GL_POLYGON_SMOOTH);
@@ -2067,21 +2070,26 @@ namespace {
         glTexCoord2f(1.0,1.0); glVertex2i(vp_width_,vp_height_);
         glTexCoord2f(1.0,0.0); glVertex2i(vp_width_,0);
         glEnd();
-     }
-
-     ~ViewportRenderer() {
-       glBindTexture(GL_TEXTURE_2D, 0);
-       glDisable(GL_TEXTURE_2D);
-       glMatrixMode(GL_PROJECTION);
-       glPopMatrix();
-       glMatrixMode(GL_MODELVIEW);
-       glPopMatrix();
-       glPopClientAttrib();
-       glPopAttrib();
+      }
+
+      ~ViewportRenderer() {
+        glBindTexture(GL_TEXTURE_2D, 0);
+        glDisable(GL_TEXTURE_2D);
+        glMatrixMode(GL_PROJECTION);
+        glPopMatrix();
+        glMatrixMode(GL_MODELVIEW);
+        glPopMatrix();
+        glPopClientAttrib();
+        glPopAttrib();
+#if defined(OST_GL_VERSION_2_0)
+        if(Scene::Instance().HasMultisample()) {
+          glEnable(GL_MULTISAMPLE);
+        }
+#endif
 #if OST_SHADER_SUPPORT_ENABLED
-       Shader::Instance().PopProgram();
+        Shader::Instance().PopProgram();
 #endif
-     }
+      }
   };
 }
 
@@ -2480,6 +2488,11 @@ void Scene::render_stereo()
   glPopMatrix();
   glPopClientAttrib();
   glPopAttrib();
+#if defined(OST_GL_VERSION_2_0)
+  if(HasMultisample()) {
+    glEnable(GL_MULTISAMPLE);
+  }
+#endif
 #if OST_SHADER_SUPPORT_ENABLED
   Shader::Instance().PopProgram();
 #endif
diff --git a/modules/gfx/src/scene.hh b/modules/gfx/src/scene.hh
index 972d2587c..4b9483666 100644
--- a/modules/gfx/src/scene.hh
+++ b/modules/gfx/src/scene.hh
@@ -513,6 +513,7 @@ class DLLEXPORT_OST_GFX Scene {
   void SetShowExportAspect(bool f);
   bool GetShowExportAspect() const {return show_export_aspect_;}
 
+  bool HasMultisample() const {return ms_flag_;}
 protected:
   friend class GfxObj; 
   friend class GfxNode;
@@ -603,6 +604,8 @@ private:
   Bitmap bg_bm_;
   unsigned int bg_tex_;
   
+  bool ms_flag_; // multisample flag
+
   float export_aspect_; 
   bool show_export_aspect_;
 
-- 
GitLab