X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=gl_rsurf.c;h=2c78a2c6069d2b1901df1200de0d3f314dc4b67a;hp=02b002e0d3eeb9d64238e407e2aea3efbcec06b0;hb=fdfa815d659f4ceec149ce3f907c107f38022c3d;hpb=10bb1f0433fe2be39b0c9cdc23b30544020351c2 diff --git a/gl_rsurf.c b/gl_rsurf.c index 02b002e0..2c78a2c6 100644 --- a/gl_rsurf.c +++ b/gl_rsurf.c @@ -741,33 +741,33 @@ static void RSurfShader_Sky(const entity_render_t *ent, const texture_t *texture R_Mesh_Matrix(&ent->matrix); - // draw depth-only polys - memset(&m, 0, sizeof(m)); + GL_Color(fogcolor[0] * r_colorscale, fogcolor[1] * r_colorscale, fogcolor[2] * r_colorscale, 1); if (skyrendermasked) { + // depth-only (masking) qglColorMask(0,0,0,0); // just to make sure that braindead drivers don't draw anything // despite that colormask... - m.blendfunc1 = GL_ZERO; - m.blendfunc2 = GL_ONE; + GL_BlendFunc(GL_ZERO, GL_ONE); } else { // fog sky - m.blendfunc1 = GL_ONE; - m.blendfunc2 = GL_ZERO; + GL_BlendFunc(GL_ONE, GL_ZERO); } - m.depthwrite = true; - R_Mesh_State(&m); + GL_DepthMask(true); + GL_DepthTest(true); + + memset(&m, 0, sizeof(m)); + R_Mesh_State_Texture(&m); + while((surf = *surfchain++) != NULL) { if (surf->visframe == r_framecount) { for (mesh = surf->mesh;mesh;mesh = mesh->chain) { - GL_Color(fogcolor[0] * r_colorscale, fogcolor[1] * r_colorscale, fogcolor[2] * r_colorscale, 1); - R_Mesh_GetSpace(mesh->numverts); - R_Mesh_CopyVertex3f(mesh->vertex3f, mesh->numverts); + GL_VertexPointer(mesh->vertex3f); R_Mesh_Draw(mesh->numverts, mesh->numtriangles, mesh->element3i); } } @@ -777,36 +777,40 @@ static void RSurfShader_Sky(const entity_render_t *ent, const texture_t *texture static void RSurfShader_Water_Callback(const void *calldata1, int calldata2) { - int i; const entity_render_t *ent = calldata1; const msurface_t *surf = ent->model->surfaces + calldata2; - float f, colorscale, scroll[2], *v, *tc; + float f, colorscale; const surfmesh_t *mesh; rmeshstate_t m; float alpha; float modelorg[3]; texture_t *texture; - Matrix4x4_Transform(&ent->inversematrix, r_origin, modelorg); + matrix4x4_t tempmatrix; + + // scrolling in texture matrix + Matrix4x4_CreateTranslate(&tempmatrix, sin(cl.time) * 0.125, sin(cl.time * 0.8f) * 0.125, 0); + R_Mesh_TextureMatrix(0, &tempmatrix); R_Mesh_Matrix(&ent->matrix); + Matrix4x4_Transform(&ent->inversematrix, r_origin, modelorg); memset(&m, 0, sizeof(m)); texture = surf->texinfo->texture->currentframe; alpha = texture->currentalpha; if (texture->rendertype == SURFRENDER_ADD) { - m.blendfunc1 = GL_SRC_ALPHA; - m.blendfunc2 = GL_ONE; + GL_BlendFunc(GL_SRC_ALPHA, GL_ONE); + GL_DepthMask(false); } else if (texture->rendertype == SURFRENDER_ALPHA) { - m.blendfunc1 = GL_SRC_ALPHA; - m.blendfunc2 = GL_ONE_MINUS_SRC_ALPHA; + GL_BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + GL_DepthMask(false); } else { - m.blendfunc1 = GL_ONE; - m.blendfunc2 = GL_ZERO; + GL_BlendFunc(GL_ONE, GL_ZERO); + GL_DepthMask(true); } m.tex[0] = R_GetTexture(texture->skin.base); colorscale = r_colorscale; @@ -815,19 +819,13 @@ static void RSurfShader_Water_Callback(const void *calldata1, int calldata2) m.texrgbscale[0] = 4; colorscale *= 0.25f; } - R_Mesh_State(&m); - GL_UseColorArray(); + GL_DepthTest(true); + GL_ColorPointer(varray_color4f); for (mesh = surf->mesh;mesh;mesh = mesh->chain) { - R_Mesh_GetSpace(mesh->numverts); - R_Mesh_CopyVertex3f(mesh->vertex3f, mesh->numverts); - scroll[0] = sin(cl.time) * 0.125f; - scroll[1] = sin(cl.time * 0.8f) * 0.125f; - for (i = 0, v = varray_texcoord2f[0], tc = mesh->texcoordtexture2f;i < mesh->numverts;i++, v += 2, tc += 2) - { - v[0] = tc[0] + scroll[0]; - v[1] = tc[1] + scroll[1]; - } + GL_VertexPointer(mesh->vertex3f); + m.pointer_texcoord[0] = mesh->texcoordtexture2f; + 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)) @@ -844,20 +842,23 @@ static void RSurfShader_Water_Callback(const void *calldata1, int calldata2) if (fogenabled) { memset(&m, 0, sizeof(m)); - m.blendfunc1 = GL_SRC_ALPHA; - m.blendfunc2 = GL_ONE; + GL_BlendFunc(GL_SRC_ALPHA, GL_ONE); + GL_DepthMask(false); + GL_DepthTest(true); m.tex[0] = R_GetTexture(texture->skin.fog); - R_Mesh_State(&m); for (mesh = surf->mesh;mesh;mesh = mesh->chain) { - R_Mesh_GetSpace(mesh->numverts); - R_Mesh_CopyVertex3f(mesh->vertex3f, mesh->numverts); - if (m.tex[0]) - R_Mesh_CopyTexCoord2f(0, mesh->texcoordtexture2f, mesh->numverts); + 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); } } + + Matrix4x4_CreateIdentity(&tempmatrix); + R_Mesh_TextureMatrix(0, &tempmatrix); } static void RSurfShader_Water(const entity_render_t *ent, const texture_t *texture, msurface_t **surfchain) @@ -892,18 +893,18 @@ static void RSurfShader_Wall_Pass_BaseVertex(const entity_render_t *ent, const m memset(&m, 0, sizeof(m)); if (rendertype == SURFRENDER_ADD) { - m.blendfunc1 = GL_SRC_ALPHA; - m.blendfunc2 = GL_ONE; + GL_BlendFunc(GL_SRC_ALPHA, GL_ONE); + GL_DepthMask(false); } else if (rendertype == SURFRENDER_ALPHA) { - m.blendfunc1 = GL_SRC_ALPHA; - m.blendfunc2 = GL_ONE_MINUS_SRC_ALPHA; + GL_BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + GL_DepthMask(false); } else { - m.blendfunc1 = GL_ONE; - m.blendfunc2 = GL_ZERO; + GL_BlendFunc(GL_ONE, GL_ZERO); + GL_DepthMask(true); } m.tex[0] = R_GetTexture(texture->skin.base); colorscale = r_colorscale; @@ -913,13 +914,13 @@ static void RSurfShader_Wall_Pass_BaseVertex(const entity_render_t *ent, const m colorscale *= 0.25f; } base = ent->effects & EF_FULLBRIGHT ? 2.0f : r_ambient.value * (1.0f / 64.0f); - R_Mesh_State(&m); - GL_UseColorArray(); + GL_DepthTest(true); + GL_ColorPointer(varray_color4f); for (mesh = surf->mesh;mesh;mesh = mesh->chain) { - R_Mesh_GetSpace(mesh->numverts); - R_Mesh_CopyVertex3f(mesh->vertex3f, mesh->numverts); - R_Mesh_CopyTexCoord2f(0, mesh->texcoordtexture2f, mesh->numverts); + 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)) { @@ -940,16 +941,17 @@ static void RSurfShader_Wall_Pass_Glow(const entity_render_t *ent, const msurfac float modelorg[3]; Matrix4x4_Transform(&ent->inversematrix, r_origin, modelorg); memset(&m, 0, sizeof(m)); - m.blendfunc1 = GL_SRC_ALPHA; - m.blendfunc2 = GL_ONE; + GL_BlendFunc(GL_SRC_ALPHA, GL_ONE); + GL_DepthMask(false); + GL_DepthTest(true); m.tex[0] = R_GetTexture(texture->skin.glow); - R_Mesh_State(&m); - GL_UseColorArray(); + GL_ColorPointer(varray_color4f); for (mesh = surf->mesh;mesh;mesh = mesh->chain) { - R_Mesh_GetSpace(mesh->numverts); - R_Mesh_CopyVertex3f(mesh->vertex3f, mesh->numverts); - R_Mesh_CopyTexCoord2f(0, mesh->texcoordtexture2f, mesh->numverts); + 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); } @@ -962,17 +964,17 @@ static void RSurfShader_Wall_Pass_Fog(const entity_render_t *ent, const msurface float modelorg[3]; Matrix4x4_Transform(&ent->inversematrix, r_origin, modelorg); memset(&m, 0, sizeof(m)); - m.blendfunc1 = GL_SRC_ALPHA; - m.blendfunc2 = GL_ONE; + GL_BlendFunc(GL_SRC_ALPHA, GL_ONE); + GL_DepthMask(false); + GL_DepthTest(true); m.tex[0] = R_GetTexture(texture->skin.fog); - R_Mesh_State(&m); - GL_UseColorArray(); + GL_ColorPointer(varray_color4f); for (mesh = surf->mesh;mesh;mesh = mesh->chain) { - R_Mesh_GetSpace(mesh->numverts); - R_Mesh_CopyVertex3f(mesh->vertex3f, mesh->numverts); + GL_VertexPointer(mesh->vertex3f); if (m.tex[0]) - R_Mesh_CopyTexCoord2f(0, mesh->texcoordtexture2f, mesh->numverts); + 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); } @@ -986,50 +988,35 @@ static void RSurfShader_OpaqueWall_Pass_BaseTripleTexCombine(const entity_render int lightmaptexturenum; float cl; memset(&m, 0, sizeof(m)); - m.blendfunc1 = GL_ONE; - m.blendfunc2 = GL_ZERO; + 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; - R_Mesh_State(&m); cl = (float) (1 << r_lightmapscalebit) * r_colorscale; GL_Color(cl, cl, cl, 1); - if (!gl_mesh_copyarrays.integer) - R_Mesh_EndBatch(); while((surf = *surfchain++) != NULL) { if (surf->visframe == r_framecount) { lightmaptexturenum = R_GetTexture(surf->lightmaptexture); - if (m.tex[1] != lightmaptexturenum) - { + //if (m.tex[1] != lightmaptexturenum) + //{ m.tex[1] = lightmaptexturenum; - if (gl_mesh_copyarrays.integer) - R_Mesh_State(&m); - } + // R_Mesh_State_Texture(&m); + //} for (mesh = surf->mesh;mesh;mesh = mesh->chain) { - if (gl_mesh_copyarrays.integer) - { - m.pointervertexcount = mesh->numverts; - m.pointer_vertex = mesh->vertex3f; - m.pointer_texcoord[0] = mesh->texcoordtexture2f; - m.pointer_texcoord[1] = mesh->texcoordlightmap2f; - m.pointer_texcoord[2] = mesh->texcoorddetail2f; - R_Mesh_State(&m); - } - else - { - R_Mesh_GetSpace(mesh->numverts); - R_Mesh_CopyVertex3f(mesh->vertex3f, mesh->numverts); - R_Mesh_CopyTexCoord2f(0, mesh->texcoordtexture2f, mesh->numverts); - R_Mesh_CopyTexCoord2f(1, mesh->texcoordlightmap2f, mesh->numverts); - R_Mesh_CopyTexCoord2f(2, mesh->texcoorddetail2f, mesh->numverts); - } + 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); } } @@ -1043,30 +1030,30 @@ static void RSurfShader_OpaqueWall_Pass_BaseDoubleTex(const entity_render_t *ent rmeshstate_t m; int lightmaptexturenum; memset(&m, 0, sizeof(m)); - m.blendfunc1 = GL_ONE; - m.blendfunc2 = GL_ZERO; + 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; - R_Mesh_State(&m); 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) - { + //if (m.tex[1] != lightmaptexturenum) + //{ m.tex[1] = lightmaptexturenum; - R_Mesh_State(&m); - } + // R_Mesh_State_Texture(&m); + //} for (mesh = surf->mesh;mesh;mesh = mesh->chain) { - R_Mesh_GetSpace(mesh->numverts); - R_Mesh_CopyVertex3f(mesh->vertex3f, mesh->numverts); - R_Mesh_CopyTexCoord2f(0, mesh->texcoordtexture2f, mesh->numverts); - R_Mesh_CopyTexCoord2f(1, mesh->texcoordlightmap2f, mesh->numverts); + 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); } } @@ -1079,10 +1066,10 @@ static void RSurfShader_OpaqueWall_Pass_BaseTexture(const entity_render_t *ent, const surfmesh_t *mesh; rmeshstate_t m; memset(&m, 0, sizeof(m)); - m.blendfunc1 = GL_ONE; - m.blendfunc2 = GL_ZERO; + GL_DepthMask(true); + GL_DepthTest(true); + GL_BlendFunc(GL_ONE, GL_ZERO); m.tex[0] = R_GetTexture(texture->skin.base); - R_Mesh_State(&m); GL_Color(1, 1, 1, 1); while((surf = *surfchain++) != NULL) { @@ -1090,9 +1077,9 @@ static void RSurfShader_OpaqueWall_Pass_BaseTexture(const entity_render_t *ent, { for (mesh = surf->mesh;mesh;mesh = mesh->chain) { - R_Mesh_GetSpace(mesh->numverts); - R_Mesh_CopyVertex3f(mesh->vertex3f, mesh->numverts); - R_Mesh_CopyTexCoord2f(0, mesh->texcoordtexture2f, mesh->numverts); + GL_VertexPointer(mesh->vertex3f); + m.pointer_texcoord[0] = mesh->texcoordtexture2f; + R_Mesh_State_Texture(&m); R_Mesh_Draw(mesh->numverts, mesh->numtriangles, mesh->element3i); } } @@ -1106,28 +1093,28 @@ static void RSurfShader_OpaqueWall_Pass_BaseLightmap(const entity_render_t *ent, rmeshstate_t m; int lightmaptexturenum; memset(&m, 0, sizeof(m)); - m.blendfunc1 = GL_ZERO; - m.blendfunc2 = GL_SRC_COLOR; + 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; - R_Mesh_State(&m); 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) - { + //if (m.tex[0] != lightmaptexturenum) + //{ m.tex[0] = lightmaptexturenum; - R_Mesh_State(&m); - } + // R_Mesh_State_Texture(&m); + //} for (mesh = surf->mesh;mesh;mesh = mesh->chain) { - R_Mesh_GetSpace(mesh->numverts); - R_Mesh_CopyVertex3f(mesh->vertex3f, mesh->numverts); - R_Mesh_CopyTexCoord2f(0, mesh->texcoordlightmap2f, mesh->numverts); + GL_VertexPointer(mesh->vertex3f); + m.pointer_texcoord[0] = mesh->texcoordlightmap2f; + R_Mesh_State_Texture(&m); R_Mesh_Draw(mesh->numverts, mesh->numtriangles, mesh->element3i); } } @@ -1142,8 +1129,9 @@ static void RSurfShader_OpaqueWall_Pass_Light(const entity_render_t *ent, const rmeshstate_t m; memset(&m, 0, sizeof(m)); - m.blendfunc1 = GL_SRC_ALPHA; - m.blendfunc2 = GL_ONE; + 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) @@ -1151,8 +1139,7 @@ static void RSurfShader_OpaqueWall_Pass_Light(const entity_render_t *ent, const m.texrgbscale[0] = 4; colorscale *= 0.25f; } - R_Mesh_State(&m); - GL_UseColorArray(); + GL_ColorPointer(varray_color4f); while((surf = *surfchain++) != NULL) { if (surf->visframe == r_framecount && surf->dlightframe == r_framecount) @@ -1161,10 +1148,10 @@ static void RSurfShader_OpaqueWall_Pass_Light(const entity_render_t *ent, const { if (RSurf_LightCheck(&ent->inversematrix, surf->dlightbits, mesh)) { - R_Mesh_GetSpace(mesh->numverts); - R_Mesh_CopyVertex3f(mesh->vertex3f, mesh->numverts); - R_Mesh_CopyTexCoord2f(0, mesh->texcoordtexture2f, mesh->numverts); + 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); } @@ -1181,20 +1168,20 @@ static void RSurfShader_OpaqueWall_Pass_Fog(const entity_render_t *ent, const te float modelorg[3]; Matrix4x4_Transform(&ent->inversematrix, r_origin, modelorg); memset(&m, 0, sizeof(m)); - m.blendfunc1 = GL_SRC_ALPHA; - m.blendfunc2 = GL_ONE_MINUS_SRC_ALPHA; - R_Mesh_State(&m); - GL_UseColorArray(); + 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) { - R_Mesh_GetSpace(mesh->numverts); - R_Mesh_CopyVertex3f(mesh->vertex3f, mesh->numverts); + GL_VertexPointer(mesh->vertex3f); if (m.tex[0]) - R_Mesh_CopyTexCoord2f(0, mesh->texcoordtexture2f, mesh->numverts); + 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); } @@ -1208,10 +1195,10 @@ static void RSurfShader_OpaqueWall_Pass_BaseDetail(const entity_render_t *ent, c const surfmesh_t *mesh; rmeshstate_t m; memset(&m, 0, sizeof(m)); - m.blendfunc1 = GL_DST_COLOR; - m.blendfunc2 = GL_SRC_COLOR; + GL_BlendFunc(GL_DST_COLOR, GL_SRC_COLOR); + GL_DepthMask(false); + GL_DepthTest(true); m.tex[0] = R_GetTexture(texture->skin.detail); - R_Mesh_State(&m); GL_Color(1, 1, 1, 1); while((surf = *surfchain++) != NULL) { @@ -1219,9 +1206,9 @@ static void RSurfShader_OpaqueWall_Pass_BaseDetail(const entity_render_t *ent, c { for (mesh = surf->mesh;mesh;mesh = mesh->chain) { - R_Mesh_GetSpace(mesh->numverts); - R_Mesh_CopyVertex3f(mesh->vertex3f, mesh->numverts); - R_Mesh_CopyTexCoord2f(0, mesh->texcoorddetail2f, mesh->numverts); + GL_VertexPointer(mesh->vertex3f); + m.pointer_texcoord[0] = mesh->texcoorddetail2f; + R_Mesh_State_Texture(&m); R_Mesh_Draw(mesh->numverts, mesh->numtriangles, mesh->element3i); } } @@ -1234,10 +1221,10 @@ static void RSurfShader_OpaqueWall_Pass_Glow(const entity_render_t *ent, const t const surfmesh_t *mesh; rmeshstate_t m; memset(&m, 0, sizeof(m)); - m.blendfunc1 = GL_SRC_ALPHA; - m.blendfunc2 = GL_ONE; + GL_BlendFunc(GL_SRC_ALPHA, GL_ONE); + GL_DepthMask(false); + GL_DepthTest(true); m.tex[0] = R_GetTexture(texture->skin.glow); - R_Mesh_State(&m); GL_Color(r_colorscale, r_colorscale, r_colorscale, 1); while((surf = *surfchain++) != NULL) { @@ -1245,9 +1232,9 @@ static void RSurfShader_OpaqueWall_Pass_Glow(const entity_render_t *ent, const t { for (mesh = surf->mesh;mesh;mesh = mesh->chain) { - R_Mesh_GetSpace(mesh->numverts); - R_Mesh_CopyVertex3f(mesh->vertex3f, mesh->numverts); - R_Mesh_CopyTexCoord2f(0, mesh->texcoordtexture2f, mesh->numverts); + GL_VertexPointer(mesh->vertex3f); + m.pointer_texcoord[0] = mesh->texcoordtexture2f; + R_Mesh_State_Texture(&m); R_Mesh_Draw(mesh->numverts, mesh->numtriangles, mesh->element3i); } } @@ -1260,10 +1247,9 @@ static void RSurfShader_OpaqueWall_Pass_OpaqueGlow(const entity_render_t *ent, c const surfmesh_t *mesh; rmeshstate_t m; memset(&m, 0, sizeof(m)); - m.blendfunc1 = GL_SRC_ALPHA; - m.blendfunc2 = GL_ZERO; + GL_BlendFunc(GL_SRC_ALPHA, GL_ZERO); + GL_DepthMask(true); m.tex[0] = R_GetTexture(texture->skin.glow); - R_Mesh_State(&m); if (m.tex[0]) GL_Color(r_colorscale, r_colorscale, r_colorscale, 1); else @@ -1274,9 +1260,9 @@ static void RSurfShader_OpaqueWall_Pass_OpaqueGlow(const entity_render_t *ent, c { for (mesh = surf->mesh;mesh;mesh = mesh->chain) { - R_Mesh_GetSpace(mesh->numverts); - R_Mesh_CopyVertex3f(mesh->vertex3f, mesh->numverts); - R_Mesh_CopyTexCoord2f(0, mesh->texcoordtexture2f, mesh->numverts); + GL_VertexPointer(mesh->vertex3f); + m.pointer_texcoord[0] = mesh->texcoordtexture2f; + R_Mesh_State_Texture(&m); R_Mesh_Draw(mesh->numverts, mesh->numtriangles, mesh->element3i); } } @@ -1511,12 +1497,15 @@ static void R_DrawPortal_Callback(const void *calldata1, int calldata2) rmeshstate_t m; const entity_render_t *ent = calldata1; const mportal_t *portal = ent->model->portals + calldata2; - memset(&m, 0, sizeof(m)); - m.blendfunc1 = GL_SRC_ALPHA; - m.blendfunc2 = GL_ONE_MINUS_SRC_ALPHA; + GL_BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + GL_DepthMask(false); + GL_DepthTest(true); R_Mesh_Matrix(&ent->matrix); - R_Mesh_State(&m); - R_Mesh_GetSpace(portal->numpoints); + GL_VertexPointer(varray_vertex3f); + + memset(&m, 0, sizeof(m)); + R_Mesh_State_Texture(&m); + i = portal - ent->model->portals; GL_Color(((i & 0x0007) >> 0) * (1.0f / 7.0f) * r_colorscale, ((i & 0x0038) >> 3) * (1.0f / 7.0f) * r_colorscale, @@ -1734,7 +1723,7 @@ void R_PVSUpdate (entity_render_t *ent, mleaf_t *viewleaf) if (viewleaf) { surfacepvsframes = model->surfacepvsframes; - vis = Mod_LeafPVS (viewleaf, model); + vis = model->LeafPVS(model, viewleaf); for (j = 0;j < model->numleafs;j += 8) { bits = *vis++; @@ -1758,7 +1747,7 @@ void R_PVSUpdate (entity_render_t *ent, mleaf_t *viewleaf) } } } - Mod_BuildPVSTextureChains(model); + model->BuildPVSTextureChains(model); } } } @@ -1769,7 +1758,7 @@ void R_WorldVisibility (entity_render_t *ent) mleaf_t *viewleaf; Matrix4x4_Transform(&ent->inversematrix, r_origin, modelorg); - viewleaf = Mod_PointInLeaf (modelorg, ent->model); + viewleaf = ent->model->PointInLeaf(ent->model, modelorg); R_PVSUpdate(ent, viewleaf); if (!viewleaf) @@ -1837,14 +1826,8 @@ void R_Model_Brush_DrawShadowVolume (entity_render_t *ent, vec3_t relativelighto temp[1] = bound(surf->poly_mins[1], relativelightorigin[1], surf->poly_maxs[1]) - relativelightorigin[1]; temp[2] = bound(surf->poly_mins[2], relativelightorigin[2], surf->poly_maxs[2]) - relativelightorigin[2]; if (DotProduct(temp, temp) < lightradius2) - { for (mesh = surf->mesh;mesh;mesh = mesh->chain) - { - R_Mesh_GetSpace(mesh->numverts); - R_Mesh_CopyVertex3f(mesh->vertex3f, mesh->numverts); - R_Shadow_Volume(mesh->numverts, mesh->numtriangles, mesh->element3i, mesh->neighbor3i, relativelightorigin, lightradius, projectdistance); - } - } + R_Shadow_Volume(mesh->numverts, mesh->numtriangles, mesh->vertex3f, mesh->element3i, mesh->neighbor3i, relativelightorigin, lightradius, projectdistance); } } } @@ -1895,57 +1878,22 @@ void R_Model_Brush_DrawLight(entity_render_t *ent, vec3_t relativelightorigin, v lightmaxs[1] = relativelightorigin[1] + lightradius; lightmaxs[2] = relativelightorigin[2] + lightradius; R_UpdateTextureInfo(ent); - if (ent != &cl_entities[0].render) + for (surfnum = 0, surf = ent->model->surfaces + ent->model->firstmodelsurface;surfnum < ent->model->nummodelsurfaces;surfnum++, surf++) { - // bmodel, cull crudely to view and light - for (surfnum = 0, surf = ent->model->surfaces + ent->model->firstmodelsurface;surfnum < ent->model->nummodelsurfaces;surfnum++, surf++) + if ((ent != &cl_entities[0].render || surf->visframe == r_framecount) && BoxesOverlap(surf->poly_mins, surf->poly_maxs, lightmins, lightmaxs)) { - if (BoxesOverlap(surf->poly_mins, surf->poly_maxs, lightmins, lightmaxs)) - { - f = PlaneDiff(relativelightorigin, surf->plane); - if (surf->flags & SURF_PLANEBACK) - f = -f; - if (f >= -0.1 && f < lightradius) - { - f = PlaneDiff(relativeeyeorigin, surf->plane); - if (surf->flags & SURF_PLANEBACK) - f = -f; - if (f > 0) - { - t = surf->texinfo->texture->currentframe; - if (t->rendertype == SURFRENDER_OPAQUE && t->flags & SURF_SHADOWLIGHT) - { - for (mesh = surf->mesh;mesh;mesh = mesh->chain) - { - R_Shadow_DiffuseLighting(mesh->numverts, mesh->numtriangles, mesh->element3i, mesh->vertex3f, mesh->svector3f, mesh->tvector3f, mesh->normal3f, mesh->texcoordtexture2f, relativelightorigin, lightradius, lightcolor, matrix_modeltofilter, matrix_modeltoattenuationxyz, matrix_modeltoattenuationz, t->skin.base, t->skin.nmap, NULL); - R_Shadow_SpecularLighting(mesh->numverts, mesh->numtriangles, mesh->element3i, mesh->vertex3f, mesh->svector3f, mesh->tvector3f, mesh->normal3f, mesh->texcoordtexture2f, relativelightorigin, relativeeyeorigin, lightradius, lightcolor, matrix_modeltofilter, matrix_modeltoattenuationxyz, matrix_modeltoattenuationz, t->skin.gloss, t->skin.nmap, NULL); - } - } - } - } - } - } - } - else - { - // world, already culled to view, just cull to light - for (surfnum = 0, surf = ent->model->surfaces + ent->model->firstmodelsurface;surfnum < ent->model->nummodelsurfaces;surfnum++, surf++) - { - if (surf->visframe == r_framecount && BoxesOverlap(surf->poly_mins, surf->poly_maxs, lightmins, lightmaxs)) + f = PlaneDiff(relativelightorigin, surf->plane); + if (surf->flags & SURF_PLANEBACK) + f = -f; + if (f >= -0.1 && f < lightradius) { - f = PlaneDiff(relativelightorigin, surf->plane); - if (surf->flags & SURF_PLANEBACK) - f = -f; - if (f >= -0.1 && f < lightradius) + t = surf->texinfo->texture->currentframe; + if (t->rendertype == SURFRENDER_OPAQUE && t->flags & SURF_SHADOWLIGHT) { - t = surf->texinfo->texture->currentframe; - if (t->rendertype == SURFRENDER_OPAQUE && t->flags & SURF_SHADOWLIGHT) + for (mesh = surf->mesh;mesh;mesh = mesh->chain) { - for (mesh = surf->mesh;mesh;mesh = mesh->chain) - { - R_Shadow_DiffuseLighting(mesh->numverts, mesh->numtriangles, mesh->element3i, mesh->vertex3f, mesh->svector3f, mesh->tvector3f, mesh->normal3f, mesh->texcoordtexture2f, relativelightorigin, lightradius, lightcolor, matrix_modeltofilter, matrix_modeltoattenuationxyz, matrix_modeltoattenuationz, t->skin.base, t->skin.nmap, NULL); - R_Shadow_SpecularLighting(mesh->numverts, mesh->numtriangles, mesh->element3i, mesh->vertex3f, mesh->svector3f, mesh->tvector3f, mesh->normal3f, mesh->texcoordtexture2f, relativelightorigin, relativeeyeorigin, lightradius, lightcolor, matrix_modeltofilter, matrix_modeltoattenuationxyz, matrix_modeltoattenuationz, t->skin.gloss, t->skin.nmap, NULL); - } + R_Shadow_DiffuseLighting(mesh->numverts, mesh->numtriangles, mesh->element3i, mesh->vertex3f, mesh->svector3f, mesh->tvector3f, mesh->normal3f, mesh->texcoordtexture2f, relativelightorigin, lightradius, lightcolor, matrix_modeltofilter, matrix_modeltoattenuationxyz, matrix_modeltoattenuationz, t->skin.base, t->skin.nmap, NULL); + R_Shadow_SpecularLighting(mesh->numverts, mesh->numtriangles, mesh->element3i, mesh->vertex3f, mesh->svector3f, mesh->tvector3f, mesh->normal3f, mesh->texcoordtexture2f, relativelightorigin, relativeeyeorigin, lightradius, lightcolor, matrix_modeltofilter, matrix_modeltoattenuationxyz, matrix_modeltoattenuationz, t->skin.gloss, t->skin.nmap, NULL); } } }