+void R_DrawParticles (void)
+{
+ particle_t *p;
+ int i, dynamiclight, staticlight, r, g, b;
+ byte br, bg, bb, ba;
+ float scale, scale2, minparticledist;
+ byte *color24;
+ vec3_t uprightangles, up2, right2, tempcolor, corner;
+ mleaf_t *leaf;
+
+ // LordHavoc: early out condition
+ if ((!numparticles) || (!r_drawparticles.value))
+ return;
+
+ staticlight = dynamiclight = r_particles_lighting.value;
+ if (!r_dynamic.value)
+ dynamiclight = 0;
+ c_particles += numparticles;
+
+ uprightangles[0] = 0;
+ uprightangles[1] = r_refdef.viewangles[1];
+ uprightangles[2] = 0;
+ AngleVectors (uprightangles, NULL, right2, up2);
+
+ minparticledist = DotProduct(r_refdef.vieworg, vpn) + 16.0f;
+
+ for (i = 0, p = particles;i < numparticles;i++, p++)
+ {
+ // LordHavoc: unnecessary (array was already compacted)
+// if (p->die < cl.time)
+// continue;
+
+ // LordHavoc: only render if not too close
+ 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;
+
+ /*
+ if (p->type == pt_decal)
+ {
+ VectorSubtract(p->org, r_refdef.vieworg, v);
+ if (DotProduct(p->direction, v) < 0)
+ continue;
+ }
+ */
+
+ color24 = (byte *) &d_8to24table[(int)p->color];
+ r = color24[0];
+ g = color24[1];
+ b = color24[2];
+ if (staticlight && (p->dynlight || staticlight >= 2)) // LordHavoc: only light blood and smoke
+ {
+ R_CompleteLightPoint(tempcolor, p->org, dynamiclight);
+ r = (r * (int) tempcolor[0]) >> 7;
+ g = (g * (int) tempcolor[1]) >> 7;
+ b = (b * (int) tempcolor[2]) >> 7;
+ }
+ br = (byte) min(r, 255);
+ bg = (byte) min(g, 255);
+ bb = (byte) min(b, 255);
+ ba = (byte) p->alpha;
+ transpolybegin(R_GetTexture(p->tex), 0, R_GetTexture(p->tex), p->rendermode);
+ scale = p->scale * -0.5;scale2 = p->scale;
+ /*
+ if (p->type == pt_decal)
+ {
+ corner[0] = p->org[0] + p->decalup[0]*scale + p->decalright[0]*scale;
+ corner[1] = p->org[1] + p->decalup[1]*scale + p->decalright[1]*scale;
+ corner[2] = p->org[2] + p->decalup[2]*scale + p->decalright[2]*scale;
+ transpolyvertub(corner[0] , corner[1] , corner[2] , 0,1,br,bg,bb,ba);
+ transpolyvertub(corner[0] + p->decalup[0]*scale2 , corner[1] + p->decalup[1]*scale2 , corner[2] + p->decalup[2]*scale2 , 0,0,br,bg,bb,ba);
+ transpolyvertub(corner[0] + p->decalup[0]*scale2 + p->decalright[0]*scale2, corner[1] + p->decalup[1]*scale2 + p->decalright[1]*scale2, corner[2] + p->decalup[2]*scale2 + p->decalright[2]*scale2, 1,0,br,bg,bb,ba);
+ transpolyvertub(corner[0] + p->decalright[0]*scale2, corner[1] + p->decalright[1]*scale2, corner[2] + p->decalright[2]*scale2, 1,1,br,bg,bb,ba);
+ }
+ else*/ if (p->tex == rainparticletexture) // rain streak
+ {
+ corner[0] = p->org[0] + up2[0]*scale + right2[0]*scale;
+ corner[1] = p->org[1] + up2[1]*scale + right2[1]*scale;
+ corner[2] = p->org[2] + up2[2]*scale + right2[2]*scale;
+ transpolyvertub(corner[0] , corner[1] , corner[2] , 0,1,br,bg,bb,ba);
+ transpolyvertub(corner[0] + up2[0]*scale2 , corner[1] + up2[1]*scale2 , corner[2] + up2[2]*scale2 , 0,0,br,bg,bb,ba);
+ transpolyvertub(corner[0] + up2[0]*scale2 + right2[0]*scale2, corner[1] + up2[1]*scale2 + right2[1]*scale2, corner[2] + up2[2]*scale2 + right2[2]*scale2, 1,0,br,bg,bb,ba);
+ transpolyvertub(corner[0] + right2[0]*scale2, corner[1] + right2[1]*scale2, corner[2] + right2[2]*scale2, 1,1,br,bg,bb,ba);
+ }
+ else
+ {
+ corner[0] = p->org[0] + vup[0]*scale + vright[0]*scale;
+ corner[1] = p->org[1] + vup[1]*scale + vright[1]*scale;
+ corner[2] = p->org[2] + vup[2]*scale + vright[2]*scale;
+ transpolyvertub(corner[0] , corner[1] , corner[2] , 0,1,br,bg,bb,ba);
+ transpolyvertub(corner[0] + vup[0]*scale2 , corner[1] + vup[1]*scale2 , corner[2] + vup[2]*scale2 , 0,0,br,bg,bb,ba);
+ transpolyvertub(corner[0] + vup[0]*scale2 + vright[0]*scale2, corner[1] + vup[1]*scale2 + vright[1]*scale2, corner[2] + vup[2]*scale2 + vright[2]*scale2, 1,0,br,bg,bb,ba);
+ transpolyvertub(corner[0] + vright[0]*scale2, corner[1] + vright[1]*scale2, corner[2] + vright[2]*scale2, 1,1,br,bg,bb,ba);
+ }
+ transpolyend();
+ }
+}