From http://www.jwz.org/xscreensaver/xscreensaver-5.37.tar.gz
[xscreensaver] / hacks / glx / tangram.c
index 187c3a712ff1a2493660c4973fa525020c52bcb6..82a1f4102e18ba143ad50942d39cff97bdde7000 100644 (file)
@@ -1,4 +1,4 @@
-/* tangram, Copyright (c) 2005 Jeremy English <jhe@jeremyenglish.org>
+/* tangram, Copyright (c) 2005-2014 Jeremy English <jhe@jeremyenglish.org>
  *
  * Permission to use, copy, modify, distribute, and sell this software
  * and its documentation for any purpose is hereby granted without
 
 #define DEFAULTS       "*delay:        10000            \n" \
                        "*wireframe:    False         \n" \
-                       "*titleFont:  -*-times-bold-r-normal-*-180-*\n" \
-                       "*titleFont2: -*-times-bold-r-normal-*-120-*\n" \
-                       "*titleFont3: -*-times-bold-r-normal-*-80-*\n"  \
+       "*titleFont:  -*-helvetica-medium-r-normal-*-*-180-*-*-*-*-*-*\n" \
+       "*titleFont2: -*-helvetica-medium-r-normal-*-*-120-*-*-*-*-*-*\n" \
+       "*titleFont3: -*-helvetica-medium-r-normal-*-*-80-*-*-*-*-*-*\n"  \
 
 # define refresh_tangram 0
 # define release_tangram 0
-# define tangram_handle_event 0
 #undef countof
 #define countof(x) (sizeof((x))/sizeof((*x)))
 
@@ -38,7 +37,7 @@
 #include <time.h>
 #include <math.h>
 #include "tangram_shapes.h"
-#include "glxfonts.h"
+#include "texfont.h"
 
 typedef struct {
     GLubyte r;
@@ -98,12 +97,7 @@ typedef struct {
     XColor *colors;
     int ccolor;
 
-    XFontStruct *xfont1;
-    XFontStruct *xfont2;
-    XFontStruct *xfont3;
-    GLuint font1_dlist, font2_dlist, font3_dlist;
-    GLuint name_list;
-
+    texture_font_data *font1_data, *font2_data, *font3_data;
     GLfloat theta[3];
     Bool going_down[3];
 
@@ -115,34 +109,38 @@ typedef struct {
 static tangram_configuration *tps = NULL;
 
 #define DEF_VIEWING_TIME "5"
-#define DEF_ROTATE_CAMERA "True"
+#define DEF_ROTATE "True"
 #define DEF_X_CAMERA_ROTATE "0.2"
 #define DEF_Y_CAMERA_ROTATE "0.5"
 #define DEF_Z_CAMERA_ROTATE "0"
-
+#define DEF_LABELS "True"
 
 static GLuint viewing_time;
 static Bool do_rotate;
+static Bool do_labels;
 static GLfloat x_camera_rotate;
 static GLfloat y_camera_rotate;
 static GLfloat z_camera_rotate;
 static int wire;
 
 static XrmOptionDescRec opts[] = {
-    {"-viewing_time", ".viewing_time", XrmoptionSepArg, 0},
+    {"-viewing_time", ".viewingTime", XrmoptionSepArg, 0},
     {"-rotate", ".rotate", XrmoptionNoArg, "True"},
     {"+rotate", ".rotate", XrmoptionNoArg, "False"},
-    {"-x_camera_rotate", ".x_camera_rotate", XrmoptionSepArg, 0},
-    {"-y_camera_rotate", ".y_camera_rotate", XrmoptionSepArg, 0},
-    {"-z_camera_rotate", ".z_camera_rotate", XrmoptionSepArg, 0}
+    {"-labels", ".labels", XrmoptionNoArg, "True"},
+    {"+labels", ".labels", XrmoptionNoArg, "False"},
+    {"-x_camera_rotate", ".xCameraRotate", XrmoptionSepArg, 0},
+    {"-y_camera_rotate", ".yCameraRotate", XrmoptionSepArg, 0},
+    {"-z_camera_rotate", ".zCameraRotate", XrmoptionSepArg, 0}
 };
 
 static argtype vars[] = {
-    {&viewing_time, "viewing_time", "Viewing Time", DEF_VIEWING_TIME, t_Int},
-    {&do_rotate, "rotate", "Rotate", DEF_ROTATE_CAMERA, t_Bool},
-    {&x_camera_rotate, "x_camera_rotate", "X Camera Rotate", DEF_X_CAMERA_ROTATE, t_Float},
-    {&y_camera_rotate, "y_camera_rotate", "Y Camera Rotate", DEF_Y_CAMERA_ROTATE, t_Float},
-    {&z_camera_rotate, "z_camera_rotate", "Z Camera Rotate", DEF_Z_CAMERA_ROTATE, t_Float}
+    {&viewing_time, "viewingTime", "ViewingTime", DEF_VIEWING_TIME, t_Int},
+    {&do_rotate, "rotate", "Rotate", DEF_ROTATE, t_Bool},
+    {&do_labels, "labels", "Labels", DEF_LABELS, t_Bool},
+    {&x_camera_rotate, "xCameraRotate", "XCameraRotate", DEF_X_CAMERA_ROTATE, t_Float},
+    {&y_camera_rotate, "yCameraRotate", "YCameraRotate", DEF_Y_CAMERA_ROTATE, t_Float},
+    {&z_camera_rotate, "zCameraRotate", "ZCameraRotate", DEF_Z_CAMERA_ROTATE, t_Float}
 };
 
 ENTRYPOINT ModeSpecOpt tangram_opts = { countof(opts), opts, countof(vars), vars, NULL };
@@ -735,15 +733,24 @@ static void draw_tangram_shape(tangram_shape ts)
 static void load_fonts(ModeInfo * mi)
 {
     tangram_configuration *tp = &tps[MI_SCREEN(mi)];
-    load_font(mi->dpy, "titleFont", &tp->xfont1, &tp->font1_dlist);
-    load_font(mi->dpy, "titleFont2", &tp->xfont2, &tp->font2_dlist);
-    load_font(mi->dpy, "titleFont3", &tp->xfont3, &tp->font3_dlist);
+    tp->font1_data = load_texture_font (mi->dpy, "titleFont");
+    tp->font2_data = load_texture_font (mi->dpy, "titleFont2");
+    tp->font3_data = load_texture_font (mi->dpy, "titleFont3");
 }
 
 static void draw_shapes(ModeInfo * mi)
 {
     tangram_configuration *tp = &tps[MI_SCREEN(mi)];
 
+# 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 (h, 1/h, 1);
+    }
+# endif
+
     draw_tangram_shape(tp->tsm1);
 
     draw_tangram_shape(tp->tsm2);
@@ -752,26 +759,27 @@ static void draw_shapes(ModeInfo * mi)
     draw_tangram_shape(tp->tlg2);
     draw_tangram_shape(tp->sq);
     draw_tangram_shape(tp->rh);
-    glCallList(tp->name_list);
-}
 
-static void set_perspective(void)
-{
-    glPushMatrix();
-    glMatrixMode(GL_PROJECTION);
-    glLoadIdentity();
-    gluPerspective(60, -1, 0.1, 50);
-    gluLookAt(0, 5, -5, 0, 0, 0, 0, -1, 0);
-    glMatrixMode(GL_MODELVIEW);
-    glPopMatrix();
+    if (do_labels)
+      {
+        texture_font_data *f;
+        if (MI_WIDTH(mi) >= 500 && MI_HEIGHT(mi) >= 375)
+            f = tp->font1_data;
+        else if (MI_WIDTH(mi) >= 350 && MI_HEIGHT(mi) >= 260)
+            f = tp->font2_data;
+        else
+            f = tp->font3_data;
 
+        glColor3f(0.8, 0.8, 0);
+        print_texture_label (mi->dpy, f,
+                             mi->xgwa.width, mi->xgwa.height,
+                             1, tp->pn);
+      }
 }
 
 ENTRYPOINT void reshape_tangram(ModeInfo * mi, int w, int h)
 {
     glViewport(0, 0, w, h);
-    set_perspective();
-    glLoadIdentity();
 }
 
 static void set_camera(tangram_configuration *tp)
@@ -825,13 +833,13 @@ static void init_shapes(ModeInfo * mi)
                       &tp->tlg2, &tp->sq, &tp->rh);
     get_solved_puzzle(mi, &tp->n_tsm1, &tp->n_tsm2, &tp->n_tm, &tp->n_tlg1,
                       &tp->n_tlg2, &tp->n_sq, &tp->n_rh);
-    tp->tsm1.dl = get_sm_tri_dl(wire);
-    tp->tsm2.dl = get_sm_tri_dl(wire);
-    tp->tm.dl = get_md_tri_dl(wire);
-    tp->tlg1.dl = get_lg_tri_dl(wire);
-    tp->tlg2.dl = get_lg_tri_dl(wire);
-    tp->sq.dl = get_square_dl(wire);
-    tp->rh.dl = get_rhomboid_dl(wire);
+    tp->tsm1.dl = tangram_get_sm_tri_dl(wire);
+    tp->tsm2.dl = tangram_get_sm_tri_dl(wire);
+    tp->tm.dl = tangram_get_md_tri_dl(wire);
+    tp->tlg1.dl = tangram_get_lg_tri_dl(wire);
+    tp->tlg2.dl = tangram_get_lg_tri_dl(wire);
+    tp->sq.dl = tangram_get_square_dl(wire);
+    tp->rh.dl = tangram_get_rhomboid_dl(wire);
 }
 
 static void gl_init(ModeInfo * mi)
@@ -869,16 +877,7 @@ ENTRYPOINT void init_tangram(ModeInfo * mi)
 {
     tangram_configuration *tp;
 
-    if (!tps) {
-        tps = (tangram_configuration *)
-            calloc(MI_NUM_SCREENS(mi), sizeof(tangram_configuration));
-        if (!tps) {
-            fprintf(stderr, "%s: out of memory\n", progname);
-            exit(1);
-        }
-
-        tp = &tps[MI_SCREEN(mi)];
-    }
+    MI_INIT (mi, tps, NULL);
 
     tp = &tps[MI_SCREEN(mi)];
 
@@ -886,6 +885,8 @@ ENTRYPOINT void init_tangram(ModeInfo * mi)
         gl_init(mi);
     }
 
+    reshape_tangram (mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+
     wire = MI_IS_WIREFRAME(mi);
 
     load_fonts(mi);
@@ -1025,34 +1026,35 @@ ENTRYPOINT void draw_tangram(ModeInfo * mi)
     glPushMatrix();
 
     glLoadIdentity();
-    glNewList(tp->name_list, GL_COMPILE);
-    {
-        XFontStruct *f;
-        GLuint fl;
-        if (MI_WIDTH(mi) >= 500 && MI_HEIGHT(mi) >= 375)
-            f = tp->xfont1, fl = tp->font1_dlist;
-        else if (MI_WIDTH(mi) >= 350 && MI_HEIGHT(mi) >= 260)
-            f = tp->xfont2, fl = tp->font2_dlist;
-        else
-            f = tp->xfont3, fl = tp->font3_dlist;
-
-        glColor3f(0.8, 0.8, 0);
-        print_gl_string(mi->dpy, f, fl,
-                        mi->xgwa.width, mi->xgwa.height,
-                        10, mi->xgwa.height - 10, tp->pn);
-    }
-    glEndList();
 
     glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, white);
     glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, 128);
 
     draw_shapes(mi);
 
+    if (mi->fps_p) do_fps (mi);
+
     glFlush();
     glPopMatrix();
     glXSwapBuffers(dpy, window);
 }
 
+ENTRYPOINT Bool
+tangram_handle_event (ModeInfo *mi, XEvent *event)
+{
+  tangram_configuration *tp = &tps[MI_SCREEN(mi)];
+
+  if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event))
+    {
+      tp->display_counter = 0;
+      return True;
+    }
+
+  return False;
+}
+
+
+
 XSCREENSAVER_MODULE ("Tangram", tangram)
 
 #endif                          /* USE_GL */