#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;
+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;
-/*---------------------------------------------------------------------------*/
-#ifdef OCTA_BALL
-
-/* These are the faces of an octahedron in positive longitude/latitude. */
-
-static float octahedron[8][3][2] = {
- {{ 0.0f, 90.0f }, { 0.0f, 0.0f }, { 90.0f, 0.0f }},
- {{ 90.0f, 90.0f }, { 90.0f, 0.0f }, { 180.0f, 0.0f }},
- {{ 180.0f, 90.0f }, { 180.0f, 0.0f }, { 270.0f, 0.0f }},
- {{ 270.0f, 90.0f }, { 270.0f, 0.0f }, { 360.0f, 0.0f }},
- {{ 0.0f, -90.0f }, { 90.0f, 0.0f }, { 0.0f, 0.0f }},
- {{ 90.0f, -90.0f }, { 180.0f, 0.0f }, { 90.0f, 0.0f }},
- {{ 180.0f, -90.0f }, { 270.0f, 0.0f }, { 180.0f, 0.0f }},
- {{ 270.0f, -90.0f }, { 360.0f, 0.0f }, { 270.0f, 0.0f }},
-};
-
-static void midpoint(float *P, const float *A, const float *B)
-{
- float D[2];
-
- /* The haversine midpoint method. */
-
- D[0] = fcosf(B[1]) * fcosf(B[0] - A[0]);
- D[1] = fcosf(B[1]) * fsinf(B[0] - A[0]);
+static int back_state = 0;
- P[0] = A[0] + fatan2f(D[1], fcosf(A[1]) + D[0]);
-
- P[1] = fatan2f(fsinf(A[1]) +
- fsinf(B[1]),
- fsqrtf((fcosf(A[1]) + D[0]) *
- (fcosf(A[1]) + D[0]) + D[1] * D[1]));
-}
+/*---------------------------------------------------------------------------*/
-static void ball_vertex(const float *p)
+void geom_init(void)
{
- /* Draw a vertex with normal and texture coordinate at the given lon/lat. */
-
- const float x = fsinf(p[0]) * fcosf(p[1]);
- const float y = fsinf(p[1]);
- const float z = fcosf(p[0]) * fcosf(p[1]);
-
- glTexCoord2f(p[0] / V_RAD(360.0f),
- p[1] / V_RAD(180.0f));
-
- glNormal3f(x, y, z);
- glVertex3f(x, y, z);
+ 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);
}
-static void ball_subdiv(const float *a,
- const float *b,
- const float *c, int D)
+void geom_free(void)
{
- if (D > 0)
- {
- /* Recursively subdivide the given triangle. */
-
- float d[2];
- float e[2];
- float f[2];
-
- midpoint(d, a, b);
- midpoint(e, b, c);
- midpoint(f, c, a);
-
- ball_subdiv(a, d, f, D - 1);
- ball_subdiv(d, b, e, D - 1);
- ball_subdiv(f, e, c, D - 1);
- ball_subdiv(d, e, f, D - 1);
- }
- else
- {
- /* Draw the given triangle. */
-
- ball_vertex(a);
- ball_vertex(b);
- ball_vertex(c);
- }
+ sol_free_full(&vect);
+ sol_free_full(&mark);
+ sol_free_full(&flag);
+ sol_free_full(&goal);
+ sol_free_full(&jump);
+ sol_free_full(&beam);
}
-#endif /* OCTA_BALL */
/*---------------------------------------------------------------------------*/
-void ball_init(int b)
+void back_init(const char *name)
{
- char name[MAXSTR];
+ if (back_state)
+ back_free();
- config_get_s(CONFIG_BALL, name, MAXSTR);
+ /* Load the background SOL and modify its material in-place to use the */
+ /* named gradient texture. */
- ball_text = make_image_from_file(name);
+ sol_load_full(&back, "geom/back/back.sol", 0);
+ back.draw.mv[0].o = make_image_from_file(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);
- {
-#ifdef OCTA_BALL
- int i, d = b ? 4 : 3;
-
- glBegin(GL_TRIANGLES);
- {
- for (i = 0; i < 8; ++i)
- {
- float a[2];
- float b[2];
- float c[2];
-
- a[0] = V_RAD(octahedron[i][0][0]);
- a[1] = V_RAD(octahedron[i][0][1]);
-
- b[0] = V_RAD(octahedron[i][1][0]);
- b[1] = V_RAD(octahedron[i][1][1]);
- c[0] = V_RAD(octahedron[i][2][0]);
- c[1] = V_RAD(octahedron[i][2][1]);
-
- ball_subdiv(a, b, c, d);
- }
- }
- glEnd();
-#else
- int i, slices = b ? 32 : 16;
- int j, stacks = b ? 16 : 8;
-
- 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();
- }
-#endif /* OCTA_BALL */
- }
- glEndList();
+ back_state = 1;
}
-void ball_free(void)
+void back_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)
-{
- 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.2f, 0.2f, 0.2f, 1.0f };
- static const float h[1] = { 20.0f };
-
- 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, 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);
- }
- glDepthMask(GL_TRUE);
-
- /* Render the ball into the depth buffer. */
-
- 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);
- }
- glEnable(GL_DEPTH_TEST);
- }
- glDisable(GL_COLOR_MATERIAL);
+ if (back_state)
+ sol_free_full(&back);
+
+ back_state = 0;
}
/*---------------------------------------------------------------------------*/
-static GLuint mark_list;
-
-void mark_init(int b)
+static const struct d_mtrl *jump_part_draw(const struct d_mtrl *mq,
+ GLfloat s, GLfloat a)
{
- 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);
+ glMatrixMode(GL_TEXTURE);
+ glTranslatef(s, 0.0f, 0.0f);
+ glMatrixMode(GL_MODELVIEW);
- for (i = 0; i < slices; i++)
- {
- float x = fcosf(-2.f * PI * i / slices);
- float y = fsinf(-2.f * PI * i / slices);
+ glRotatef(a, 0.0f, 1.0f, 0.0f);
+ mq = sol_draw(&jump.draw, mq, 1, 1);
+ glScalef(0.9f, 0.9f, 0.9f);
- glVertex3f(x, 0, y);
- }
- }
- glEnd();
- }
- glEndList();
+ return mq;
}
-void mark_draw(void)
+static const struct d_mtrl *goal_part_draw(const struct d_mtrl *mq, GLfloat s)
{
- glEnable(GL_COLOR_MATERIAL);
- glDisable(GL_TEXTURE_2D);
- glDepthMask(GL_FALSE);
- {
- glCallList(mark_list);
- }
- glDepthMask(GL_TRUE);
- glEnable(GL_TEXTURE_2D);
- glDisable(GL_COLOR_MATERIAL);
-}
+ glMatrixMode(GL_TEXTURE);
+ glTranslatef(0.0f, -s, 0.0f);
+ glMatrixMode(GL_MODELVIEW);
-void mark_free(void)
-{
- if (glIsList(mark_list))
- glDeleteLists(mark_list, 1);
+ mq = sol_draw(&goal.draw, mq, 1, 1);
+ glScalef(0.8f, 1.1f, 0.8f);
- mark_list = 0;
+ return mq;
}
/*---------------------------------------------------------------------------*/
-static void coin_head(int n, float radius, float thick)
+const struct d_mtrl *goal_draw(const struct d_mtrl *mq, float t)
{
- int i;
-
- glBegin(GL_TRIANGLE_FAN);
+ glPushMatrix();
{
- glNormal3f(0.f, 0.f, +1.f);
+ glScalef(1.0f, 3.0f, 1.0f);
+ glColor4f(1.0f, 1.0f, 0.0f, 0.5f);
- 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(&beam.draw, mq, 1, 1);
- glTexCoord2f(-x * 0.5f + 0.5f, +y * 0.5f + 0.5f);
- glVertex3f(radius * x, radius * y, +thick);
- }
- }
- glEnd();
-}
+ 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);
-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);
+ glMatrixMode(GL_TEXTURE);
+ glLoadIdentity();
+ glMatrixMode(GL_MODELVIEW);
- glTexCoord2f(+x * 0.5f + 0.5f, +y * 0.5f + 0.5f);
- glVertex3f(radius * x, radius * y, -thick);
- }
+ glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
}
- 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);
+ glPopMatrix();
- glNormal3f(x, y, 0.0f);
- glVertex3f(radius * x, radius * y, +thick);
- glVertex3f(radius * x, radius * y, -thick);
- }
- }
- glEnd();
+ return mq;
}
-/*---------------------------------------------------------------------------*/
-
-static GLuint item_coin_text;
-static GLuint item_grow_text;
-static GLuint item_shrink_text;
-static GLuint item_list;
-
-void item_color(const struct s_item *hp, float *c)
+const struct d_mtrl *jump_draw(const struct d_mtrl *mq, float t, int h)
{
- switch (hp->t)
+ static GLfloat jump_colors[4][4] = {
+ { 0.75f, 0.5f, 1.0f, 0.5f },
+ { 0.75f, 0.5f, 1.0f, 0.8f },
+ };
+
+ glPushMatrix();
{
+ glColor4fv(jump_colors[h]);
- case ITEM_COIN:
+ glScalef(1.0f, 2.0f, 1.0f);
- if (hp->n >= 1)
- {
- c[0] = 1.0f;
- c[1] = 1.0f;
- c[2] = 0.2f;
- }
- if (hp->n >= 5)
- {
- c[0] = 1.0f;
- c[1] = 0.2f;
- c[2] = 0.2f;
- }
- if (hp->n >= 10)
- {
- c[0] = 0.2f;
- c[1] = 0.2f;
- c[2] = 1.0f;
- }
- break;
+ mq = sol_draw(&beam.draw, mq, 1, 1);
- case ITEM_GROW:
- case ITEM_SHRINK:
+ 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);
- default:
-
- c[0] = 1.0f;
- c[1] = 1.0f;
- c[2] = 1.0f;
+ glMatrixMode(GL_TEXTURE);
+ glLoadIdentity();
+ glMatrixMode(GL_MODELVIEW);
- break;
+ glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
}
-}
-
-void item_init(int b)
-{
- int n = b ? 32 : 8;
-
- item_coin_text = make_image_from_file(IMG_ITEM_COIN);
- item_grow_text = make_image_from_file(IMG_ITEM_GROW);
- item_shrink_text = make_image_from_file(IMG_ITEM_SHRINK);
-
- item_list = glGenLists(1);
+ glPopMatrix();
- glNewList(item_list, GL_COMPILE);
- {
- glDisable(GL_TEXTURE_2D);
- coin_edge(n, COIN_RADIUS, COIN_THICK);
- glEnable (GL_TEXTURE_2D);
- coin_head(n, COIN_RADIUS, COIN_THICK);
- coin_tail(n, COIN_RADIUS, COIN_THICK);
- }
- glEndList();
+ return mq;
}
-void item_free(void)
+const struct d_mtrl *swch_draw(const struct d_mtrl *mq, int b, int e)
{
- if (glIsList(item_list))
- glDeleteLists(item_list, 1);
+ 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 */
+ };
- if (glIsTexture(item_coin_text))
- glDeleteTextures(1, &item_coin_text);
-
- if (glIsTexture(item_grow_text))
- glDeleteTextures(1, &item_grow_text);
+ glPushMatrix();
+ {
+ glScalef(1.0f, 2.0f, 1.0f);
- if (glIsTexture(item_shrink_text))
- glDeleteTextures(1, &item_shrink_text);
+ glColor4fv(swch_colors[b * 2 + e]);
+ mq = sol_draw(&beam.draw, mq, 1, 1);
+ glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ }
+ glPopMatrix();
- item_list = 0;
- item_coin_text = 0;
- item_grow_text = 0;
- item_shrink_text = 0;
+ return mq;
}
-void item_push(int type)
+const struct d_mtrl *flag_draw(const struct d_mtrl *mq)
{
- 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] = { 10.0f };
-
- 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);
-
- switch (type)
- {
- case ITEM_COIN:
- glBindTexture(GL_TEXTURE_2D, item_coin_text);
- break;
-
- case ITEM_GROW:
- glBindTexture(GL_TEXTURE_2D, item_grow_text);
- break;
-
- case ITEM_SHRINK:
- glBindTexture(GL_TEXTURE_2D, item_shrink_text);
- break;
- }
+ glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ return sol_draw(&flag.draw, mq, 1, 1);
}
-void item_draw(const struct s_item *hp, float r)
+const struct d_mtrl *mark_draw(const struct d_mtrl *mq)
{
- float c[3];
-
- item_color(hp, c);
-
- glColor3fv(c);
- glCallList(item_list);
+ return sol_draw(&mark.draw, mq, 1, 1);
}
-void item_pull(void)
+const struct d_mtrl *vect_draw(const struct d_mtrl *mq)
{
- glColor3f(1.0f, 1.0f, 1.0f);
- glDisable(GL_COLOR_MATERIAL);
+ mq = sol_draw(&vect.draw, mq, 0, 1);
+ mq = sol_draw(&vect.draw, mq, 0, 0);
+ return mq;
}
-/*---------------------------------------------------------------------------*/
-
-static GLuint goal_list;
-
-void goal_init(int b)
+const struct d_mtrl *back_draw(const struct d_mtrl *mq, float t)
{
- int i, n = b ? 32 : 8;
-
- goal_list = glGenLists(1);
-
- glNewList(goal_list, GL_COMPILE);
+ glPushMatrix();
{
- 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);
+ GLfloat dx = 60.0f * fsinf(t / 10.0f);
+ GLfloat dz = 180.0f * fsinf(t / 12.0f);
- glColor4f(1.0f, 1.0f, 0.0f, 0.5f);
- glVertex3f(x, 0.0f, y);
+ glDisable(GL_LIGHTING);
+ glDepthMask(GL_FALSE);
+ {
+ glScalef(-BACK_DIST, BACK_DIST, -BACK_DIST);
+ glRotatef(dz, 0.0f, 0.0f, 1.0f);
+ glRotatef(dx, 1.0f, 0.0f, 0.0f);
- glColor4f(1.0f, 1.0f, 0.0f, 0.0f);
- glVertex3f(x, GOAL_HEIGHT, y);
- }
+ mq = sol_draw(&back.draw, mq, 1, 1);
}
- glEnd();
+ glDepthMask(GL_TRUE);
+ glEnable(GL_LIGHTING);
}
- glEndList();
-}
+ glPopMatrix();
-void goal_free(void)
-{
- if (glIsList(goal_list))
- glDeleteLists(goal_list, 1);
-
- goal_list = 0;
+ return mq;
}
-void goal_draw(void)
+void back_draw_easy(void)
{
- glCallList(goal_list);
+ sol_draw_disable(back_draw(sol_draw_enable(), 0.0f));
}
/*---------------------------------------------------------------------------*/
+/*
+static GLuint clip_text;
-static GLuint jump_list;
+static GLubyte clip_data[] = { 0xff, 0xff, 0x0, 0x0 };
-void jump_init(int b)
+void clip_init(void)
{
- int k, i, n = b ? 32 : 8;
+ if (!glActiveTexture_)
+ return;
- jump_list = glGenLists(2);
-
- for (k = 0; k < 2; k++)
+ glActiveTexture_(GL_TEXTURE1);
{
- glNewList(jump_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);
-
- 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();
- }
- glEndList();
- }
-}
-
-void jump_free(void)
-{
- glDeleteLists(jump_list, 2);
- jump_list = 0;
-}
-
-void jump_draw(int highlight)
-{
- glCallList(jump_list + highlight);
-}
-
-/*---------------------------------------------------------------------------*/
-
-static GLuint swch_list;
+ glGenTextures(1, &clip_text);
+ glBindTexture(GL_TEXTURE_1D, clip_text);
-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 }};
-
-void swch_init(int b)
-{
- int k, i, n = b ? 32 : 8;
+ glTexImage1D(GL_TEXTURE_1D, 0,
+ GL_LUMINANCE_ALPHA, 2, 0,
+ GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, clip_data);
- swch_list = glGenLists(4);
+ glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- /* Create the display lists. */
-
- for (k = 0; k < 4; k++)
- {
- 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();
+ glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
}
+ 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, int e)
+void clip_draw_set(void)
{
- glCallList(swch_list + b * 2 + e);
-}
-
-/*---------------------------------------------------------------------------*/
-
-static GLuint flag_list;
+ if (!glActiveTexture_)
+ return;
-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);
- {
- glEnable(GL_COLOR_MATERIAL);
- glDisable(GL_LIGHTING);
- glDisable(GL_TEXTURE_2D);
- {
- 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();
-
- 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();
- }
- glEnable(GL_TEXTURE_2D);
- glEnable(GL_LIGHTING);
- glDisable(GL_COLOR_MATERIAL);
+ 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);
+ if (!glActiveTexture_)
+ return;
- flag_list = 0;
-}
-
-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
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);
}
}
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)
-{
- if (k > 0.0f)
+ glActiveTexture_(GL_TEXTURE1);
{
- int w = config_get_d(CONFIG_WIDTH);
- int h = config_get_d(CONFIG_HEIGHT);
-
- config_push_ortho();
- {
- 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();
-
- glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
-
- glEnable(GL_TEXTURE_2D);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_LIGHTING);
- glDisable(GL_COLOR_MATERIAL);
- }
- config_pop_matrix();
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glDisable(GL_TEXTURE_2D);
}
+ glActiveTexture_(GL_TEXTURE0);
}
/*---------------------------------------------------------------------------*/