# include "config.h"
#endif
-#ifdef STANDALONE
-# include "xlockmoreI.h"
-#endif
-
/* HAVE_GLUT defined if we're building a standalone glsnake,
* and not defined if we're building as an xscreensaver hack */
#ifdef HAVE_GLUT
# include <GL/glut.h>
#else
-# ifdef HAVE_COCOA
-# include <OpenGL/gl.h>
-# include <OpenGL/glu.h>
+# ifdef HAVE_JWXYZ
# define HAVE_GETTIMEOFDAY
# else
# include <GL/gl.h>
# include <GL/glu.h>
# endif
#endif
+# ifdef HAVE_ANDROID
+# include <GLES/gl.h>
+#endif
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+#ifdef STANDALONE
+# include "xlockmoreI.h"
+#endif
#include <stdio.h>
#include <stddef.h>
#define DEF_ANGVEL 1.0
#define DEF_STATICTIME 5000
#define DEF_ALTCOLOUR 0
-#define DEF_TITLES 1
+#define DEF_TITLES 0
#define DEF_INTERACTIVE 0
#define DEF_ZOOM 25.0
#define DEF_WIREFRAME 0
#define DEF_ANGVEL "1.0"
#define DEF_STATICTIME "5000"
#define DEF_ALTCOLOUR "False"
-#define DEF_TITLES "True"
+#define DEF_TITLES "False"
#define DEF_INTERACTIVE "False"
#define DEF_ZOOM "25.0"
#define DEF_WIREFRAME "False"
#define DEFAULTS "*delay: 30000 \n" \
"*count: 30 \n" \
"*showFPS: False \n" \
- "*labelfont: -*-times-bold-r-normal-*-180-*\n" \
-
+ "*suppressRotationAnimation: True\n" \
+ "*labelfont: -*-helvetica-medium-r-normal-*-*-180-*-*-*-*-*-*\n" \
#undef countof
#define countof(x) (sizeof((x))/sizeof((*x)))
#include "xlockmore.h"
-#include "glxfonts.h"
+#include "texfont.h"
static XrmOptionDescRec opts[] = {
{ "-explode", ".explode", XrmoptionSepArg, DEF_EXPLODE },
struct glsnake_cfg {
#ifndef HAVE_GLUT
GLXContext * glx_context;
- XFontStruct * font;
- GLuint font_list;
+ texture_font_data *font_data;
#else
/* font list number */
int font;
/* the id of the display lists for drawing a node */
GLuint node_solid, node_wire;
+ int node_polys;
/* is the window fullscreen? */
int fullscreen;
struct glsnake_cfg * bp;
/* set up the conf struct and glx contexts */
- if (!glc) {
- glc = (struct glsnake_cfg *) calloc(MI_NUM_SCREENS(mi), sizeof(struct glsnake_cfg));
- if (!glc) {
- fprintf(stderr, "%s: out of memory\n", progname);
- exit(1);
- }
- }
+ MI_INIT(mi, glc, NULL);
bp = &glc[MI_SCREEN(mi)];
if ((bp->glx_context = init_GL(mi)) != NULL) {
/* set up a font for the labels */
#ifndef HAVE_GLUT
if (titles)
- load_font(mi->dpy, "labelfont", &bp->font, &bp->font_list);
+ bp->font_data = load_texture_font (mi->dpy, "labelfont");
#endif
/* build a solid display list */
glVertex3fv(solid_prism_v[0]);
glVertex3fv(solid_prism_v[2]);
glVertex3fv(solid_prism_v[1]);
+ bp->node_polys++;
glNormal3fv(solid_prism_n[1]);
glVertex3fv(solid_prism_v[6]);
glVertex3fv(solid_prism_v[7]);
glVertex3fv(solid_prism_v[8]);
+ bp->node_polys++;
glNormal3fv(solid_prism_n[2]);
glVertex3fv(solid_prism_v[12]);
glVertex3fv(solid_prism_v[13]);
glVertex3fv(solid_prism_v[14]);
+ bp->node_polys++;
glNormal3fv(solid_prism_n[3]);
glVertex3fv(solid_prism_v[3]);
glVertex3fv(solid_prism_v[4]);
glVertex3fv(solid_prism_v[5]);
+ bp->node_polys++;
glNormal3fv(solid_prism_n[4]);
glVertex3fv(solid_prism_v[9]);
glVertex3fv(solid_prism_v[11]);
glVertex3fv(solid_prism_v[10]);
+ bp->node_polys++;
glNormal3fv(solid_prism_n[5]);
glVertex3fv(solid_prism_v[16]);
glVertex3fv(solid_prism_v[15]);
glVertex3fv(solid_prism_v[17]);
+ bp->node_polys++;
glEnd();
+
/* edges */
glBegin(GL_QUADS);
glNormal3fv(solid_prism_n[6]);
glVertex3fv(solid_prism_v[12]);
glVertex3fv(solid_prism_v[14]);
glVertex3fv(solid_prism_v[2]);
+ bp->node_polys++;
glNormal3fv(solid_prism_n[7]);
glVertex3fv(solid_prism_v[0]);
glVertex3fv(solid_prism_v[1]);
glVertex3fv(solid_prism_v[7]);
glVertex3fv(solid_prism_v[6]);
+ bp->node_polys++;
glNormal3fv(solid_prism_n[8]);
glVertex3fv(solid_prism_v[6]);
glVertex3fv(solid_prism_v[8]);
glVertex3fv(solid_prism_v[13]);
glVertex3fv(solid_prism_v[12]);
+ bp->node_polys++;
glNormal3fv(solid_prism_n[9]);
glVertex3fv(solid_prism_v[3]);
glVertex3fv(solid_prism_v[5]);
glVertex3fv(solid_prism_v[17]);
glVertex3fv(solid_prism_v[15]);
+ bp->node_polys++;
glNormal3fv(solid_prism_n[10]);
glVertex3fv(solid_prism_v[3]);
glVertex3fv(solid_prism_v[9]);
glVertex3fv(solid_prism_v[10]);
glVertex3fv(solid_prism_v[4]);
+ bp->node_polys++;
glNormal3fv(solid_prism_n[11]);
glVertex3fv(solid_prism_v[15]);
glVertex3fv(solid_prism_v[16]);
glVertex3fv(solid_prism_v[11]);
glVertex3fv(solid_prism_v[9]);
+ bp->node_polys++;
glNormal3fv(solid_prism_n[12]);
glVertex3fv(solid_prism_v[1]);
glVertex3fv(solid_prism_v[2]);
glVertex3fv(solid_prism_v[5]);
glVertex3fv(solid_prism_v[4]);
+ bp->node_polys++;
glNormal3fv(solid_prism_n[13]);
glVertex3fv(solid_prism_v[8]);
glVertex3fv(solid_prism_v[7]);
glVertex3fv(solid_prism_v[10]);
glVertex3fv(solid_prism_v[11]);
+ bp->node_polys++;
glNormal3fv(solid_prism_n[14]);
glVertex3fv(solid_prism_v[13]);
glVertex3fv(solid_prism_v[16]);
glVertex3fv(solid_prism_v[17]);
glVertex3fv(solid_prism_v[14]);
+ bp->node_polys++;
glEnd();
/* faces */
glVertex3fv(solid_prism_v[0]);
glVertex3fv(solid_prism_v[6]);
glVertex3fv(solid_prism_v[12]);
+ bp->node_polys++;
glNormal3fv(solid_prism_n[19]);
glVertex3fv(solid_prism_v[3]);
glVertex3fv(solid_prism_v[15]);
glVertex3fv(solid_prism_v[9]);
+ bp->node_polys++;
glEnd();
glBegin(GL_QUADS);
glVertex3fv(solid_prism_v[4]);
glVertex3fv(solid_prism_v[10]);
glVertex3fv(solid_prism_v[7]);
+ bp->node_polys++;
glNormal3fv(solid_prism_n[17]);
glVertex3fv(solid_prism_v[8]);
glVertex3fv(solid_prism_v[11]);
glVertex3fv(solid_prism_v[16]);
glVertex3fv(solid_prism_v[13]);
+ bp->node_polys++;
glNormal3fv(solid_prism_n[18]);
glVertex3fv(solid_prism_v[2]);
glVertex3fv(solid_prism_v[14]);
glVertex3fv(solid_prism_v[17]);
glVertex3fv(solid_prism_v[5]);
+ bp->node_polys++;
glEnd();
glEndList();
glBegin(GL_LINE_STRIP);
glVertex3fv(wire_prism_v[0]);
glVertex3fv(wire_prism_v[1]);
+ bp->node_polys++;
glVertex3fv(wire_prism_v[2]);
glVertex3fv(wire_prism_v[0]);
+ bp->node_polys++;
glVertex3fv(wire_prism_v[3]);
glVertex3fv(wire_prism_v[4]);
+ bp->node_polys++;
glVertex3fv(wire_prism_v[5]);
glVertex3fv(wire_prism_v[3]);
+ bp->node_polys++;
glEnd();
glBegin(GL_LINES);
glVertex3fv(wire_prism_v[1]);
glVertex3fv(wire_prism_v[4]);
+ bp->node_polys++;
glVertex3fv(wire_prism_v[2]);
glVertex3fv(wire_prism_v[5]);
+ bp->node_polys++;
glEnd();
glEndList();
#endif
/* draw some text */
- glPushAttrib((GLbitfield) GL_TRANSFORM_BIT | GL_ENABLE_BIT);
+
+/* glPushAttrib((GLbitfield) GL_TRANSFORM_BIT | GL_ENABLE_BIT);*/
glDisable(GL_LIGHTING);
glDisable(GL_DEPTH_TEST);
if (transparent) {
glPushMatrix();
glLoadIdentity();
#ifdef HAVE_GLUT
- gluOrtho2D((GLdouble) 0., (GLdouble) bp->width, (GLdouble) 0., (GLdouble) bp->height);
+ glOrtho((GLdouble) 0., (GLdouble) bp->width, (GLdouble) 0., (GLdouble) bp->height, -1, 1);
#else
- gluOrtho2D((GLdouble) 0., (GLdouble) mi->xgwa.width, (GLdouble) 0., (GLdouble) mi->xgwa.height);
+ glOrtho((GLdouble) 0., (GLdouble) mi->xgwa.width, (GLdouble) 0., (GLdouble) mi->xgwa.height, -1, 1);
#endif
glColor4f(1.0, 1.0, 1.0, 1.0);
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, s[i++]);
}
#else
- print_gl_string(mi->dpy, bp->font, bp->font_list,
- mi->xgwa.width, mi->xgwa.height,
- 10.0, (float) mi->xgwa.height - 10.0,
- s);
+ print_texture_label (mi->dpy, bp->font_data,
+ mi->xgwa.width, mi->xgwa.height,
+ 1, s);
#endif
}
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
- glPopAttrib();
+
+
+/* glPopAttrib();*/
}
/* apply the matrix to the origin and stick it in vec */
glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context));
#endif
+ gl_init(mi);
+
/* clear the buffer */
glClear((GLbitfield) GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glRotatef(yspin, 0.0, 1.0, 0.0);
glRotatef(zspin, 0.0, 0.0, 1.0);
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, 1/h, 1/h);
+ }
+# endif
+
/* now draw each node along the snake -- this is quite ugly :p */
+ mi->polygon_count = 0;
for (i = 0; i < NODE_COUNT; i++) {
/* choose a colour for this node */
if ((i == bp->selected || i == bp->selected+1) && interactive)
glCallList(bp->node_wire);
else
glCallList(bp->node_solid);
+ mi->polygon_count += bp->node_polys;
/* now work out where to draw the next one */
#ifndef HAVE_GLUT
glsnake_idle(bp);
+ if (mi->fps_p) do_fps(mi);
#endif
glFlush();