http://www.jwz.org/xscreensaver/xscreensaver-5.13.tar.gz
[xscreensaver] / hacks / glx / atunnel.c
index 6d3b8b621f9073b23c1c422687986be9865acfc8..ee244ea5c137b38fe7bdd95d488ef9258c2cb090 100644 (file)
@@ -1,11 +1,11 @@
 /* -*- Mode: C; tab-width: 4 -*- */
-/* atunnels --- OpenGL Advanced Tunnel Screensaver */
+/* atunnel --- OpenGL Advanced Tunnel Screensaver */
 
 #if 0
-static const char sccsid[] = "@(#)atunnels.c   5.07 2003/02/12 xlockmore";
+static const char sccsid[] = "@(#)atunnel.c    5.13 2004/05/25 xlockmore";
 #endif
 
-/* Copyright (c) E. Lassauge, 2003. */
+/* Copyright (c) E. Lassauge, 2003-2004. */
 
 /*
  * Permission to use, copy, modify, and distribute this software and its
@@ -24,11 +24,13 @@ static const char sccsid[] = "@(#)atunnels.c        5.07 2003/02/12 xlockmore";
  * Email: romka@ut.ee
  * WEB: http://romka.demonews.com
  *
- * Eric Lassauge  (March-16-2002) <lassauge@mail.dotcom.fr>
+ * Eric Lassauge  (May-25-2004) <lassauge@users.sourceforge.net>
  *                                 http://lassauge.free.fr/linux.html
  *
  * REVISION HISTORY:
  *
+ * E.Lassauge - 25-May-2004:
+ *     - added more texture !
  * E.Lassauge - 16-Mar-2002:
  *     - created based on the Roman demo.
  *     - deleted all external file stuff to use xpm textures and
@@ -37,24 +39,18 @@ static const char sccsid[] = "@(#)atunnels.c        5.07 2003/02/12 xlockmore";
  */
 
 #ifdef STANDALONE              /* xscreensaver mode */
-# define PROGCLASS             "Atunnels"
-# define HACK_INIT             init_atunnels
-# define HACK_DRAW             draw_atunnels
-# define HACK_RESHAPE          reshape_atunnels
-# define atunnels_opts         xlockmore_opts
 #define        DEFAULTS                "*delay:        10000   \n" \
-                               "*showFPS:      False   \n" \
-                                "*light:       True    \n" \
-                                "*wire:                False   \n" \
-                                "*texture:     True    \n"
+                                "*showFPS:  False   \n" \
 
-#define MODE_atunnels
+# define refresh_atunnel 0
+# define atunnel_handle_event 0
+#define MODE_atunnel
 # include "xlockmore.h"                /* from the xscreensaver distribution */
 #else                          /* !STANDALONE */
 # include "xlock.h"            /* from the xlockmore distribution */
 #endif                                 /* !STANDALONE */
 
-#ifdef MODE_atunnels /* whole file */
+#ifdef MODE_atunnel /* whole file */
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -70,18 +66,25 @@ static const char sccsid[] = "@(#)atunnels.c        5.07 2003/02/12 xlockmore";
 #include "../images/tunnel0.xpm"
 #include "../images/tunnel1.xpm"
 #include "../images/tunnel2.xpm"
+#include "../images/tunnel3.xpm"
+#include "../images/tunnel4.xpm"
+#include "../images/tunnel5.xpm"
 #else /* !STANDALONE */
 #include "pixmaps/tunnel0.xpm"
 #include "pixmaps/tunnel1.xpm"
 #include "pixmaps/tunnel2.xpm"
+#include "pixmaps/tunnel3.xpm"
+#include "pixmaps/tunnel4.xpm"
+#include "pixmaps/tunnel5.xpm"
 #endif /* !STANDALONE */
 #endif /* HAVE_XPM */
 
+
 #undef countof
 #define countof(x) (sizeof((x))/sizeof((*x)))
 
 #define DEF_LIGHT      "True"
-#define DEF_WIRE       "False"
+#define DEF_WIRE    "False"
 #define DEF_TEXTURE    "True"
 
 static Bool do_light;
@@ -89,33 +92,33 @@ static Bool do_wire;
 static Bool do_texture;
 
 static XrmOptionDescRec opts[] = {
-  {(char *)"-light",   (char *)".atunnels.light",      XrmoptionNoArg, (caddr_t) "true" },
-  {(char *)"+light",   (char *)".atunnels.light",      XrmoptionNoArg, (caddr_t) "false" },
-  {(char *)"-wire",    (char *)".atunnels.wire",       XrmoptionNoArg, (caddr_t) "true" },
-  {(char *)"+wire",    (char *)".atunnels.wire",       XrmoptionNoArg, (caddr_t) "false" },
-  {(char *)"-texture", (char *)".atunnels.texture",    XrmoptionNoArg, (caddr_t) "true" },
-  {(char *)"+texture", (char *)".atunnels.texture",    XrmoptionNoArg, (caddr_t) "false" },
+  {"-light",   ".atunnel.light",      XrmoptionNoArg, "true" },
+  {"+light",   ".atunnel.light",      XrmoptionNoArg, "false" },
+  {"-wireframe",".atunnel.wire",       XrmoptionNoArg, "true" },
+  {"+wireframe",".atunnel.wire",       XrmoptionNoArg, "false" },
+  {"-texture", ".atunnel.texture",    XrmoptionNoArg, "true" },
+  {"+texture", ".atunnel.texture",    XrmoptionNoArg, "false" },
 };
 
 static argtype vars[] = {
-  {(caddr_t *) &do_light,   (char *)"light",  (char *)"Light",   DEF_LIGHT,   t_Bool},
-  {(caddr_t *) &do_wire,    (char *)"wire",   (char *)"Wire",    DEF_WIRE,    t_Bool},
-  {(caddr_t *) &do_texture, (char *)"texture",(char *)"Texture", DEF_TEXTURE, t_Bool},
+  {&do_light,   "light",   "Light",   DEF_LIGHT,   t_Bool},
+  {&do_wire,    "wire",    "Wire",    DEF_WIRE,    t_Bool},
+  {&do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
 };
 
 static OptionStruct desc[] =
 {
-  {(char *)"-/+ light",   (char *)"whether to do enable lighting (slower)"},
-  {(char *)"-/+ wire",    (char *)"whether to do use wireframe instead of filled (faster)"},
-  {(char *)"-/+ texture", (char *)"whether to apply a texture (slower)"},
+  {"-/+ light",   "whether to do enable lighting (slower)"},
+  {"-/+ wire",    "whether to do use wireframe instead of filled (faster)"},
+  {"-/+ texture", "whether to apply a texture (slower)"},
 };
 
-ModeSpecOpt atunnels_opts = {countof(opts), opts, countof(vars), vars, desc};
+ENTRYPOINT ModeSpecOpt atunnel_opts = {countof(opts), opts, countof(vars), vars, desc};
 
 #ifdef USE_MODULES
-ModStruct   atunnels_description =
-{"atunnels", "init_atunnels", "draw_atunnels", "release_atunnels",
- "draw_atunnels", "init_atunnels", NULL, &atunnels_opts,
+ModStruct   atunnel_description =
+{"atunnel", "init_atunnel", "draw_atunnel", "release_atunnel",
+ "draw_atunnel", "init_atunnel", NULL, &atunnel_opts,
  1000, 1, 2, 1, 4, 1.0, "",
  "OpenGL advanced tunnel screensaver", 0, NULL};
 #endif
@@ -125,21 +128,23 @@ typedef struct {
   int screen_width, screen_height;
   GLXContext *glx_context;
   Window window;
-} atunnelsstruct;
+  struct tunnel_state *ts;
+  GLuint texture[MAX_TEXTURE]; /* texture id: GL world */
+} atunnelstruct;
 
-static atunnelsstruct *Atunnels = NULL;
-static GLuint texture[3]; /* texture id: GL world */
+static atunnelstruct *Atunnel = NULL;
 
 /*=================== Load Texture =========================================*/
 static void LoadTexture(ModeInfo * mi, char **fn, int t_num)
 {
 #if defined( I_HAVE_XPM )
+       atunnelstruct *sa = &Atunnel[MI_SCREEN(mi)];
        XImage *teximage;    /* Texture data */
  
         if ((teximage = xpm_to_ximage(MI_DISPLAY(mi), MI_VISUAL(mi),
                         MI_COLORMAP(mi), fn)) == None) {
            (void) fprintf(stderr, "Error reading the texture.\n");
-           glDeleteTextures(1, &texture[t_num]);
+           glDeleteTextures(1, &sa->texture[t_num]);
             do_texture = False;
 #ifdef STANDALONE
            exit(0);
@@ -149,12 +154,15 @@ static void LoadTexture(ModeInfo * mi, char **fn, int t_num)
        }
 
 #ifdef HAVE_GLBINDTEXTURE
-       glBindTexture(GL_TEXTURE_2D, texture[t_num]);
+       glBindTexture(GL_TEXTURE_2D, sa->texture[t_num]);
 #endif /* HAVE_GLBINDTEXTURE */
        glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
        clear_gl_error();
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, teximage->width, teximage->height, 
-                       0, GL_RGBA, GL_UNSIGNED_BYTE, teximage->data);
+                       0, GL_RGBA,
+                 /* GL_UNSIGNED_BYTE, */
+                 GL_UNSIGNED_INT_8_8_8_8_REV,
+                 teximage->data);
        check_gl_error("texture");
 
        /* Texture parameters, LINEAR scaling for better texture quality */
@@ -170,22 +178,25 @@ static void LoadTexture(ModeInfo * mi, char **fn, int t_num)
 /*=================== Main Initialization ==================================*/
 static void Init(ModeInfo * mi)
 {
+       atunnelstruct *sa = &Atunnel[MI_SCREEN(mi)];
        GLfloat light_ambient[] = {1.0, 1.0, 1.0, 1.0};
        GLfloat light_diffuse[] = {1.0, 1.0, 1.0, 1.0};
        GLfloat light_specular[] = {1.0, 1.0, 1.0, 1.0};
        GLfloat light_position[] = {0.0, 0.0, 1.0, 0.0};
        GLfloat fogColor[4] = {0.8, 0.8, 0.8, 1.0};
 
-       glClearColor(0, 0, 0, 0);
        if (do_texture)
        {
-               glGenTextures(3, texture);
+               glGenTextures(MAX_TEXTURE, sa->texture);
                LoadTexture(mi, texture0,0);
                LoadTexture(mi, texture1,1);
                LoadTexture(mi, texture2,2);
+               LoadTexture(mi, texture3,3);
+               LoadTexture(mi, texture4,4);
+               LoadTexture(mi, texture5,5);
                glEnable(GL_TEXTURE_2D);
        }
-       InitTunnel();
+       sa->ts = InitTunnel();
        
        /* Set lighting parameters */
        if (do_light)
@@ -230,8 +241,8 @@ static void Init(ModeInfo * mi)
 
 
 /* Standard reshape function */
-void
-reshape_atunnels(ModeInfo *mi, int width, int height)
+ENTRYPOINT void
+reshape_atunnel(ModeInfo *mi, int width, int height)
 {
        float a;
 
@@ -244,9 +255,9 @@ reshape_atunnels(ModeInfo *mi, int width, int height)
 }
 
 /* draw the screensaver once */
-void draw_atunnels(ModeInfo * mi)
+ENTRYPOINT void draw_atunnel(ModeInfo * mi)
 {
-       atunnelsstruct *sa = &Atunnels[MI_SCREEN(mi)];
+       atunnelstruct *sa = &Atunnel[MI_SCREEN(mi)];
        Display    *display = MI_DISPLAY(mi);
        Window      window = MI_WINDOW(mi);
 
@@ -259,8 +270,8 @@ void draw_atunnels(ModeInfo * mi)
 
        glLoadIdentity();
 
-       DrawTunnel(do_texture, do_light, texture);
-       SplashScreen(do_wire, do_texture, do_light);
+       DrawTunnel(sa->ts, do_texture, do_light, sa->texture);
+       SplashScreen(sa->ts, do_wire, do_texture, do_light);
 
        glFlush();  
        /* manage framerate display */
@@ -271,20 +282,20 @@ void draw_atunnels(ModeInfo * mi)
 
 
 /* xscreensaver initialization routine */
-void init_atunnels(ModeInfo * mi)
+ENTRYPOINT void init_atunnel(ModeInfo * mi)
 {
   int screen = MI_SCREEN(mi);
-  atunnelsstruct *sa;
+  atunnelstruct *sa;
 
-  if (Atunnels == NULL) {
-       if ((Atunnels = (atunnelsstruct *) calloc(MI_NUM_SCREENS(mi), sizeof (atunnelsstruct))) == NULL)
+  if (Atunnel == NULL) {
+       if ((Atunnel = (atunnelstruct *) calloc(MI_NUM_SCREENS(mi), sizeof (atunnelstruct))) == NULL)
          return;
   }
-  sa = &Atunnels[screen];
+  sa = &Atunnel[screen];
 
   sa->window = MI_WINDOW(mi);
   if ((sa->glx_context = init_GL(mi)) != NULL) {
-       reshape_atunnels(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+       reshape_atunnel(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
        Init(mi);
   } else {
        MI_CLEARWINDOW(mi);
@@ -293,16 +304,22 @@ void init_atunnels(ModeInfo * mi)
 }
 
 /* all sorts of nice cleanup code should go here! */
-void release_atunnels(ModeInfo * mi)
+ENTRYPOINT void release_atunnel(ModeInfo * mi)
 {
+#if 0
   int screen;
-  if (Atunnels != NULL) {
+  if (Atunnel != NULL) {
        for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
-         /*      atunnelsstruct *sa = &Atunnels[screen];*/
+      atunnelstruct *sa = &Atunnel[screen];
+      FreeTunnel(sa->ts);
        }
-       (void) free((void *) Atunnels);
-       Atunnels = NULL;
+       (void) free((void *) Atunnel);
+       Atunnel = NULL;
   }
   FreeAllGL(mi);
+#endif
 }
+
+XSCREENSAVER_MODULE ("Atunnel", atunnel)
+
 #endif