]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - r_explosion.c
added some (not yet used) key config menu code, part of a redesign for loading the...
[xonotic/darkplaces.git] / r_explosion.c
index d7504a29edc76532ee6bed957cb3b3a3b54a306a..8bac758f7f0a5deca46cdda934293c9fc0437e37 100644 (file)
@@ -24,10 +24,12 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #define EXPLOSIONGRID 8
 #define EXPLOSIONVERTS ((EXPLOSIONGRID+1)*(EXPLOSIONGRID+1))
 #define EXPLOSIONTRIS (EXPLOSIONGRID*EXPLOSIONGRID*2)
-#define EXPLOSIONSTARTVELOCITY (384.0f)
+#define EXPLOSIONSTARTVELOCITY (256.0f)
+//#define EXPLOSIONSTARTVELOCITY (384.0f)
 //#define EXPLOSIONRANDOMVELOCITY (32.0f)
 #define EXPLOSIONFADESTART (1.5f)
-#define EXPLOSIONFADERATE (4.5f)
+//#define EXPLOSIONFADERATE (4.5f)
+#define EXPLOSIONFADERATE (3.0f)
 /*
 #define MAX_EXPLOSIONGAS (MAX_EXPLOSIONS * EXPLOSIONGAS)
 #define EXPLOSIONGAS 8
@@ -77,7 +79,7 @@ cvar_t r_drawexplosions = {0, "r_drawexplosions", "1"};
 void r_explosion_start(void)
 {
        int x, y;
-       byte noise1[128][128], noise2[128][128], noise3[128][128], data[128][128][4];
+       qbyte noise1[128][128], noise2[128][128], noise3[128][128], data[128][128][4];
        explosiontexturepool = R_AllocTexturePool();
        fractalnoise(&noise1[0][0], 128, 32);
        fractalnoise(&noise2[0][0], 128, 4);
@@ -169,11 +171,11 @@ void R_NewExplosion(vec3_t org)
 {
        int i, j;
        float dist;
-       byte noise[EXPLOSIONGRID*EXPLOSIONGRID];
-       fractalnoise(noise, EXPLOSIONGRID, 4);
+       qbyte noise[EXPLOSIONGRID*EXPLOSIONGRID];
+       fractalnoisequick(noise, EXPLOSIONGRID, 4); // adjust noise grid size according to explosion
        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 +209,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;
@@ -219,7 +221,7 @@ void R_NewExplosion(vec3_t org)
 void R_DrawExplosion(explosion_t *e)
 {
        int i;
-       float c[EXPLOSIONVERTS][4], diff[3], /*fog, */ifog, alpha, dist, centerdist, size, scale;
+       float c[EXPLOSIONVERTS][4], diff[3], centerdir[3], /*fog, */ifog, alpha, dist/*, centerdist, size, scale*/;
        rmeshinfo_t m;
        memset(&m, 0, sizeof(m));
        m.transparent = true;
@@ -231,54 +233,62 @@ void R_DrawExplosion(explosion_t *e)
        m.vertex = &e->vert[0][0];
        m.vertexstep = sizeof(float[3]);
        alpha = e->alpha;
-       if (alpha > 1)
-               alpha = 1;
+       //if (alpha > 1)
+       //      alpha = 1;
        m.cr = 1;
        m.cg = 1;
        m.cb = 1;
-       m.ca = alpha;
+       m.ca = 1; //alpha;
        m.color = &c[0][0];
        m.colorstep = sizeof(float[4]);
-       centerdist = DotProduct(e->origin, vpn);
+       VectorSubtract(r_origin, e->origin, centerdir);
+       VectorNormalizeFast(centerdir);
+       /*
+       centerdist = DotProduct(e->origin, centerdir);
        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;
+               dist = DotProduct(e->vert[i], centerdir) - centerdist;
                if (size < dist)
                        size = dist;
        }
-       //scale = -1.0f / sqrt(size / EXPLOSIONVERTS);
-       //scale = -1.0f / sqrt(size);
-       scale = -1.0f / size;
+       scale = 4.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], centerdir) - centerdist) * scale - 2.0f;
+                       VectorSubtract(e->vert[i], e->origin, diff);
+                       VectorNormalizeFast(diff);
+                       dist = DotProduct(diff, centerdir) * 6.0f - 4.0f;
+                       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], centerdir) - centerdist) * scale - 2.0f;
+                       VectorSubtract(e->vert[i], e->origin, diff);
+                       VectorNormalizeFast(diff);
+                       dist = DotProduct(diff, centerdir) * 6.0f - 4.0f;
+                       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 +350,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 +366,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 +412,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)
                        {