#define EXPLOSIONVERTS ((EXPLOSIONGRID+1)*(EXPLOSIONGRID+1))
#define EXPLOSIONTRIS (EXPLOSIONGRID*EXPLOSIONGRID*2)
#define EXPLOSIONSTARTVELOCITY (256.0f)
-#define EXPLOSIONFADESTART (1.5f)
-#define EXPLOSIONFADERATE (3.0f)
float explosiontexcoord2f[EXPLOSIONVERTS][2];
int explosiontris[EXPLOSIONTRIS][3];
float starttime;
float time;
float alpha;
+ float fade;
vec3_t origin;
vec3_t vert[EXPLOSIONVERTS];
vec3_t vertvel[EXPLOSIONVERTS];
fractalnoisequick(noise, EXPLOSIONGRID, 4); // adjust noise grid size according to explosion
for (i = 0;i < MAX_EXPLOSIONS;i++)
{
- if (explosion[i].alpha <= 0.01f)
+ if (explosion[i].alpha <= cl_explosions_alpha_end.value)
{
explosion[i].starttime = cl.time;
explosion[i].time = explosion[i].starttime - 0.1;
- explosion[i].alpha = EXPLOSIONFADESTART;
+ explosion[i].alpha = cl_explosions_alpha_start.value;
+ explosion[i].fade = (cl_explosions_alpha_start.value - cl_explosions_alpha_end.value) / cl_explosions_lifetime.value;
VectorCopy(org, explosion[i].origin);
for (j = 0;j < EXPLOSIONVERTS;j++)
{
numtriangles = EXPLOSIONTRIS;
numverts = EXPLOSIONVERTS;
- alpha = e->alpha * r_colorscale;
- GL_Color(alpha, alpha, alpha, 1);
- GL_VertexPointer(e->vert[0]);
+ alpha = e->alpha;
memset(&m, 0, sizeof(m));
m.tex[0] = R_GetTexture(explosiontexture);
m.pointer_texcoord[0] = explosiontexcoord2f[0];
- R_Mesh_State_Texture(&m);
+ m.pointer_vertex = e->vert[0];
+ R_Mesh_State(&m);
+
+ GL_Color(alpha, alpha, alpha, 1);
+ GL_LockArrays(0, numverts);
R_Mesh_Draw(numverts, numtriangles, explosiontris[0]);
+ GL_LockArrays(0, 0);
}
void R_MoveExplosion(explosion_t *e)
frametime = cl.time - e->time;
e->time = cl.time;
- e->alpha = EXPLOSIONFADESTART - (cl.time - e->starttime) * EXPLOSIONFADERATE;
- if (e->alpha <= 0.01f)
+ e->alpha = e->alpha - (e->fade * frametime);
+ if (e->alpha <= cl_explosions_alpha_end.value)
{
e->alpha = -1;
return;
VectorMA(e->vert[i], frametime, e->vertvel[i], end);
if (r_explosionclip.integer)
{
- if (CL_TraceLine(e->vert[i], end, impact, normal, 0, true, NULL) < 1)
+ if (CL_TraceLine(e->vert[i], end, impact, normal, true, NULL, SUPERCONTENTS_SOLID) < 1)
{
// clip velocity against the wall
dot = DotProduct(e->vertvel[i], normal) * -1.125f;
frametime = cl.time - cl.oldtime;
for (i = 0;i < MAX_EXPLOSIONS;i++)
- if (explosion[i].alpha > 0.01f)
+ if (explosion[i].alpha > cl_explosions_alpha_end.value)
R_MoveExplosion(&explosion[i]);
}
if (!r_drawexplosions.integer)
return;
for (i = 0;i < MAX_EXPLOSIONS;i++)
- if (explosion[i].alpha > 0.01f)
+ if (explosion[i].alpha > cl_explosions_alpha_end.value)
R_MeshQueue_AddTransparent(explosion[i].origin, R_DrawExplosionCallback, &explosion[i], 0);
}