Эх сурвалжийг харах

use push/pop attrib

Former-commit-id: b38c5920fd109039057a033cc415750702b44088
Alec Jacobson 10 жил өмнө
parent
commit
ccb0ff7e21
1 өөрчлөгдсөн 45 нэмэгдсэн , 47 устгасан
  1. 45 47
      include/igl/RotateWidget.h

+ 45 - 47
include/igl/RotateWidget.h

@@ -379,11 +379,8 @@ inline void igl::RotateWidget::draw() const
   using namespace Eigen;
   using namespace std;
   using namespace igl;
-  int l,dt;
-  glGetIntegerv(GL_LIGHTING,&l);
-  glGetIntegerv(GL_DEPTH_TEST,&dt);
-  double lw;
-  glGetDoublev(GL_LINE_WIDTH,&lw);
+  glPushAttrib(GL_ENABLE_BIT | GL_LIGHTING_BIT | GL_DEPTH_BUFFER_BIT | GL_LINE_BIT);
+  glDisable(GL_CLIP_PLANE0);
 
   glDisable(GL_LIGHTING);
   glDisable(GL_DEPTH_TEST);
@@ -470,9 +467,7 @@ inline void igl::RotateWidget::draw() const
   draw_guide();
   glPopMatrix();
 
-  glLineWidth(lw);
-  (l ? glEnable(GL_LIGHTING):glDisable(GL_LIGHTING));
-  (dt ? glEnable(GL_DEPTH_TEST):glDisable(GL_DEPTH_TEST));
+  glPopAttrib();
 };
 
 inline void igl::RotateWidget::draw_guide() const
@@ -480,12 +475,15 @@ inline void igl::RotateWidget::draw_guide() const
   using namespace Eigen;
   using namespace std;
   using namespace igl;
-  int posm,post,cf;
-  glGetIntegerv(GL_CULL_FACE,&cf);
-  glGetIntegerv(GL_POINT_SMOOTH,&posm);
-  glGetIntegerv(GL_POLYGON_STIPPLE,&post);
-  double posi;
-  glGetDoublev(GL_POINT_SIZE,&posi);
+  glPushAttrib(
+    GL_DEPTH_BUFFER_BIT | 
+    GL_ENABLE_BIT | 
+    GL_POLYGON_BIT | 
+    GL_POINT_BIT | 
+    GL_TRANSFORM_BIT |
+    GL_STENCIL_BUFFER_BIT |
+    GL_LIGHTING_BIT);
+
   // http://www.codeproject.com/Articles/23444/A-Simple-OpenGL-Stipple-Polygon-Example-EP_OpenGL_
   const GLubyte halftone[] = {
     0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
@@ -510,47 +508,47 @@ inline void igl::RotateWidget::draw_guide() const
   {
     case DOWN_TYPE_NONE:
     case DOWN_TYPE_TRACKBALL:
-      return;
+      goto finish;
     case DOWN_TYPE_OUTLINE:
       glScaled(outer_over_inner,outer_over_inner,outer_over_inner);
       break;
     default:
       break;
   }
-  const Vector3d nudown(udown.normalized()), 
-    nudrag(udrag.normalized());
-  glPushMatrix();
-  glDisable(GL_CULL_FACE);
-  glDisable(GL_POINT_SMOOTH);
-  glPointSize(5.);
-  glBegin(GL_POINTS);
-  glVertex3dv(nudown.data());
-  glVertex3d(0,0,0);
-  glVertex3dv(nudrag.data());
-  glEnd();
-  glBegin(GL_LINE_STRIP);
-  glVertex3dv(nudown.data());
-  glVertex3d(0,0,0);
-  glVertex3dv(nudrag.data());
-  glEnd();
-  glEnable(GL_POLYGON_STIPPLE);
-  glPolygonStipple(halftone);
-  glBegin(GL_TRIANGLE_FAN);
-  glVertex3d(0,0,0);
-  Quaterniond dq = rot * down_rot.conjugate();
-  //dq.setFromTwoVectors(nudown,nudrag);
-  for(double t = 0;t<1;t+=0.1)
   {
-    const Vector3d p = Quaterniond::Identity().slerp(t,dq) * nudown;
-    glVertex3dv(p.data());
+    const Vector3d nudown(udown.normalized()), 
+      nudrag(udrag.normalized());
+    glPushMatrix();
+    glDisable(GL_CULL_FACE);
+    glDisable(GL_POINT_SMOOTH);
+    glPointSize(5.);
+    glBegin(GL_POINTS);
+    glVertex3dv(nudown.data());
+    glVertex3d(0,0,0);
+    glVertex3dv(nudrag.data());
+    glEnd();
+    glBegin(GL_LINE_STRIP);
+    glVertex3dv(nudown.data());
+    glVertex3d(0,0,0);
+    glVertex3dv(nudrag.data());
+    glEnd();
+    glEnable(GL_POLYGON_STIPPLE);
+    glPolygonStipple(halftone);
+    glBegin(GL_TRIANGLE_FAN);
+    glVertex3d(0,0,0);
+    Quaterniond dq = rot * down_rot.conjugate();
+    //dq.setFromTwoVectors(nudown,nudrag);
+    for(double t = 0;t<1;t+=0.1)
+    {
+      const Vector3d p = Quaterniond::Identity().slerp(t,dq) * nudown;
+      glVertex3dv(p.data());
+    }
+    glVertex3dv(nudrag.data());
+    glEnd();
+    glPopMatrix();
   }
-  glVertex3dv(nudrag.data());
-  glEnd();
-  glPopMatrix();
-  glPointSize(posi);
-  (cf?glEnable(GL_CULL_FACE):glDisable(GL_CULL_FACE));
-  (posm?glEnable(GL_POINT_SMOOTH):glDisable(GL_POINT_SMOOTH));
-  (post?glEnable(GL_POLYGON_STIPPLE):glDisable(GL_POLYGON_STIPPLE));
+finish:
+  glPopAttrib();
 }
 
 #endif