X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=r_shadow.c;h=c1dcc70c17342a1e7eb43543a5df55eb50b8f5f7;hb=3c0dcba17deda28ea48a69acda942b292f74aeb1;hp=d43bf7b466818cc9b3a8958cfeb90274df23ff1d;hpb=5a424be4a0d4c0c444aed5485a2a136d3bb0f509;p=xonotic%2Fdarkplaces.git diff --git a/r_shadow.c b/r_shadow.c index d43bf7b4..c1dcc70c 100644 --- a/r_shadow.c +++ b/r_shadow.c @@ -702,7 +702,6 @@ void R_Shadow_MarkVolumeFromBox(int firsttriangle, int numtris, const float *inv void R_Shadow_RenderVolume(int numvertices, int numtriangles, const float *vertex3f, const int *element3i) { - rmeshstate_t m; if (r_shadow_compilingrtlight) { // if we're compiling an rtlight, capture the mesh @@ -710,9 +709,7 @@ void R_Shadow_RenderVolume(int numvertices, int numtriangles, const float *verte return; } renderstats.lights_shadowtriangles += numtriangles; - memset(&m, 0, sizeof(m)); - m.pointer_vertex = vertex3f; - R_Mesh_State(&m); + R_Mesh_VertexPointer(vertex3f); GL_LockArrays(0, numvertices); if (r_shadow_rendermode == R_SHADOW_RENDERMODE_STENCIL) { @@ -811,8 +808,6 @@ matrix4x4_t r_shadow_entitytoattenuationz; void R_Shadow_RenderMode_Begin(void) { - rmeshstate_t m; - R_Shadow_ValidateCvars(); if (!r_shadow_attenuation2dtexture @@ -821,8 +816,8 @@ void R_Shadow_RenderMode_Begin(void) || r_shadow_lightattenuationscale.value != r_shadow_attenscale) R_Shadow_MakeTextures(); - memset(&m, 0, sizeof(m)); - R_Mesh_State(&m); + R_Mesh_ColorPointer(NULL); + R_Mesh_ResetTextureState(); GL_BlendFunc(GL_ONE, GL_ZERO); GL_DepthMask(false); GL_DepthTest(true); @@ -853,7 +848,6 @@ void R_Shadow_RenderMode_ActiveLight(rtlight_t *rtlight) void R_Shadow_RenderMode_Reset(void) { - rmeshstate_t m; if (r_shadow_rendermode == R_SHADOW_RENDERMODE_LIGHT_GLSL) { qglUseProgramObjectARB(0); @@ -864,8 +858,8 @@ void R_Shadow_RenderMode_Reset(void) } else if (r_shadow_rendermode == R_SHADOW_RENDERMODE_STENCILTWOSIDE) qglDisable(GL_STENCIL_TEST_TWO_SIDE_EXT); - memset(&m, 0, sizeof(m)); - R_Mesh_State(&m); + R_Mesh_ColorPointer(NULL); + R_Mesh_ResetTextureState(); } void R_Shadow_RenderMode_StencilShadowVolumes(void) @@ -940,6 +934,9 @@ void R_Shadow_RenderMode_Lighting(qboolean stenciltest, qboolean transparent) R_Mesh_TexBind(4, R_GetTexture(r_texture_fogattenuation)); // fog R_Mesh_TexBind(5, R_GetTexture(r_texture_white)); // pants R_Mesh_TexBind(6, R_GetTexture(r_texture_white)); // shirt + R_Mesh_TexBind(7, R_GetTexture(r_texture_white)); // lightmap + R_Mesh_TexBind(8, R_GetTexture(r_texture_blanknormalmap)); // deluxemap + R_Mesh_TexBind(9, R_GetTexture(r_texture_black)); // glow //R_Mesh_TexMatrix(3, r_shadow_entitytolight); // light filter matrix GL_BlendFunc(GL_SRC_ALPHA, GL_ONE); GL_ColorMask(r_refdef.colormask[0], r_refdef.colormask[1], r_refdef.colormask[2], 0); @@ -1232,53 +1229,52 @@ static void R_Shadow_GenTexCoords_Specular_NormalCubeMap(float *out3f, int numve } } -static void R_Shadow_RenderSurfacesLighting_VisibleLighting(const entity_render_t *ent, const texture_t *texture, int numsurfaces, msurface_t **surfacelist, const vec3_t lightcolorbase, const vec3_t lightcolorpants, const vec3_t lightcolorshirt, rtexture_t *basetexture, rtexture_t *pantstexture, rtexture_t *shirttexture, rtexture_t *normalmaptexture, rtexture_t *glosstexture, float specularscale, qboolean dopants, qboolean doshirt) +static void R_Shadow_RenderSurfacesLighting_VisibleLighting(int numsurfaces, msurface_t **surfacelist, const vec3_t lightcolorbase, const vec3_t lightcolorpants, const vec3_t lightcolorshirt, rtexture_t *basetexture, rtexture_t *pantstexture, rtexture_t *shirttexture, rtexture_t *normalmaptexture, rtexture_t *glosstexture, float specularscale, qboolean dopants, qboolean doshirt) { // used to display how many times a surface is lit for level design purposes int surfacelistindex; - model_t *model = ent->model; - rmeshstate_t m; GL_Color(0.1, 0.025, 0, 1); - memset(&m, 0, sizeof(m)); - R_Mesh_State(&m); - RSurf_PrepareVerticesForBatch(ent, texture, r_shadow_entityeyeorigin, false, false, numsurfaces, surfacelist); + R_Mesh_ColorPointer(NULL); + R_Mesh_ResetTextureState(); + RSurf_PrepareVerticesForBatch(false, false, numsurfaces, surfacelist); for (surfacelistindex = 0;surfacelistindex < numsurfaces;surfacelistindex++) { const msurface_t *surface = surfacelist[surfacelistindex]; GL_LockArrays(surface->num_firstvertex, surface->num_vertices); - R_Mesh_Draw(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, model->surfmesh.data_element3i + 3 * surface->num_firsttriangle); - GL_LockArrays(0, 0); + R_Mesh_Draw(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, rsurface_model->surfmesh.data_element3i + 3 * surface->num_firsttriangle); } + GL_LockArrays(0, 0); } -static void R_Shadow_RenderSurfacesLighting_Light_GLSL(const entity_render_t *ent, const texture_t *texture, int numsurfaces, msurface_t **surfacelist, const vec3_t lightcolorbase, const vec3_t lightcolorpants, const vec3_t lightcolorshirt, rtexture_t *basetexture, rtexture_t *pantstexture, rtexture_t *shirttexture, rtexture_t *normalmaptexture, rtexture_t *glosstexture, float specularscale, qboolean dopants, qboolean doshirt) +static void R_Shadow_RenderSurfacesLighting_Light_GLSL(int numsurfaces, msurface_t **surfacelist, const vec3_t lightcolorbase, const vec3_t lightcolorpants, const vec3_t lightcolorshirt, rtexture_t *basetexture, rtexture_t *pantstexture, rtexture_t *shirttexture, rtexture_t *normalmaptexture, rtexture_t *glosstexture, float specularscale, qboolean dopants, qboolean doshirt) { // ARB2 GLSL shader path (GFFX5200, Radeon 9500) int surfacelistindex; - model_t *model = ent->model; - RSurf_PrepareVerticesForBatch(ent, texture, r_shadow_entityeyeorigin, true, true, numsurfaces, surfacelist); - R_SetupSurfaceShader(ent, texture, r_shadow_entityeyeorigin, lightcolorbase, false); + RSurf_PrepareVerticesForBatch(true, true, numsurfaces, surfacelist); + R_SetupSurfaceShader(lightcolorbase, false); + R_Mesh_TexCoordPointer(0, 2, rsurface_model->surfmesh.data_texcoordtexture2f); + R_Mesh_TexCoordPointer(1, 3, rsurface_svector3f); + R_Mesh_TexCoordPointer(2, 3, rsurface_tvector3f); + R_Mesh_TexCoordPointer(3, 3, rsurface_normal3f); + if (rsurface_texture->currentmaterialflags & MATERIALFLAG_ALPHATEST) + qglDepthFunc(GL_EQUAL); for (surfacelistindex = 0;surfacelistindex < numsurfaces;surfacelistindex++) { const msurface_t *surface = surfacelist[surfacelistindex]; - const int *elements = model->surfmesh.data_element3i + surface->num_firsttriangle * 3; - R_Mesh_TexCoordPointer(0, 2, model->surfmesh.data_texcoordtexture2f); - R_Mesh_TexCoordPointer(1, 3, rsurface_svector3f); - R_Mesh_TexCoordPointer(2, 3, rsurface_tvector3f); - R_Mesh_TexCoordPointer(3, 3, rsurface_normal3f); GL_LockArrays(surface->num_firstvertex, surface->num_vertices); - R_Mesh_Draw(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, elements); - GL_LockArrays(0, 0); + R_Mesh_Draw(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, rsurface_model->surfmesh.data_element3i + surface->num_firsttriangle * 3); } + GL_LockArrays(0, 0); + if (rsurface_texture->currentmaterialflags & MATERIALFLAG_ALPHATEST) + qglDepthFunc(GL_LEQUAL); } -static void R_Shadow_RenderSurfacesLighting_Light_Dot3_AmbientPass(const entity_render_t *ent, const texture_t *texture, const msurface_t *surface, const vec3_t lightcolorbase, rtexture_t *basetexture, float colorscale) +static void R_Shadow_RenderSurfacesLighting_Light_Dot3_AmbientPass(const msurface_t *surface, const vec3_t lightcolorbase, rtexture_t *basetexture, float colorscale) { int renders; - model_t *model = ent->model; float color2[3]; rmeshstate_t m; - const int *elements = model->surfmesh.data_element3i + surface->num_firsttriangle * 3; + const int *elements = rsurface_model->surfmesh.data_element3i + surface->num_firsttriangle * 3; GL_Color(1,1,1,1); // colorscale accounts for how much we multiply the brightness // during combine. @@ -1291,13 +1287,12 @@ static void R_Shadow_RenderSurfacesLighting_Light_Dot3_AmbientPass(const entity_ { // 3 3D combine path (Geforce3, Radeon 8500) memset(&m, 0, sizeof(m)); - m.pointer_vertex = rsurface_vertex3f; m.tex3d[0] = R_GetTexture(r_shadow_attenuation3dtexture); m.pointer_texcoord3f[0] = rsurface_vertex3f; m.texmatrix[0] = r_shadow_entitytoattenuationxyz; m.tex[1] = R_GetTexture(basetexture); - m.pointer_texcoord[1] = model->surfmesh.data_texcoordtexture2f; - m.texmatrix[1] = texture->currenttexmatrix; + m.pointer_texcoord[1] = rsurface_model->surfmesh.data_texcoordtexture2f; + m.texmatrix[1] = rsurface_texture->currenttexmatrix; m.texcubemap[2] = R_GetTexture(r_shadow_rtlight->currentcubemap); m.pointer_texcoord3f[2] = rsurface_vertex3f; m.texmatrix[2] = r_shadow_entitytolight; @@ -1307,20 +1302,18 @@ static void R_Shadow_RenderSurfacesLighting_Light_Dot3_AmbientPass(const entity_ { // 2 3D combine path (Geforce3, original Radeon) memset(&m, 0, sizeof(m)); - m.pointer_vertex = rsurface_vertex3f; m.tex3d[0] = R_GetTexture(r_shadow_attenuation3dtexture); m.pointer_texcoord3f[0] = rsurface_vertex3f; m.texmatrix[0] = r_shadow_entitytoattenuationxyz; m.tex[1] = R_GetTexture(basetexture); - m.pointer_texcoord[1] = model->surfmesh.data_texcoordtexture2f; - m.texmatrix[1] = texture->currenttexmatrix; + m.pointer_texcoord[1] = rsurface_model->surfmesh.data_texcoordtexture2f; + m.texmatrix[1] = rsurface_texture->currenttexmatrix; GL_BlendFunc(GL_ONE, GL_ONE); } else if (r_textureunits.integer >= 4 && r_shadow_rtlight->currentcubemap != r_texture_whitecube) { // 4 2D combine path (Geforce3, Radeon 8500) memset(&m, 0, sizeof(m)); - m.pointer_vertex = rsurface_vertex3f; m.tex[0] = R_GetTexture(r_shadow_attenuation2dtexture); m.pointer_texcoord3f[0] = rsurface_vertex3f; m.texmatrix[0] = r_shadow_entitytoattenuationxyz; @@ -1328,8 +1321,8 @@ static void R_Shadow_RenderSurfacesLighting_Light_Dot3_AmbientPass(const entity_ m.pointer_texcoord3f[1] = rsurface_vertex3f; m.texmatrix[1] = r_shadow_entitytoattenuationz; m.tex[2] = R_GetTexture(basetexture); - m.pointer_texcoord[2] = model->surfmesh.data_texcoordtexture2f; - m.texmatrix[2] = texture->currenttexmatrix; + m.pointer_texcoord[2] = rsurface_model->surfmesh.data_texcoordtexture2f; + m.texmatrix[2] = rsurface_texture->currenttexmatrix; if (r_shadow_rtlight->currentcubemap != r_texture_whitecube) { m.texcubemap[3] = R_GetTexture(r_shadow_rtlight->currentcubemap); @@ -1342,7 +1335,6 @@ static void R_Shadow_RenderSurfacesLighting_Light_Dot3_AmbientPass(const entity_ { // 3 2D combine path (Geforce3, original Radeon) memset(&m, 0, sizeof(m)); - m.pointer_vertex = rsurface_vertex3f; m.tex[0] = R_GetTexture(r_shadow_attenuation2dtexture); m.pointer_texcoord3f[0] = rsurface_vertex3f; m.texmatrix[0] = r_shadow_entitytoattenuationxyz; @@ -1350,22 +1342,21 @@ static void R_Shadow_RenderSurfacesLighting_Light_Dot3_AmbientPass(const entity_ m.pointer_texcoord3f[1] = rsurface_vertex3f; m.texmatrix[1] = r_shadow_entitytoattenuationz; m.tex[2] = R_GetTexture(basetexture); - m.pointer_texcoord[2] = model->surfmesh.data_texcoordtexture2f; - m.texmatrix[2] = texture->currenttexmatrix; + m.pointer_texcoord[2] = rsurface_model->surfmesh.data_texcoordtexture2f; + m.texmatrix[2] = rsurface_texture->currenttexmatrix; GL_BlendFunc(GL_ONE, GL_ONE); } else { // 2/2/2 2D combine path (any dot3 card) memset(&m, 0, sizeof(m)); - m.pointer_vertex = rsurface_vertex3f; m.tex[0] = R_GetTexture(r_shadow_attenuation2dtexture); m.pointer_texcoord3f[0] = rsurface_vertex3f; m.texmatrix[0] = r_shadow_entitytoattenuationxyz; m.tex[1] = R_GetTexture(r_shadow_attenuation2dtexture); m.pointer_texcoord3f[1] = rsurface_vertex3f; m.texmatrix[1] = r_shadow_entitytoattenuationz; - R_Mesh_State(&m); + R_Mesh_TextureState(&m); GL_ColorMask(0,0,0,1); GL_BlendFunc(GL_ONE, GL_ZERO); GL_LockArrays(surface->num_firstvertex, surface->num_vertices); @@ -1373,10 +1364,9 @@ static void R_Shadow_RenderSurfacesLighting_Light_Dot3_AmbientPass(const entity_ GL_LockArrays(0, 0); memset(&m, 0, sizeof(m)); - m.pointer_vertex = rsurface_vertex3f; m.tex[0] = R_GetTexture(basetexture); - m.pointer_texcoord[0] = model->surfmesh.data_texcoordtexture2f; - m.texmatrix[0] = texture->currenttexmatrix; + m.pointer_texcoord[0] = rsurface_model->surfmesh.data_texcoordtexture2f; + m.texmatrix[0] = rsurface_texture->currenttexmatrix; if (r_shadow_rtlight->currentcubemap != r_texture_whitecube) { m.texcubemap[1] = R_GetTexture(r_shadow_rtlight->currentcubemap); @@ -1386,7 +1376,7 @@ static void R_Shadow_RenderSurfacesLighting_Light_Dot3_AmbientPass(const entity_ GL_BlendFunc(GL_DST_ALPHA, GL_ONE); } // this final code is shared - R_Mesh_State(&m); + R_Mesh_TextureState(&m); GL_ColorMask(r_refdef.colormask[0], r_refdef.colormask[1], r_refdef.colormask[2], 0); VectorScale(lightcolorbase, colorscale, color2); GL_LockArrays(surface->num_firstvertex, surface->num_vertices); @@ -1398,13 +1388,12 @@ static void R_Shadow_RenderSurfacesLighting_Light_Dot3_AmbientPass(const entity_ GL_LockArrays(0, 0); } -static void R_Shadow_RenderSurfacesLighting_Light_Dot3_DiffusePass(const entity_render_t *ent, const texture_t *texture, const msurface_t *surface, const vec3_t lightcolorbase, rtexture_t *basetexture, rtexture_t *normalmaptexture, float colorscale) +static void R_Shadow_RenderSurfacesLighting_Light_Dot3_DiffusePass(const msurface_t *surface, const vec3_t lightcolorbase, rtexture_t *basetexture, rtexture_t *normalmaptexture, float colorscale) { int renders; - model_t *model = ent->model; float color2[3]; rmeshstate_t m; - const int *elements = model->surfmesh.data_element3i + surface->num_firsttriangle * 3; + const int *elements = rsurface_model->surfmesh.data_element3i + surface->num_firsttriangle * 3; GL_Color(1,1,1,1); // colorscale accounts for how much we multiply the brightness // during combine. @@ -1417,11 +1406,10 @@ static void R_Shadow_RenderSurfacesLighting_Light_Dot3_DiffusePass(const entity_ { // 3/2 3D combine path (Geforce3, Radeon 8500) memset(&m, 0, sizeof(m)); - m.pointer_vertex = rsurface_vertex3f; m.tex[0] = R_GetTexture(normalmaptexture); m.texcombinergb[0] = GL_REPLACE; - m.pointer_texcoord[0] = model->surfmesh.data_texcoordtexture2f; - m.texmatrix[0] = texture->currenttexmatrix; + m.pointer_texcoord[0] = rsurface_model->surfmesh.data_texcoordtexture2f; + m.texmatrix[0] = rsurface_texture->currenttexmatrix; m.texcubemap[1] = R_GetTexture(r_texture_normalizationcube); m.texcombinergb[1] = GL_DOT3_RGBA_ARB; m.pointer_texcoord3f[1] = rsurface_array_texcoord3f; @@ -1429,7 +1417,7 @@ static void R_Shadow_RenderSurfacesLighting_Light_Dot3_DiffusePass(const entity_ m.tex3d[2] = R_GetTexture(r_shadow_attenuation3dtexture); m.pointer_texcoord3f[2] = rsurface_vertex3f; m.texmatrix[2] = r_shadow_entitytoattenuationxyz; - R_Mesh_State(&m); + R_Mesh_TextureState(&m); GL_ColorMask(0,0,0,1); GL_BlendFunc(GL_ONE, GL_ZERO); GL_LockArrays(surface->num_firstvertex, surface->num_vertices); @@ -1437,10 +1425,9 @@ static void R_Shadow_RenderSurfacesLighting_Light_Dot3_DiffusePass(const entity_ GL_LockArrays(0, 0); memset(&m, 0, sizeof(m)); - m.pointer_vertex = rsurface_vertex3f; m.tex[0] = R_GetTexture(basetexture); - m.pointer_texcoord[0] = model->surfmesh.data_texcoordtexture2f; - m.texmatrix[0] = texture->currenttexmatrix; + m.pointer_texcoord[0] = rsurface_model->surfmesh.data_texcoordtexture2f; + m.texmatrix[0] = rsurface_texture->currenttexmatrix; if (r_shadow_rtlight->currentcubemap != r_texture_whitecube) { m.texcubemap[1] = R_GetTexture(r_shadow_rtlight->currentcubemap); @@ -1453,11 +1440,10 @@ static void R_Shadow_RenderSurfacesLighting_Light_Dot3_DiffusePass(const entity_ { // 1/2/2 3D combine path (original Radeon) memset(&m, 0, sizeof(m)); - m.pointer_vertex = rsurface_vertex3f; m.tex3d[0] = R_GetTexture(r_shadow_attenuation3dtexture); m.pointer_texcoord3f[0] = rsurface_vertex3f; m.texmatrix[0] = r_shadow_entitytoattenuationxyz; - R_Mesh_State(&m); + R_Mesh_TextureState(&m); GL_ColorMask(0,0,0,1); GL_BlendFunc(GL_ONE, GL_ZERO); GL_LockArrays(surface->num_firstvertex, surface->num_vertices); @@ -1465,26 +1451,24 @@ static void R_Shadow_RenderSurfacesLighting_Light_Dot3_DiffusePass(const entity_ GL_LockArrays(0, 0); memset(&m, 0, sizeof(m)); - m.pointer_vertex = rsurface_vertex3f; m.tex[0] = R_GetTexture(normalmaptexture); m.texcombinergb[0] = GL_REPLACE; - m.pointer_texcoord[0] = model->surfmesh.data_texcoordtexture2f; - m.texmatrix[0] = texture->currenttexmatrix; + m.pointer_texcoord[0] = rsurface_model->surfmesh.data_texcoordtexture2f; + m.texmatrix[0] = rsurface_texture->currenttexmatrix; m.texcubemap[1] = R_GetTexture(r_texture_normalizationcube); m.texcombinergb[1] = GL_DOT3_RGBA_ARB; m.pointer_texcoord3f[1] = rsurface_array_texcoord3f; R_Shadow_GenTexCoords_Diffuse_NormalCubeMap(rsurface_array_texcoord3f + 3 * surface->num_firstvertex, surface->num_vertices, rsurface_vertex3f + 3 * surface->num_firstvertex, rsurface_svector3f + 3 * surface->num_firstvertex, rsurface_tvector3f + 3 * surface->num_firstvertex, rsurface_normal3f + 3 * surface->num_firstvertex, r_shadow_entitylightorigin); - R_Mesh_State(&m); + R_Mesh_TextureState(&m); GL_BlendFunc(GL_DST_ALPHA, GL_ZERO); GL_LockArrays(surface->num_firstvertex, surface->num_vertices); R_Mesh_Draw(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, elements); GL_LockArrays(0, 0); memset(&m, 0, sizeof(m)); - m.pointer_vertex = rsurface_vertex3f; m.tex[0] = R_GetTexture(basetexture); - m.pointer_texcoord[0] = model->surfmesh.data_texcoordtexture2f; - m.texmatrix[0] = texture->currenttexmatrix; + m.pointer_texcoord[0] = rsurface_model->surfmesh.data_texcoordtexture2f; + m.texmatrix[0] = rsurface_texture->currenttexmatrix; if (r_shadow_rtlight->currentcubemap != r_texture_whitecube) { m.texcubemap[1] = R_GetTexture(r_shadow_rtlight->currentcubemap); @@ -1497,16 +1481,15 @@ static void R_Shadow_RenderSurfacesLighting_Light_Dot3_DiffusePass(const entity_ { // 2/2 3D combine path (original Radeon) memset(&m, 0, sizeof(m)); - m.pointer_vertex = rsurface_vertex3f; m.tex[0] = R_GetTexture(normalmaptexture); m.texcombinergb[0] = GL_REPLACE; - m.pointer_texcoord[0] = model->surfmesh.data_texcoordtexture2f; - m.texmatrix[0] = texture->currenttexmatrix; + m.pointer_texcoord[0] = rsurface_model->surfmesh.data_texcoordtexture2f; + m.texmatrix[0] = rsurface_texture->currenttexmatrix; m.texcubemap[1] = R_GetTexture(r_texture_normalizationcube); m.texcombinergb[1] = GL_DOT3_RGBA_ARB; m.pointer_texcoord3f[1] = rsurface_array_texcoord3f; R_Shadow_GenTexCoords_Diffuse_NormalCubeMap(rsurface_array_texcoord3f + 3 * surface->num_firstvertex, surface->num_vertices, rsurface_vertex3f + 3 * surface->num_firstvertex, rsurface_svector3f + 3 * surface->num_firstvertex, rsurface_tvector3f + 3 * surface->num_firstvertex, rsurface_normal3f + 3 * surface->num_firstvertex, r_shadow_entitylightorigin); - R_Mesh_State(&m); + R_Mesh_TextureState(&m); GL_ColorMask(0,0,0,1); GL_BlendFunc(GL_ONE, GL_ZERO); GL_LockArrays(surface->num_firstvertex, surface->num_vertices); @@ -1514,10 +1497,9 @@ static void R_Shadow_RenderSurfacesLighting_Light_Dot3_DiffusePass(const entity_ GL_LockArrays(0, 0); memset(&m, 0, sizeof(m)); - m.pointer_vertex = rsurface_vertex3f; m.tex[0] = R_GetTexture(basetexture); - m.pointer_texcoord[0] = model->surfmesh.data_texcoordtexture2f; - m.texmatrix[0] = texture->currenttexmatrix; + m.pointer_texcoord[0] = rsurface_model->surfmesh.data_texcoordtexture2f; + m.texmatrix[0] = rsurface_texture->currenttexmatrix; m.tex3d[1] = R_GetTexture(r_shadow_attenuation3dtexture); m.pointer_texcoord3f[1] = rsurface_vertex3f; m.texmatrix[1] = r_shadow_entitytoattenuationxyz; @@ -1527,11 +1509,10 @@ static void R_Shadow_RenderSurfacesLighting_Light_Dot3_DiffusePass(const entity_ { // 4/2 2D combine path (Geforce3, Radeon 8500) memset(&m, 0, sizeof(m)); - m.pointer_vertex = rsurface_vertex3f; m.tex[0] = R_GetTexture(normalmaptexture); m.texcombinergb[0] = GL_REPLACE; - m.pointer_texcoord[0] = model->surfmesh.data_texcoordtexture2f; - m.texmatrix[0] = texture->currenttexmatrix; + m.pointer_texcoord[0] = rsurface_model->surfmesh.data_texcoordtexture2f; + m.texmatrix[0] = rsurface_texture->currenttexmatrix; m.texcubemap[1] = R_GetTexture(r_texture_normalizationcube); m.texcombinergb[1] = GL_DOT3_RGBA_ARB; m.pointer_texcoord3f[1] = rsurface_array_texcoord3f; @@ -1542,7 +1523,7 @@ static void R_Shadow_RenderSurfacesLighting_Light_Dot3_DiffusePass(const entity_ m.tex[3] = R_GetTexture(r_shadow_attenuation2dtexture); m.pointer_texcoord3f[3] = rsurface_vertex3f; m.texmatrix[3] = r_shadow_entitytoattenuationz; - R_Mesh_State(&m); + R_Mesh_TextureState(&m); GL_ColorMask(0,0,0,1); GL_BlendFunc(GL_ONE, GL_ZERO); GL_LockArrays(surface->num_firstvertex, surface->num_vertices); @@ -1550,10 +1531,9 @@ static void R_Shadow_RenderSurfacesLighting_Light_Dot3_DiffusePass(const entity_ GL_LockArrays(0, 0); memset(&m, 0, sizeof(m)); - m.pointer_vertex = rsurface_vertex3f; m.tex[0] = R_GetTexture(basetexture); - m.pointer_texcoord[0] = model->surfmesh.data_texcoordtexture2f; - m.texmatrix[0] = texture->currenttexmatrix; + m.pointer_texcoord[0] = rsurface_model->surfmesh.data_texcoordtexture2f; + m.texmatrix[0] = rsurface_texture->currenttexmatrix; if (r_shadow_rtlight->currentcubemap != r_texture_whitecube) { m.texcubemap[1] = R_GetTexture(r_shadow_rtlight->currentcubemap); @@ -1566,14 +1546,13 @@ static void R_Shadow_RenderSurfacesLighting_Light_Dot3_DiffusePass(const entity_ { // 2/2/2 2D combine path (any dot3 card) memset(&m, 0, sizeof(m)); - m.pointer_vertex = rsurface_vertex3f; m.tex[0] = R_GetTexture(r_shadow_attenuation2dtexture); m.pointer_texcoord3f[0] = rsurface_vertex3f; m.texmatrix[0] = r_shadow_entitytoattenuationxyz; m.tex[1] = R_GetTexture(r_shadow_attenuation2dtexture); m.pointer_texcoord3f[1] = rsurface_vertex3f; m.texmatrix[1] = r_shadow_entitytoattenuationz; - R_Mesh_State(&m); + R_Mesh_TextureState(&m); GL_ColorMask(0,0,0,1); GL_BlendFunc(GL_ONE, GL_ZERO); GL_LockArrays(surface->num_firstvertex, surface->num_vertices); @@ -1581,26 +1560,24 @@ static void R_Shadow_RenderSurfacesLighting_Light_Dot3_DiffusePass(const entity_ GL_LockArrays(0, 0); memset(&m, 0, sizeof(m)); - m.pointer_vertex = rsurface_vertex3f; m.tex[0] = R_GetTexture(normalmaptexture); m.texcombinergb[0] = GL_REPLACE; - m.pointer_texcoord[0] = model->surfmesh.data_texcoordtexture2f; - m.texmatrix[0] = texture->currenttexmatrix; + m.pointer_texcoord[0] = rsurface_model->surfmesh.data_texcoordtexture2f; + m.texmatrix[0] = rsurface_texture->currenttexmatrix; m.texcubemap[1] = R_GetTexture(r_texture_normalizationcube); m.texcombinergb[1] = GL_DOT3_RGBA_ARB; m.pointer_texcoord3f[1] = rsurface_array_texcoord3f; R_Shadow_GenTexCoords_Diffuse_NormalCubeMap(rsurface_array_texcoord3f + 3 * surface->num_firstvertex, surface->num_vertices, rsurface_vertex3f + 3 * surface->num_firstvertex, rsurface_svector3f + 3 * surface->num_firstvertex, rsurface_tvector3f + 3 * surface->num_firstvertex, rsurface_normal3f + 3 * surface->num_firstvertex, r_shadow_entitylightorigin); - R_Mesh_State(&m); + R_Mesh_TextureState(&m); GL_BlendFunc(GL_DST_ALPHA, GL_ZERO); GL_LockArrays(surface->num_firstvertex, surface->num_vertices); R_Mesh_Draw(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, elements); GL_LockArrays(0, 0); memset(&m, 0, sizeof(m)); - m.pointer_vertex = rsurface_vertex3f; m.tex[0] = R_GetTexture(basetexture); - m.pointer_texcoord[0] = model->surfmesh.data_texcoordtexture2f; - m.texmatrix[0] = texture->currenttexmatrix; + m.pointer_texcoord[0] = rsurface_model->surfmesh.data_texcoordtexture2f; + m.texmatrix[0] = rsurface_texture->currenttexmatrix; if (r_shadow_rtlight->currentcubemap != r_texture_whitecube) { m.texcubemap[1] = R_GetTexture(r_shadow_rtlight->currentcubemap); @@ -1610,7 +1587,7 @@ static void R_Shadow_RenderSurfacesLighting_Light_Dot3_DiffusePass(const entity_ GL_BlendFunc(GL_DST_ALPHA, GL_ONE); } // this final code is shared - R_Mesh_State(&m); + R_Mesh_TextureState(&m); GL_ColorMask(r_refdef.colormask[0], r_refdef.colormask[1], r_refdef.colormask[2], 0); VectorScale(lightcolorbase, colorscale, color2); GL_LockArrays(surface->num_firstvertex, surface->num_vertices); @@ -1622,13 +1599,12 @@ static void R_Shadow_RenderSurfacesLighting_Light_Dot3_DiffusePass(const entity_ GL_LockArrays(0, 0); } -static void R_Shadow_RenderSurfacesLighting_Light_Dot3_SpecularPass(const entity_render_t *ent, const texture_t *texture, const msurface_t *surface, const vec3_t lightcolorbase, rtexture_t *glosstexture, rtexture_t *normalmaptexture, float colorscale) +static void R_Shadow_RenderSurfacesLighting_Light_Dot3_SpecularPass(const msurface_t *surface, const vec3_t lightcolorbase, rtexture_t *glosstexture, rtexture_t *normalmaptexture, float colorscale) { int renders; - model_t *model = ent->model; float color2[3]; rmeshstate_t m; - const int *elements = model->surfmesh.data_element3i + surface->num_firsttriangle * 3; + const int *elements = rsurface_model->surfmesh.data_element3i + surface->num_firsttriangle * 3; // FIXME: detect blendsquare! //if (!gl_support_blendsquare) // return; @@ -1637,15 +1613,14 @@ static void R_Shadow_RenderSurfacesLighting_Light_Dot3_SpecularPass(const entity { // 2/0/0/1/2 3D combine blendsquare path memset(&m, 0, sizeof(m)); - m.pointer_vertex = rsurface_vertex3f; m.tex[0] = R_GetTexture(normalmaptexture); - m.pointer_texcoord[0] = model->surfmesh.data_texcoordtexture2f; - m.texmatrix[0] = texture->currenttexmatrix; + m.pointer_texcoord[0] = rsurface_model->surfmesh.data_texcoordtexture2f; + m.texmatrix[0] = rsurface_texture->currenttexmatrix; m.texcubemap[1] = R_GetTexture(r_texture_normalizationcube); m.texcombinergb[1] = GL_DOT3_RGBA_ARB; m.pointer_texcoord3f[1] = rsurface_array_texcoord3f; R_Shadow_GenTexCoords_Specular_NormalCubeMap(rsurface_array_texcoord3f + 3 * surface->num_firstvertex, surface->num_vertices, rsurface_vertex3f + 3 * surface->num_firstvertex, rsurface_svector3f + 3 * surface->num_firstvertex, rsurface_tvector3f + 3 * surface->num_firstvertex, rsurface_normal3f + 3 * surface->num_firstvertex, r_shadow_entitylightorigin, r_shadow_entityeyeorigin); - R_Mesh_State(&m); + R_Mesh_TextureState(&m); GL_ColorMask(0,0,0,1); // this squares the result GL_BlendFunc(GL_SRC_ALPHA, GL_ZERO); @@ -1653,9 +1628,7 @@ static void R_Shadow_RenderSurfacesLighting_Light_Dot3_SpecularPass(const entity R_Mesh_Draw(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, elements); GL_LockArrays(0, 0); - memset(&m, 0, sizeof(m)); - m.pointer_vertex = rsurface_vertex3f; - R_Mesh_State(&m); + R_Mesh_ResetTextureState(); GL_LockArrays(surface->num_firstvertex, surface->num_vertices); // square alpha in framebuffer a few times to make it shiny GL_BlendFunc(GL_ZERO, GL_DST_ALPHA); @@ -1668,21 +1641,19 @@ static void R_Shadow_RenderSurfacesLighting_Light_Dot3_SpecularPass(const entity GL_LockArrays(0, 0); memset(&m, 0, sizeof(m)); - m.pointer_vertex = rsurface_vertex3f; m.tex3d[0] = R_GetTexture(r_shadow_attenuation3dtexture); m.pointer_texcoord3f[0] = rsurface_vertex3f; m.texmatrix[0] = r_shadow_entitytoattenuationxyz; - R_Mesh_State(&m); + R_Mesh_TextureState(&m); GL_BlendFunc(GL_DST_ALPHA, GL_ZERO); GL_LockArrays(surface->num_firstvertex, surface->num_vertices); R_Mesh_Draw(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, elements); GL_LockArrays(0, 0); memset(&m, 0, sizeof(m)); - m.pointer_vertex = rsurface_vertex3f; m.tex[0] = R_GetTexture(glosstexture); - m.pointer_texcoord[0] = model->surfmesh.data_texcoordtexture2f; - m.texmatrix[0] = texture->currenttexmatrix; + m.pointer_texcoord[0] = rsurface_model->surfmesh.data_texcoordtexture2f; + m.texmatrix[0] = rsurface_texture->currenttexmatrix; if (r_shadow_rtlight->currentcubemap != r_texture_whitecube) { m.texcubemap[1] = R_GetTexture(r_shadow_rtlight->currentcubemap); @@ -1695,15 +1666,14 @@ static void R_Shadow_RenderSurfacesLighting_Light_Dot3_SpecularPass(const entity { // 2/0/0/2 3D combine blendsquare path memset(&m, 0, sizeof(m)); - m.pointer_vertex = rsurface_vertex3f; m.tex[0] = R_GetTexture(normalmaptexture); - m.pointer_texcoord[0] = model->surfmesh.data_texcoordtexture2f; - m.texmatrix[0] = texture->currenttexmatrix; + m.pointer_texcoord[0] = rsurface_model->surfmesh.data_texcoordtexture2f; + m.texmatrix[0] = rsurface_texture->currenttexmatrix; m.texcubemap[1] = R_GetTexture(r_texture_normalizationcube); m.texcombinergb[1] = GL_DOT3_RGBA_ARB; m.pointer_texcoord3f[1] = rsurface_array_texcoord3f; R_Shadow_GenTexCoords_Specular_NormalCubeMap(rsurface_array_texcoord3f + 3 * surface->num_firstvertex, surface->num_vertices, rsurface_vertex3f + 3 * surface->num_firstvertex, rsurface_svector3f + 3 * surface->num_firstvertex, rsurface_tvector3f + 3 * surface->num_firstvertex, rsurface_normal3f + 3 * surface->num_firstvertex, r_shadow_entitylightorigin, r_shadow_entityeyeorigin); - R_Mesh_State(&m); + R_Mesh_TextureState(&m); GL_ColorMask(0,0,0,1); // this squares the result GL_BlendFunc(GL_SRC_ALPHA, GL_ZERO); @@ -1711,9 +1681,7 @@ static void R_Shadow_RenderSurfacesLighting_Light_Dot3_SpecularPass(const entity R_Mesh_Draw(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, elements); GL_LockArrays(0, 0); - memset(&m, 0, sizeof(m)); - m.pointer_vertex = rsurface_vertex3f; - R_Mesh_State(&m); + R_Mesh_ResetTextureState(); GL_LockArrays(surface->num_firstvertex, surface->num_vertices); // square alpha in framebuffer a few times to make it shiny GL_BlendFunc(GL_ZERO, GL_DST_ALPHA); @@ -1726,10 +1694,9 @@ static void R_Shadow_RenderSurfacesLighting_Light_Dot3_SpecularPass(const entity GL_LockArrays(0, 0); memset(&m, 0, sizeof(m)); - m.pointer_vertex = rsurface_vertex3f; m.tex[0] = R_GetTexture(glosstexture); - m.pointer_texcoord[0] = model->surfmesh.data_texcoordtexture2f; - m.texmatrix[0] = texture->currenttexmatrix; + m.pointer_texcoord[0] = rsurface_model->surfmesh.data_texcoordtexture2f; + m.texmatrix[0] = rsurface_texture->currenttexmatrix; m.tex3d[1] = R_GetTexture(r_shadow_attenuation3dtexture); m.pointer_texcoord3f[1] = rsurface_vertex3f; m.texmatrix[1] = r_shadow_entitytoattenuationxyz; @@ -1739,15 +1706,14 @@ static void R_Shadow_RenderSurfacesLighting_Light_Dot3_SpecularPass(const entity { // 2/0/0/2/2 2D combine blendsquare path memset(&m, 0, sizeof(m)); - m.pointer_vertex = rsurface_vertex3f; m.tex[0] = R_GetTexture(normalmaptexture); - m.pointer_texcoord[0] = model->surfmesh.data_texcoordtexture2f; - m.texmatrix[0] = texture->currenttexmatrix; + m.pointer_texcoord[0] = rsurface_model->surfmesh.data_texcoordtexture2f; + m.texmatrix[0] = rsurface_texture->currenttexmatrix; m.texcubemap[1] = R_GetTexture(r_texture_normalizationcube); m.texcombinergb[1] = GL_DOT3_RGBA_ARB; m.pointer_texcoord3f[1] = rsurface_array_texcoord3f; R_Shadow_GenTexCoords_Specular_NormalCubeMap(rsurface_array_texcoord3f + 3 * surface->num_firstvertex, surface->num_vertices, rsurface_vertex3f + 3 * surface->num_firstvertex, rsurface_svector3f + 3 * surface->num_firstvertex, rsurface_tvector3f + 3 * surface->num_firstvertex, rsurface_normal3f + 3 * surface->num_firstvertex, r_shadow_entitylightorigin, r_shadow_entityeyeorigin); - R_Mesh_State(&m); + R_Mesh_TextureState(&m); GL_ColorMask(0,0,0,1); // this squares the result GL_BlendFunc(GL_SRC_ALPHA, GL_ZERO); @@ -1755,9 +1721,7 @@ static void R_Shadow_RenderSurfacesLighting_Light_Dot3_SpecularPass(const entity R_Mesh_Draw(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, elements); GL_LockArrays(0, 0); - memset(&m, 0, sizeof(m)); - m.pointer_vertex = rsurface_vertex3f; - R_Mesh_State(&m); + R_Mesh_ResetTextureState(); GL_LockArrays(surface->num_firstvertex, surface->num_vertices); // square alpha in framebuffer a few times to make it shiny GL_BlendFunc(GL_ZERO, GL_DST_ALPHA); @@ -1770,24 +1734,22 @@ static void R_Shadow_RenderSurfacesLighting_Light_Dot3_SpecularPass(const entity GL_LockArrays(0, 0); memset(&m, 0, sizeof(m)); - m.pointer_vertex = rsurface_vertex3f; m.tex[0] = R_GetTexture(r_shadow_attenuation2dtexture); m.pointer_texcoord3f[0] = rsurface_vertex3f; m.texmatrix[0] = r_shadow_entitytoattenuationxyz; m.tex[1] = R_GetTexture(r_shadow_attenuation2dtexture); m.pointer_texcoord3f[1] = rsurface_vertex3f; m.texmatrix[1] = r_shadow_entitytoattenuationz; - R_Mesh_State(&m); + R_Mesh_TextureState(&m); GL_BlendFunc(GL_DST_ALPHA, GL_ZERO); GL_LockArrays(surface->num_firstvertex, surface->num_vertices); R_Mesh_Draw(surface->num_firstvertex, surface->num_vertices, surface->num_triangles, elements); GL_LockArrays(0, 0); memset(&m, 0, sizeof(m)); - m.pointer_vertex = rsurface_vertex3f; m.tex[0] = R_GetTexture(glosstexture); - m.pointer_texcoord[0] = model->surfmesh.data_texcoordtexture2f; - m.texmatrix[0] = texture->currenttexmatrix; + m.pointer_texcoord[0] = rsurface_model->surfmesh.data_texcoordtexture2f; + m.texmatrix[0] = rsurface_texture->currenttexmatrix; if (r_shadow_rtlight->currentcubemap != r_texture_whitecube) { m.texcubemap[1] = R_GetTexture(r_shadow_rtlight->currentcubemap); @@ -1796,7 +1758,7 @@ static void R_Shadow_RenderSurfacesLighting_Light_Dot3_SpecularPass(const entity } GL_BlendFunc(GL_DST_ALPHA, GL_ONE); } - R_Mesh_State(&m); + R_Mesh_TextureState(&m); GL_ColorMask(r_refdef.colormask[0], r_refdef.colormask[1], r_refdef.colormask[2], 0); VectorScale(lightcolorbase, colorscale, color2); GL_LockArrays(surface->num_firstvertex, surface->num_vertices); @@ -1808,7 +1770,7 @@ static void R_Shadow_RenderSurfacesLighting_Light_Dot3_SpecularPass(const entity GL_LockArrays(0, 0); } -static void R_Shadow_RenderSurfacesLighting_Light_Dot3(const entity_render_t *ent, const texture_t *texture, int numsurfaces, msurface_t **surfacelist, const vec3_t lightcolorbase, const vec3_t lightcolorpants, const vec3_t lightcolorshirt, rtexture_t *basetexture, rtexture_t *pantstexture, rtexture_t *shirttexture, rtexture_t *normalmaptexture, rtexture_t *glosstexture, float specularscale, qboolean dopants, qboolean doshirt) +static void R_Shadow_RenderSurfacesLighting_Light_Dot3(int numsurfaces, msurface_t **surfacelist, const vec3_t lightcolorbase, const vec3_t lightcolorpants, const vec3_t lightcolorshirt, rtexture_t *basetexture, rtexture_t *pantstexture, rtexture_t *shirttexture, rtexture_t *normalmaptexture, rtexture_t *glosstexture, float specularscale, qboolean dopants, qboolean doshirt) { // ARB path (any Geforce, any Radeon) int surfacelistindex; @@ -1817,37 +1779,38 @@ static void R_Shadow_RenderSurfacesLighting_Light_Dot3(const entity_render_t *en qboolean dospecular = specularscale > 0; if (!doambient && !dodiffuse && !dospecular) return; - RSurf_PrepareVerticesForBatch(ent, texture, r_shadow_entityeyeorigin, true, true, numsurfaces, surfacelist); + RSurf_PrepareVerticesForBatch(true, true, numsurfaces, surfacelist); + R_Mesh_ColorPointer(NULL); for (surfacelistindex = 0;surfacelistindex < numsurfaces;surfacelistindex++) { const msurface_t *surface = surfacelist[surfacelistindex]; if (doambient) - R_Shadow_RenderSurfacesLighting_Light_Dot3_AmbientPass(ent, texture, surface, lightcolorbase, basetexture, r_shadow_rtlight->ambientscale); + R_Shadow_RenderSurfacesLighting_Light_Dot3_AmbientPass(surface, lightcolorbase, basetexture, r_shadow_rtlight->ambientscale); if (dodiffuse) - R_Shadow_RenderSurfacesLighting_Light_Dot3_DiffusePass(ent, texture, surface, lightcolorbase, basetexture, normalmaptexture, r_shadow_rtlight->diffusescale); + R_Shadow_RenderSurfacesLighting_Light_Dot3_DiffusePass(surface, lightcolorbase, basetexture, normalmaptexture, r_shadow_rtlight->diffusescale); if (dopants) { if (doambient) - R_Shadow_RenderSurfacesLighting_Light_Dot3_AmbientPass(ent, texture, surface, lightcolorpants, pantstexture, r_shadow_rtlight->ambientscale); + R_Shadow_RenderSurfacesLighting_Light_Dot3_AmbientPass(surface, lightcolorpants, pantstexture, r_shadow_rtlight->ambientscale); if (dodiffuse) - R_Shadow_RenderSurfacesLighting_Light_Dot3_DiffusePass(ent, texture, surface, lightcolorpants, pantstexture, normalmaptexture, r_shadow_rtlight->diffusescale); + R_Shadow_RenderSurfacesLighting_Light_Dot3_DiffusePass(surface, lightcolorpants, pantstexture, normalmaptexture, r_shadow_rtlight->diffusescale); } if (doshirt) { if (doambient) - R_Shadow_RenderSurfacesLighting_Light_Dot3_AmbientPass(ent, texture, surface, lightcolorshirt, shirttexture, r_shadow_rtlight->ambientscale); + R_Shadow_RenderSurfacesLighting_Light_Dot3_AmbientPass(surface, lightcolorshirt, shirttexture, r_shadow_rtlight->ambientscale); if (dodiffuse) - R_Shadow_RenderSurfacesLighting_Light_Dot3_DiffusePass(ent, texture, surface, lightcolorshirt, shirttexture, normalmaptexture, r_shadow_rtlight->diffusescale); + R_Shadow_RenderSurfacesLighting_Light_Dot3_DiffusePass(surface, lightcolorshirt, shirttexture, normalmaptexture, r_shadow_rtlight->diffusescale); } if (dospecular) - R_Shadow_RenderSurfacesLighting_Light_Dot3_SpecularPass(ent, texture, surface, lightcolorbase, glosstexture, normalmaptexture, specularscale); + R_Shadow_RenderSurfacesLighting_Light_Dot3_SpecularPass(surface, lightcolorbase, glosstexture, normalmaptexture, specularscale); } } void R_Shadow_RenderSurfacesLighting_Light_Vertex_Pass(const model_t *model, const msurface_t *surface, vec3_t diffusecolor2, vec3_t ambientcolor2) { int renders; - const int *elements = model->surfmesh.data_element3i + surface->num_firsttriangle * 3; + const int *elements = rsurface_model->surfmesh.data_element3i + surface->num_firsttriangle * 3; R_Shadow_RenderSurfacesLighting_Light_Vertex_Shading(surface, diffusecolor2, ambientcolor2); for (renders = 0;renders < 64 && (ambientcolor2[0] > renders || ambientcolor2[1] > renders || ambientcolor2[2] > renders || diffusecolor2[0] > renders || diffusecolor2[1] > renders || diffusecolor2[2] > renders);renders++) { @@ -1914,10 +1877,10 @@ goodpass: } } -static void R_Shadow_RenderSurfacesLighting_Light_Vertex(const entity_render_t *ent, const texture_t *texture, int numsurfaces, msurface_t **surfacelist, const vec3_t lightcolorbase, const vec3_t lightcolorpants, const vec3_t lightcolorshirt, rtexture_t *basetexture, rtexture_t *pantstexture, rtexture_t *shirttexture, rtexture_t *normalmaptexture, rtexture_t *glosstexture, float specularscale, qboolean dopants, qboolean doshirt) +static void R_Shadow_RenderSurfacesLighting_Light_Vertex(int numsurfaces, msurface_t **surfacelist, const vec3_t lightcolorbase, const vec3_t lightcolorpants, const vec3_t lightcolorshirt, rtexture_t *basetexture, rtexture_t *pantstexture, rtexture_t *shirttexture, rtexture_t *normalmaptexture, rtexture_t *glosstexture, float specularscale, qboolean dopants, qboolean doshirt) { int surfacelistindex; - model_t *model = ent->model; + model_t *model = rsurface_entity->model; float ambientcolorbase[3], diffusecolorbase[3]; float ambientcolorpants[3], diffusecolorpants[3]; float ambientcolorshirt[3], diffusecolorshirt[3]; @@ -1929,39 +1892,31 @@ static void R_Shadow_RenderSurfacesLighting_Light_Vertex(const entity_render_t * VectorScale(lightcolorshirt, r_shadow_rtlight->ambientscale * 2, ambientcolorshirt); VectorScale(lightcolorshirt, r_shadow_rtlight->diffusescale * 2, diffusecolorshirt); GL_BlendFunc(GL_SRC_ALPHA, GL_ONE); + R_Mesh_ColorPointer(rsurface_array_color4f); memset(&m, 0, sizeof(m)); m.tex[0] = R_GetTexture(basetexture); + m.texmatrix[0] = rsurface_texture->currenttexmatrix; + m.pointer_texcoord[0] = rsurface_model->surfmesh.data_texcoordtexture2f; if (r_textureunits.integer >= 2) { - // voodoo2 + // voodoo2 or TNT m.tex[1] = R_GetTexture(r_shadow_attenuation2dtexture); m.texmatrix[1] = r_shadow_entitytoattenuationxyz; + m.pointer_texcoord3f[1] = rsurface_vertex3f; if (r_textureunits.integer >= 3) { - // Geforce3/Radeon class but not using dot3 + // Voodoo4 or Kyro (or Geforce3/Radeon with gl_combine off) m.tex[2] = R_GetTexture(r_shadow_attenuation2dtexture); m.texmatrix[2] = r_shadow_entitytoattenuationz; + m.pointer_texcoord3f[2] = rsurface_vertex3f; } } - m.pointer_color = rsurface_array_color4f; - R_Mesh_State(&m); - RSurf_PrepareVerticesForBatch(ent, texture, r_shadow_entityeyeorigin, true, false, numsurfaces, surfacelist); + R_Mesh_TextureState(&m); + RSurf_PrepareVerticesForBatch(true, false, numsurfaces, surfacelist); for (surfacelistindex = 0;surfacelistindex < numsurfaces;surfacelistindex++) { const msurface_t *surface = surfacelist[surfacelistindex]; // OpenGL 1.1 path (anything) - R_Mesh_TexCoordPointer(0, 2, model->surfmesh.data_texcoordtexture2f); - R_Mesh_TexMatrix(0, &texture->currenttexmatrix); - if (r_textureunits.integer >= 2) - { - // voodoo2 or TNT - R_Mesh_TexCoordPointer(1, 3, rsurface_vertex3f); - if (r_textureunits.integer >= 3) - { - // Voodoo4 or Kyro (or Geforce3/Radeon with gl_combine off) - R_Mesh_TexCoordPointer(2, 3, rsurface_vertex3f); - } - } R_Mesh_TexBind(0, R_GetTexture(basetexture)); R_Shadow_RenderSurfacesLighting_Light_Vertex_Pass(model, surface, diffusecolorbase, ambientcolorbase); if (dopants) @@ -1977,53 +1932,53 @@ static void R_Shadow_RenderSurfacesLighting_Light_Vertex(const entity_render_t * } } -void R_Shadow_RenderSurfacesLighting(const entity_render_t *ent, const texture_t *texture, int numsurfaces, msurface_t **surfacelist) +void R_Shadow_RenderSurfacesLighting(int numsurfaces, msurface_t **surfacelist) { // FIXME: support MATERIALFLAG_NODEPTHTEST vec3_t lightcolorbase, lightcolorpants, lightcolorshirt; // calculate colors to render this texture with - lightcolorbase[0] = r_shadow_rtlight->currentcolor[0] * ent->colormod[0] * texture->currentalpha; - lightcolorbase[1] = r_shadow_rtlight->currentcolor[1] * ent->colormod[1] * texture->currentalpha; - lightcolorbase[2] = r_shadow_rtlight->currentcolor[2] * ent->colormod[2] * texture->currentalpha; - if ((r_shadow_rtlight->ambientscale + r_shadow_rtlight->diffusescale) * VectorLength2(lightcolorbase) + (r_shadow_rtlight->specularscale * texture->specularscale) * VectorLength2(lightcolorbase) < (1.0f / 1048576.0f)) + lightcolorbase[0] = r_shadow_rtlight->currentcolor[0] * rsurface_entity->colormod[0] * rsurface_texture->currentalpha; + lightcolorbase[1] = r_shadow_rtlight->currentcolor[1] * rsurface_entity->colormod[1] * rsurface_texture->currentalpha; + lightcolorbase[2] = r_shadow_rtlight->currentcolor[2] * rsurface_entity->colormod[2] * rsurface_texture->currentalpha; + if ((r_shadow_rtlight->ambientscale + r_shadow_rtlight->diffusescale) * VectorLength2(lightcolorbase) + (r_shadow_rtlight->specularscale * rsurface_texture->specularscale) * VectorLength2(lightcolorbase) < (1.0f / 1048576.0f)) return; - if ((texture->textureflags & Q3TEXTUREFLAG_TWOSIDED) || (ent->flags & RENDER_NOCULLFACE)) + if ((rsurface_texture->textureflags & Q3TEXTUREFLAG_TWOSIDED) || (rsurface_entity->flags & RENDER_NOCULLFACE)) qglDisable(GL_CULL_FACE); else qglEnable(GL_CULL_FACE); - if (texture->colormapping) + if (rsurface_texture->colormapping) { - qboolean dopants = texture->skin.pants != NULL && VectorLength2(ent->colormap_pantscolor) >= (1.0f / 1048576.0f); - qboolean doshirt = texture->skin.shirt != NULL && VectorLength2(ent->colormap_shirtcolor) >= (1.0f / 1048576.0f); + qboolean dopants = rsurface_texture->skin.pants != NULL && VectorLength2(rsurface_entity->colormap_pantscolor) >= (1.0f / 1048576.0f); + qboolean doshirt = rsurface_texture->skin.shirt != NULL && VectorLength2(rsurface_entity->colormap_shirtcolor) >= (1.0f / 1048576.0f); if (dopants) { - lightcolorpants[0] = lightcolorbase[0] * ent->colormap_pantscolor[0]; - lightcolorpants[1] = lightcolorbase[1] * ent->colormap_pantscolor[1]; - lightcolorpants[2] = lightcolorbase[2] * ent->colormap_pantscolor[2]; + lightcolorpants[0] = lightcolorbase[0] * rsurface_entity->colormap_pantscolor[0]; + lightcolorpants[1] = lightcolorbase[1] * rsurface_entity->colormap_pantscolor[1]; + lightcolorpants[2] = lightcolorbase[2] * rsurface_entity->colormap_pantscolor[2]; } else VectorClear(lightcolorpants); if (doshirt) { - lightcolorshirt[0] = lightcolorbase[0] * ent->colormap_shirtcolor[0]; - lightcolorshirt[1] = lightcolorbase[1] * ent->colormap_shirtcolor[1]; - lightcolorshirt[2] = lightcolorbase[2] * ent->colormap_shirtcolor[2]; + lightcolorshirt[0] = lightcolorbase[0] * rsurface_entity->colormap_shirtcolor[0]; + lightcolorshirt[1] = lightcolorbase[1] * rsurface_entity->colormap_shirtcolor[1]; + lightcolorshirt[2] = lightcolorbase[2] * rsurface_entity->colormap_shirtcolor[2]; } else VectorClear(lightcolorshirt); switch (r_shadow_rendermode) { case R_SHADOW_RENDERMODE_VISIBLELIGHTING: - R_Shadow_RenderSurfacesLighting_VisibleLighting(ent, texture, numsurfaces, surfacelist, lightcolorbase, lightcolorpants, lightcolorshirt, texture->basetexture, texture->skin.pants, texture->skin.shirt, texture->skin.nmap, texture->glosstexture, r_shadow_rtlight->specularscale * texture->specularscale, dopants, doshirt); + R_Shadow_RenderSurfacesLighting_VisibleLighting(numsurfaces, surfacelist, lightcolorbase, lightcolorpants, lightcolorshirt, rsurface_texture->basetexture, rsurface_texture->skin.pants, rsurface_texture->skin.shirt, rsurface_texture->skin.nmap, rsurface_texture->glosstexture, r_shadow_rtlight->specularscale * rsurface_texture->specularscale, dopants, doshirt); break; case R_SHADOW_RENDERMODE_LIGHT_GLSL: - R_Shadow_RenderSurfacesLighting_Light_GLSL(ent, texture, numsurfaces, surfacelist, lightcolorbase, lightcolorpants, lightcolorshirt, texture->basetexture, texture->skin.pants, texture->skin.shirt, texture->skin.nmap, texture->glosstexture, r_shadow_rtlight->specularscale * texture->specularscale, dopants, doshirt); + R_Shadow_RenderSurfacesLighting_Light_GLSL(numsurfaces, surfacelist, lightcolorbase, lightcolorpants, lightcolorshirt, rsurface_texture->basetexture, rsurface_texture->skin.pants, rsurface_texture->skin.shirt, rsurface_texture->skin.nmap, rsurface_texture->glosstexture, r_shadow_rtlight->specularscale * rsurface_texture->specularscale, dopants, doshirt); break; case R_SHADOW_RENDERMODE_LIGHT_DOT3: - R_Shadow_RenderSurfacesLighting_Light_Dot3(ent, texture, numsurfaces, surfacelist, lightcolorbase, lightcolorpants, lightcolorshirt, texture->basetexture, texture->skin.pants, texture->skin.shirt, texture->skin.nmap, texture->glosstexture, r_shadow_rtlight->specularscale * texture->specularscale, dopants, doshirt); + R_Shadow_RenderSurfacesLighting_Light_Dot3(numsurfaces, surfacelist, lightcolorbase, lightcolorpants, lightcolorshirt, rsurface_texture->basetexture, rsurface_texture->skin.pants, rsurface_texture->skin.shirt, rsurface_texture->skin.nmap, rsurface_texture->glosstexture, r_shadow_rtlight->specularscale * rsurface_texture->specularscale, dopants, doshirt); break; case R_SHADOW_RENDERMODE_LIGHT_VERTEX: - R_Shadow_RenderSurfacesLighting_Light_Vertex(ent, texture, numsurfaces, surfacelist, lightcolorbase, lightcolorpants, lightcolorshirt, texture->basetexture, texture->skin.pants, texture->skin.shirt, texture->skin.nmap, texture->glosstexture, r_shadow_rtlight->specularscale * texture->specularscale, dopants, doshirt); + R_Shadow_RenderSurfacesLighting_Light_Vertex(numsurfaces, surfacelist, lightcolorbase, lightcolorpants, lightcolorshirt, rsurface_texture->basetexture, rsurface_texture->skin.pants, rsurface_texture->skin.shirt, rsurface_texture->skin.nmap, rsurface_texture->glosstexture, r_shadow_rtlight->specularscale * rsurface_texture->specularscale, dopants, doshirt); break; default: Con_Printf("R_Shadow_RenderSurfacesLighting: unknown r_shadow_rendermode %i\n", r_shadow_rendermode); @@ -2035,16 +1990,16 @@ void R_Shadow_RenderSurfacesLighting(const entity_render_t *ent, const texture_t switch (r_shadow_rendermode) { case R_SHADOW_RENDERMODE_VISIBLELIGHTING: - R_Shadow_RenderSurfacesLighting_VisibleLighting(ent, texture, numsurfaces, surfacelist, lightcolorbase, vec3_origin, vec3_origin, texture->basetexture, r_texture_black, r_texture_black, texture->skin.nmap, texture->glosstexture, r_shadow_rtlight->specularscale * texture->specularscale, false, false); + R_Shadow_RenderSurfacesLighting_VisibleLighting(numsurfaces, surfacelist, lightcolorbase, vec3_origin, vec3_origin, rsurface_texture->basetexture, r_texture_black, r_texture_black, rsurface_texture->skin.nmap, rsurface_texture->glosstexture, r_shadow_rtlight->specularscale * rsurface_texture->specularscale, false, false); break; case R_SHADOW_RENDERMODE_LIGHT_GLSL: - R_Shadow_RenderSurfacesLighting_Light_GLSL(ent, texture, numsurfaces, surfacelist, lightcolorbase, vec3_origin, vec3_origin, texture->basetexture, r_texture_black, r_texture_black, texture->skin.nmap, texture->glosstexture, r_shadow_rtlight->specularscale * texture->specularscale, false, false); + R_Shadow_RenderSurfacesLighting_Light_GLSL(numsurfaces, surfacelist, lightcolorbase, vec3_origin, vec3_origin, rsurface_texture->basetexture, r_texture_black, r_texture_black, rsurface_texture->skin.nmap, rsurface_texture->glosstexture, r_shadow_rtlight->specularscale * rsurface_texture->specularscale, false, false); break; case R_SHADOW_RENDERMODE_LIGHT_DOT3: - R_Shadow_RenderSurfacesLighting_Light_Dot3(ent, texture, numsurfaces, surfacelist, lightcolorbase, vec3_origin, vec3_origin, texture->basetexture, r_texture_black, r_texture_black, texture->skin.nmap, texture->glosstexture, r_shadow_rtlight->specularscale * texture->specularscale, false, false); + R_Shadow_RenderSurfacesLighting_Light_Dot3(numsurfaces, surfacelist, lightcolorbase, vec3_origin, vec3_origin, rsurface_texture->basetexture, r_texture_black, r_texture_black, rsurface_texture->skin.nmap, rsurface_texture->glosstexture, r_shadow_rtlight->specularscale * rsurface_texture->specularscale, false, false); break; case R_SHADOW_RENDERMODE_LIGHT_VERTEX: - R_Shadow_RenderSurfacesLighting_Light_Vertex(ent, texture, numsurfaces, surfacelist, lightcolorbase, vec3_origin, vec3_origin, texture->basetexture, r_texture_black, r_texture_black, texture->skin.nmap, texture->glosstexture, r_shadow_rtlight->specularscale * texture->specularscale, false, false); + R_Shadow_RenderSurfacesLighting_Light_Vertex(numsurfaces, surfacelist, lightcolorbase, vec3_origin, vec3_origin, rsurface_texture->basetexture, r_texture_black, r_texture_black, rsurface_texture->skin.nmap, rsurface_texture->glosstexture, r_shadow_rtlight->specularscale * rsurface_texture->specularscale, false, false); break; default: Con_Printf("R_Shadow_RenderSurfacesLighting: unknown r_shadow_rendermode %i\n", r_shadow_rendermode); @@ -2247,12 +2202,14 @@ void R_Shadow_DrawEntityShadow(entity_render_t *ent, int numsurfaces, int *surfa void R_Shadow_SetupEntityLight(const entity_render_t *ent) { // set up properties for rendering light onto this entity + RSurf_ActiveEntity(ent); Matrix4x4_Concat(&r_shadow_entitytolight, &r_shadow_rtlight->matrix_worldtolight, &ent->matrix); Matrix4x4_Concat(&r_shadow_entitytoattenuationxyz, &matrix_attenuationxyz, &r_shadow_entitytolight); Matrix4x4_Concat(&r_shadow_entitytoattenuationz, &matrix_attenuationz, &r_shadow_entitytolight); Matrix4x4_Transform(&ent->inversematrix, r_shadow_rtlight->shadoworigin, r_shadow_entitylightorigin); - Matrix4x4_Transform(&ent->inversematrix, r_vieworigin, r_shadow_entityeyeorigin); - R_Mesh_Matrix(&ent->matrix); + VectorCopy(rsurface_modelorg, r_shadow_entityeyeorigin); + if (r_shadow_lightingrendermode == R_SHADOW_RENDERMODE_LIGHT_GLSL) + R_Mesh_TexMatrix(3, &r_shadow_entitytolight); } void R_Shadow_DrawEntityLight(entity_render_t *ent, int numsurfaces, int *surfacelist)