summaryrefslogtreecommitdiffstats
path: root/hacks/glx/stonerview-view.c
diff options
context:
space:
mode:
Diffstat (limited to 'hacks/glx/stonerview-view.c')
-rw-r--r--hacks/glx/stonerview-view.c134
1 files changed, 134 insertions, 0 deletions
diff --git a/hacks/glx/stonerview-view.c b/hacks/glx/stonerview-view.c
new file mode 100644
index 0000000..baf40e4
--- /dev/null
+++ b/hacks/glx/stonerview-view.c
@@ -0,0 +1,134 @@
+/* StonerView: An eccentric visual toy.
+ Copyright 1998-2001 by Andrew Plotkin (erkyrath@eblong.com)
+ http://www.eblong.com/zarf/stonerview.html
+
+ Permission to use, copy, modify, distribute, and sell this software and its
+ documentation for any purpose is hereby granted without fee, provided that
+ the above copyright notice appear in all copies and that both that
+ copyright notice and this permission notice appear in supporting
+ documentation. No representations are made about the suitability of this
+ software for any purpose. It is provided "as is" without express or
+ implied warranty.
+*/
+
+/* Ported away from GLUT (so that it can do `-root' and work with xscreensaver)
+ by Jamie Zawinski <jwz@jwz.org>, 22-Jan-2001.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifdef HAVE_COCOA
+# include "jwxyz.h"
+#elif defined(HAVE_ANDROID)
+# include <GLES/gl.h>
+#else /* real Xlib */
+# include <GL/glx.h>
+# include <GL/glu.h>
+#endif /* !HAVE_COCOA */
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+#include <stdlib.h>
+#include "stonerview.h"
+
+static GLfloat view_rotx = -45.0, view_roty = 0.0, view_rotz = 15.0;
+static GLfloat view_scale = 4.0;
+
+
+stonerview_state *
+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 = (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
+stonerview_win_draw(stonerview_state *st)
+{
+ int ix;
+ static const GLfloat white[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat gray[] = { 0.6, 0.6, 0.6, 1.0 };
+
+ glDrawBuffer(GL_BACK);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix();
+ glScalef(view_scale, view_scale, view_scale);
+ glRotatef(view_rotx, 1.0, 0.0, 0.0);
+ glRotatef(view_roty, 0.0, 1.0, 0.0);
+ glRotatef(view_rotz, 0.0, 0.0, 1.0);
+
+ glShadeModel(GL_FLAT);
+
+ for (ix=0; ix < st->num_els; ix++) {
+ stonerview_elem_t *el = &st->elist[ix];
+
+ glNormal3f(0.0, 0.0, 1.0);
+
+ /* outline the square */
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, (st->wireframe ? white : gray));
+ glBegin(GL_LINE_LOOP);
+ glVertex3f(el->pos[0]-el->vervec[0], el->pos[1]-el->vervec[1], el->pos[2]);
+ glVertex3f(el->pos[0]+el->vervec[1], el->pos[1]-el->vervec[0], el->pos[2]);
+ glVertex3f(el->pos[0]+el->vervec[0], el->pos[1]+el->vervec[1], el->pos[2]);
+ glVertex3f(el->pos[0]-el->vervec[1], el->pos[1]+el->vervec[0], el->pos[2]);
+ glEnd();
+
+ if (st->wireframe) continue;
+
+ /* fill the square */
+ {
+ GLfloat col[4];
+ col[0] = el->col[0]; col[1] = el->col[1];
+ col[2] = el->col[2]; col[3] = el->col[3];
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, col);
+ }
+ glBegin(GL_QUADS);
+ glVertex3f(el->pos[0]-el->vervec[0], el->pos[1]-el->vervec[1], el->pos[2]);
+ glVertex3f(el->pos[0]+el->vervec[1], el->pos[1]-el->vervec[0], el->pos[2]);
+ glVertex3f(el->pos[0]+el->vervec[0], el->pos[1]+el->vervec[1], el->pos[2]);
+ glVertex3f(el->pos[0]-el->vervec[1], el->pos[1]+el->vervec[0], el->pos[2]);
+ glEnd();
+ }
+
+ glPopMatrix();
+}
+
+void
+stonerview_win_release(stonerview_state *st)
+{
+ free (st->elist);
+ /*free (st->oscroot); -- #### how do we free this? */
+ free (st);
+}