From http://www.jwz.org/xscreensaver/xscreensaver-5.18.tar.gz
[xscreensaver] / hacks / glx / stonerview-view.c
index 167b6948625ba6a6d88cabc305cafaf9a0d0995a..d66eab28ce505ac2a271f448a7f3841ddcb88651 100644 (file)
 #include <stdlib.h>
 #include "stonerview.h"
 
-static GLfloat view_rotx = -45.0, view_roty = 0.0, view_rotz = 0.0;
+static GLfloat view_rotx = -45.0, view_roty = 0.0, view_rotz = 15.0;
 static GLfloat view_scale = 4.0;
 
 
 stonerview_state *
-init_view(int wireframe_p)
+stonerview_init_view(int wireframe_p, int transparent_p)
 {
   stonerview_state *st = (stonerview_state *) calloc (1, sizeof(*st));
 
   st->wireframe = wireframe_p;
+  st->transparent = transparent_p;
   st->num_els = NUM_ELS;
-  st->elist = (elem_t *) calloc (st->num_els, sizeof(*st->elist));
+  st->elist = (stonerview_elem_t *) calloc (st->num_els, sizeof(*st->elist));
 
   st->osctail = &st->oscroot;
 
   /* for trackball, two-sided lighting and no face culling */
   glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
 
+  glEnable(GL_CULL_FACE);
   glEnable(GL_LIGHTING);
   glEnable(GL_LIGHT0);
   glEnable(GL_DEPTH_TEST);
 
   glEnable(GL_NORMALIZE);
 
+  glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
+  glEnable(GL_LINE_SMOOTH);
+  glEnable(GL_BLEND);
+
+  if (st->transparent)
+    glBlendFunc(GL_SRC_ALPHA,GL_ONE);
+
   return st;
 }
 
 /* callback: draw everything */
-void win_draw(stonerview_state *st)
+void
+stonerview_win_draw(stonerview_state *st)
 {
   int ix;
   static const GLfloat white[] = { 1.0, 1.0, 1.0, 1.0 };
@@ -69,7 +79,7 @@ void win_draw(stonerview_state *st)
   glShadeModel(GL_FLAT);
 
   for (ix=0; ix < st->num_els; ix++) {
-    elem_t *el = &st->elist[ix];
+    stonerview_elem_t *el = &st->elist[ix];
 
     glNormal3f(0.0, 0.0, 1.0);
 
@@ -97,7 +107,8 @@ void win_draw(stonerview_state *st)
   glPopMatrix();
 }
 
-void win_release(stonerview_state *st)
+void
+stonerview_win_release(stonerview_state *st)
 {
   free (st->elist);
   /*free (st->oscroot);  -- #### how do we free this? */