+ 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.transparent = false;
+ 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;
+