Optional use of vertex arrays in the particle system.
[neverball] / share / geom.c
index b42b9a5..3e624ee 100644 (file)
@@ -1,4 +1,4 @@
-/*   
+/*
  * Copyright (C) 2003 Robert Kooima
  *
  * NEVERBALL is  free software; you can redistribute  it and/or modify
 #include "geom.h"
 #include "part.h"
 #include "vec3.h"
-#include "solid.h"
 #include "image.h"
 #include "config.h"
+#include "video.h"
 
-#define PI 3.1415926535897932
+#include "solid_draw.h"
 
 /*---------------------------------------------------------------------------*/
 
-static GLuint ball_list;
-static GLuint ball_text;
-
-void ball_init(int b)
-{
-    char name[MAXSTR];
-    int i, slices = b ? 32 : 16;
-    int j, stacks = b ? 16 :  8;
-
-    config_get_s(CONFIG_BALL, name, MAXSTR);
-
-    ball_text = make_image_from_file(NULL, NULL, NULL, NULL, name);
+static struct s_full beam;
+static struct s_full jump;
+static struct s_full goal;
+static struct s_full flag;
+static struct s_full mark;
+static struct s_full vect;
+static struct s_full back;
 
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+static int back_state = 0;
 
-    ball_list = glGenLists(1);
-    
-    glNewList(ball_list, GL_COMPILE);
-    {
-        for (i = 0; i < stacks; i++)
-        {
-            float k0 = (float)  i      / stacks;
-            float k1 = (float) (i + 1) / stacks;
-
-            float s0 = fsinf(V_PI * (k0 - 0.5));
-            float c0 = fcosf(V_PI * (k0 - 0.5));
-            float s1 = fsinf(V_PI * (k1 - 0.5));
-            float c1 = fcosf(V_PI * (k1 - 0.5));
-
-            glBegin(GL_QUAD_STRIP);
-            {
-                for (j = 0; j <= slices; j++)
-                {
-                    float k = (float) j / slices;
-                    float s = fsinf(V_PI * k * 2.0);
-                    float c = fcosf(V_PI * k * 2.0);
-
-                    glTexCoord2f(k, k0);
-                    glNormal3f(s * c0, c * c0, s0);
-                    glVertex3f(s * c0, c * c0, s0);
-
-                    glTexCoord2f(k, k1);
-                    glNormal3f(s * c1, c * c1, s1);
-                    glVertex3f(s * c1, c * c1, s1);
-                }
-            }
-            glEnd();
-        }
-    }
-    glEndList();
-}
+/*---------------------------------------------------------------------------*/
 
-void ball_free(void)
+void geom_init(void)
 {
-    if (glIsList(ball_list))
-        glDeleteLists(ball_list, 1);
-
-    if (glIsTexture(ball_text))
-        glDeleteTextures(1, &ball_text);
-
-    ball_list = 0;
-    ball_text = 0;
+    sol_load_full(&beam, "geom/beam/beam.sol", 0);
+    sol_load_full(&jump, "geom/jump/jump.sol", 0);
+    sol_load_full(&goal, "geom/goal/goal.sol", 0);
+    sol_load_full(&flag, "geom/flag/flag.sol", 0);
+    sol_load_full(&mark, "geom/mark/mark.sol", 0);
+    sol_load_full(&vect, "geom/vect/vect.sol", 0);
 }
 
-void ball_draw(void)
+void geom_free(void)
 {
-    glPushAttrib(GL_POLYGON_BIT |
-                 GL_LIGHTING_BIT |
-                 GL_DEPTH_BUFFER_BIT);
-    {
-        static const float  s[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
-        static const float  e[4] = { 0.2f, 0.2f, 0.2f, 1.0f };
-        static const float  h[1] = { 64.0f };
-
-        glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR,  s);
-        glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION,  e);
-        glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, h);
-
-        glEnable(GL_COLOR_MATERIAL);
-
-        glBindTexture(GL_TEXTURE_2D, ball_text);
-
-        /* Render the ball back to front in case it is translucent. */
-
-        glDepthMask(GL_FALSE);
-
-        glCullFace(GL_FRONT);
-        glCallList(ball_list);
-        glCullFace(GL_BACK);
-        glCallList(ball_list);
-
-        /* Render the ball into the depth buffer. */
-
-        glDepthMask(GL_TRUE);
-        glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
-        {
-            glCallList(ball_list);
-        }
-        glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
-
-        /* Ensure the ball is visible even when obscured by geometry. */
-
-        glDisable(GL_DEPTH_TEST);
-
-        glColor4f(1.0f, 1.0f, 1.0f, 0.1f);
-        glCallList(ball_list);
-    }
-    glPopAttrib();
+    sol_free_full(&vect);
+    sol_free_full(&mark);
+    sol_free_full(&flag);
+    sol_free_full(&goal);
+    sol_free_full(&jump);
+    sol_free_full(&beam);
 }
 
 /*---------------------------------------------------------------------------*/
 
-static GLuint mark_list;
-
-void mark_init(int b)
+void back_init(const char *name)
 {
-    int i, slices = b ? 32 : 16;
-
-    mark_list = glGenLists(1);
-    
-    glNewList(mark_list, GL_COMPILE);
-    {
-        glBegin(GL_TRIANGLE_FAN);
-        {
-            glNormal3f(0.f, 1.f, 0.f);
+    if (back_state)
+        back_free();
 
-            for (i = 0; i < slices; i++)
-            {
-                float x = fcosf(-2.f * PI * i / slices);
-                float y = fsinf(-2.f * PI * i / slices);
+    /* Load the background SOL and modify its material in-place to use the   */
+    /* named gradient texture.                                               */
 
-                glVertex3f(x, 0, y);
-            }
-        }
-        glEnd();
-    }
-    glEndList();
-}
+    sol_load_full(&back, "geom/back/back.sol", 0);
+    back.draw.mv[0].o = make_image_from_file(name);
 
-void mark_draw(void)
-{
-    glPushAttrib(GL_TEXTURE_BIT);
-    glPushAttrib(GL_LIGHTING_BIT);
-    glPushAttrib(GL_DEPTH_BUFFER_BIT);
-    {
-        glEnable(GL_COLOR_MATERIAL);
-        glDisable(GL_TEXTURE_2D);
-        glDepthMask(GL_FALSE);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
 
-        glCallList(mark_list);
-    }
-    glPopAttrib();
-    glPopAttrib();
-    glPopAttrib();
+    back_state = 1;
 }
 
-void mark_free(void)
+void back_free(void)
 {
-    if (glIsList(mark_list))
-        glDeleteLists(mark_list, 1);
-
-    mark_list = 0;
+    if (back_state)
+        sol_free_full(&back);
+    
+    back_state = 0;
 }
 
 /*---------------------------------------------------------------------------*/
 
-static GLuint coin_text;
-static GLuint coin_list;
-
-static void coin_head(int n, float radius, float thick)
+static const struct d_mtrl *jump_part_draw(const struct d_mtrl *mq,
+                                           GLfloat s, GLfloat a)
 {
-    int i;
-
-    glBegin(GL_TRIANGLE_FAN);
-    {
-        glNormal3f(0.f, 0.f, +1.f);
+    glMatrixMode(GL_TEXTURE);
+    glTranslatef(s, 0.0f, 0.0f);
+    glMatrixMode(GL_MODELVIEW);
 
-        for (i = 0; i < n; i++)
-        {
-            float x = fcosf(+2.f * PI * i / n);
-            float y = fsinf(+2.f * PI * i / n);
+    glRotatef(a, 0.0f, 1.0f, 0.0f);
+    mq = sol_draw(&jump.draw, mq, 1, 1);
+    glScalef(0.9f, 0.9f, 0.9f);
 
-            glTexCoord2f(-x * 0.5f + 0.5f, +y * 0.5f + 0.5f);
-            glVertex3f(radius * x, radius * y, +thick);
-        }
-    }
-    glEnd();
+    return mq;
 }
 
-static void coin_tail(int n, float radius, float thick)
+static const struct d_mtrl *goal_part_draw(const struct d_mtrl *mq, GLfloat s)
 {
-    int i;
-
-    glBegin(GL_TRIANGLE_FAN);
-    {
-        glNormal3f(0.f, 0.f, -1.f);
+    glMatrixMode(GL_TEXTURE);
+    glTranslatef(0.0f, -s, 0.0f);
+    glMatrixMode(GL_MODELVIEW);
 
-        for (i = 0; i < n; i++)
-        {
-            float x = fcosf(-2.f * PI * i / n);
-            float y = fsinf(-2.f * PI * i / n);
+    mq = sol_draw(&goal.draw, mq, 1, 1);
+    glScalef(0.8f, 1.1f, 0.8f);
 
-            glTexCoord2f(+x * 0.5f + 0.5f, +y * 0.5f + 0.5f);
-            glVertex3f(radius * x, radius * y, -thick);
-        }
-    }
-    glEnd();
+    return mq;
 }
 
-static void coin_edge(int n, float radius, float thick)
-{
-    int i;
-
-    glBegin(GL_QUAD_STRIP);
-    {
-        for (i = 0; i <= n; i++)
-        {
-            float x = fcosf(2.f * PI * i / n);
-            float y = fsinf(2.f * PI * i / n);
-
-            glNormal3f(x, y, 0.f);
-            glVertex3f(radius * x, radius * y, +thick);
-            glVertex3f(radius * x, radius * y, -thick);
-        }
-    }
-    glEnd();
-}
+/*---------------------------------------------------------------------------*/
 
-void coin_color(float *c, int n)
+const struct d_mtrl *goal_draw(const struct d_mtrl *mq, float t)
 {
-    if (n >= 1)
-    {
-        c[0] = 1.0f;
-        c[1] = 1.0f;
-        c[2] = 0.2f;
-    }
-    if (n >= 5)
-    {
-        c[0] = 1.0f;
-        c[1] = 0.2f;
-        c[2] = 0.2f;
-    }
-    if (n >= 10)
+    glPushMatrix();
     {
-        c[0] = 0.2f;
-        c[1] = 0.2f;
-        c[2] = 1.0f;
-    }
-}
+        glScalef(1.0f, 3.0f, 1.0f);
+        glColor4f(1.0f, 1.0f, 0.0f, 0.5f);
 
-void coin_init(int b)
-{
-    char name[MAXSTR];
-    int n = b ? 32 : 8;
+        mq = sol_draw(&beam.draw, mq, 1, 1);
 
-    config_get_s(CONFIG_COIN, name, MAXSTR);
+        mq = goal_part_draw(mq, t * 0.10f);
+        mq = goal_part_draw(mq, t * 0.10f);
+        mq = goal_part_draw(mq, t * 0.10f);
+        mq = goal_part_draw(mq, t * 0.10f);
 
-    coin_text = make_image_from_file(NULL, NULL, NULL, NULL, name);
-    coin_list = glGenLists(1);
+        glMatrixMode(GL_TEXTURE);
+        glLoadIdentity();
+        glMatrixMode(GL_MODELVIEW);
 
-    glNewList(coin_list, GL_COMPILE);
-    {
-        coin_edge(n, COIN_RADIUS, COIN_THICK);
-        coin_head(n, COIN_RADIUS, COIN_THICK);
-        coin_tail(n, COIN_RADIUS, COIN_THICK);
+        glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
     }
-    glEndList();
-}
-
-void coin_free(void)
-{
-    if (glIsList(coin_list))
-        glDeleteLists(coin_list, 1);
-
-    if (glIsTexture(coin_text))
-        glDeleteTextures(1, &coin_text);
+    glPopMatrix();
 
-    coin_list = 0;
-    coin_text = 0;
+    return mq;
 }
 
-void coin_push(void)
+const struct d_mtrl *jump_draw(const struct d_mtrl *mq, float t, int h)
 {
-    static const float  a[4] = { 0.2f, 0.2f, 0.2f, 1.0f };
-    static const float  s[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
-    static const float  e[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
-    static const float  h[1] = { 32.0f };
+    static GLfloat jump_colors[4][4] = {
+        { 0.75f, 0.5f, 1.0f, 0.5f },
+        { 0.75f, 0.5f, 1.0f, 0.8f },
+    };
 
-    glPushAttrib(GL_LIGHTING_BIT);
+    glPushMatrix();
+    {
+        glColor4fv(jump_colors[h]);
 
-    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT,   a);
-    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR,  s);
-    glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION,  e);
-    glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, h);
+        glScalef(1.0f, 2.0f, 1.0f);
 
-    glEnable(GL_COLOR_MATERIAL);
-    glBindTexture(GL_TEXTURE_2D, coin_text);
-}
+        mq = sol_draw(&beam.draw, mq, 1, 1);
 
-void coin_draw(int n, float r)
-{
-    float c[3];
+        mq = jump_part_draw(mq, t * 0.15f, t * 360.0f);
+        mq = jump_part_draw(mq, t * 0.20f, t * 360.0f);
+        mq = jump_part_draw(mq, t * 0.25f, t * 360.0f);
 
-    coin_color(c, n);
+        glMatrixMode(GL_TEXTURE);
+        glLoadIdentity();
+        glMatrixMode(GL_MODELVIEW);
 
-    glColor3fv(c);
-    glCallList(coin_list);
-}
+        glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+    }
+    glPopMatrix();
 
-void coin_pull(void)
-{
-    glPopAttrib();
+    return mq;
 }
 
-/*---------------------------------------------------------------------------*/
-
-static GLuint goal_list;
-
-void goal_init(int b)
+const struct d_mtrl *swch_draw(const struct d_mtrl *mq, int b, int e)
 {
-    int i, n = b ? 32 : 8;
+    static GLfloat swch_colors[4][4] = {
+        { 1.0f, 0.0f, 0.0f, 0.5f }, /* red out */
+        { 1.0f, 0.0f, 0.0f, 0.8f }, /* red in */
+        { 0.0f, 1.0f, 0.0f, 0.5f }, /* green out */
+        { 0.0f, 1.0f, 0.0f, 0.8f }, /* green in */
+    };
 
-    goal_list = glGenLists(1);
-
-    glNewList(goal_list, GL_COMPILE);
+    glPushMatrix();
     {
-        glPushAttrib(GL_TEXTURE_BIT  |
-                     GL_LIGHTING_BIT |
-                     GL_DEPTH_BUFFER_BIT);
-        {
-            glEnable(GL_COLOR_MATERIAL);
-            glDisable(GL_LIGHTING);
-            glDisable(GL_TEXTURE_2D);
-            glDepthMask(GL_FALSE);
-
-            glBegin(GL_QUAD_STRIP);
-            {
-                for (i = 0; i <= n; i++)
-                {
-                    float x = fcosf(2.f * PI * i / n);
-                    float y = fsinf(2.f * PI * i / n);
-            
-                    glColor4f(1.0f, 1.0f, 0.0f, 0.5f);
-                    glVertex3f(x, 0.0f, y);
-
-                    glColor4f(1.0f, 1.0f, 0.0f, 0.0f);
-                    glVertex3f(x, GOAL_HEIGHT, y);
-                }
-            }
-            glEnd();
-        }
-        glPopAttrib();
+        glScalef(1.0f, 2.0f, 1.0f);
+
+        glColor4fv(swch_colors[b * 2 + e]);
+        mq = sol_draw(&beam.draw, mq, 1, 1);
+        glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
     }
-    glEndList();
+    glPopMatrix();
+
+    return mq;
 }
 
-void goal_free(void)
+const struct d_mtrl *flag_draw(const struct d_mtrl *mq)
 {
-    if (glIsList(goal_list))
-        glDeleteLists(goal_list, 1);
-
-    goal_list = 0;
+    glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+    return sol_draw(&flag.draw, mq, 1, 1);
 }
 
-void goal_draw(void)
+const struct d_mtrl *mark_draw(const struct d_mtrl *mq)
 {
-    glCallList(goal_list);
+    return sol_draw(&mark.draw, mq, 1, 1);
 }
 
-/*---------------------------------------------------------------------------*/
-
-static GLuint jump_list;
-
-void jump_init(int b)
+const struct d_mtrl *vect_draw(const struct d_mtrl *mq)
 {
-    int i, n = b ? 32 : 8;
-
-    jump_list = glGenLists(1);
+    mq = sol_draw(&vect.draw, mq, 0, 1);
+    mq = sol_draw(&vect.draw, mq, 0, 0);
+    return mq;
+}
 
-    glNewList(jump_list, GL_COMPILE);
+const struct d_mtrl *back_draw(const struct d_mtrl *mq, float t)
+{
+    glPushMatrix();
     {
-        glPushAttrib(GL_TEXTURE_BIT  |
-                     GL_LIGHTING_BIT |
-                     GL_DEPTH_BUFFER_BIT);
+        GLfloat dx =  60.0f * fsinf(t / 10.0f);
+        GLfloat dz = 180.0f * fsinf(t / 12.0f);
+
+        glDisable(GL_LIGHTING);
+        glDepthMask(GL_FALSE);
         {
-            glEnable(GL_COLOR_MATERIAL);
-            glDisable(GL_LIGHTING);
-            glDisable(GL_TEXTURE_2D);
-            glDepthMask(GL_FALSE);
-
-            glBegin(GL_QUAD_STRIP);
-            {
-                for (i = 0; i <= n; i++)
-                {
-                    float x = fcosf(2.f * PI * i / n);
-                    float y = fsinf(2.f * PI * i / n);
-            
-                    glColor4f(1.0f, 1.0f, 1.0f, 0.5f);
-                    glVertex3f(x, 0.0f, y);
-
-                    glColor4f(1.0f, 1.0f, 1.0f, 0.0f);
-                    glVertex3f(x, JUMP_HEIGHT, y);
-                }
-            }
-            glEnd();
+            glScalef(-BACK_DIST, BACK_DIST, -BACK_DIST);
+            glRotatef(dz, 0.0f, 0.0f, 1.0f);
+            glRotatef(dx, 1.0f, 0.0f, 0.0f);
+
+            mq = sol_draw(&back.draw, mq, 1, 1);
         }
-        glPopAttrib();
+        glDepthMask(GL_TRUE);
+        glEnable(GL_LIGHTING);
     }
-    glEndList();
-}
+    glPopMatrix();
 
-void jump_free(void)
-{
-    if (glIsList(jump_list))
-        glDeleteLists(jump_list, 1);
-
-    jump_list = 0;
+    return mq;
 }
 
-void jump_draw(void)
+void back_draw_easy(void)
 {
-    glCallList(jump_list);
+    sol_draw_disable(back_draw(sol_draw_enable(), 0.0f));
 }
 
 /*---------------------------------------------------------------------------*/
+/*
+static GLuint clip_text;
 
-static GLuint swch_list;
+static GLubyte clip_data[] = { 0xff, 0xff, 0x0, 0x0 };
 
-void swch_init(int b)
+void clip_init(void)
 {
-    int i, n = b ? 32 : 8;
+    if (!glActiveTexture_)
+        return;
 
-    swch_list = glGenLists(2);
-
-    /* Create the ON display list. */
-
-    glNewList(swch_list, GL_COMPILE);
+    glActiveTexture_(GL_TEXTURE1);
     {
-        glPushAttrib(GL_TEXTURE_BIT  |
-                     GL_LIGHTING_BIT |
-                     GL_DEPTH_BUFFER_BIT);
-        {
-            glEnable(GL_COLOR_MATERIAL);
-            glDisable(GL_LIGHTING);
-            glDisable(GL_TEXTURE_2D);
-            glDepthMask(GL_FALSE);
-
-            glBegin(GL_QUAD_STRIP);
-            {
-                for (i = 0; i <= n; i++)
-                {
-                    float x = fcosf(2.f * PI * i / n);
-                    float y = fsinf(2.f * PI * i / n);
-            
-                    glColor4f(1.0f, 0.0f, 0.0f, 0.5f);
-                    glVertex3f(x, 0.0f, y);
-
-                    glColor4f(1.0f, 0.0f, 0.0f, 0.0f);
-                    glVertex3f(x, SWCH_HEIGHT, y);
-                }
-            }
-            glEnd();
-        }
-        glPopAttrib();
-    }
-    glEndList();
+        glGenTextures(1, &clip_text);
+        glBindTexture(GL_TEXTURE_1D, clip_text);
 
-    /* Create the OFF display list. */
+        glTexImage1D(GL_TEXTURE_1D, 0,
+                     GL_LUMINANCE_ALPHA, 2, 0,
+                     GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, clip_data);
 
-    glNewList(swch_list + 1, GL_COMPILE);
-    {
-        glPushAttrib(GL_TEXTURE_BIT  |
-                     GL_LIGHTING_BIT |
-                     GL_DEPTH_BUFFER_BIT);
-        {
-            glEnable(GL_COLOR_MATERIAL);
-            glDisable(GL_LIGHTING);
-            glDisable(GL_TEXTURE_2D);
-            glDepthMask(GL_FALSE);
-
-            glBegin(GL_QUAD_STRIP);
-            {
-                for (i = 0; i <= n; i++)
-                {
-                    float x = fcosf(2.f * PI * i / n);
-                    float y = fsinf(2.f * PI * i / n);
-            
-                    glColor4f(0.0f, 1.0f, 0.0f, 0.5f);
-                    glVertex3f(x, 0.0f, y);
-
-                    glColor4f(0.0f, 1.0f, 0.0f, 0.0f);
-                    glVertex3f(x, SWCH_HEIGHT, y);
-                }
-            }
-            glEnd();
-        }
-        glPopAttrib();
+        glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+        glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+        glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
     }
-    glEndList();
+    glActiveTexture_(GL_TEXTURE0);
 }
 
-void swch_free(void)
+void clip_free(void)
 {
-    if (glIsList(swch_list))
-        glDeleteLists(swch_list, 2);
-
-    swch_list = 0;
+    if (glIsTexture(clip_text))
+        glDeleteTextures(1, &clip_text);
 }
 
-void swch_draw(int b)
+void clip_draw_set(void)
 {
-    if (b)
-        glCallList(swch_list + 1);
-    else
-        glCallList(swch_list);
-}
-
-/*---------------------------------------------------------------------------*/
+    if (!glActiveTexture_)
+        return;
 
-static GLuint flag_list;
-
-void flag_init(int b)
-{
-    int i, n = b ? 8 : 4;
+    glActiveTexture_(GL_TEXTURE1);
+    {
+        glBindTexture(GL_TEXTURE_1D, clip_text);
 
-    flag_list = glGenLists(1);
+        glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
 
-    glNewList(flag_list, GL_COMPILE);
-    {
-        glPushAttrib(GL_TEXTURE_BIT | GL_LIGHTING_BIT);
-        {
-            glEnable(GL_COLOR_MATERIAL);
-            glDisable(GL_LIGHTING);
-            glDisable(GL_TEXTURE_2D);
-
-            glBegin(GL_QUAD_STRIP);
-            {
-                for (i = 0; i <= n; i++)
-                {
-                    float x = fcosf(2.f * PI * i / n) * 0.01f;
-                    float y = fsinf(2.f * PI * i / n) * 0.01f;
-            
-                    glColor3f(1.0f, 1.0f, 1.0f);
-                    glVertex3f(x, 0.0f,        y);
-                    glVertex3f(x, GOAL_HEIGHT, y);
-                }
-            }
-            glEnd();
-
-            glBegin(GL_TRIANGLES);
-            {
-                glColor3f(1.0f, 0.0f, 0.0f);
-
-                glVertex3f(              0.0f, GOAL_HEIGHT,        0.0f);
-                glVertex3f(GOAL_HEIGHT * 0.2f, GOAL_HEIGHT * 0.9f, 0.0f);
-                glVertex3f(              0.0f, GOAL_HEIGHT * 0.8f, 0.0f);
-
-                glVertex3f(              0.0f, GOAL_HEIGHT,        0.0f);
-                glVertex3f(              0.0f, GOAL_HEIGHT * 0.8f, 0.0f);
-                glVertex3f(GOAL_HEIGHT * 0.2f, GOAL_HEIGHT * 0.9f, 0.0f);
-            }
-            glEnd();
-        }
-        glPopAttrib();
+        glEnable(GL_TEXTURE_GEN_S);
+        glEnable(GL_TEXTURE_1D);
     }
-    glEndList();
+    glActiveTexture_(GL_TEXTURE0);
 }
 
-void flag_free(void)
+void clip_draw_clr(void)
 {
-    if (glIsList(flag_list))
-        glDeleteLists(flag_list, 1);
-
-    flag_list = 0;
-}
+    if (!glActiveTexture_)
+        return;
 
-void flag_draw(void)
-{
-    glCallList(flag_list);
+    glActiveTexture_(GL_TEXTURE1);
+    {
+        glDisable(GL_TEXTURE_GEN_S);
+        glDisable(GL_TEXTURE_1D);
+    }
+    glActiveTexture_(GL_TEXTURE0);
 }
-
+*/
 /*---------------------------------------------------------------------------*/
+
 /*
  * A note about lighting and shadow: technically speaking, it's wrong.
  * The  light  position  and   shadow  projection  behave  as  if  the
@@ -629,12 +324,12 @@ static GLuint shad_text;
 
 void shad_init(void)
 {
-    shad_text = make_image_from_file(NULL, NULL, NULL, NULL, IMG_SHAD);
+    shad_text = make_image_from_file(IMG_SHAD);
 
     if (config_get_d(CONFIG_SHADOW) == 2)
     {
-        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
-        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
     }
 }
 
@@ -644,65 +339,25 @@ void shad_free(void)
         glDeleteTextures(1, &shad_text);
 }
 
-void shad_draw_set(const float *p, float r)
+void shad_draw_set(void)
 {
-    glMatrixMode(GL_TEXTURE);
+    glActiveTexture_(GL_TEXTURE1);
     {
-        float k = 0.25f / r;
-
+        glEnable(GL_TEXTURE_2D);
         glBindTexture(GL_TEXTURE_2D, shad_text);
-
-        glLoadIdentity();
-        glTranslatef(0.5f - k * p[0],
-                     0.5f - k * p[2], 0.f);
-        glScalef(k, k, 1.0f);
+        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
     }
-    glMatrixMode(GL_MODELVIEW);
+    glActiveTexture_(GL_TEXTURE0);
 }
 
 void shad_draw_clr(void)
 {
-    glMatrixMode(GL_TEXTURE);
-    {
-        glLoadIdentity();
-    }
-    glMatrixMode(GL_MODELVIEW);
-}
-
-/*---------------------------------------------------------------------------*/
-
-void fade_draw(float k)
-{
-    int w = config_get_d(CONFIG_WIDTH);
-    int h = config_get_d(CONFIG_HEIGHT);
-
-    if (k > 0.0f)
+    glActiveTexture_(GL_TEXTURE1);
     {
-        config_push_ortho();
-        glPushAttrib(GL_TEXTURE_BIT  |
-                     GL_LIGHTING_BIT |
-                     GL_COLOR_BUFFER_BIT |
-                     GL_DEPTH_BUFFER_BIT);
-        {
-            glEnable(GL_COLOR_MATERIAL);
-            glDisable(GL_LIGHTING);
-            glDisable(GL_DEPTH_TEST);
-            glDisable(GL_TEXTURE_2D);
-            
-            glColor4f(0.0f, 0.0f, 0.0f, k);
-
-            glBegin(GL_QUADS);
-            {
-                glVertex2i(0, 0);
-                glVertex2i(w, 0);
-                glVertex2i(w, h);
-                glVertex2i(0, h);
-            }
-            glEnd();
-        }
-        glPopAttrib();
-        config_pop_matrix();
+        glBindTexture(GL_TEXTURE_2D, 0);
+        glDisable(GL_TEXTURE_2D);
     }
+    glActiveTexture_(GL_TEXTURE0);
 }
 
 /*---------------------------------------------------------------------------*/