X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fglx%2Flavalite.c;h=6f57bf7d0d592284972bff53df522a81c5ddc6b0;hb=39809ded547bdbb08207d3e514950425215b4410;hp=1efe40cf408dc96ba1662135bb90d5ebb104c062;hpb=6b1c86cf395f59389e4ece4ea8f4bea2c332745b;p=xscreensaver diff --git a/hacks/glx/lavalite.c b/hacks/glx/lavalite.c index 1efe40cf..6f57bf7d 100644 --- a/hacks/glx/lavalite.c +++ b/hacks/glx/lavalite.c @@ -1,6 +1,6 @@ /* lavalite --- 3D Simulation a Lava Lite, written by jwz. * - * This software Copyright (c) 2002-2006 Jamie Zawinski + * This software Copyright (c) 2002-2017 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 @@ -70,7 +70,7 @@ "*geometry: 600x900\n" \ "*count: " DEF_COUNT " \n" \ -# define refresh_lavalite 0 +# define free_lavalite 0 # define release_lavalite 0 @@ -300,8 +300,15 @@ ENTRYPOINT void reshape_lavalite (ModeInfo *mi, int width, int height) { GLfloat h = (GLfloat) height / (GLfloat) width; + int y = 0; - glViewport (0, 0, (GLint) width, (GLint) height); + if (width > height * 5) { /* tiny window: show middle */ + height = width * 3; + y = -height/2; + h = height / (GLfloat) width; + } + + glViewport (0, y, (GLint) width, (GLint) height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); @@ -339,6 +346,7 @@ load_texture (ModeInfo *mi, const char *filename) } image = xpm_file_to_ximage (dpy, visual, cmap, filename); + if (!image) return False; clear_gl_error(); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, @@ -611,7 +619,6 @@ generate_bottle (ModeInfo *mi) int wire = MI_IS_WIREFRAME(mi); int faces = resolution * 1.5; Bool smooth = do_smooth; - Bool have_texture = False; const lamp_geometry *top_slice = bp->model; const char *current_texture = 0; @@ -660,11 +667,10 @@ generate_bottle (ModeInfo *mi) break; } - have_texture = False; if (!wire && texture && texture != current_texture) { current_texture = texture; - have_texture = load_texture (mi, current_texture); + load_texture (mi, current_texture); } /* Color the discs darker than the tube walls. */ @@ -736,7 +742,7 @@ generate_bottle (ModeInfo *mi) } - have_texture = !wire && load_texture (mi, table_tex); + if (!wire) load_texture (mi, table_tex); glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, table_color); bp->bottle_poly_count += draw_table (top_slice->elevation, wire); @@ -1243,39 +1249,10 @@ lavalite_handle_event (ModeInfo *mi, XEvent *event) { lavalite_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, 5, - !!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; return False; } @@ -1304,16 +1281,7 @@ init_lavalite (ModeInfo *mi) lavalite_configuration *bp; int wire = MI_IS_WIREFRAME(mi); - if (!bps) { - bps = (lavalite_configuration *) - calloc (MI_NUM_SCREENS(mi), sizeof (lavalite_configuration)); - if (!bps) { - fprintf(stderr, "%s: out of memory\n", progname); - exit(1); - } - - bp = &bps[MI_SCREEN(mi)]; - } + MI_INIT (mi, bps); bp = &bps[MI_SCREEN(mi)]; @@ -1405,19 +1373,15 @@ init_lavalite (ModeInfo *mi) bp->rot2 = make_rotator (spin_speed, 0, 0, 1, 0.1, False); - bp->trackball = gltrackball_init (); - - /* move initial camera position up by around 15 degrees: - in other words, tilt the scene toward the viewer. */ - gltrackball_start (bp->trackball, 50, 50, 100, 100); - gltrackball_track (bp->trackball, 50, 5, 100, 100); - - /* Oh, but if it's the "Giant" model, tilt the scene away: make it - look like we're looking up at it instead of odwn at it! */ - if (bp->style == GIANT) - gltrackball_track (bp->trackball, 50, -12, 100, 100); - else if (bp->style == ROCKET) /* same for rocket, but not as much */ - gltrackball_track (bp->trackball, 50, -4, 100, 100); + bp->trackball = gltrackball_init (False); + + /* Tilt the scene a bit: lean the normal lamps toward the viewer, + and the huge lamps away. */ + gltrackball_reset (bp->trackball, + -0.3 + frand(0.6), + (bp->style == ROCKET || bp->style == GIANT + ? frand (0.2) + : -frand (0.6))); } switch (bp->style) @@ -1518,6 +1482,7 @@ draw_lavalite (ModeInfo *mi) #endif /* 0 */ glLoadIdentity(); + glRotatef(current_device_rotation(), 0, 0, 1); gluLookAt ((cx - 0.5) * 8, /* Position the camera */ (cy - 0.5) * 8, @@ -1527,6 +1492,8 @@ draw_lavalite (ModeInfo *mi) gltrackball_rotate (bp->trackball); /* Apply mouse-based camera position */ + glRotatef (-90, 1, 0, 0); /* Right side up */ + /* Place the lights relative to the object, before the object has been rotated or wandered within the scene. */