]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - r_explosion.c
cleaned up backend code a bit more, added R_Mesh_Draw_GetBuffer (untested - returns...
[xonotic/darkplaces.git] / r_explosion.c
index d7504a29edc76532ee6bed957cb3b3a3b54a306a..8bfd09d7b7f026e5836330577c74bf21b75f6166 100644 (file)
@@ -170,10 +170,10 @@ void R_NewExplosion(vec3_t org)
        int i, j;
        float dist;
        byte noise[EXPLOSIONGRID*EXPLOSIONGRID];
-       fractalnoise(noise, EXPLOSIONGRID, 4);
+       fractalnoisequick(noise, EXPLOSIONGRID, 4);
        for (i = 0;i < MAX_EXPLOSIONS;i++)
        {
-               if (explosion[i].alpha <= 0.0f)
+               if (explosion[i].alpha <= 0.01f)
                {
                        explosion[i].starttime = cl.time;
                        explosion[i].time = explosion[i].starttime - 0.1;
@@ -207,7 +207,7 @@ void R_NewExplosion(vec3_t org)
                }
                VectorRandom(v);
                VectorMA(org, EXPLOSIONGASSTARTRADIUS, v, v);
-               TraceLine(org, v, explosiongas[i].origin, NULL, 0);
+               TraceLine(org, v, explosiongas[i].origin, NULL, 0, true);
                VectorRandom(v);
                VectorScale(v, EXPLOSIONGASSTARTVELOCITY, explosiongas[i].velocity);
                explosiongas[i].pressure = j * GASDENSITY_SCALER;
@@ -243,42 +243,40 @@ void R_DrawExplosion(explosion_t *e)
        size = 0;
        for (i = 0;i < EXPLOSIONVERTS;i++)
        {
-               //VectorSubtract(e->vert[i], e->origin, diff);
-               //dist = DotProduct(diff, diff);
                dist = DotProduct(e->vert[i], vpn) - centerdist;
-               if (size < dist)
+               if (size > dist)
                        size = dist;
        }
-       //scale = -1.0f / sqrt(size / EXPLOSIONVERTS);
-       //scale = -1.0f / sqrt(size);
-       scale = -1.0f / size;
+       scale = 1.0f / size;
        if (fogenabled)
        {
                for (i = 0;i < EXPLOSIONVERTS;i++)
                {
-                       dist = DotProduct(e->vert[i], vpn) - centerdist;
-                       // use inverse fog alpha as color
-                       VectorSubtract(e->vert[i], r_origin, diff);
-                       ifog = 1 - exp(fogdensity/DotProduct(diff,diff));
-                       if (ifog < 0)
-                               ifog = 0;
-                       c[i][0] = ifog;
-                       c[i][1] = ifog;
-                       c[i][2] = ifog;
-                       //c[i][3] = min(dist * scale, 1) * alpha;
-                       c[i][3] = dist * scale * alpha;
+                       dist = (DotProduct(e->vert[i], vpn) - centerdist) * scale;
+                       if (dist > 0)
+                       {
+                               // use inverse fog alpha as color
+                               VectorSubtract(e->vert[i], r_origin, diff);
+                               ifog = 1 - exp(fogdensity/DotProduct(diff,diff));
+                               if (ifog < 0)
+                                       ifog = 0;
+                               c[i][0] = c[i][1] = c[i][2] = dist * alpha * ifog;
+                       }
+                       else
+                               c[i][0] = c[i][1] = c[i][2] = 0;
+                       c[i][3] = 1;
                }
        }
        else
        {
                for (i = 0;i < EXPLOSIONVERTS;i++)
                {
-                       dist = DotProduct(e->vert[i], vpn) - centerdist;
-                       c[i][0] = 1;
-                       c[i][1] = 1;
-                       c[i][2] = 1;
-                       //c[i][3] = min(dist * scale, 1) * alpha;
-                       c[i][3] = dist * scale * alpha;
+                       dist = (DotProduct(e->vert[i], vpn) - centerdist) * scale;
+                       if (dist > 0)
+                               c[i][0] = c[i][1] = c[i][2] = dist * alpha;
+                       else
+                               c[i][0] = c[i][1] = c[i][2] = 0;
+                       c[i][3] = 1;
                }
        }
        /*
@@ -340,6 +338,11 @@ void R_MoveExplosion(explosion_t *e/*, explosiongas_t **list, explosiongas_t **l
        frametime = cl.time - e->time;
        e->time = cl.time;
        e->alpha = EXPLOSIONFADESTART - (cl.time - e->starttime) * EXPLOSIONFADERATE;
+       if (e->alpha <= 0.01f)
+       {
+               e->alpha = -1;
+               return;
+       }
        frictionscale = 1 - frametime;
        frictionscale = bound(0, frictionscale, 1);
        for (i = 0;i < EXPLOSIONVERTS;i++)
@@ -351,7 +354,7 @@ void R_MoveExplosion(explosion_t *e/*, explosiongas_t **list, explosiongas_t **l
                        VectorMA(e->vert[i], frametime, e->vertvel[i], end);
                        if (r_explosionclip.integer)
                        {
-                               if (TraceLine(e->vert[i], end, impact, normal, 0) < 1)
+                               if (TraceLine(e->vert[i], end, impact, normal, 0, true) < 1)
                                {
                                        // clip velocity against the wall
                                        dot = DotProduct(e->vertvel[i], normal) * -1.125f;
@@ -397,7 +400,7 @@ void R_MoveExplosionGas(explosiongas_t *e, explosiongas_t **list, explosiongas_t
                {
                        float f, dot;
                        vec3_t impact, normal;
-                       f = TraceLine(e->origin, end, impact, normal, 0);
+                       f = TraceLine(e->origin, end, impact, normal, 0, true);
                        VectorCopy(impact, e->origin);
                        if (f < 1)
                        {