- GL_BlendFunc(GL_ONE, GL_ZERO);
- GL_DepthMask(true);
- }
- if (gl_textureshader && r_watershader.integer)
- {
- m.tex[0] = R_GetTexture(mod_shared_distorttexture);
- m.tex[1] = R_GetTexture(texture->skin.base);
- }
- else
- m.tex[0] = R_GetTexture(texture->skin.base);
- colorscale = r_colorscale;
- if (gl_combine.integer)
- {
- m.texrgbscale[0] = 4;
- colorscale *= 0.25f;
- }
- GL_DepthTest(true);
- GL_ColorPointer(varray_color4f);
- for (mesh = surf->mesh;mesh;mesh = mesh->chain)
- {
- GL_VertexPointer(mesh->vertex3f);
- m.pointer_texcoord[0] = mesh->texcoordtexture2f;
- m.pointer_texcoord[1] = mesh->texcoordtexture2f;
- m.texcombinergb[1] = GL_REPLACE;
- R_Mesh_State_Texture(&m);
- f = surf->flags & SURF_DRAWFULLBRIGHT ? 1.0f : ((surf->flags & SURF_LIGHTMAP) ? 0 : 0.5f);
- R_FillColors(varray_color4f, mesh->numverts, f, f, f, alpha);
- if (!(surf->flags & SURF_DRAWFULLBRIGHT || ent->effects & EF_FULLBRIGHT))
- {
- if (surf->dlightframe == r_framecount)
- RSurf_LightSeparate_Vertex3f_Color4f(&ent->inversematrix, surf->dlightbits, mesh->numverts, mesh->vertex3f, varray_color4f, 1);
- if (surf->flags & SURF_LIGHTMAP)
- RSurf_AddLightmapToVertexColors_Color4f(mesh->lightmapoffsets, varray_color4f, mesh->numverts, surf->samples, ((surf->extents[0]>>4)+1)*((surf->extents[1]>>4)+1)*3, surf->styles);
- }
- RSurf_FogColors_Vertex3f_Color4f(mesh->vertex3f, varray_color4f, colorscale, mesh->numverts, modelorg);
- if (gl_textureshader && r_watershader.integer)
- {
- GL_ActiveTexture (0);
- qglTexEnvi (GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, GL_TEXTURE_2D);
- GL_ActiveTexture (1);
- qglTexEnvi (GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, GL_TEXTURE_2D);
- qglTexEnvi (GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, GL_OFFSET_TEXTURE_2D_NV);
- qglTexEnvi (GL_TEXTURE_SHADER_NV, GL_PREVIOUS_TEXTURE_INPUT_NV, GL_TEXTURE0_ARB);
- qglTexEnvfv (GL_TEXTURE_SHADER_NV, GL_OFFSET_TEXTURE_MATRIX_NV, &args[0]);
- qglEnable (GL_TEXTURE_SHADER_NV);
- }
- R_Mesh_Draw(mesh->numverts, mesh->numtriangles, mesh->element3i);
- if (gl_textureshader && r_watershader.integer)
- {
- qglDisable (GL_TEXTURE_SHADER_NV);
- GL_ActiveTexture (0);
- }
- }
-
- if (fogenabled)
- {
- memset(&m, 0, sizeof(m));
- GL_BlendFunc(GL_SRC_ALPHA, GL_ONE);
- GL_DepthMask(false);
- GL_DepthTest(true);
- m.tex[0] = R_GetTexture(texture->skin.fog);
- for (mesh = surf->mesh;mesh;mesh = mesh->chain)
- {
- GL_VertexPointer(mesh->vertex3f);
- m.pointer_texcoord[0] = mesh->texcoordtexture2f;
- GL_ColorPointer(varray_color4f);
- R_Mesh_State_Texture(&m);
- RSurf_FogPassColors_Vertex3f_Color4f(mesh->vertex3f, varray_color4f, fogcolor[0], fogcolor[1], fogcolor[2], alpha, r_colorscale, mesh->numverts, modelorg);
- R_Mesh_Draw(mesh->numverts, mesh->numtriangles, mesh->element3i);
- }
- }
-
- if (r_waterscroll.value)
- {
- Matrix4x4_CreateIdentity(&tempmatrix);
- R_Mesh_TextureMatrix(0, &tempmatrix);
- R_Mesh_TextureMatrix(1, &tempmatrix);
- }
-}
-
-static void RSurfShader_Water(const entity_render_t *ent, const texture_t *texture, msurface_t **surfchain)
-{
- const msurface_t *surf;
- msurface_t **chain;
- vec3_t center;
- if (texture->rendertype != SURFRENDER_OPAQUE)
- {
- for (chain = surfchain;(surf = *chain) != NULL;chain++)
- {
- if (surf->visframe == r_framecount)
- {
- Matrix4x4_Transform(&ent->matrix, surf->poly_center, center);
- R_MeshQueue_AddTransparent(center, RSurfShader_Water_Callback, ent, surf - ent->model->brushq1.surfaces);
- }
- }
- }
- else
- for (chain = surfchain;(surf = *chain) != NULL;chain++)
- if (surf->visframe == r_framecount)
- RSurfShader_Water_Callback(ent, surf - ent->model->brushq1.surfaces);
-}
-
-static void RSurfShader_Wall_Pass_BaseVertex(const entity_render_t *ent, const msurface_t *surf, const texture_t *texture, int rendertype, float currentalpha)
-{
- float base, colorscale;
- const surfmesh_t *mesh;
- rmeshstate_t m;
- float modelorg[3];
- Matrix4x4_Transform(&ent->inversematrix, r_origin, modelorg);
- memset(&m, 0, sizeof(m));
- if (rendertype == SURFRENDER_ADD)
- {
- GL_BlendFunc(GL_SRC_ALPHA, GL_ONE);
- GL_DepthMask(false);
- }
- else if (rendertype == SURFRENDER_ALPHA)
- {
- GL_BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- GL_DepthMask(false);
- }
- else
- {
- GL_BlendFunc(GL_ONE, GL_ZERO);
- GL_DepthMask(true);
- }
- m.tex[0] = R_GetTexture(texture->skin.base);
- colorscale = r_colorscale;
- if (gl_combine.integer)
- {
- m.texrgbscale[0] = 4;
- colorscale *= 0.25f;
- }
- base = ent->effects & EF_FULLBRIGHT ? 2.0f : r_ambient.value * (1.0f / 64.0f);
- GL_DepthTest(true);
- GL_ColorPointer(varray_color4f);
- for (mesh = surf->mesh;mesh;mesh = mesh->chain)
- {
- GL_VertexPointer(mesh->vertex3f);
- m.pointer_texcoord[0] = mesh->texcoordtexture2f;
- R_Mesh_State_Texture(&m);
- R_FillColors(varray_color4f, mesh->numverts, base, base, base, currentalpha);
- if (!(ent->effects & EF_FULLBRIGHT))
- {
- if (surf->dlightframe == r_framecount)
- RSurf_LightSeparate_Vertex3f_Color4f(&ent->inversematrix, surf->dlightbits, mesh->numverts, mesh->vertex3f, varray_color4f, 1);
- if (surf->flags & SURF_LIGHTMAP)
- RSurf_AddLightmapToVertexColors_Color4f(mesh->lightmapoffsets, varray_color4f, mesh->numverts, surf->samples, ((surf->extents[0]>>4)+1)*((surf->extents[1]>>4)+1)*3, surf->styles);
- }
- RSurf_FogColors_Vertex3f_Color4f(mesh->vertex3f, varray_color4f, colorscale, mesh->numverts, modelorg);
- R_Mesh_Draw(mesh->numverts, mesh->numtriangles, mesh->element3i);
- }
-}
-
-static void RSurfShader_Wall_Pass_Glow(const entity_render_t *ent, const msurface_t *surf, const texture_t *texture, int rendertype, float currentalpha)
-{
- const surfmesh_t *mesh;
- rmeshstate_t m;
- float modelorg[3];
- Matrix4x4_Transform(&ent->inversematrix, r_origin, modelorg);
- memset(&m, 0, sizeof(m));
- GL_BlendFunc(GL_SRC_ALPHA, GL_ONE);
- GL_DepthMask(false);
- GL_DepthTest(true);
- m.tex[0] = R_GetTexture(texture->skin.glow);
- GL_ColorPointer(varray_color4f);
- for (mesh = surf->mesh;mesh;mesh = mesh->chain)
- {
- GL_VertexPointer(mesh->vertex3f);
- if (m.tex[0])
- m.pointer_texcoord[0] = mesh->texcoordtexture2f;
- R_Mesh_State_Texture(&m);
- RSurf_FoggedColors_Vertex3f_Color4f(mesh->vertex3f, varray_color4f, 1, 1, 1, currentalpha, r_colorscale, mesh->numverts, modelorg);
- R_Mesh_Draw(mesh->numverts, mesh->numtriangles, mesh->element3i);
- }
-}
-
-static void RSurfShader_Wall_Pass_Fog(const entity_render_t *ent, const msurface_t *surf, const texture_t *texture, int rendertype, float currentalpha)
-{
- const surfmesh_t *mesh;
- rmeshstate_t m;
- float modelorg[3];
- Matrix4x4_Transform(&ent->inversematrix, r_origin, modelorg);
- memset(&m, 0, sizeof(m));
- GL_BlendFunc(GL_SRC_ALPHA, GL_ONE);
- GL_DepthMask(false);
- GL_DepthTest(true);
- m.tex[0] = R_GetTexture(texture->skin.fog);
- GL_ColorPointer(varray_color4f);
- for (mesh = surf->mesh;mesh;mesh = mesh->chain)
- {
- GL_VertexPointer(mesh->vertex3f);
- if (m.tex[0])
- m.pointer_texcoord[0] = mesh->texcoordtexture2f;
- R_Mesh_State_Texture(&m);
- RSurf_FogPassColors_Vertex3f_Color4f(mesh->vertex3f, varray_color4f, fogcolor[0], fogcolor[1], fogcolor[2], currentalpha, r_colorscale, mesh->numverts, modelorg);
- R_Mesh_Draw(mesh->numverts, mesh->numtriangles, mesh->element3i);
- }
-}
-
-static void RSurfShader_OpaqueWall_Pass_BaseTripleTexCombine(const entity_render_t *ent, const texture_t *texture, msurface_t **surfchain)
-{
- const msurface_t *surf;
- const surfmesh_t *mesh;
- rmeshstate_t m;
- int lightmaptexturenum;
- float cl;
- memset(&m, 0, sizeof(m));
- GL_BlendFunc(GL_ONE, GL_ZERO);
- GL_DepthMask(true);
- GL_DepthTest(true);
- m.tex[0] = R_GetTexture(texture->skin.base);
- m.tex[1] = R_GetTexture((**surfchain).lightmaptexture);
- m.tex[2] = R_GetTexture(texture->skin.detail);
- m.texrgbscale[0] = 1;
- m.texrgbscale[1] = 4;
- m.texrgbscale[2] = 2;
- cl = (float) (1 << r_lightmapscalebit) * r_colorscale;
- GL_Color(cl, cl, cl, 1);
-
- while((surf = *surfchain++) != NULL)
- {
- if (surf->visframe == r_framecount)
- {
- lightmaptexturenum = R_GetTexture(surf->lightmaptexture);
- //if (m.tex[1] != lightmaptexturenum)
- //{
- m.tex[1] = lightmaptexturenum;
- // R_Mesh_State_Texture(&m);
- //}
- for (mesh = surf->mesh;mesh;mesh = mesh->chain)
- {
- GL_VertexPointer(mesh->vertex3f);
- m.pointer_texcoord[0] = mesh->texcoordtexture2f;
- m.pointer_texcoord[1] = mesh->texcoordlightmap2f;
- m.pointer_texcoord[2] = mesh->texcoorddetail2f;
- R_Mesh_State_Texture(&m);
- R_Mesh_Draw(mesh->numverts, mesh->numtriangles, mesh->element3i);
- }
- }
- }
-}
-
-static void RSurfShader_OpaqueWall_Pass_BaseDoubleTex(const entity_render_t *ent, const texture_t *texture, msurface_t **surfchain)
-{
- const msurface_t *surf;
- const surfmesh_t *mesh;
- rmeshstate_t m;
- int lightmaptexturenum;
- memset(&m, 0, sizeof(m));
- GL_BlendFunc(GL_ONE, GL_ZERO);
- GL_DepthMask(true);
- GL_DepthTest(true);
- m.tex[0] = R_GetTexture(texture->skin.base);
- m.tex[1] = R_GetTexture((**surfchain).lightmaptexture);
- if (gl_combine.integer)
- m.texrgbscale[1] = 4;
- GL_Color(r_colorscale, r_colorscale, r_colorscale, 1);
- while((surf = *surfchain++) != NULL)
- {
- if (surf->visframe == r_framecount)
- {
- lightmaptexturenum = R_GetTexture(surf->lightmaptexture);
- //if (m.tex[1] != lightmaptexturenum)
- //{
- m.tex[1] = lightmaptexturenum;
- // R_Mesh_State_Texture(&m);
- //}
- for (mesh = surf->mesh;mesh;mesh = mesh->chain)
- {
- GL_VertexPointer(mesh->vertex3f);
- m.pointer_texcoord[0] = mesh->texcoordtexture2f;
- m.pointer_texcoord[1] = mesh->texcoordlightmap2f;
- R_Mesh_State_Texture(&m);
- R_Mesh_Draw(mesh->numverts, mesh->numtriangles, mesh->element3i);
- }
- }
- }
-}
-
-static void RSurfShader_OpaqueWall_Pass_BaseTexture(const entity_render_t *ent, const texture_t *texture, msurface_t **surfchain)
-{
- const msurface_t *surf;
- const surfmesh_t *mesh;
- rmeshstate_t m;
- memset(&m, 0, sizeof(m));
- GL_DepthMask(true);
- GL_DepthTest(true);
- GL_BlendFunc(GL_ONE, GL_ZERO);
- m.tex[0] = R_GetTexture(texture->skin.base);
- GL_Color(1, 1, 1, 1);
- while((surf = *surfchain++) != NULL)
- {
- if (surf->visframe == r_framecount)
- {
- for (mesh = surf->mesh;mesh;mesh = mesh->chain)
- {
- GL_VertexPointer(mesh->vertex3f);
- m.pointer_texcoord[0] = mesh->texcoordtexture2f;
- R_Mesh_State_Texture(&m);
- R_Mesh_Draw(mesh->numverts, mesh->numtriangles, mesh->element3i);
- }
- }
- }
-}
-
-static void RSurfShader_OpaqueWall_Pass_BaseLightmap(const entity_render_t *ent, const texture_t *texture, msurface_t **surfchain)
-{
- const msurface_t *surf;
- const surfmesh_t *mesh;
- rmeshstate_t m;
- int lightmaptexturenum;
- memset(&m, 0, sizeof(m));
- GL_BlendFunc(GL_ZERO, GL_SRC_COLOR);
- GL_DepthMask(false);
- GL_DepthTest(true);
- m.tex[0] = R_GetTexture((**surfchain).lightmaptexture);
- if (gl_combine.integer)
- m.texrgbscale[0] = 4;
- GL_Color(r_colorscale, r_colorscale, r_colorscale, 1);
- while((surf = *surfchain++) != NULL)
- {
- if (surf->visframe == r_framecount)
- {
- lightmaptexturenum = R_GetTexture(surf->lightmaptexture);
- //if (m.tex[0] != lightmaptexturenum)
- //{
- m.tex[0] = lightmaptexturenum;
- // R_Mesh_State_Texture(&m);
- //}
- for (mesh = surf->mesh;mesh;mesh = mesh->chain)
- {
- GL_VertexPointer(mesh->vertex3f);
- m.pointer_texcoord[0] = mesh->texcoordlightmap2f;
- R_Mesh_State_Texture(&m);
- R_Mesh_Draw(mesh->numverts, mesh->numtriangles, mesh->element3i);
- }
- }
- }
-}
-
-static void RSurfShader_OpaqueWall_Pass_Light(const entity_render_t *ent, const texture_t *texture, msurface_t **surfchain)
-{
- const msurface_t *surf;
- const surfmesh_t *mesh;
- float colorscale;
- rmeshstate_t m;
-
- memset(&m, 0, sizeof(m));
- GL_BlendFunc(GL_SRC_ALPHA, GL_ONE);
- GL_DepthMask(false);
- GL_DepthTest(true);
- m.tex[0] = R_GetTexture(texture->skin.base);
- colorscale = r_colorscale;
- if (gl_combine.integer)
- {
- m.texrgbscale[0] = 4;
- colorscale *= 0.25f;
- }
- GL_ColorPointer(varray_color4f);
- while((surf = *surfchain++) != NULL)
- {
- if (surf->visframe == r_framecount && surf->dlightframe == r_framecount)
- {
- for (mesh = surf->mesh;mesh;mesh = mesh->chain)
- {
- if (RSurf_LightCheck(&ent->inversematrix, surf->dlightbits, mesh))
- {
- GL_VertexPointer(mesh->vertex3f);
- m.pointer_texcoord[0] = mesh->texcoordtexture2f;
- R_FillColors(varray_color4f, mesh->numverts, 0, 0, 0, 1);
- R_Mesh_State_Texture(&m);
- RSurf_LightSeparate_Vertex3f_Color4f(&ent->inversematrix, surf->dlightbits, mesh->numverts, mesh->vertex3f, varray_color4f, colorscale);
- R_Mesh_Draw(mesh->numverts, mesh->numtriangles, mesh->element3i);
- }
- }
- }
- }
-}
-
-static void RSurfShader_OpaqueWall_Pass_Fog(const entity_render_t *ent, const texture_t *texture, msurface_t **surfchain)
-{
- const msurface_t *surf;
- const surfmesh_t *mesh;
- rmeshstate_t m;
- float modelorg[3];
- Matrix4x4_Transform(&ent->inversematrix, r_origin, modelorg);
- memset(&m, 0, sizeof(m));
- GL_BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- GL_DepthMask(false);
- GL_DepthTest(true);
- GL_ColorPointer(varray_color4f);
- while((surf = *surfchain++) != NULL)
- {
- if (surf->visframe == r_framecount)
- {
- for (mesh = surf->mesh;mesh;mesh = mesh->chain)
- {
- GL_VertexPointer(mesh->vertex3f);
- if (m.tex[0])
- m.pointer_texcoord[0] = mesh->texcoordtexture2f;
- R_Mesh_State_Texture(&m);
- RSurf_FogPassColors_Vertex3f_Color4f(mesh->vertex3f, varray_color4f, fogcolor[0], fogcolor[1], fogcolor[2], 1, r_colorscale, mesh->numverts, modelorg);
- R_Mesh_Draw(mesh->numverts, mesh->numtriangles, mesh->element3i);
- }
- }
- }
-}
-
-static void RSurfShader_OpaqueWall_Pass_BaseDetail(const entity_render_t *ent, const texture_t *texture, msurface_t **surfchain)
-{
- const msurface_t *surf;
- const surfmesh_t *mesh;
- rmeshstate_t m;
- memset(&m, 0, sizeof(m));
- GL_BlendFunc(GL_DST_COLOR, GL_SRC_COLOR);
- GL_DepthMask(false);
- GL_DepthTest(true);
- m.tex[0] = R_GetTexture(texture->skin.detail);
- GL_Color(1, 1, 1, 1);
- while((surf = *surfchain++) != NULL)
- {
- if (surf->visframe == r_framecount)