]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - r_explosion.c
reenabled loading plaques (and cleaned up that code a lot)
[xonotic/darkplaces.git] / r_explosion.c
index 6922bb6e5c9b348c235507d76ac19319b5494f71..f46fe6482b4d9b6af5b2b72e81246489cf4d2d94 100644 (file)
@@ -77,7 +77,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 +169,11 @@ void R_NewExplosion(vec3_t org)
 {
        int i, j;
        float dist;
-       byte noise[EXPLOSIONGRID*EXPLOSIONGRID];
+       qbyte noise[EXPLOSIONGRID*EXPLOSIONGRID];
        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;
@@ -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++)