X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fglx%2Flament.c;h=aedc57d421df8ebb1eaef93d86bc02a996e104e0;hb=a94197e76a5dea5cb60542840809d6c20d0abbf3;hp=d79376dde97ecca177abf0bd3fb36be50bcb4d71;hpb=f65151994eba80ecabcdac6eef6fa0dde7e2d45b;p=xscreensaver diff --git a/hacks/glx/lament.c b/hacks/glx/lament.c index d79376dd..aedc57d4 100644 --- a/hacks/glx/lament.c +++ b/hacks/glx/lament.c @@ -81,8 +81,10 @@ #define PROGCLASS "Lament" #define HACK_INIT init_lament #define HACK_DRAW draw_lament +#define HACK_RESHAPE reshape_lament #define lament_opts xlockmore_opts #define DEFAULTS "*delay: 10000 \n" \ + "*showFPS: False \n" \ "*wireframe: False \n" \ "*texture: True \n" #include "xlockmore.h" @@ -107,6 +109,7 @@ static argtype vars[] = { ModeSpecOpt lament_opts = {countof(opts), opts, countof(vars), vars, NULL}; #include "xpm-ximage.h" + #include "../images/lament.xpm" #define RAND(n) ((long) ((random() & 0x7fffffff) % ((long) (n)))) @@ -138,8 +141,16 @@ typedef enum { } lament_type; -static GLfloat exterior_color[] = { 0.70, 0.60, 0.00, 1.00 }; -static GLfloat interior_color[] = { 0.25, 0.25, 0.20, 1.00 }; +static GLfloat exterior_color[] = { 0.33, 0.22, 0.03, 1.00, /* ambient */ + 0.78, 0.57, 0.11, 1.00, /* specular */ + 0.99, 0.91, 0.81, 1.00, /* diffuse */ + 27.80 /* shininess */ + }; +static GLfloat interior_color[] = { 0.20, 0.20, 0.15, 1.00, /* ambient */ + 0.40, 0.40, 0.32, 1.00, /* specular */ + 0.99, 0.99, 0.81, 1.00, /* diffuse */ + 50.80 /* shininess */ + }; typedef struct { @@ -183,7 +194,6 @@ parse_image_data(ModeInfo *mi) lament_faces); } - /* Computing normal vectors (thanks to Nat Friedman ) */ @@ -275,6 +285,15 @@ do_normal(GLfloat x1, GLfloat y1, GLfloat z1, /* Shorthand utilities for making faces, with proper normals. */ +static void +set_colors (GLfloat *color) +{ + glMaterialfv(GL_FRONT, GL_AMBIENT, color+0); + glMaterialfv(GL_FRONT, GL_DIFFUSE, color+4); + glMaterialfv(GL_FRONT, GL_SPECULAR, color+8); + glMaterialfv(GL_FRONT, GL_SHININESS, color+12); +} + static void face3(GLint texture, GLfloat *color, Bool wire, GLfloat s1, GLfloat t1, GLfloat x1, GLfloat y1, GLfloat z1, @@ -284,7 +303,8 @@ face3(GLint texture, GLfloat *color, Bool wire, #ifdef HAVE_GLBINDTEXTURE glBindTexture(GL_TEXTURE_2D, texture); #endif /* HAVE_GLBINDTEXTURE */ - glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color); + set_colors(color); + do_normal(x1, y1, z1, x2, y2, z2, x3, y3, z3); glBegin(wire ? GL_LINE_LOOP : GL_TRIANGLES); glTexCoord2f(s1, t1); glVertex3f(x1, y1, z1); @@ -303,7 +323,7 @@ face4(GLint texture, GLfloat *color, Bool wire, #ifdef HAVE_GLBINDTEXTURE glBindTexture(GL_TEXTURE_2D, texture); #endif /* HAVE_GLBINDTEXTURE */ - glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color); + set_colors(color); do_normal(x1, y1, z1, x2, y2, z2, x3, y3, z3); glBegin(wire ? GL_LINE_LOOP : GL_QUADS); glTexCoord2f(s1, t1); glVertex3f(x1, y1, z1); @@ -324,7 +344,7 @@ face5(GLint texture, GLfloat *color, Bool wire, #ifdef HAVE_GLBINDTEXTURE glBindTexture(GL_TEXTURE_2D, texture); #endif /* HAVE_GLBINDTEXTURE */ - glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color); + set_colors(color); do_normal(x1, y1, z1, x2, y2, z2, x3, y3, z3); glBegin(wire ? GL_LINE_LOOP : GL_POLYGON); glTexCoord2f(s1, t1); glVertex3f(x1, y1, z1); @@ -541,7 +561,7 @@ star(ModeInfo *mi, Bool top, Bool wire) #ifdef HAVE_GLBINDTEXTURE glBindTexture(GL_TEXTURE_2D, lc->texids[top ? FACE_U : FACE_D]); #endif /* HAVE_GLBINDTEXTURE */ - glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, exterior_color); + set_colors(exterior_color); i = 1; do_normal(points[i+0][0], points[i+0][1], 0, @@ -563,7 +583,7 @@ star(ModeInfo *mi, Bool top, Bool wire) #ifdef HAVE_GLBINDTEXTURE glBindTexture(GL_TEXTURE_2D, 0); #endif /* HAVE_GLBINDTEXTURE */ - glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, interior_color); + set_colors(interior_color); i = countof(points) - 9; do_normal(points[i+0][0], points[i+0][1], 0, @@ -712,7 +732,6 @@ tetra(ModeInfo *mi, Bool wire) 0.0, 0.0, 0.5, -0.5, 0.5, 0.0, 0.0, 0.5, 0.5, -0.5, 0.0, 0.0, -0.5, -0.5, -0.5); - glEnd(); } glEndList(); @@ -1010,7 +1029,7 @@ taser(ModeInfo *mi, Bool wire) #ifdef HAVE_GLBINDTEXTURE glBindTexture(GL_TEXTURE_2D, lc->texids[FACE_E]); #endif /* HAVE_GLBINDTEXTURE */ - glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, exterior_color); + set_colors(exterior_color); do_normal(0, body_face_points[(i*5)+0][0], body_face_points[(i*5)+0][1], 0, body_face_points[(i*5)+1][0], body_face_points[(i*5)+1][1], @@ -1135,7 +1154,7 @@ taser(ModeInfo *mi, Bool wire) #ifdef HAVE_GLBINDTEXTURE glBindTexture(GL_TEXTURE_2D, lc->texids[FACE_E]); #endif /* HAVE_GLBINDTEXTURE */ - glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, exterior_color); + set_colors(exterior_color); do_normal( 0, lifter_face_points[(i*5)+0][0], lifter_face_points[(i*5)+0][1], @@ -1273,7 +1292,7 @@ taser(ModeInfo *mi, Bool wire) #ifdef HAVE_GLBINDTEXTURE glBindTexture(GL_TEXTURE_2D, lc->texids[FACE_E]); #endif /* HAVE_GLBINDTEXTURE */ - glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, exterior_color); + set_colors(exterior_color); do_normal( 0, slider_face_points[(i*5)+0][0], slider_face_points[(i*5)+0][1], @@ -1302,7 +1321,7 @@ taser(ModeInfo *mi, Bool wire) #ifdef HAVE_GLBINDTEXTURE glBindTexture(GL_TEXTURE_2D, 0); #endif /* HAVE_GLBINDTEXTURE */ - glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, interior_color); + set_colors(interior_color); do_normal( 0, slider_face_points[(i*5)+2][0], slider_face_points[(i*5)+2][1], @@ -1873,8 +1892,8 @@ rotate(GLfloat *pos, GLfloat *v, GLfloat *dv, GLfloat max_v) /* Window management, etc */ -static void -reshape(int width, int height) +void +reshape_lament(ModeInfo *mi, int width, int height) { int target_size = 180; int win_size = (width > height ? height : width); @@ -1927,31 +1946,26 @@ gl_init(ModeInfo *mi) if (!wire) { - static GLfloat pos0[] = { -4.0, 2.0, 5.0, 1.0 }; - static GLfloat pos1[] = { 12.0, 5.0, 1.0, 1.0 }; - static GLfloat local[] = { 0.0 }; - static GLfloat ambient[] = { 0.3, 0.3, 0.3, 1.0 }; - static GLfloat spec[] = { 1.0, 1.0, 1.0, 1.0 }; - static GLfloat shine[] = { 100.0 }; + static GLfloat pos0[] = { -4.0, 2.0, 5.0, 1.0 }; + static GLfloat pos1[] = { 6.0, -1.0, 3.0, 1.0 }; + + static GLfloat amb0[] = { 0.7, 0.7, 0.7, 1.0 }; +/* static GLfloat amb1[] = { 0.7, 0.0, 0.0, 1.0 }; */ + static GLfloat dif0[] = { 1.0, 1.0, 1.0, 1.0 }; + static GLfloat dif1[] = { 0.3, 0.1, 0.1, 1.0 }; glLightfv(GL_LIGHT0, GL_POSITION, pos0); glLightfv(GL_LIGHT1, GL_POSITION, pos1); - glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); - glLightfv(GL_LIGHT1, GL_AMBIENT, ambient); - - glLightfv(GL_LIGHT0, GL_SPECULAR, spec); - glLightfv(GL_LIGHT1, GL_SPECULAR, spec); - - glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, local); - glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, exterior_color); - glMaterialfv(GL_FRONT, GL_SPECULAR, spec); - glMaterialfv(GL_FRONT, GL_SHININESS, shine); + glLightfv(GL_LIGHT0, GL_AMBIENT, amb0); +/* glLightfv(GL_LIGHT1, GL_AMBIENT, amb1); */ + glLightfv(GL_LIGHT0, GL_DIFFUSE, dif0); + glLightfv(GL_LIGHT1, GL_DIFFUSE, dif1); + set_colors(exterior_color); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); - glEnable(GL_LIGHT1); - glDisable(GL_LIGHT1); +/* glEnable(GL_LIGHT1); */ glEnable(GL_DEPTH_TEST); glEnable(GL_TEXTURE_2D); @@ -1975,12 +1989,15 @@ gl_init(ModeInfo *mi) { int height = lc->texture->width; /* assume square */ glBindTexture(GL_TEXTURE_2D, lc->texids[i]); - glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, exterior_color); + set_colors(exterior_color); + + clear_gl_error(); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, lc->texture->width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (lc->texture->data + (lc->texture->bytes_per_line * height * i))); + check_gl_error("texture"); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); @@ -2025,6 +2042,47 @@ gl_init(ModeInfo *mi) } +# ifdef HAVE_MESA_GL + +# include + +static RETSIGTYPE +lament_signal_kludge (int sig) +{ + signal (sig, SIG_DFL); + fprintf (stderr, + "\n" + "%s: dying with signal %d (%s).\n" + "\n" + "\tThis is almost certainly a bug in the Mesa GL library,\n" + "\tespecially if the stack trace in the core file mentions\n" + "\t`lambda_textured_triangle' or `render_quad'.\n" + "\n" + "\tFirst make sure that you have the latest version of Mesa.\n" + "\tIf that doesn't fix it, then I encourage you to report this\n" + "\tbug to the Mesa maintainers at .\n" + "\n", + progname, + sig, + (sig == SIGILL ? "SIGILL" : + sig == SIGFPE ? "SIGFPE" : + sig == SIGBUS ? "SIGBUS" : + sig == SIGSEGV ? "SIGSEGV" : "???")); + fflush (stderr); + kill (getpid (), sig); +} + +static void +handle_signals (void) +{ + signal (SIGILL, lament_signal_kludge); + signal (SIGFPE, lament_signal_kludge); + signal (SIGBUS, lament_signal_kludge); + signal (SIGSEGV, lament_signal_kludge); +} +# endif /* HAVE_MESA_GL */ + + void init_lament(ModeInfo *mi) { @@ -2057,25 +2115,24 @@ init_lament(ModeInfo *mi) lc->ddy = 0.00006 + frand(0.00003); lc->ddz = 0.00006 + frand(0.00003); - lc->ddx = 0.00001; - lc->ddy = 0.00001; - lc->ddz = 0.00001; - lc->type = LAMENT_BOX; lc->anim_pause = 300 + (random() % 100); if ((lc->glx_context = init_GL(mi)) != NULL) { - reshape(MI_WIDTH(mi), MI_HEIGHT(mi)); + reshape_lament(mi, MI_WIDTH(mi), MI_HEIGHT(mi)); gl_init(mi); } + +# ifdef HAVE_MESA_GL + handle_signals (); +# endif /* HAVE_MESA_GL */ } void draw_lament(ModeInfo *mi) { - static int tick = 0; lament_configuration *lc = &lcs[MI_SCREEN(mi)]; Display *dpy = MI_DISPLAY(mi); Window window = MI_WINDOW(mi); @@ -2087,6 +2144,8 @@ draw_lament(ModeInfo *mi) glXMakeCurrent(dpy, window, *(lc->glx_context)); draw(mi); + if (mi->fps_p) do_fps (mi); + glFinish(); glXSwapBuffers(dpy, window); @@ -2101,12 +2160,6 @@ draw_lament(ModeInfo *mi) lc->anim_pause--; else animate(mi); - - if (++tick > 500) - { - tick = 0; - reshape(MI_WIDTH(mi), MI_HEIGHT(mi)); - } } #endif /* USE_GL */