Add a "coin" item type. In effect this makes coin-specific functions
[neverball] / share / geom.c
index def33a0..77ddcee 100644 (file)
@@ -1,4 +1,4 @@
-/*   
+/*
  * Copyright (C) 2003 Robert Kooima
  *
  * NEVERBALL is  free software; you can redistribute  it and/or modify
@@ -30,7 +30,7 @@
 /*---------------------------------------------------------------------------*/
 
 static GLuint ball_list;
-static GLuint ball_text;
+static GLuint ball_text[2];
 
 void ball_init(int b)
 {
@@ -39,14 +39,16 @@ void ball_init(int b)
     int j, stacks = b ? 16 :  8;
 
     config_get_s(CONFIG_BALL, name, MAXSTR);
+    ball_text[0] = make_image_from_file(NULL, NULL, NULL, NULL, name);
 
-    ball_text = make_image_from_file(NULL, NULL, NULL, NULL, name);
+    config_get_s(CONFIG_BALL_BONUS, name, MAXSTR);
+    ball_text[1] = make_image_from_file(NULL, NULL, NULL, NULL, name);
 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
 
     ball_list = glGenLists(1);
-    
+
     glNewList(ball_list, GL_COMPILE);
     {
         for (i = 0; i < stacks; i++)
@@ -87,14 +89,18 @@ void ball_free(void)
     if (glIsList(ball_list))
         glDeleteLists(ball_list, 1);
 
-    if (glIsTexture(ball_text))
-        glDeleteTextures(1, &ball_text);
+    if (glIsTexture(ball_text[0]))
+        glDeleteTextures(1, &ball_text[0]);
 
-    ball_list = 0;
-    ball_text = 0;
+    if (glIsTexture(ball_text[1]))
+        glDeleteTextures(1, &ball_text[1]);
+
+    ball_list    = 0;
+    ball_text[0] = 0;
+    ball_text[1] = 0;
 }
 
-void ball_draw(void)
+void ball_draw(int i)
 {
     glPushAttrib(GL_POLYGON_BIT |
                  GL_LIGHTING_BIT |
@@ -110,7 +116,7 @@ void ball_draw(void)
 
         glEnable(GL_COLOR_MATERIAL);
 
-        glBindTexture(GL_TEXTURE_2D, ball_text);
+        glBindTexture(GL_TEXTURE_2D, ball_text[i]);
 
         /* Render the ball back to front in case it is translucent. */
 
@@ -149,7 +155,7 @@ void mark_init(int b)
     int i, slices = b ? 32 : 16;
 
     mark_list = glGenLists(1);
-    
+
     glNewList(mark_list, GL_COMPILE);
     {
         glBegin(GL_TRIANGLE_FAN);
@@ -282,12 +288,9 @@ void coin_color(float *c, int n)
 
 void coin_init(int b)
 {
-    char name[MAXSTR];
     int n = b ? 32 : 8;
 
-    config_get_s(CONFIG_COIN, name, MAXSTR);
-
-    coin_text = make_image_from_file(NULL, NULL, NULL, NULL, name);
+    coin_text = make_image_from_file(NULL, NULL, NULL, NULL, IMG_COIN);
     coin_list = glGenLists(1);
 
     glNewList(coin_list, GL_COMPILE);
@@ -346,6 +349,109 @@ void coin_pull(void)
 
 /*---------------------------------------------------------------------------*/
 
+static GLuint item_grow_text;
+static GLuint item_shrink_text;
+static GLuint item_list;
+
+void item_color(float *c, int t)
+{
+    switch (t)
+    {
+    case ITEM_GROW:
+    case ITEM_SHRINK:
+
+    default:
+        c[0] = 1.0f;
+        c[1] = 1.0f;
+        c[2] = 1.0f;
+
+        break;
+    }
+}
+
+void item_init(int b)
+{
+    int n = b ? 32 : 8;
+
+    item_grow_text = make_image_from_file(NULL, NULL, NULL, NULL,
+                                          IMG_ITEM_GROW);
+    item_shrink_text = make_image_from_file(NULL, NULL, NULL, NULL,
+                                            IMG_ITEM_SHRINK);
+    item_list = glGenLists(1);
+
+    glNewList(item_list, GL_COMPILE);
+    {
+        coin_edge(n, COIN_RADIUS, COIN_THICK);
+        coin_head(n, COIN_RADIUS, COIN_THICK);
+        coin_tail(n, COIN_RADIUS, COIN_THICK);
+    }
+    glEndList();
+}
+
+void item_free(void)
+{
+    if (glIsList(item_list))
+        glDeleteLists(item_list, 1);
+
+    if (glIsTexture(item_grow_text))
+        glDeleteTextures(1, &item_grow_text);
+
+    if (glIsTexture(item_shrink_text))
+        glDeleteTextures(1, &item_shrink_text);
+
+    item_list = 0;
+    item_grow_text = 0;
+    item_shrink_text = 0;
+}
+
+void item_push(void)
+{
+    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 };
+
+    glPushAttrib(GL_LIGHTING_BIT);
+
+    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);
+}
+
+void item_push_text(int t)
+{
+    glEnable(GL_COLOR_MATERIAL);
+
+    switch (t)
+    {
+    case ITEM_GROW:
+        glBindTexture(GL_TEXTURE_2D, item_grow_text);
+        break;
+
+    case ITEM_SHRINK:
+        glBindTexture(GL_TEXTURE_2D, item_shrink_text);
+        break;
+    }
+}
+
+void item_draw(int t, float r)
+{
+    float c[3];
+
+    item_color(c, t);
+
+    glColor3fv(c);
+    glCallList(item_list);
+}
+
+void item_pull(void)
+{
+    glPopAttrib();
+}
+
+/*---------------------------------------------------------------------------*/
+
 static GLuint goal_list;
 
 void goal_init(int b)
@@ -371,7 +477,7 @@ void goal_init(int b)
                 {
                     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);
 
@@ -405,40 +511,41 @@ static GLuint jump_list;
 
 void jump_init(int b)
 {
-    int i, n = b ? 32 : 8;
+    int k, i, n = b ? 32 : 8;
 
-    jump_list = glGenLists(1);
+    jump_list = glGenLists(2);
 
-    glNewList(jump_list, GL_COMPILE);
+    for (k = 0; k < 12; k++)
     {
-        glPushAttrib(GL_TEXTURE_BIT  |
-                     GL_LIGHTING_BIT |
-                     GL_DEPTH_BUFFER_BIT);
+        glNewList(jump_list + k, GL_COMPILE);
         {
-            glEnable(GL_COLOR_MATERIAL);
-            glDisable(GL_LIGHTING);
-            glDisable(GL_TEXTURE_2D);
-            glDepthMask(GL_FALSE);
-
-            glBegin(GL_QUAD_STRIP);
+            glPushAttrib(GL_TEXTURE_BIT | GL_LIGHTING_BIT | GL_DEPTH_BUFFER_BIT);
             {
-                for (i = 0; i <= n; i++)
+                glEnable(GL_COLOR_MATERIAL);
+                glDisable(GL_LIGHTING);
+                glDisable(GL_TEXTURE_2D);
+                glDepthMask(GL_FALSE);
+
+                glBegin(GL_QUAD_STRIP);
                 {
-                    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);
+                    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.0f);
-                    glVertex3f(x, JUMP_HEIGHT, y);
+                        glColor4f(1.0f, 1.0f, 1.0f, (k == 0 ? 0.5f : 0.8f));
+                        glVertex3f(x, 0.0f, y);
+
+                        glColor4f(1.0f, 1.0f, 1.0f, 0.0f);
+                        glVertex3f(x, JUMP_HEIGHT, y);
+                    }
                 }
+                glEnd();
             }
-            glEnd();
+            glPopAttrib();
         }
-        glPopAttrib();
+        glEndList();
     }
-    glEndList();
 }
 
 void jump_free(void)
@@ -449,9 +556,9 @@ void jump_free(void)
     jump_list = 0;
 }
 
-void jump_draw(void)
+void jump_draw(int highlight)
 {
-    glCallList(jump_list);
+    glCallList(jump_list + highlight);
 }
 
 /*---------------------------------------------------------------------------*/
@@ -478,36 +585,34 @@ void swch_init(int b)
 
     for (k = 0; k < 4; k++)
     {
-       glNewList(swch_list + k, 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);
-
-                       glColor4fv(swch_colors[2*k]);
-                       glVertex3f(x, 0.0f, y);
-
-                       glColor4fv(swch_colors[2*k+1]);
-                       glVertex3f(x, SWCH_HEIGHT, y);
-                   }
-               }
-               glEnd();
-           }
-           glPopAttrib();
-       }
-       glEndList();
+        glNewList(swch_list + k, 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);
+
+                        glColor4fv(swch_colors[2 * k]);
+                        glVertex3f(x, 0.0f, y);
+
+                        glColor4fv(swch_colors[2 * k + 1]);
+                        glVertex3f(x, SWCH_HEIGHT, y);
+                    }
+                }
+                glEnd();
+            }
+            glPopAttrib();
+        }
+        glEndList();
     }
 }
 
@@ -521,7 +626,7 @@ void swch_free(void)
 
 void swch_draw(int b, int e)
 {
-    glCallList(swch_list + b*2 + e);
+    glCallList(swch_list + b * 2 + e);
 }
 
 /*---------------------------------------------------------------------------*/
@@ -548,7 +653,7 @@ void flag_init(int b)
                 {
                     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);
@@ -665,7 +770,7 @@ void fade_draw(float k)
             glDisable(GL_LIGHTING);
             glDisable(GL_DEPTH_TEST);
             glDisable(GL_TEXTURE_2D);
-            
+
             glColor4f(0.0f, 0.0f, 0.0f, k);
 
             glBegin(GL_QUADS);