X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fglx%2Flavalite.c;h=b1604a2212829b623850e7be27dde2a78cc2f831;hb=4361b69d3178d7fc98d0388f9a223af6c2651aba;hp=c31df5a43d9a2621568c2370451df9aca0b25571;hpb=50be9bb40dc60130c99ffa568e6677779904ff70;p=xscreensaver diff --git a/hacks/glx/lavalite.c b/hacks/glx/lavalite.c index c31df5a4..b1604a22 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 @@ -339,6 +339,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, @@ -1241,39 +1242,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; } @@ -1302,14 +1274,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); - } - } + MI_INIT (mi, bps, NULL); bp = &bps[MI_SCREEN(mi)]; @@ -1401,19 +1366,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 down 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) @@ -1514,6 +1475,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, @@ -1523,6 +1485,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. */