}
/*---------------------------------------------------------------------------*/
-/*
+
+static GLint max_tex_units;
+
static GLuint clip_text;
static GLubyte clip_data[] = { 0xff, 0xff, 0x0, 0x0 };
void clip_init(void)
{
- if (!glActiveTexture_)
+ if (max_tex_units < 3)
return;
- glActiveTexture_(GL_TEXTURE1);
- {
- glGenTextures(1, &clip_text);
- glBindTexture(GL_TEXTURE_1D, clip_text);
+ glActiveTexture_(GL_TEXTURE2);
- glTexImage1D(GL_TEXTURE_1D, 0,
- GL_LUMINANCE_ALPHA, 2, 0,
- GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, clip_data);
+ glGenTextures(1, &clip_text);
+ glBindTexture(GL_TEXTURE_2D, clip_text);
- glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexImage2D(GL_TEXTURE_2D, 0,
+ GL_LUMINANCE_ALPHA, 1, 2, 0,
+ GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, clip_data);
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
+
+ /* Fade to black using stored alpha. */
+
+ glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
+ glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
+ glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS);
+ glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
+ glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_ONE_MINUS_SRC_ALPHA);
+
+ /* Restore original alpha.*/
+
+ glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
+ glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PRIMARY_COLOR);
+ glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_TEXTURE0);
+ glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
+ glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);
- glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- }
glActiveTexture_(GL_TEXTURE0);
}
void clip_draw_set(void)
{
- if (!glActiveTexture_)
+ if (max_tex_units < 3)
return;
- glActiveTexture_(GL_TEXTURE1);
- {
- glBindTexture(GL_TEXTURE_1D, clip_text);
+ glActiveTexture_(GL_TEXTURE2);
- glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glBindTexture(GL_TEXTURE_2D, clip_text);
+ glEnable(GL_TEXTURE_2D);
- glEnable(GL_TEXTURE_GEN_S);
- glEnable(GL_TEXTURE_1D);
- }
glActiveTexture_(GL_TEXTURE0);
}
void clip_draw_clr(void)
{
- if (!glActiveTexture_)
+ if (max_tex_units < 3)
return;
- glActiveTexture_(GL_TEXTURE1);
- {
- glDisable(GL_TEXTURE_GEN_S);
- glDisable(GL_TEXTURE_1D);
- }
+ glActiveTexture_(GL_TEXTURE2);
+
+ glBindTexture(GL_TEXTURE_2D, 0);
+ glDisable(GL_TEXTURE_2D);
+
glActiveTexture_(GL_TEXTURE0);
}
-*/
-/*---------------------------------------------------------------------------*/
/*
* A note about lighting and shadow: technically speaking, it's wrong.
void shad_init(void)
{
- GLint m;
-
if (!config_get_d(CONFIG_SHADOW))
return;
- glGetIntegerv(GL_MAX_TEXTURE_UNITS, &m);
+ glGetIntegerv(GL_MAX_TEXTURE_UNITS, &max_tex_units);
- if (m < 2)
+ if (max_tex_units < 2)
{
config_set_d(CONFIG_SHADOW, 0);
return;
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
}
+
+ clip_init();
}
void shad_free(void)
{
if (glIsTexture(shad_text))
glDeleteTextures(1, &shad_text);
+
+ clip_free();
}
void shad_draw_set(void)
{
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, shad_text);
- glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
+
+ if (max_tex_units < 3)
+ {
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
+ }
+ else
+ {
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
+
+ /* Keep color intact. */
+
+ glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
+ glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
+ glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
+
+ /* Multiply shadow alpha and clip alpha. */
+
+ glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
+ glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE1);
+ glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_TEXTURE2);
+ glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
+ glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);
+ }
}
glActiveTexture_(GL_TEXTURE0);
+
+ clip_draw_set();
}
void shad_draw_clr(void)
glDisable(GL_TEXTURE_2D);
}
glActiveTexture_(GL_TEXTURE0);
+
+ clip_draw_clr();
}
/*---------------------------------------------------------------------------*/
{
struct v_ball *up = vary->uv + ui;
- glActiveTexture_(GL_TEXTURE1);
glMatrixMode(GL_TEXTURE);
+ glActiveTexture_(GL_TEXTURE2);
+ {
+ glLoadIdentity();
+ glTranslatef(p[0] - up->p[0],
+ p[1] - up->p[1] + 0.5f,
+ p[2] - up->p[2]);
+ glRotatef(V_DEG(a), v[0], v[1], v[2]);
+ }
+ glActiveTexture_(GL_TEXTURE1);
{
float k = 0.25f / up->r;
glTranslatef(p[0], p[1], p[2]);
glRotatef(V_DEG(a), v[0], v[1], v[2]);
}
- glMatrixMode(GL_MODELVIEW);
glActiveTexture_(GL_TEXTURE0);
+ glMatrixMode(GL_MODELVIEW);
}
}
const size_t s = sizeof (GLfloat);
/*
glDisableClientState(GL_NORMAL_ARRAY);
+ glClientActiveTexture_(GL_TEXTURE2);
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glClientActiveTexture_(GL_TEXTURE1);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glClientActiveTexture_(GL_TEXTURE0);
{
/*
glEnableClientState(GL_NORMAL_ARRAY);
+ glClientActiveTexture_(GL_TEXTURE2);
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glClientActiveTexture_(GL_TEXTURE1);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glClientActiveTexture_(GL_TEXTURE0);
glVertexPointer (3, T, s, (GLvoid *) offsetof (struct d_vert, p));
glNormalPointer ( T, s, (GLvoid *) offsetof (struct d_vert, n));
+ glClientActiveTexture_(GL_TEXTURE2);
+ glTexCoordPointer(3, T, s, (GLvoid *) offsetof (struct d_vert, p));
glClientActiveTexture_(GL_TEXTURE1);
glTexCoordPointer(3, T, s, (GLvoid *) offsetof (struct d_vert, p));
glClientActiveTexture_(GL_TEXTURE0);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
+ glClientActiveTexture_(GL_TEXTURE2);
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glClientActiveTexture_(GL_TEXTURE1);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glClientActiveTexture_(GL_TEXTURE0);
{
sol_apply_mtrl(&default_draw_mtrl, rend);
+ glClientActiveTexture_(GL_TEXTURE2);
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glClientActiveTexture_(GL_TEXTURE1);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glClientActiveTexture_(GL_TEXTURE0);