-static GLuint ball_list;
-static GLuint ball_text[2];
-
-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[0] = 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++)
- {
- 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)
-{
- if (glIsList(ball_list))
- glDeleteLists(ball_list, 1);
-
- if (glIsTexture(ball_text[0]))
- glDeleteTextures(1, &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(int i)
-{
- 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[i]);
-
- /* 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();
-}
-
-/*---------------------------------------------------------------------------*/
-