X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=share%2Fgeom.c;h=eedddbf5d250819ab7670064d057a5002f5f542e;hb=0a92d6a1621f362c80cdd3f894652cfb12f19b8b;hp=def33a0522342b6dbc04574ec735eb833d4e9992;hpb=4b0db6199b2048a922c797ee03e3fb9942506cf1;p=neverball diff --git a/share/geom.c b/share/geom.c index def33a0..eedddbf 100644 --- a/share/geom.c +++ b/share/geom.c @@ -1,4 +1,4 @@ -/* +/* * Copyright (C) 2003 Robert Kooima * * NEVERBALL is free software; you can redistribute it and/or modify @@ -29,119 +29,6 @@ /*---------------------------------------------------------------------------*/ -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); - - 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)) - glDeleteTextures(1, &ball_text); - - ball_list = 0; - ball_text = 0; -} - -void ball_draw(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(); -} - -/*---------------------------------------------------------------------------*/ - static GLuint mark_list; void mark_init(int b) @@ -149,7 +36,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); @@ -171,19 +58,15 @@ void mark_init(int b) 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); { - glEnable(GL_COLOR_MATERIAL); - glDisable(GL_TEXTURE_2D); - glDepthMask(GL_FALSE); - glCallList(mark_list); } - glPopAttrib(); - glPopAttrib(); - glPopAttrib(); + glDepthMask(GL_TRUE); + glEnable(GL_TEXTURE_2D); + glDisable(GL_COLOR_MATERIAL); } void mark_free(void) @@ -196,156 +79,6 @@ void mark_free(void) /*---------------------------------------------------------------------------*/ -static GLuint coin_text; -static GLuint coin_list; - -static void coin_head(int n, float radius, float thick) -{ - int i; - - glBegin(GL_TRIANGLE_FAN); - { - glNormal3f(0.f, 0.f, +1.f); - - for (i = 0; i < n; i++) - { - float x = fcosf(+2.f * PI * i / n); - float y = fsinf(+2.f * PI * i / n); - - glTexCoord2f(-x * 0.5f + 0.5f, +y * 0.5f + 0.5f); - glVertex3f(radius * x, radius * y, +thick); - } - } - glEnd(); -} - -static void coin_tail(int n, float radius, float thick) -{ - int i; - - glBegin(GL_TRIANGLE_FAN); - { - glNormal3f(0.f, 0.f, -1.f); - - for (i = 0; i < n; i++) - { - float x = fcosf(-2.f * PI * i / n); - float y = fsinf(-2.f * PI * i / n); - - glTexCoord2f(+x * 0.5f + 0.5f, +y * 0.5f + 0.5f); - glVertex3f(radius * x, radius * y, -thick); - } - } - glEnd(); -} - -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) -{ - 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) - { - c[0] = 0.2f; - c[1] = 0.2f; - c[2] = 1.0f; - } -} - -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_list = glGenLists(1); - - 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); - } - glEndList(); -} - -void coin_free(void) -{ - if (glIsList(coin_list)) - glDeleteLists(coin_list, 1); - - if (glIsTexture(coin_text)) - glDeleteTextures(1, &coin_text); - - coin_list = 0; - coin_text = 0; -} - -void coin_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); - - glEnable(GL_COLOR_MATERIAL); - glBindTexture(GL_TEXTURE_2D, coin_text); -} - -void coin_draw(int n, float r) -{ - float c[3]; - - coin_color(c, n); - - glColor3fv(c); - glCallList(coin_list); -} - -void coin_pull(void) -{ - glPopAttrib(); -} - -/*---------------------------------------------------------------------------*/ - static GLuint goal_list; void goal_init(int b) @@ -356,32 +89,21 @@ void goal_init(int b) glNewList(goal_list, GL_COMPILE); { - glPushAttrib(GL_TEXTURE_BIT | - GL_LIGHTING_BIT | - GL_DEPTH_BUFFER_BIT); + glBegin(GL_QUAD_STRIP); { - glEnable(GL_COLOR_MATERIAL); - glDisable(GL_LIGHTING); - glDisable(GL_TEXTURE_2D); - glDepthMask(GL_FALSE); - - glBegin(GL_QUAD_STRIP); + for (i = 0; i <= n; i++) { - 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); + float x = fcosf(2.f * PI * i / n); + float y = fsinf(2.f * PI * i / n); - glColor4f(1.0f, 1.0f, 0.0f, 0.0f); - glVertex3f(x, GOAL_HEIGHT, y); - } + 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(); + glEnd(); } glEndList(); } @@ -405,29 +127,22 @@ 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 < 2; 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); { 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); + + 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); @@ -436,22 +151,19 @@ void jump_init(int b) } glEnd(); } - glPopAttrib(); + glEndList(); } - glEndList(); } void jump_free(void) { - if (glIsList(jump_list)) - glDeleteLists(jump_list, 1); - + glDeleteLists(jump_list, 2); jump_list = 0; } -void jump_draw(void) +void jump_draw(int highlight) { - glCallList(jump_list); + glCallList(jump_list + highlight); } /*---------------------------------------------------------------------------*/ @@ -459,14 +171,14 @@ void jump_draw(void) static GLuint swch_list; static GLfloat swch_colors[8][4] = { - {1.0f, 0.0f, 0.0f, 0.5f}, /* red out */ - {1.0f, 0.0f, 0.0f, 0.0f}, - {1.0f, 0.0f, 0.0f, 0.8f}, /* red in */ - {1.0f, 0.0f, 0.0f, 0.0f}, - {0.0f, 1.0f, 0.0f, 0.5f}, /* green out */ - {0.0f, 1.0f, 0.0f, 0.0f}, - {0.0f, 1.0f, 0.0f, 0.8f}, /* green in */ - {0.0f, 1.0f, 0.0f, 0.0f}}; + { 1.0f, 0.0f, 0.0f, 0.5f }, /* red out */ + { 1.0f, 0.0f, 0.0f, 0.0f }, + { 1.0f, 0.0f, 0.0f, 0.8f }, /* red in */ + { 1.0f, 0.0f, 0.0f, 0.0f }, + { 0.0f, 1.0f, 0.0f, 0.5f }, /* green out */ + { 0.0f, 1.0f, 0.0f, 0.0f }, + { 0.0f, 1.0f, 0.0f, 0.8f }, /* green in */ + { 0.0f, 1.0f, 0.0f, 0.0f }}; void swch_init(int b) { @@ -478,36 +190,25 @@ 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); + { + 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 + 0]); + glVertex3f(x, 0.0f, y); + + glColor4fv(swch_colors[2 * k + 1]); + glVertex3f(x, SWCH_HEIGHT, y); + } + } + glEnd(); + } + glEndList(); } } @@ -521,7 +222,7 @@ void swch_free(void) void swch_draw(int b, int e) { - glCallList(swch_list + b*2 + e); + glCallList(swch_list + b * 2 + e); } /*---------------------------------------------------------------------------*/ @@ -536,26 +237,10 @@ void flag_init(int b) glNewList(flag_list, GL_COMPILE); { - glPushAttrib(GL_TEXTURE_BIT | GL_LIGHTING_BIT); + glEnable(GL_COLOR_MATERIAL); + glDisable(GL_LIGHTING); + glDisable(GL_TEXTURE_2D); { - 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); @@ -569,8 +254,24 @@ void flag_init(int b) glVertex3f(GOAL_HEIGHT * 0.2f, GOAL_HEIGHT * 0.9f, 0.0f); } glEnd(); + + 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(); } - glPopAttrib(); + glEnable(GL_TEXTURE_2D); + glEnable(GL_LIGHTING); + glDisable(GL_COLOR_MATERIAL); } glEndList(); } @@ -606,7 +307,7 @@ 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) { @@ -650,22 +351,18 @@ void shad_draw_clr(void) void fade_draw(float k) { - int w = config_get_d(CONFIG_WIDTH); - int h = config_get_d(CONFIG_HEIGHT); - if (k > 0.0f) { + int w = config_get_d(CONFIG_WIDTH); + int h = config_get_d(CONFIG_HEIGHT); + 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); @@ -676,8 +373,14 @@ void fade_draw(float k) glVertex2i(0, h); } glEnd(); + + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + + glEnable(GL_TEXTURE_2D); + glEnable(GL_DEPTH_TEST); + glEnable(GL_LIGHTING); + glDisable(GL_COLOR_MATERIAL); } - glPopAttrib(); config_pop_matrix(); } }