- if (specularscale && glosstexture != r_texture_black)
- {
- // FIXME: detect blendsquare!
- //if (gl_support_blendsquare)
- {
- colorscale = specularscale;
- GL_Color(1,1,1,1);
- if (r_shadow_texture3d.integer && r_textureunits.integer >= 2 && lightcubemap /*&& gl_support_blendsquare*/) // FIXME: detect blendsquare!
- {
- // 2/0/0/1/2 3D combine blendsquare path
- memset(&m, 0, sizeof(m));
- m.pointer_vertex = vertex3f;
- m.tex[0] = R_GetTexture(bumptexture);
- m.pointer_texcoord[0] = texcoord2f;
- m.texcubemap[1] = R_GetTexture(r_texture_normalizationcube);
- m.texcombinergb[1] = GL_DOT3_RGBA_ARB;
- m.pointer_texcoord3f[1] = varray_texcoord3f[1];
- R_Shadow_GenTexCoords_Specular_NormalCubeMap(varray_texcoord3f[1] + 3 * firstvertex, numvertices, vertex3f + 3 * firstvertex, svector3f + 3 * firstvertex, tvector3f + 3 * firstvertex, normal3f + 3 * firstvertex, relativelightorigin, relativeeyeorigin);
- R_Mesh_State(&m);
- GL_ColorMask(0,0,0,1);
- // this squares the result
- GL_BlendFunc(GL_SRC_ALPHA, GL_ZERO);
- GL_LockArrays(firstvertex, numvertices);
- R_Mesh_Draw(firstvertex, numvertices, numtriangles, elements);
- GL_LockArrays(0, 0);
- c_rt_lightmeshes++;
- c_rt_lighttris += numtriangles;
-
- memset(&m, 0, sizeof(m));
- m.pointer_vertex = vertex3f;
- R_Mesh_State(&m);
- GL_LockArrays(firstvertex, numvertices);
- // square alpha in framebuffer a few times to make it shiny
- GL_BlendFunc(GL_ZERO, GL_DST_ALPHA);
- // these comments are a test run through this math for intensity 0.5
- // 0.5 * 0.5 = 0.25 (done by the BlendFunc earlier)
- // 0.25 * 0.25 = 0.0625 (this is another pass)
- // 0.0625 * 0.0625 = 0.00390625 (this is another pass)
- R_Mesh_Draw(firstvertex, numvertices, numtriangles, elements);
- c_rt_lightmeshes++;
- c_rt_lighttris += numtriangles;
- R_Mesh_Draw(firstvertex, numvertices, numtriangles, elements);
- c_rt_lightmeshes++;
- c_rt_lighttris += numtriangles;
- GL_LockArrays(0, 0);
-
- memset(&m, 0, sizeof(m));
- m.pointer_vertex = vertex3f;
- m.tex3d[0] = R_GetTexture(r_shadow_attenuation3dtexture);
-#ifdef USETEXMATRIX
- m.pointer_texcoord3f[0] = vertex3f;
- m.texmatrix[0] = *matrix_modeltoattenuationxyz;
-#else
- m.pointer_texcoord3f[0] = varray_texcoord3f[0];
- R_Shadow_Transform_Vertex3f_TexCoord3f(varray_texcoord3f[0] + 3 * firstvertex, numvertices, vertex3f + 3 * firstvertex, matrix_modeltoattenuationxyz);
-#endif
- R_Mesh_State(&m);
- GL_BlendFunc(GL_DST_ALPHA, GL_ZERO);
- GL_LockArrays(firstvertex, numvertices);
- R_Mesh_Draw(firstvertex, numvertices, numtriangles, elements);
- GL_LockArrays(0, 0);
- c_rt_lightmeshes++;
- c_rt_lighttris += numtriangles;
-
- memset(&m, 0, sizeof(m));
- m.pointer_vertex = vertex3f;
- m.tex[0] = R_GetTexture(glosstexture);
- m.pointer_texcoord[0] = texcoord2f;
- if (lightcubemap)
- {
- m.texcubemap[1] = R_GetTexture(lightcubemap);
-#ifdef USETEXMATRIX
- m.pointer_texcoord3f[1] = vertex3f;
- m.texmatrix[1] = *matrix_modeltolight;
-#else
- m.pointer_texcoord3f[1] = varray_texcoord3f[1];
- R_Shadow_Transform_Vertex3f_TexCoord3f(varray_texcoord3f[1] + 3 * firstvertex, numvertices, vertex3f + 3 * firstvertex, matrix_modeltolight);
-#endif
- }
- GL_BlendFunc(GL_DST_ALPHA, GL_ONE);
- }
- else if (r_shadow_texture3d.integer && r_textureunits.integer >= 2 && !lightcubemap /*&& gl_support_blendsquare*/) // FIXME: detect blendsquare!
- {
- // 2/0/0/2 3D combine blendsquare path
- memset(&m, 0, sizeof(m));
- m.pointer_vertex = vertex3f;
- m.tex[0] = R_GetTexture(bumptexture);
- m.pointer_texcoord[0] = texcoord2f;
- m.texcubemap[1] = R_GetTexture(r_texture_normalizationcube);
- m.texcombinergb[1] = GL_DOT3_RGBA_ARB;
- m.pointer_texcoord3f[1] = varray_texcoord3f[1];
- R_Shadow_GenTexCoords_Specular_NormalCubeMap(varray_texcoord3f[1] + 3 * firstvertex, numvertices, vertex3f + 3 * firstvertex, svector3f + 3 * firstvertex, tvector3f + 3 * firstvertex, normal3f + 3 * firstvertex, relativelightorigin, relativeeyeorigin);
- R_Mesh_State(&m);
- GL_ColorMask(0,0,0,1);
- // this squares the result
- GL_BlendFunc(GL_SRC_ALPHA, GL_ZERO);
- GL_LockArrays(firstvertex, numvertices);
- R_Mesh_Draw(firstvertex, numvertices, numtriangles, elements);
- GL_LockArrays(0, 0);
- c_rt_lightmeshes++;
- c_rt_lighttris += numtriangles;
-
- memset(&m, 0, sizeof(m));
- m.pointer_vertex = vertex3f;
- R_Mesh_State(&m);
- GL_LockArrays(firstvertex, numvertices);
- // square alpha in framebuffer a few times to make it shiny
- GL_BlendFunc(GL_ZERO, GL_DST_ALPHA);
- // these comments are a test run through this math for intensity 0.5
- // 0.5 * 0.5 = 0.25 (done by the BlendFunc earlier)
- // 0.25 * 0.25 = 0.0625 (this is another pass)
- // 0.0625 * 0.0625 = 0.00390625 (this is another pass)
- R_Mesh_Draw(firstvertex, numvertices, numtriangles, elements);
- c_rt_lightmeshes++;
- c_rt_lighttris += numtriangles;
- R_Mesh_Draw(firstvertex, numvertices, numtriangles, elements);
- c_rt_lightmeshes++;
- c_rt_lighttris += numtriangles;
- GL_LockArrays(0, 0);
-
- memset(&m, 0, sizeof(m));
- m.pointer_vertex = vertex3f;
- m.tex[0] = R_GetTexture(glosstexture);
- m.pointer_texcoord[0] = texcoord2f;
- m.tex3d[1] = R_GetTexture(r_shadow_attenuation3dtexture);
-#ifdef USETEXMATRIX
- m.pointer_texcoord3f[1] = vertex3f;
- m.texmatrix[1] = *matrix_modeltoattenuationxyz;
-#else
- m.pointer_texcoord3f[1] = varray_texcoord3f[1];
- R_Shadow_Transform_Vertex3f_TexCoord3f(varray_texcoord3f[1] + 3 * firstvertex, numvertices, vertex3f + 3 * firstvertex, matrix_modeltoattenuationxyz);
-#endif
- GL_BlendFunc(GL_DST_ALPHA, GL_ONE);
- }
- else
- {
- // 2/0/0/2/2 2D combine blendsquare path
- memset(&m, 0, sizeof(m));
- m.pointer_vertex = vertex3f;
- m.tex[0] = R_GetTexture(bumptexture);
- m.pointer_texcoord[0] = texcoord2f;
- m.texcubemap[1] = R_GetTexture(r_texture_normalizationcube);
- m.texcombinergb[1] = GL_DOT3_RGBA_ARB;
- m.pointer_texcoord3f[1] = varray_texcoord3f[1];
- R_Shadow_GenTexCoords_Specular_NormalCubeMap(varray_texcoord3f[1] + 3 * firstvertex, numvertices, vertex3f + 3 * firstvertex, svector3f + 3 * firstvertex, tvector3f + 3 * firstvertex, normal3f + 3 * firstvertex, relativelightorigin, relativeeyeorigin);
- R_Mesh_State(&m);
- GL_ColorMask(0,0,0,1);
- // this squares the result
- GL_BlendFunc(GL_SRC_ALPHA, GL_ZERO);
- GL_LockArrays(firstvertex, numvertices);
- R_Mesh_Draw(firstvertex, numvertices, numtriangles, elements);
- GL_LockArrays(0, 0);
- c_rt_lightmeshes++;
- c_rt_lighttris += numtriangles;
-
- memset(&m, 0, sizeof(m));
- m.pointer_vertex = vertex3f;
- R_Mesh_State(&m);
- GL_LockArrays(firstvertex, numvertices);
- // square alpha in framebuffer a few times to make it shiny
- GL_BlendFunc(GL_ZERO, GL_DST_ALPHA);
- // these comments are a test run through this math for intensity 0.5
- // 0.5 * 0.5 = 0.25 (done by the BlendFunc earlier)
- // 0.25 * 0.25 = 0.0625 (this is another pass)
- // 0.0625 * 0.0625 = 0.00390625 (this is another pass)
- R_Mesh_Draw(firstvertex, numvertices, numtriangles, elements);
- c_rt_lightmeshes++;
- c_rt_lighttris += numtriangles;
- R_Mesh_Draw(firstvertex, numvertices, numtriangles, elements);
- c_rt_lightmeshes++;
- c_rt_lighttris += numtriangles;
- GL_LockArrays(0, 0);
-
- memset(&m, 0, sizeof(m));
- m.pointer_vertex = vertex3f;
- m.tex[0] = R_GetTexture(r_shadow_attenuation2dtexture);
-#ifdef USETEXMATRIX
- m.pointer_texcoord3f[0] = vertex3f;
- m.texmatrix[0] = *matrix_modeltoattenuationxyz;
-#else
- m.pointer_texcoord[0] = varray_texcoord2f[0];
- R_Shadow_Transform_Vertex3f_TexCoord2f(varray_texcoord2f[0] + 3 * firstvertex, numvertices, vertex3f + 3 * firstvertex, matrix_modeltoattenuationxyz);
-#endif
- m.tex[1] = R_GetTexture(r_shadow_attenuation2dtexture);
-#ifdef USETEXMATRIX
- m.pointer_texcoord3f[1] = vertex3f;
- m.texmatrix[1] = *matrix_modeltoattenuationz;
-#else
- m.pointer_texcoord[1] = varray_texcoord2f[1];
- R_Shadow_Transform_Vertex3f_TexCoord2f(varray_texcoord2f[1] + 3 * firstvertex, numvertices, vertex3f + 3 * firstvertex, matrix_modeltoattenuationz);
-#endif
- R_Mesh_State(&m);
- GL_BlendFunc(GL_DST_ALPHA, GL_ZERO);
- GL_LockArrays(firstvertex, numvertices);
- R_Mesh_Draw(firstvertex, numvertices, numtriangles, elements);
- GL_LockArrays(0, 0);
- c_rt_lightmeshes++;
- c_rt_lighttris += numtriangles;
-
- memset(&m, 0, sizeof(m));
- m.pointer_vertex = vertex3f;
- m.tex[0] = R_GetTexture(glosstexture);
- m.pointer_texcoord[0] = texcoord2f;
- if (lightcubemap)
- {
- m.texcubemap[1] = R_GetTexture(lightcubemap);
-#ifdef USETEXMATRIX
- m.pointer_texcoord3f[1] = vertex3f;
- m.texmatrix[1] = *matrix_modeltolight;
-#else
- m.pointer_texcoord3f[1] = varray_texcoord3f[1];
- R_Shadow_Transform_Vertex3f_TexCoord3f(varray_texcoord3f[1] + 3 * firstvertex, numvertices, vertex3f + 3 * firstvertex, matrix_modeltolight);
-#endif
- }
- GL_BlendFunc(GL_DST_ALPHA, GL_ONE);
- }
- R_Mesh_State(&m);
- GL_ColorMask(r_refdef.colormask[0], r_refdef.colormask[1], r_refdef.colormask[2], 0);
- VectorScale(lightcolorbase, colorscale, color2);
- GL_LockArrays(firstvertex, numvertices);
- for (renders = 0;renders < 64 && (color2[0] > 0 || color2[1] > 0 || color2[2] > 0);renders++, color2[0]--, color2[1]--, color2[2]--)
- {
- GL_Color(bound(0, color2[0], 1), bound(0, color2[1], 1), bound(0, color2[2], 1), 1);
- R_Mesh_Draw(firstvertex, numvertices, numtriangles, elements);
- c_rt_lightmeshes++;
- c_rt_lighttris += numtriangles;
- }
- GL_LockArrays(0, 0);
- }
- }