]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - r_explosion.c
Tomaz patch to implement controllable fade rate in explosions
[xonotic/darkplaces.git] / r_explosion.c
index 23a44c6db572e1f71d733f8bf9a5298a5681ad27..b8fe3bdda9cd69c657211fdffce96dfce139002f 100644 (file)
@@ -26,8 +26,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #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];
@@ -40,6 +38,7 @@ typedef struct explosion_s
        float starttime;
        float time;
        float alpha;
+       float fade;
        vec3_t origin;
        vec3_t vert[EXPLOSIONVERTS];
        vec3_t vertvel[EXPLOSIONVERTS];
@@ -153,11 +152,12 @@ void R_NewExplosion(vec3_t org)
        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++)
                        {
@@ -187,16 +187,19 @@ void R_DrawExplosionCallback(const void *calldata1, int calldata2)
 
        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)
@@ -206,8 +209,8 @@ 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;
@@ -222,7 +225,7 @@ void R_MoveExplosion(explosion_t *e)
                        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;
@@ -245,7 +248,7 @@ void R_MoveExplosions(void)
        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]);
 }
 
@@ -256,7 +259,7 @@ void R_DrawExplosions(void)
        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);
 }