]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_particles.c
collision.h doesn't need winding.h anymore
[xonotic/darkplaces.git] / cl_particles.c
index 49e28d9a63fb3206815d401b2fde8c830b21ccd1..477ba5f56b8672a42f72ca2171512be6b0e7fa4b 100644 (file)
@@ -173,6 +173,7 @@ float CL_TraceLine (vec3_t start, vec3_t end, vec3_t impact, vec3_t normal, int
 }
 #else
 #include "cl_collision.h"
+#include "image.h"
 #endif
 
 #define MAX_PARTICLES                  32768   // default max # of particles at one time
@@ -180,7 +181,7 @@ float CL_TraceLine (vec3_t start, vec3_t end, vec3_t impact, vec3_t normal, int
 
 typedef enum
 {
-       pt_dead, pt_static, pt_rain, pt_bubble, pt_blood, pt_grow, pt_decal, pt_decalfade
+       pt_dead, pt_static, pt_rain, pt_bubble, pt_blood, pt_grow, pt_decal, pt_decalfade, pt_ember
 }
 ptype_t;
 
@@ -310,6 +311,7 @@ void CL_Particles_Clear(void)
 {
        cl_numparticles = 0;
        cl_freeparticle = 0;
+       memset(particles, 0, sizeof(particle_t) * cl_maxparticles);
 }
 
 /*
@@ -355,11 +357,10 @@ 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");
+       cl_part_mempool = Mem_AllocPool("CL_Part", 0, NULL);
        particles = (particle_t *) Mem_Alloc(cl_part_mempool, cl_maxparticles * sizeof(particle_t));
 #endif
-       cl_numparticles = 0;
-       cl_freeparticle = 0;
+       CL_Particles_Clear();
 }
 
 // list of all 26 parameters:
@@ -641,7 +642,7 @@ CL_ParticleExplosion
 */
 void CL_ParticleExplosion (vec3_t org)
 {
-       int i, k;
+       int i;
        //vec3_t v;
        //vec3_t v2;
        if (cl_stainmaps.integer)
@@ -684,19 +685,31 @@ void CL_ParticleExplosion (vec3_t org)
                }
                */
 
+#if 1
+               if (cl_particles.integer && cl_particles_sparks.integer)
+                       for (i = 0;i < 128 * cl_particles_quality.value;i++)
+                               particle(pt_static, PARTICLE_SPARK, 0x903010, 0xFFD030, tex_particle, false, PBLEND_ADD, 1.0f, 0.02f, (1.0f / cl_particles_quality.value) * lhrandom(0, 255), (1.0f / cl_particles_quality.value) * 512, 9999, 1, 0, org[0], org[1], org[2], lhrandom(-256, 256), lhrandom(-256, 256), lhrandom(-256, 256) + 80, 0, 0, 0, 0, 0.2, 0);
+       }
+
+       //if (cl_explosions.integer)
+       //      R_NewExplosion(org);
+#elif 1
+               if (cl_particles.integer && cl_particles_sparks.integer)
+                       for (i = 0;i < 64 * cl_particles_quality.value;i++)
+                               particle(pt_ember, PARTICLE_SPARK, 0x903010, 0xFFD030, tex_particle, false, PBLEND_ADD, 1.0f, 0.01f, (1.0f / cl_particles_quality.value) * lhrandom(0, 255), (1.0f / cl_particles_quality.value) * 256, 9999, 0.7, 0, org[0], org[1], org[2], lhrandom(-256, 256), lhrandom(-256, 256), lhrandom(-256, 256) + 80, cl.time, 0, 0, 0, 0, 0);
+       }
+
+       //if (cl_explosions.integer)
+       //      R_NewExplosion(org);
+#else
                if (cl_particles.integer && cl_particles_sparks.integer)
-               {
-                       // sparks
                        for (i = 0;i < 256 * cl_particles_quality.value;i++)
-                       {
-                               k = particlepalette[0x68 + (rand() & 7)];
-                               particle(pt_static, PARTICLE_SPARK, k, k, tex_particle, false, PBLEND_ADD, 1.5f, 0.05f, (1.0f / cl_particles_quality.value) * lhrandom(0, 255), (1.0f / cl_particles_quality.value) * 512, 9999, 1, 0, org[0], org[1], org[2], lhrandom(-192, 192), lhrandom(-192, 192), lhrandom(-192, 192) + 160, 0, 0, 0, 0, 0.2, 0);
-                       }
-               }
+                               particle(pt_static, PARTICLE_SPARK, 0x903010, 0xFFD030, tex_particle, false, PBLEND_ADD, 1.5f, 0.05f, (1.0f / cl_particles_quality.value) * lhrandom(0, 255), (1.0f / cl_particles_quality.value) * 512, 9999, 1, 0, org[0], org[1], org[2], lhrandom(-192, 192), lhrandom(-192, 192), lhrandom(-192, 192) + 160, 0, 0, 0, 0, 0.2, 0);
        }
 
        if (cl_explosions.integer)
                R_NewExplosion(org);
+#endif
 }
 
 /*
@@ -710,6 +723,7 @@ void CL_ParticleExplosion2 (vec3_t org, int colorStart, int colorLength)
        vec3_t vel;
        vec3_t offset;
        int i, k;
+       float pscale;
        if (!cl_particles.integer) return;
 
        for (i = 0;i < 512 * cl_particles_quality.value;i++)
@@ -718,7 +732,8 @@ void CL_ParticleExplosion2 (vec3_t org, int colorStart, int colorLength)
                VectorScale (offset, 192, vel);
                VectorScale (offset, 8, offset);
                k = particlepalette[colorStart + (i % colorLength)];
-               particle(pt_static, PARTICLE_BILLBOARD, k, k, tex_particle, false, PBLEND_ALPHA, 1.5, 1.5, (1.0f / cl_particles_quality.value) * 255, (1.0f / cl_particles_quality.value) * 384, 0.3, 0, 0, org[0] + offset[0], org[1] + offset[1], org[2] + offset[2], vel[0], vel[1], vel[2], 0, 0, 0, 0, 1, 0);
+               pscale = lhrandom(0.5, 1.5);
+               particle(pt_static, PARTICLE_BILLBOARD, k, k, tex_particle, false, PBLEND_ADD, pscale, pscale, (1.0f / cl_particles_quality.value) * 255, (1.0f/cl_particles_quality.value)*512, 9999, 0, 0, org[0] + offset[0], org[1] + offset[1], org[2] + offset[2], vel[0], vel[1], vel[2], 0, 0, 0, 0, lhrandom(1.5, 3), 0);
        }
 }
 
@@ -1183,6 +1198,8 @@ void CL_RocketTrail (vec3_t start, vec3_t end, int type, entity_t *ent)
                                {
                                        if (gamemode == GAME_GOODVSBAD2)
                                                particle(pt_static, PARTICLE_BILLBOARD, particlepalette[0 + (rand()&255)], particlepalette[0 + (rand()&255)], tex_particle, false, PBLEND_ALPHA, 6, 6, qd*255, qd*384, 9999, 0, 0, pos[0], pos[1], pos[2], lhrandom(-8, 8), lhrandom(-8, 8), lhrandom(-8, 8), 0, 0, 0, 0, 0, 0);
+                                       else if (gamemode == GAME_PRYDON)
+                                               particle(pt_static, PARTICLE_BILLBOARD, 0x103040, 0x204050, tex_particle, false, PBLEND_ADD, 6, 6, qd*128, qd*384, 9999, 0, 0, pos[0], pos[1], pos[2], lhrandom(-8, 8), lhrandom(-8, 8), lhrandom(-8, 8), 0, 0, 0, 0, 0, 0);
                                        else
                                                particle(pt_static, PARTICLE_BILLBOARD, 0x502030, 0x502030, tex_particle, false, PBLEND_ADD, 6, 6, qd*128, qd*384, 9999, 0, 0, pos[0], pos[1], pos[2], lhrandom(-8, 8), lhrandom(-8, 8), lhrandom(-8, 8), 0, 0, 0, 0, 0, 0);
                                }
@@ -1290,11 +1307,12 @@ void CL_MoveParticles (void)
        entity_render_t *hitent;
 #endif
 
-       cl_freeparticle = 0;
-
        // LordHavoc: early out condition
        if (!cl_numparticles)
+       {
+               cl_freeparticle = 0;
                return;
+       }
 
 #ifdef WORKINGLQUAKE
        frametime = cl.frametime;
@@ -1465,6 +1483,13 @@ void CL_MoveParticles (void)
                                        p->type = pt_dead;
 #endif
                                break;
+                       case pt_ember:
+                               while (cl.time > p->time2)
+                               {
+                                       p->time2 += 0.025;
+                                       particle(pt_static, PARTICLE_SPARK, 0x903010, 0xFFD030, tex_particle, false, PBLEND_ADD, p->scalex * 0.75, p->scaley * 0.75, p->alpha, p->alphafade, 9999, 0.5, 0, p->org[0], p->org[1], p->org[2], p->vel[0] * lhrandom(0.4, 0.6), p->vel[1] * lhrandom(0.4, 0.6), p->vel[2] * lhrandom(0.4, 0.6), 0, 0, 0, 0, 0, 0);
+                               }
+                               break;
                        default:
                                Con_Printf("unknown particle type %i\n", p->type);
                                p->type = pt_dead;
@@ -1473,6 +1498,7 @@ void CL_MoveParticles (void)
                }
        }
        cl_numparticles = maxparticle + 1;
+       cl_freeparticle = 0;
 }
 
 #define MAX_PARTICLETEXTURES 64
@@ -1733,11 +1759,13 @@ static void R_InitParticleTexture (void)
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 #else
-       particlefonttexture = R_LoadTexture2D(particletexturepool, "particlefont", 256, 256, particletexturedata, TEXTYPE_RGBA, TEXF_ALPHA | TEXF_PRECACHE, NULL);
+       particlefonttexture = loadtextureimage(particletexturepool, "particles/particlefont.tga", 0, 0, false, TEXF_ALPHA | TEXF_PRECACHE);
+       if (!particlefonttexture)
+               particlefonttexture = R_LoadTexture2D(particletexturepool, "particlefont", 256, 256, particletexturedata, TEXTYPE_RGBA, TEXF_ALPHA | TEXF_PRECACHE, NULL);
        for (i = 0;i < MAX_PARTICLETEXTURES;i++)
                particletexture[i].texture = particlefonttexture;
 
-       // beam
+       // nexbeam
        fractalnoise(&noise1[0][0], 64, 4);
        m = 0;
        for (y = 0;y < 64;y++)
@@ -1754,7 +1782,9 @@ static void R_InitParticleTexture (void)
                }
        }
 
-       particletexture[tex_beam].texture = R_LoadTexture2D(particletexturepool, "beam", 16, 64, &data2[0][0][0], TEXTYPE_RGBA, TEXF_PRECACHE, NULL);
+       particletexture[tex_beam].texture = loadtextureimage(particletexturepool, "particles/nexbeam.tga", 0, 0, false, TEXF_ALPHA | TEXF_PRECACHE);
+       if (!particletexture[tex_beam].texture)
+               particletexture[tex_beam].texture = R_LoadTexture2D(particletexturepool, "nexbeam", 16, 64, &data2[0][0][0], TEXTYPE_RGBA, TEXF_PRECACHE, NULL);
        particletexture[tex_beam].s1 = 0;
        particletexture[tex_beam].t1 = 0;
        particletexture[tex_beam].s2 = 1;