]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_particles.c
Added the DP_HALFLIFE_SPRITE QC extension
[xonotic/darkplaces.git] / cl_particles.c
index 543d41476c11d8601e9a58424808e0074641ce5b..f125cf2cd249b2b5af44dbf1a1ecab0ee4687efb 100644 (file)
@@ -324,10 +324,6 @@ cvar_t cl_decals = {CVAR_SAVE, "cl_decals", "0"};
 cvar_t cl_decals_time = {CVAR_SAVE, "cl_decals_time", "0"};
 cvar_t cl_decals_fadetime = {CVAR_SAVE, "cl_decals_fadetime", "20"};
 
-#ifndef WORKINGLQUAKE
-static mempool_t *cl_part_mempool;
-#endif
-
 void CL_Particles_Clear(void)
 {
        cl_numparticles = 0;
@@ -383,8 +379,7 @@ void CL_Particles_Init (void)
 #ifdef WORKINGLQUAKE
        particles = (particle_t *) Hunk_AllocName(cl_maxparticles * sizeof(particle_t), "particles");
 #else
-       cl_part_mempool = Mem_AllocPool("CL_Part", 0, NULL);
-       particles = (particle_t *) Mem_Alloc(cl_part_mempool, cl_maxparticles * sizeof(particle_t));
+       particles = (particle_t *) Mem_Alloc(cl_mempool, cl_maxparticles * sizeof(particle_t));
 #endif
        CL_Particles_Clear();
 }
@@ -393,8 +388,6 @@ void CL_Particles_Shutdown (void)
 {
 #ifdef WORKINGLQUAKE
        // No clue what to do here...
-#else
-       Mem_FreePool (&cl_part_mempool);
 #endif
 }
 
@@ -1493,7 +1486,7 @@ void CL_MoveParticles (void)
                                break;
                        case pt_decal:
                                // FIXME: this has fairly wacky handling of alpha
-                               p->alphafade = cl.time > (p->time2 + cl_decals_time.value) ? (p->alpha / cl_decals_fadetime.value) : 0;
+                               p->alphafade = cl.time > (p->time2 + cl_decals_time.value) ? (255 / cl_decals_fadetime.value) : 0;
 #ifndef WORKINGLQUAKE
                                if (p->owner->model == p->ownermodel)
                                {
@@ -1637,11 +1630,43 @@ void particletextureinvert(qbyte *data)
        }
 }
 
+// Those loops are in a separate function to work around an optimization bug in Mac OS X's GCC
+static void R_InitBloodTextures (qbyte *particletexturedata)
+{
+       int i, j, k, m;
+       qbyte data[PARTICLETEXTURESIZE][PARTICLETEXTURESIZE][4];
+
+       // blood particles
+       for (i = 0;i < 8;i++)
+       {
+               memset(&data[0][0][0], 255, sizeof(data));
+               for (k = 0;k < 24;k++)
+                       particletextureblotch(&data[0][0][0], PARTICLETEXTURESIZE/16, 96, 0, 0, 160);
+               //particletextureclamp(&data[0][0][0], 32, 32, 32, 255, 255, 255);
+               particletextureinvert(&data[0][0][0]);
+               setuptex(tex_bloodparticle[i], &data[0][0][0], particletexturedata);
+       }
+
+       // blood decals
+       for (i = 0;i < 8;i++)
+       {
+               memset(&data[0][0][0], 255, sizeof(data));
+               m = 8;
+               for (j = 1;j < 10;j++)
+                       for (k = min(j, m - 1);k < m;k++)
+                               particletextureblotch(&data[0][0][0], (float)j*PARTICLETEXTURESIZE/64.0f, 96, 0, 0, 192 - j * 8);
+               //particletextureclamp(&data[0][0][0], 32, 32, 32, 255, 255, 255);
+               particletextureinvert(&data[0][0][0]);
+               setuptex(tex_blooddecal[i], &data[0][0][0], particletexturedata);
+       }
+
+}
+
 static void R_InitParticleTexture (void)
 {
-       int x, y, d, i, j, k, m;
+       int x, y, d, i, k, m;
        float dx, dy, radius, f, f2;
-       qbyte data[PARTICLETEXTURESIZE][PARTICLETEXTURESIZE][4], noise1[PARTICLETEXTURESIZE*2][PARTICLETEXTURESIZE*2], noise2[PARTICLETEXTURESIZE*2][PARTICLETEXTURESIZE*2], noise3[64][64], data2[64][16][4];
+       qbyte data[PARTICLETEXTURESIZE][PARTICLETEXTURESIZE][4], noise3[64][64], data2[64][16][4];
        vec3_t light;
        qbyte *particletexturedata;
 
@@ -1663,6 +1688,8 @@ static void R_InitParticleTexture (void)
                memset(&data[0][0][0], 255, sizeof(data));
                do
                {
+                       qbyte noise1[PARTICLETEXTURESIZE*2][PARTICLETEXTURESIZE*2], noise2[PARTICLETEXTURESIZE*2][PARTICLETEXTURESIZE*2];
+
                        fractalnoise(&noise1[0][0], PARTICLETEXTURESIZE*2, PARTICLETEXTURESIZE/8);
                        fractalnoise(&noise2[0][0], PARTICLETEXTURESIZE*2, PARTICLETEXTURESIZE/4);
                        m = 0;
@@ -1759,29 +1786,8 @@ static void R_InitParticleTexture (void)
        }
        setuptex(tex_bubble, &data[0][0][0], particletexturedata);
 
-       // blood particles
-       for (i = 0;i < 8;i++)
-       {
-               memset(&data[0][0][0], 255, sizeof(data));
-               for (k = 0;k < 24;k++)
-                       particletextureblotch(&data[0][0][0], PARTICLETEXTURESIZE/16, 96, 0, 0, 160);
-               //particletextureclamp(&data[0][0][0], 32, 32, 32, 255, 255, 255);
-               particletextureinvert(&data[0][0][0]);
-               setuptex(tex_bloodparticle[i], &data[0][0][0], particletexturedata);
-       }
-
-       // blood decals
-       for (i = 0;i < 8;i++)
-       {
-               memset(&data[0][0][0], 255, sizeof(data));
-               m = 8;
-               for (j = 1;j < 10;j++)
-                       for (k = min(j, m - 1);k < m;k++)
-                               particletextureblotch(&data[0][0][0], (float)j*PARTICLETEXTURESIZE/64.0f, 96, 0, 0, 192 - j * 8);
-               //particletextureclamp(&data[0][0][0], 32, 32, 32, 255, 255, 255);
-               particletextureinvert(&data[0][0][0]);
-               setuptex(tex_blooddecal[i], &data[0][0][0], particletexturedata);
-       }
+       // Blood particles and blood decals
+       R_InitBloodTextures (particletexturedata);
 
        // bullet decals
        for (i = 0;i < 8;i++)
@@ -1911,7 +1917,7 @@ void R_DrawParticleCallback(const void *calldata1, int calldata2)
                ca = 1;
        }
 #ifndef WORKINGLQUAKE
-       else if (fogenabled)
+       if (fogenabled)
        {
                VectorSubtract(org, r_vieworigin, fogvec);
                fog = exp(fogdensity/DotProduct(fogvec,fogvec));
@@ -2024,7 +2030,7 @@ void R_DrawParticleCallback(const void *calldata1, int calldata2)
        glTexCoord2f(particle_texcoord2f[6], particle_texcoord2f[7]);glVertex3f(particle_vertex3f[ 9], particle_vertex3f[10], particle_vertex3f[11]);
        glEnd();
 #else
-       R_Mesh_Draw(4, 2, polygonelements);
+       R_Mesh_Draw(0, 4, 2, polygonelements);
 #endif
 }