X-Git-Url: http://vcs.maemo.org/git/?a=blobdiff_plain;f=share%2Fgeom.c;h=3e624eeb0f95f1b0306e8b074c3b449300b07074;hb=7c207b778868586579fdc03a8d0d6b8f8002cd52;hp=b42b9a543413117a61205f9c046b0d603b4cc472;hpb=c6d6c9e34bdbdc6e4d9e922130f8a8b0f3a0d20a;p=neverball diff --git a/share/geom.c b/share/geom.c index b42b9a5..3e624ee 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 @@ -21,597 +21,292 @@ #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); } /*---------------------------------------------------------------------------*/