From http://www.jwz.org/xscreensaver/xscreensaver-5.37.tar.gz
[xscreensaver] / hacks / glx / glforestfire.c
index 6b365ad17be14162935fe0dce5bce439782b1030..e81d51167f497be514660ceef31cf34bc24556f5 100644 (file)
@@ -621,13 +621,15 @@ static Bool inittree(ModeInfo * mi)
                return False;
     }
     /* initialise positions */
-    for(i=0;i<fs->num_trees;i++)
-       do {
-           fs->treepos[i].x =vrnd()*TREEOUTR*2.0-TREEOUTR;
-           fs->treepos[i].y =0.0;
-           fs->treepos[i].z =vrnd()*TREEOUTR*2.0-TREEOUTR;
-           dist=sqrt(fs->treepos[i].x *fs->treepos[i].x +fs->treepos[i].z *fs->treepos[i].z );
-        } while((dist<TREEINR) || (dist>TREEOUTR));
+    for(i=0;i<fs->num_trees;i++) {
+      do {
+        fs->treepos[i].x =vrnd()*TREEOUTR*2.0-TREEOUTR;
+        fs->treepos[i].y =0.0;
+        fs->treepos[i].z =vrnd()*TREEOUTR*2.0-TREEOUTR;
+        dist = sqrt(fs->treepos[i].x * fs->treepos[i].x +
+                    fs->treepos[i].z * fs->treepos[i].z);
+      } while((dist<TREEINR) || (dist>TREEOUTR));
+    }
        return True;
 }
 
@@ -853,23 +855,6 @@ static Bool Init(ModeInfo * mi)
                       fs->eject_r, fs->ridtri);
     }
 
-    glShadeModel(GL_FLAT);
-    glEnable(GL_DEPTH_TEST);
-
-    /* makes particles blend with background */
-    if (!MI_IS_WIREFRAME(mi)||(!fs->np))
-    {
-       glEnable(GL_BLEND);
-       glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-    }
-
-    /* fog stuff */
-    glEnable(GL_FOG);
-    glFogi(GL_FOG_MODE, GL_EXP);
-    glFogfv(GL_FOG_COLOR, fogcolor);
-    glFogf(GL_FOG_DENSITY, 0.03);
-    glHint(GL_FOG_HINT, GL_NICEST);
-
     /* initialise particles and trees */
     for (i = 0; i < fs->np; i++) {
        setnewpart(fs, &(fs->p[i]));
@@ -946,14 +931,7 @@ init_fire(ModeInfo * mi)
 {
     firestruct *fs;
 
-    /* allocate the main fire table if needed */
-    if (fire == NULL) {
-       if ((fire = (firestruct *) calloc(MI_NUM_SCREENS(mi),
-                                         sizeof(firestruct))) == NULL)
-           return;
-    }
-
-    /* initialise the per screen fire structure */
+    MI_INIT (mi, fire, 0);
     fs = &fire[MI_SCREEN(mi)];
     fs->np = MI_COUNT(mi);
     fs->fog = do_fog;
@@ -979,7 +957,7 @@ init_fire(ModeInfo * mi)
     else
        fs->num_trees = 0;
 
-    fs->trackball = gltrackball_init ();
+    fs->trackball = gltrackball_init (False);
 
     /* xlock GL stuff */
     if ((fs->glx_context = init_GL(mi)) != NULL) {
@@ -1017,7 +995,28 @@ ENTRYPOINT void draw_fire(ModeInfo * mi)
        return;
 
     glXMakeCurrent(display, window, *(fs->glx_context));
+
+    glShadeModel(GL_FLAT);
+    glEnable(GL_DEPTH_TEST);
+
+    /* makes particles blend with background */
+    if (!MI_IS_WIREFRAME(mi)||(!fs->np))
+    {
+       glEnable(GL_BLEND);
+       glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+    }
+
+    /* fog stuff */
+    glEnable(GL_FOG);
+    glFogi(GL_FOG_MODE, GL_EXP);
+    glFogfv(GL_FOG_COLOR, fogcolor);
+    glFogf(GL_FOG_DENSITY, 0.03);
+    glHint(GL_FOG_HINT, GL_NICEST);
+
+    glPushMatrix();
+    glRotatef(current_device_rotation(), 0, 0, 1);
     DrawFire(mi);
+    glPopMatrix();
 #ifndef STANDALONE
     Reshape(mi); /* xlock mode */
 #else
@@ -1060,43 +1059,10 @@ fire_handle_event (ModeInfo *mi, XEvent *event)
 {
   firestruct *fs = &fire[MI_SCREEN(mi)];
 
-  if (event->xany.type == ButtonPress &&
-      event->xbutton.button == Button1)
-    {
-      fs->button_down_p = True;
-      event->xbutton.x = MI_WIDTH(mi)  - event->xbutton.x; /* kludge! */
-      event->xbutton.y = MI_HEIGHT(mi) - event->xbutton.y;
-      gltrackball_start (fs->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)
-    {
-      fs->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 (fs->trackball, event->xbutton.button, 5,
-                              !!event->xbutton.state);
-      return True;
-    }
-  else if (event->xany.type == MotionNotify &&
-           fs->button_down_p)
-    {
-      event->xmotion.x = MI_WIDTH(mi)  - event->xmotion.x; /* kludge! */
-      event->xmotion.y = MI_HEIGHT(mi) - event->xmotion.y;
-      gltrackball_track (fs->trackball,
-                         event->xmotion.x, event->xmotion.y,
-                         MI_WIDTH (mi), MI_HEIGHT (mi));
-      return True;
-    }
+  if (gltrackball_event_handler (event, fs->trackball,
+                                 MI_WIDTH (mi), MI_HEIGHT (mi),
+                                 &fs->button_down_p))
+    return True;
 
   return False;
 }