+ qglColorMask(0,0,0,0);
+ qglEnable(GL_STENCIL_TEST);
+ // increment stencil if backface is behind depthbuffer
+ qglCullFace(GL_BACK); // quake is backwards, this culls front faces
+ qglStencilOp(GL_KEEP, GL_INCR, GL_KEEP);
+ R_Mesh_Draw(numverts * 2, tris, shadowelements);
+ // decrement stencil if frontface is infront of depthbuffer
+ qglCullFace(GL_FRONT); // quake is backwards, this culls back faces
+ qglStencilOp(GL_KEEP, GL_DECR, GL_KEEP);
+ R_Mesh_Draw(numverts * 2, tris, shadowelements);
+ // restore to normal quake rendering
+ qglDisable(GL_STENCIL_TEST);
+ qglStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
+ qglColorMask(1,1,1,1);
+ }
+}
+
+void R_Shadow_VertexLight(int numverts, float *normals, vec3_t relativelightorigin, float lightradius2, float lightdistbias, float lightsubtract, float *lightcolor)
+{
+ int i;
+ float *n, *v, *c, f, dist, temp[3];
+ // calculate vertex colors
+ for (i = 0, v = varray_vertex, c = varray_color, n = normals;i < numverts;i++, v += 4, c += 4, n += 3)
+ {
+ VectorSubtract(relativelightorigin, v, temp);
+ c[0] = 0;
+ c[1] = 0;
+ c[2] = 0;
+ c[3] = 1;
+ f = DotProduct(n, temp);
+ if (f > 0)
+ {
+ dist = DotProduct(temp, temp);
+ if (dist < lightradius2)
+ {
+ f = ((1.0f / (dist + lightdistbias)) - lightsubtract) * (f / sqrt(dist));
+ c[0] = f * lightcolor[0];
+ c[1] = f * lightcolor[1];
+ c[2] = f * lightcolor[2];
+ }
+ }