]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_particles.c
got rid of lots of unnecessary m.transparent = lines, as well as some depthdisable...
[xonotic/darkplaces.git] / cl_particles.c
index 90d0de161bcb4f3881911967513ed076582ac9a6..be86db568bf96f0d113f6590e21679ea30b02eb8 100644 (file)
@@ -1183,30 +1183,146 @@ void R_Particles_Init (void)
 
 int partindexarray[6] = {0, 1, 2, 0, 2, 3};
 
-void R_DrawParticles (void)
+void R_DrawParticleCallback(void *calldata1, int calldata2)
 {
-       int i, lighting, dynlight, additive, texnum, orientation;
-       float minparticledist, org[3], uprightangles[3], up2[3], right2[3], v[3], right[3], up[3], fog, ifog, fogvec[3], cr, cg, cb, ca;
-       mleaf_t *leaf;
+       int lighting, dynlight, additive, texnum, orientation;
+       float org[3], up2[3], right2[3], v[3], right[3], up[3], fog, ifog, fogvec[3], cr, cg, cb, ca;
        particletexture_t *tex;
+       mleaf_t *leaf;
        rmeshbufferinfo_t m;
        particle_t *p;
 
+       p = calldata1;
+
+       // LordHavoc: check if it's in a visible leaf
+       leaf = Mod_PointInLeaf(p->org, cl.worldmodel);
+       if (leaf->visframe != r_framecount)
+               return;
+
+       lighting = r_dynamic.integer ? r_particles_lighting.integer : 0;
+
+       VectorCopy(p->org, org);
+       orientation = (p->flags >> P_ORIENTATION_FIRSTBIT) & ((1 << P_ORIENTATION_BITS) - 1);
+       texnum = (p->flags >> P_TEXNUM_FIRSTBIT) & ((1 << P_TEXNUM_BITS) - 1);
+       dynlight = p->flags & P_DYNLIGHT;
+       additive = p->flags & P_ADDITIVE;
+       if (orientation == PARTICLE_BILLBOARD)
+       {
+               VectorScale(vright, p->scalex, right);
+               VectorScale(vup, p->scaley, up);
+       }
+       else if (orientation == PARTICLE_UPRIGHT_FACING)
+       {
+               v[0] = r_origin[0] - org[0];
+               v[1] = r_origin[1] - org[1];
+               v[2] = 0;
+               VectorNormalizeFast(v);
+               VectorVectors(v, right2, up2);
+               VectorScale(right2, p->scalex, right);
+               VectorScale(up2, p->scaley, up);
+       }
+       else if (orientation == PARTICLE_ORIENTED_DOUBLESIDED)
+       {
+               // double-sided
+               if (DotProduct(p->vel2, r_origin) > DotProduct(p->vel2, org))
+               {
+                       VectorNegate(p->vel2, v);
+                       VectorVectors(v, right, up);
+               }
+               else
+                       VectorVectors(p->vel2, right, up);
+               VectorScale(right, p->scalex, right);
+               VectorScale(up, p->scaley, up);
+       }
+       else
+               Host_Error("R_DrawParticles: unknown particle orientation %i\n", orientation);
+
+       cr = p->color[0] * (1.0f / 255.0f);
+       cg = p->color[1] * (1.0f / 255.0f);
+       cb = p->color[2] * (1.0f / 255.0f);
+       ca = p->alpha * (1.0f / 255.0f);
+       if (lighting >= 1 && (dynlight || lighting >= 2))
+       {
+               R_CompleteLightPoint(v, org, true, leaf);
+               cr *= v[0];
+               cg *= v[1];
+               cb *= v[2];
+       }
+
+       if (fogenabled)
+       {
+               VectorSubtract(org, r_origin, fogvec);
+               fog = exp(fogdensity/DotProduct(fogvec,fogvec));
+               ifog = 1 - fog;
+               cr = cr * ifog;
+               cg = cg * ifog;
+               cb = cb * ifog;
+               if (!additive)
+               {
+                       cr += fogcolor[0] * fog;
+                       cg += fogcolor[1] * fog;
+                       cb += fogcolor[2] * fog;
+               }
+       }
+
+       memset(&m, 0, sizeof(m));
+       m.blendfunc1 = GL_SRC_ALPHA;
+       if (additive)
+               m.blendfunc2 = GL_ONE;
+       else
+               m.blendfunc2 = GL_ONE_MINUS_SRC_ALPHA;
+       m.numtriangles = 2;
+       m.numverts = 4;
+       m.tex[0] = R_GetTexture(particlefonttexture);
+       if (R_Mesh_Draw_GetBuffer(&m, false))
+       {
+               m.index[0] = 0;
+               m.index[1] = 1;
+               m.index[2] = 2;
+               m.index[3] = 0;
+               m.index[4] = 2;
+               m.index[5] = 3;
+               m.vertex[0] = org[0] - right[0] - up[0];
+               m.vertex[1] = org[1] - right[1] - up[1];
+               m.vertex[2] = org[2] - right[2] - up[2];
+               m.vertex[4] = org[0] - right[0] + up[0];
+               m.vertex[5] = org[1] - right[1] + up[1];
+               m.vertex[6] = org[2] - right[2] + up[2];
+               m.vertex[8] = org[0] + right[0] + up[0];
+               m.vertex[9] = org[1] + right[1] + up[1];
+               m.vertex[10] = org[2] + right[2] + up[2];
+               m.vertex[12] = org[0] + right[0] - up[0];
+               m.vertex[13] = org[1] + right[1] - up[1];
+               m.vertex[14] = org[2] + right[2] - up[2];
+               tex = &particletexture[texnum];
+               m.texcoords[0][0] = tex->s1;
+               m.texcoords[0][1] = tex->t1;
+               m.texcoords[0][2] = tex->s1;
+               m.texcoords[0][3] = tex->t2;
+               m.texcoords[0][4] = tex->s2;
+               m.texcoords[0][5] = tex->t2;
+               m.texcoords[0][6] = tex->s2;
+               m.texcoords[0][7] = tex->t1;
+               m.color[0] = m.color[4] = m.color[8] = m.color[12] = cr * m.colorscale;
+               m.color[1] = m.color[5] = m.color[9] = m.color[13] = cg * m.colorscale;
+               m.color[2] = m.color[6] = m.color[10] = m.color[14] = cb * m.colorscale;
+               m.color[3] = m.color[7] = m.color[11] = m.color[15] = ca;
+               R_Mesh_Render();
+       }
+}
+
+void R_DrawParticles (void)
+{
+       int i;
+       float minparticledist;
+       particle_t *p;
+
        // LordHavoc: early out conditions
        if ((!cl_numparticles) || (!r_drawparticles.integer))
                return;
 
-       lighting = r_particles_lighting.integer;
-       if (!r_dynamic.integer)
-               lighting = 0;
-
        c_particles += cl_numparticles;
 
-       uprightangles[0] = 0;
-       uprightangles[1] = r_refdef.viewangles[1];
-       uprightangles[2] = 0;
-       AngleVectors (uprightangles, NULL, right2, up2);
-
        minparticledist = DotProduct(r_origin, vpn) + 16.0f;
 
        for (i = 0, p = particles;i < cl_numparticles;i++, p++)
@@ -1215,115 +1331,7 @@ void R_DrawParticles (void)
                if (DotProduct(p->org, vpn) < minparticledist)
                        continue;
 
-               // LordHavoc: check if it's in a visible leaf
-               leaf = Mod_PointInLeaf(p->org, cl.worldmodel);
-               if (leaf->visframe != r_framecount)
-                       continue;
-
-               VectorCopy(p->org, org);
-               orientation = (p->flags >> P_ORIENTATION_FIRSTBIT) & ((1 << P_ORIENTATION_BITS) - 1);
-               texnum = (p->flags >> P_TEXNUM_FIRSTBIT) & ((1 << P_TEXNUM_BITS) - 1);
-               dynlight = p->flags & P_DYNLIGHT;
-               additive = p->flags & P_ADDITIVE;
-               if (orientation == PARTICLE_BILLBOARD)
-               {
-                       VectorScale(vright, p->scalex, right);
-                       VectorScale(vup, p->scaley, up);
-               }
-               else if (orientation == PARTICLE_UPRIGHT_FACING)
-               {
-                       VectorScale(right2, p->scalex, right);
-                       VectorScale(up2, p->scaley, up);
-               }
-               else if (orientation == PARTICLE_ORIENTED_DOUBLESIDED)
-               {
-                       // double-sided
-                       if (DotProduct(p->vel2, r_origin) > DotProduct(p->vel2, org))
-                       {
-                               VectorNegate(p->vel2, v);
-                               VectorVectors(v, right, up);
-                       }
-                       else
-                               VectorVectors(p->vel2, right, up);
-                       VectorScale(right, p->scalex, right);
-                       VectorScale(up, p->scaley, up);
-               }
-               else
-                       Host_Error("R_DrawParticles: unknown particle orientation %i\n", orientation);
-
-               tex = &particletexture[texnum];
-
-               cr = p->color[0] * (1.0f / 255.0f);
-               cg = p->color[1] * (1.0f / 255.0f);
-               cb = p->color[2] * (1.0f / 255.0f);
-               ca = p->alpha * (1.0f / 255.0f);
-               if (lighting >= 1 && (dynlight || lighting >= 2))
-               {
-                       R_CompleteLightPoint(v, org, true, leaf);
-                       cr *= v[0];
-                       cg *= v[1];
-                       cb *= v[2];
-               }
-
-               if (fogenabled)
-               {
-                       VectorSubtract(org, r_origin, fogvec);
-                       fog = exp(fogdensity/DotProduct(fogvec,fogvec));
-                       ifog = 1 - fog;
-                       cr = cr * ifog;
-                       cg = cg * ifog;
-                       cb = cb * ifog;
-                       if (!additive)
-                       {
-                               cr += fogcolor[0] * fog;
-                               cg += fogcolor[1] * fog;
-                               cb += fogcolor[2] * fog;
-                       }
-               }
-
-               memset(&m, 0, sizeof(m));
-               m.transparent = true;
-               m.blendfunc1 = GL_SRC_ALPHA;
-               if (additive)
-                       m.blendfunc2 = GL_ONE;
-               else
-                       m.blendfunc2 = GL_ONE_MINUS_SRC_ALPHA;
-               m.numtriangles = 2;
-               m.numverts = 4;
-               m.tex[0] = R_GetTexture(particlefonttexture);
-               if (R_Mesh_Draw_GetBuffer(&m))
-               {
-                       m.index[0] = 0;
-                       m.index[1] = 1;
-                       m.index[2] = 2;
-                       m.index[3] = 0;
-                       m.index[4] = 2;
-                       m.index[5] = 3;
-                       m.vertex[0] = org[0] - right[0] - up[0];
-                       m.vertex[1] = org[1] - right[1] - up[1];
-                       m.vertex[2] = org[2] - right[2] - up[2];
-                       m.vertex[4] = org[0] - right[0] + up[0];
-                       m.vertex[5] = org[1] - right[1] + up[1];
-                       m.vertex[6] = org[2] - right[2] + up[2];
-                       m.vertex[8] = org[0] + right[0] + up[0];
-                       m.vertex[9] = org[1] + right[1] + up[1];
-                       m.vertex[10] = org[2] + right[2] + up[2];
-                       m.vertex[12] = org[0] + right[0] - up[0];
-                       m.vertex[13] = org[1] + right[1] - up[1];
-                       m.vertex[14] = org[2] + right[2] - up[2];
-                       m.texcoords[0][0] = tex->s1;
-                       m.texcoords[0][1] = tex->t1;
-                       m.texcoords[0][2] = tex->s1;
-                       m.texcoords[0][3] = tex->t2;
-                       m.texcoords[0][4] = tex->s2;
-                       m.texcoords[0][5] = tex->t2;
-                       m.texcoords[0][6] = tex->s2;
-                       m.texcoords[0][7] = tex->t1;
-                       m.color[0] = m.color[4] = m.color[8] = m.color[12] = cr * m.colorscale;
-                       m.color[1] = m.color[5] = m.color[9] = m.color[13] = cg * m.colorscale;
-                       m.color[2] = m.color[6] = m.color[10] = m.color[14] = cb * m.colorscale;
-                       m.color[3] = m.color[7] = m.color[11] = m.color[15] = ca;
-               }
+               R_MeshQueue_AddTransparent(p->org, R_DrawParticleCallback, p, 0);
        }
 }