# 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 glsnake_init init_glsnake
#define glsnake_display draw_glsnake
#define glsnake_reshape reshape_glsnake
-#define refresh_glsnake 0
+#define free_glsnake 0
#define release_glsnake 0
-#define glsnake_handle_event 0
+#define glsnake_handle_event xlockmore_no_events
/* xscreensaver defaults */
#define DEFAULTS "*delay: 30000 \n" \
"*count: 30 \n" \
"*showFPS: False \n" \
- "*labelfont: -*-helvetica-medium-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);
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, False);
+ 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 */
#ifndef HAVE_GLUT
ModeInfo * mi,
#endif
- int w, int h)
+ int width, int height)
{
- glViewport(0, 0, (GLint) w, (GLint) h);
+ double h = (GLfloat) height / (GLfloat) width;
+ int y = 0;
+
+ if (width > height * 5) { /* tiny window: show middle */
+ height = width;
+ y = -height/2;
+ h = height / (GLfloat) width;
+ }
+
+ glViewport(0, y, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
/* jwz: 0.05 was too close (left black rectangles) */
- gluPerspective(zoom, (GLdouble) w / (GLdouble) h, 1.0, 100.0);
+ gluPerspective(zoom, 1/h, 1.0, 100.0);
gluLookAt(0.0, 0.0, 20.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glMatrixMode(GL_MODELVIEW);
/*gluLookAt(0.0, 0.0, 20.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);*/
glLoadIdentity();
#ifdef HAVE_GLUT
- bp->width = w;
- bp->height = h;
+ bp->width = width;
+ bp->height = height;
#endif
}
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();