X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fglx%2Ftronbit.c;h=b79309cd85f19d975b0815c128e1ba12cd6f010b;hb=39809ded547bdbb08207d3e514950425215b4410;hp=98cbf287127a4b8425a7619f93fc3ec9605cad6e;hpb=ec8d2b32b63649e6d32bdfb306eda062769af823;p=xscreensaver diff --git a/hacks/glx/tronbit.c b/hacks/glx/tronbit.c index 98cbf287..b79309cd 100644 --- a/hacks/glx/tronbit.c +++ b/hacks/glx/tronbit.c @@ -1,4 +1,4 @@ -/* tronbit, Copyright (c) 2011 Jamie Zawinski +/* tronbit, Copyright (c) 2011-2014 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -14,7 +14,7 @@ "*showFPS: False \n" \ "*wireframe: False \n" -# define refresh_bit 0 +# define free_bit 0 # define release_bit 0 #undef countof #define countof(x) (sizeof((x))/sizeof((*x))) @@ -236,6 +236,20 @@ animate_bits (ModeInfo *mi, bit_state omodel, bit_state nmodel, GLfloat ratio) int polys = 0; GLfloat scale = sin (ratio * M_PI / 2); GLfloat osize, nsize, small; + int wire = MI_IS_WIREFRAME(mi); + + glShadeModel(GL_SMOOTH); + + glEnable(GL_DEPTH_TEST); + glEnable(GL_NORMALIZE); + glEnable(GL_CULL_FACE); + + if (!wire) + { + glEnable(GL_LIGHTING); + glEnable(GL_DEPTH_TEST); + glEnable(GL_CULL_FACE); + } if ((omodel == BIT_IDLE1 || omodel == BIT_IDLE2) && (nmodel == BIT_IDLE1 || nmodel == BIT_IDLE2)) @@ -273,11 +287,6 @@ draw_histogram (ModeInfo *mi, GLfloat ratio) int overlays = 5; int k; - glPushAttrib (GL_TRANSFORM_BIT | /* for matrix contents */ - GL_ENABLE_BIT | /* for various glDisable calls */ - GL_CURRENT_BIT | /* for glColor3f() */ - GL_LIST_BIT); /* for glListBase() */ - glDisable (GL_TEXTURE_2D); glDisable (GL_LIGHTING); glDisable (GL_BLEND); @@ -292,7 +301,8 @@ draw_histogram (ModeInfo *mi, GLfloat ratio) glPushMatrix(); glLoadIdentity(); - gluOrtho2D (0, mi->xgwa.width, 0, mi->xgwa.height); + /* glRotatef(current_device_rotation(), 0, 0, 1); */ + glOrtho (0, mi->xgwa.width, 0, mi->xgwa.height, -1, 1); for (k = 0; k < overlays; k++) { @@ -306,9 +316,11 @@ draw_histogram (ModeInfo *mi, GLfloat ratio) j = bp->histogram_fp + 1; for (i = 0; i < samples; i++) { - GLfloat x = i; - GLfloat y = bp->histogram[j]; - GLfloat z = 0; + GLfloat x, y, z; + if (j >= samples) j = 0; + x = i; + y = bp->histogram[j]; + z = 0; y += (int) ((random() % 16) - 8); y += 16; /* margin at bottom of screen */ @@ -317,7 +329,7 @@ draw_histogram (ModeInfo *mi, GLfloat ratio) y *= scaley; glVertex3f (x, y, z); - if (++j >= samples) j = 0; + ++j; polys++; } glEnd(); @@ -328,8 +340,6 @@ draw_histogram (ModeInfo *mi, GLfloat ratio) glMatrixMode(GL_PROJECTION); glPopMatrix(); - glPopAttrib(); - glMatrixMode(GL_MODELVIEW); return polys; @@ -365,45 +375,22 @@ bit_handle_event (ModeInfo *mi, XEvent *event) { bit_configuration *bp = &bps[MI_SCREEN(mi)]; - if (event->xany.type == ButtonPress && - event->xbutton.button == Button1) - { - bp->button_down_p = True; - gltrackball_start (bp->trackball, - event->xbutton.x, event->xbutton.y, - MI_WIDTH (mi), MI_HEIGHT (mi)); - return True; - } - else if (event->xany.type == ButtonRelease && - event->xbutton.button == Button1) - { - bp->button_down_p = False; - return True; - } - else if (event->xany.type == ButtonPress && - (event->xbutton.button == Button4 || - event->xbutton.button == Button5 || - event->xbutton.button == Button6 || - event->xbutton.button == Button7)) - { - gltrackball_mousewheel (bp->trackball, event->xbutton.button, 3, - !!event->xbutton.state); - return True; - } - else if (event->xany.type == MotionNotify && - bp->button_down_p) - { - gltrackball_track (bp->trackball, - event->xmotion.x, event->xmotion.y, - MI_WIDTH (mi), MI_HEIGHT (mi)); - return True; - } + if (gltrackball_event_handler (event, bp->trackball, + MI_WIDTH (mi), MI_HEIGHT (mi), + &bp->button_down_p)) + return True; else if (event->xany.type == KeyPress) { KeySym keysym; char c = 0; XLookupString (&event->xkey, &c, 1, &keysym, 0); - if (c == ' ' || c == '1' || c == '0') + + if (keysym == XK_Up || keysym == XK_Left || keysym == XK_Prior) + c = '1'; + else if (keysym == XK_Down || keysym == XK_Right || keysym == XK_Next) + c = '0'; + + if (c == ' ' || c == '\t' || c == '\n' || c == '1' || c == '0') { bp->kbd = c; return True; @@ -418,17 +405,9 @@ ENTRYPOINT void init_bit (ModeInfo *mi) { bit_configuration *bp; - int wire = MI_IS_WIREFRAME(mi); int i; - if (!bps) { - bps = (bit_configuration *) - calloc (MI_NUM_SCREENS(mi), sizeof (bit_configuration)); - if (!bps) { - fprintf(stderr, "%s: out of memory\n", progname); - exit(1); - } - } + MI_INIT (mi, bps); bp = &bps[MI_SCREEN(mi)]; @@ -436,24 +415,6 @@ init_bit (ModeInfo *mi) reshape_bit (mi, MI_WIDTH(mi), MI_HEIGHT(mi)); - if (!wire) - { - GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0}; - GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0}; - GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0}; - GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0}; - - glEnable(GL_LIGHTING); - glEnable(GL_LIGHT0); - glEnable(GL_DEPTH_TEST); - glEnable(GL_CULL_FACE); - - glLightfv(GL_LIGHT0, GL_POSITION, pos); - glLightfv(GL_LIGHT0, GL_AMBIENT, amb); - glLightfv(GL_LIGHT0, GL_DIFFUSE, dif); - glLightfv(GL_LIGHT0, GL_SPECULAR, spc); - } - { double spin_speed = 3.0; double wander_speed = 0.03 * speed; @@ -465,7 +426,7 @@ init_bit (ModeInfo *mi) spin_accel, do_wander ? wander_speed : 0, False); - bp->trackball = gltrackball_init (); + bp->trackball = gltrackball_init (False); } for (i = 0; i < countof(bp->dlists); i++) @@ -490,31 +451,49 @@ draw_bit (ModeInfo *mi) bit_configuration *bp = &bps[MI_SCREEN(mi)]; Display *dpy = MI_DISPLAY(mi); Window window = MI_WINDOW(mi); + int wire = MI_IS_WIREFRAME(mi); if (!bp->glx_context) return; glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(bp->glx_context)); - glShadeModel(GL_SMOOTH); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glEnable(GL_DEPTH_TEST); - glEnable(GL_NORMALIZE); - glEnable(GL_CULL_FACE); + if (!wire) + { + GLfloat pos[4] = {1.0, 1.0, 1.0, 0.0}; + GLfloat amb[4] = {0.0, 0.0, 0.0, 1.0}; + GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0}; + GLfloat spc[4] = {0.0, 1.0, 1.0, 1.0}; - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + glLightfv(GL_LIGHT0, GL_POSITION, pos); + glLightfv(GL_LIGHT0, GL_AMBIENT, amb); + glLightfv(GL_LIGHT0, GL_DIFFUSE, dif); + glLightfv(GL_LIGHT0, GL_SPECULAR, spc); + } glPushMatrix (); - glScalef(1.1, 1.1, 1.1); +# 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); + glRotatef(o, 0, 0, 1); + } +# endif + { double x, y, z; get_position (bp->rot, &x, &y, &z, !bp->button_down_p); glTranslatef((x - 0.5) * 11, (y - 0.5) * 5, (z - 0.5) * 3); - gltrackball_rotate (bp->trackball); get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p); @@ -527,7 +506,6 @@ draw_bit (ModeInfo *mi) glScalef (6, 6, 6); - { int nmodel = bp->history [bp->history_fp]; int omodel = bp->history [bp->history_fp > 0 @@ -537,6 +515,11 @@ draw_bit (ModeInfo *mi) double ratio = 1 - ((bp->last_time + bp->frequency) - now) / bp->frequency; if (ratio > 1) ratio = 1; mi->polygon_count += draw_histogram (mi, ratio); + + if (MI_WIDTH(mi) > MI_HEIGHT(mi) * 5) { /* wide window: scale up */ + glScalef (8, 8, 8); + } + mi->polygon_count += animate_bits (mi, omodel, nmodel, ratio); tick_bit (mi, now); }