X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=gl_backend.c;h=0c3e73915e2192045b8645231d7ff6746680b274;hb=2bc57e09fc5ad356b342bb0dc466b5a761583802;hp=bb1d6b16abbaab385f2a4b104e7032b34ec5eb4c;hpb=c27fadf7530f9e06f6fba5afe584f82b2ebb2629;p=xonotic%2Fdarkplaces.git diff --git a/gl_backend.c b/gl_backend.c index bb1d6b16..0c3e7391 100644 --- a/gl_backend.c +++ b/gl_backend.c @@ -137,6 +137,7 @@ typedef struct gl_state_s int alphatest; int alphafunc; float alphafuncvalue; + qboolean alphatocoverage; int scissortest; unsigned int unit; unsigned int clientunit; @@ -275,6 +276,7 @@ static void R_Mesh_SetUseVBO(void) case RENDERPATH_GL11: case RENDERPATH_GL13: case RENDERPATH_GL20: + case RENDERPATH_GLES1: gl_state.usevbo_staticvertex = (vid.support.arb_vertex_buffer_object && gl_vbo.integer) || vid.forcevbo; gl_state.usevbo_staticindex = (vid.support.arb_vertex_buffer_object && (gl_vbo.integer == 1 || gl_vbo.integer == 3)) || vid.forcevbo; gl_state.usevbo_dynamicvertex = (vid.support.arb_vertex_buffer_object && gl_vbo_dynamicvertex.integer) || vid.forcevbo; @@ -325,6 +327,7 @@ static void gl_backend_start(void) case RENDERPATH_GL11: case RENDERPATH_GL13: case RENDERPATH_GL20: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: // fetch current fbo here (default fbo is not 0 on some GLES devices) if (vid.support.ext_framebuffer_object) @@ -357,6 +360,7 @@ static void gl_backend_shutdown(void) case RENDERPATH_GL13: case RENDERPATH_GL20: case RENDERPATH_SOFT: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: break; case RENDERPATH_D3D9: @@ -402,6 +406,7 @@ static void gl_backend_devicelost(void) case RENDERPATH_GL13: case RENDERPATH_GL20: case RENDERPATH_SOFT: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: break; case RENDERPATH_D3D9: @@ -429,6 +434,7 @@ static void gl_backend_devicelost(void) case RENDERPATH_GL13: case RENDERPATH_GL20: case RENDERPATH_SOFT: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: break; case RENDERPATH_D3D9: @@ -461,6 +467,7 @@ static void gl_backend_devicerestored(void) case RENDERPATH_GL13: case RENDERPATH_GL20: case RENDERPATH_SOFT: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: break; case RENDERPATH_D3D9: @@ -550,6 +557,7 @@ void GL_Finish(void) case RENDERPATH_GL11: case RENDERPATH_GL13: case RENDERPATH_GL20: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: qglFinish(); break; @@ -711,6 +719,7 @@ qboolean R_ScissorForBBox(const float *mins, const float *maxs, int *scissor) case RENDERPATH_GL13: case RENDERPATH_GL20: case RENDERPATH_SOFT: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: break; } @@ -794,6 +803,7 @@ void R_Viewport_InitOrtho(r_viewport_t *v, const matrix4x4_t *cameramatrix, int case RENDERPATH_GL13: case RENDERPATH_GL20: case RENDERPATH_SOFT: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: break; case RENDERPATH_D3D9: @@ -1044,6 +1054,7 @@ void R_Viewport_InitRectSideView(r_viewport_t *v, const matrix4x4_t *cameramatri case RENDERPATH_GL13: case RENDERPATH_GL11: case RENDERPATH_SOFT: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: break; case RENDERPATH_D3D9: @@ -1079,6 +1090,7 @@ void R_SetViewport(const r_viewport_t *v) { case RENDERPATH_GL13: case RENDERPATH_GL11: + case RENDERPATH_GLES1: CHECKGLERROR qglViewport(v->x, v->y, v->width, v->height);CHECKGLERROR // Load the projection matrix into OpenGL @@ -1155,6 +1167,7 @@ int R_Mesh_CreateFramebufferObject(rtexture_t *depthtexture, rtexture_t *colorte case RENDERPATH_GL11: case RENDERPATH_GL13: case RENDERPATH_GL20: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: if (!vid.support.ext_framebuffer_object) return 0; @@ -1183,6 +1196,7 @@ void R_Mesh_DestroyFramebufferObject(int fbo) case RENDERPATH_GL11: case RENDERPATH_GL13: case RENDERPATH_GL20: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: if (fbo) qglDeleteFramebuffersEXT(1, (GLuint*)&fbo); @@ -1239,6 +1253,7 @@ void R_Mesh_ResetRenderTargets(void) case RENDERPATH_GL11: case RENDERPATH_GL13: case RENDERPATH_GL20: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: if (gl_state.framebufferobject) { @@ -1282,6 +1297,7 @@ void R_Mesh_SetRenderTargets(int fbo, rtexture_t *depthtexture, rtexture_t *colo case RENDERPATH_GL11: case RENDERPATH_GL13: case RENDERPATH_GL20: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: if (gl_state.framebufferobject != fbo) { @@ -1366,6 +1382,7 @@ static int d3dstencilopforglfunc(int f) } #endif +extern cvar_t r_transparent_alphatocoverage; static void GL_Backend_ResetState(void) { @@ -1375,6 +1392,7 @@ static void GL_Backend_ResetState(void) gl_state.alphatest = false; gl_state.alphafunc = GL_GEQUAL; gl_state.alphafuncvalue = 0.5f; + gl_state.alphatocoverage = false; gl_state.blendfunc1 = GL_ONE; gl_state.blendfunc2 = GL_ZERO; gl_state.blend = false; @@ -1396,9 +1414,6 @@ static void GL_Backend_ResetState(void) #ifdef SUPPORTD3D { IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_COLORWRITEENABLE, gl_state.colormask); - IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_ALPHATESTENABLE, gl_state.alphatest); - IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_ALPHAFUNC, d3dcmpforglfunc(gl_state.alphafunc)); - IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_ALPHAREF, (int)bound(0, gl_state.alphafuncvalue * 256.0f, 255)); IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_CULLMODE, D3DCULL_NONE); IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_ZFUNC, d3dcmpforglfunc(gl_state.depthfunc)); IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_ZENABLE, gl_state.depthtest); @@ -1414,8 +1429,9 @@ static void GL_Backend_ResetState(void) case RENDERPATH_D3D11: Con_DPrintf("FIXME D3D11 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__); break; - case RENDERPATH_GL13: case RENDERPATH_GL11: + case RENDERPATH_GL13: + case RENDERPATH_GLES1: CHECKGLERROR qglColorMask(1, 1, 1, 1);CHECKGLERROR @@ -1482,7 +1498,6 @@ static void GL_Backend_ResetState(void) break; case RENDERPATH_SOFT: DPSOFTRAST_ColorMask(1,1,1,1); - DPSOFTRAST_AlphaTest(gl_state.alphatest); DPSOFTRAST_BlendFunc(gl_state.blendfunc1, gl_state.blendfunc2); DPSOFTRAST_CullFace(gl_state.cullface); DPSOFTRAST_DepthFunc(gl_state.depthfunc); @@ -1503,11 +1518,6 @@ static void GL_Backend_ResetState(void) qglEnable(GL_DEPTH_TEST);CHECKGLERROR qglDepthMask(gl_state.depthmask);CHECKGLERROR qglPolygonOffset(gl_state.polygonoffset[0], gl_state.polygonoffset[1]); - // if (vid.renderpath == RENDERPATH_GL20) - // { - // qglAlphaFunc(gl_state.alphafunc, gl_state.alphafuncvalue);CHECKGLERROR - // qglDisable(GL_ALPHA_TEST);CHECKGLERROR - // } if (vid.support.arb_vertex_buffer_object) { qglBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); @@ -1556,6 +1566,7 @@ void GL_ActiveTexture(unsigned int num) case RENDERPATH_GL11: case RENDERPATH_GL13: case RENDERPATH_GL20: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: if (qglActiveTexture) { @@ -1583,6 +1594,7 @@ void GL_ClientActiveTexture(unsigned int num) { case RENDERPATH_GL11: case RENDERPATH_GL13: + case RENDERPATH_GLES1: if (qglActiveTexture) { CHECKGLERROR @@ -1616,6 +1628,7 @@ void GL_BlendFunc(int blendfunc1, int blendfunc2) case RENDERPATH_GL11: case RENDERPATH_GL13: case RENDERPATH_GL20: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: CHECKGLERROR qglBlendFunc(gl_state.blendfunc1, gl_state.blendfunc2);CHECKGLERROR @@ -1689,6 +1702,7 @@ void GL_DepthMask(int state) case RENDERPATH_GL11: case RENDERPATH_GL13: case RENDERPATH_GL20: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: CHECKGLERROR qglDepthMask(gl_state.depthmask);CHECKGLERROR @@ -1721,6 +1735,7 @@ void GL_DepthTest(int state) case RENDERPATH_GL11: case RENDERPATH_GL13: case RENDERPATH_GL20: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: CHECKGLERROR if (gl_state.depthtest) @@ -1760,6 +1775,7 @@ void GL_DepthFunc(int state) case RENDERPATH_GL11: case RENDERPATH_GL13: case RENDERPATH_GL20: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: CHECKGLERROR qglDepthFunc(gl_state.depthfunc);CHECKGLERROR @@ -1793,6 +1809,7 @@ void GL_DepthRange(float nearfrac, float farfrac) case RENDERPATH_GL11: case RENDERPATH_GL13: case RENDERPATH_GL20: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: qglDepthRange(gl_state.depthrange[0], gl_state.depthrange[1]); break; @@ -1830,6 +1847,7 @@ void R_SetStencilSeparate(qboolean enable, int writemask, int frontfail, int fro case RENDERPATH_GL11: case RENDERPATH_GL13: case RENDERPATH_GL20: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: CHECKGLERROR if (enable) @@ -1896,6 +1914,7 @@ void R_SetStencil(qboolean enable, int writemask, int fail, int zfail, int zpass case RENDERPATH_GL11: case RENDERPATH_GL13: case RENDERPATH_GL20: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: CHECKGLERROR if (enable) @@ -1952,6 +1971,7 @@ void GL_PolygonOffset(float planeoffset, float depthoffset) case RENDERPATH_GL11: case RENDERPATH_GL13: case RENDERPATH_GL20: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: qglPolygonOffset(gl_state.polygonoffset[0], gl_state.polygonoffset[1]); break; @@ -1990,6 +2010,7 @@ void GL_SetMirrorState(qboolean state) case RENDERPATH_GL11: case RENDERPATH_GL13: case RENDERPATH_GL20: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: qglCullFace(gl_state.cullface);CHECKGLERROR break; @@ -2026,6 +2047,7 @@ void GL_CullFace(int state) case RENDERPATH_GL11: case RENDERPATH_GL13: case RENDERPATH_GL20: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: CHECKGLERROR @@ -2100,6 +2122,7 @@ void GL_AlphaTest(int state) { case RENDERPATH_GL11: case RENDERPATH_GL13: + case RENDERPATH_GLES1: // only fixed function uses alpha test, other paths use pixel kill capability in shaders CHECKGLERROR if (gl_state.alphatest) @@ -2112,19 +2135,45 @@ void GL_AlphaTest(int state) } break; case RENDERPATH_D3D9: -#ifdef SUPPORTD3D -// IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_ALPHATESTENABLE, gl_state.alphatest); -#endif - break; case RENDERPATH_D3D10: - break; case RENDERPATH_D3D11: + case RENDERPATH_SOFT: + case RENDERPATH_GL20: + case RENDERPATH_GLES2: break; + } + } +} + +void GL_AlphaToCoverage(qboolean state) +{ + if (gl_state.alphatocoverage != state) + { + gl_state.alphatocoverage = state; + switch(vid.renderpath) + { + case RENDERPATH_GL11: + case RENDERPATH_GL13: + case RENDERPATH_GLES1: + case RENDERPATH_GLES2: + case RENDERPATH_D3D9: + case RENDERPATH_D3D10: + case RENDERPATH_D3D11: case RENDERPATH_SOFT: -// DPSOFTRAST_AlphaTest(gl_state.alphatest); break; case RENDERPATH_GL20: - case RENDERPATH_GLES2: + // alpha to coverage turns the alpha value of the pixel into 0%, 25%, 50%, 75% or 100% by masking the multisample fragments accordingly + CHECKGLERROR + if (gl_state.alphatocoverage) + { + qglEnable(GL_SAMPLE_ALPHA_TO_COVERAGE_ARB);CHECKGLERROR +// qglEnable(GL_MULTISAMPLE_ARB);CHECKGLERROR + } + else + { + qglDisable(GL_SAMPLE_ALPHA_TO_COVERAGE_ARB);CHECKGLERROR +// qglDisable(GL_MULTISAMPLE_ARB);CHECKGLERROR + } break; } } @@ -2142,6 +2191,7 @@ void GL_ColorMask(int r, int g, int b, int a) case RENDERPATH_GL11: case RENDERPATH_GL13: case RENDERPATH_GL20: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: CHECKGLERROR qglColorMask((GLboolean)r, (GLboolean)g, (GLboolean)b, (GLboolean)a);CHECKGLERROR @@ -2176,6 +2226,7 @@ void GL_Color(float cr, float cg, float cb, float ca) { case RENDERPATH_GL11: case RENDERPATH_GL13: + case RENDERPATH_GLES1: CHECKGLERROR qglColor4f(gl_state.color4f[0], gl_state.color4f[1], gl_state.color4f[2], gl_state.color4f[3]); CHECKGLERROR @@ -2203,6 +2254,7 @@ void GL_Scissor (int x, int y, int width, int height) case RENDERPATH_GL11: case RENDERPATH_GL13: case RENDERPATH_GL20: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: CHECKGLERROR qglScissor(x, y,width,height); @@ -2242,6 +2294,7 @@ void GL_ScissorTest(int state) case RENDERPATH_GL11: case RENDERPATH_GL13: case RENDERPATH_GL20: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: CHECKGLERROR if(gl_state.scissortest) @@ -2284,6 +2337,7 @@ void GL_Clear(int mask, const float *colorvalue, float depthvalue, int stencilva case RENDERPATH_GL11: case RENDERPATH_GL13: case RENDERPATH_GL20: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: CHECKGLERROR if (mask & GL_COLOR_BUFFER_BIT) @@ -2327,6 +2381,7 @@ void GL_ReadPixelsBGRA(int x, int y, int width, int height, unsigned char *outpi case RENDERPATH_GL11: case RENDERPATH_GL13: case RENDERPATH_GL20: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: CHECKGLERROR qglReadPixels(x, y, width, height, GL_BGRA, GL_UNSIGNED_BYTE, outpixels);CHECKGLERROR @@ -2537,6 +2592,7 @@ void R_Mesh_Draw(int firstvertex, int numvertices, int firsttriangle, int numtri case RENDERPATH_GL11: case RENDERPATH_GL13: case RENDERPATH_GL20: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: // check if the user specified to ignore static index buffers if (!gl_state.usevbo_staticindex || (gl_vbo.integer == 3 && !vid.forcevbo && (element3i_bufferoffset || element3s_bufferoffset))) @@ -2879,6 +2935,7 @@ void R_Mesh_Draw(int firstvertex, int numvertices, int firsttriangle, int numtri case RENDERPATH_SOFT: DPSOFTRAST_DrawTriangles(firstvertex, numvertices, numtriangles, element3i, element3s); break; + case RENDERPATH_GLES1: case RENDERPATH_GLES2: // GLES does not have glDrawRangeElements, and generally // underperforms with index buffers, so this code path is @@ -2974,6 +3031,7 @@ void R_Mesh_UpdateMeshBuffer(r_meshbuffer_t *buffer, const void *data, size_t si case RENDERPATH_GL11: case RENDERPATH_GL13: case RENDERPATH_GL20: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: if (!buffer->bufferobject) qglGenBuffersARB(1, (GLuint *)&buffer->bufferobject); @@ -3055,6 +3113,7 @@ void R_Mesh_DestroyMeshBuffer(r_meshbuffer_t *buffer) case RENDERPATH_GL11: case RENDERPATH_GL13: case RENDERPATH_GL20: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: qglDeleteBuffersARB(1, (GLuint *)&buffer->bufferobject); break; @@ -3110,6 +3169,7 @@ void R_Mesh_VertexPointer(int components, int gltype, size_t stride, const void { case RENDERPATH_GL11: case RENDERPATH_GL13: + case RENDERPATH_GLES1: if (gl_state.pointer_vertex_components != components || gl_state.pointer_vertex_gltype != gltype || gl_state.pointer_vertex_stride != stride || gl_state.pointer_vertex_pointer != pointer || gl_state.pointer_vertex_vertexbuffer != vertexbuffer || gl_state.pointer_vertex_offset != bufferoffset) { int bufferobject = vertexbuffer ? vertexbuffer->bufferobject : 0; @@ -3156,6 +3216,7 @@ void R_Mesh_ColorPointer(int components, int gltype, size_t stride, const void * { case RENDERPATH_GL11: case RENDERPATH_GL13: + case RENDERPATH_GLES1: CHECKGLERROR if (pointer) { @@ -3250,6 +3311,7 @@ void R_Mesh_TexCoordPointer(unsigned int unitnum, int components, int gltype, si { case RENDERPATH_GL11: case RENDERPATH_GL13: + case RENDERPATH_GLES1: CHECKGLERROR if (pointer) { @@ -3350,6 +3412,7 @@ void R_Mesh_CopyToTexture(rtexture_t *tex, int tx, int ty, int sx, int sy, int w case RENDERPATH_GL11: case RENDERPATH_GL13: case RENDERPATH_GL20: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: R_Mesh_TexBind(0, tex); GL_ActiveTexture(0);CHECKGLERROR @@ -3443,8 +3506,9 @@ void R_Mesh_TexBind(unsigned int unitnum, rtexture_t *tex) case GL_TEXTURE_CUBE_MAP_ARB: if (unit->tcubemap != texnum) {GL_ActiveTexture(unitnum);unit->tcubemap = texnum;qglBindTexture(GL_TEXTURE_CUBE_MAP_ARB, unit->tcubemap);CHECKGLERROR}break; } break; - case RENDERPATH_GL13: case RENDERPATH_GL11: + case RENDERPATH_GL13: + case RENDERPATH_GLES1: unit->texture = tex; tex2d = 0; tex3d = 0; @@ -3591,6 +3655,7 @@ void R_Mesh_TexMatrix(unsigned int unitnum, const matrix4x4_t *matrix) case RENDERPATH_GL11: case RENDERPATH_GL13: case RENDERPATH_GL20: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: if (matrix && matrix->m[3][3]) { @@ -3643,6 +3708,7 @@ void R_Mesh_TexCombine(unsigned int unitnum, int combinergb, int combinealpha, i // do nothing break; case RENDERPATH_GL13: + case RENDERPATH_GLES1: // GL_ARB_texture_env_combine if (!combinergb) combinergb = GL_MODULATE; @@ -3737,8 +3803,9 @@ void R_Mesh_ResetTextureState(void) case RENDERPATH_D3D11: case RENDERPATH_SOFT: break; - case RENDERPATH_GL13: case RENDERPATH_GL11: + case RENDERPATH_GL13: + case RENDERPATH_GLES1: for (unitnum = 0;unitnum < vid.texunits;unitnum++) { R_Mesh_TexCombine(unitnum, GL_MODULATE, GL_MODULATE, 1, 1); @@ -3797,6 +3864,7 @@ static void R_Mesh_InitVertexDeclarations(void) case RENDERPATH_GL20: case RENDERPATH_GL13: case RENDERPATH_GL11: + case RENDERPATH_GLES1: case RENDERPATH_GLES2: break; case RENDERPATH_D3D9: @@ -3870,6 +3938,7 @@ void R_Mesh_PrepareVertices_Vertex3f(int numvertices, const float *vertex3f, con } break; case RENDERPATH_GL13: + case RENDERPATH_GLES1: if (vertexbuffer) { R_Mesh_VertexPointer(3, GL_FLOAT, sizeof(float[3]), vertex3f, vertexbuffer, 0); @@ -3973,8 +4042,9 @@ void R_Mesh_PrepareVertices_Generic_Arrays(int numvertices, const float *vertex3 return; } break; - case RENDERPATH_GL13: case RENDERPATH_GL11: + case RENDERPATH_GL13: + case RENDERPATH_GLES1: if (!vid.useinterleavedarrays) { R_Mesh_VertexPointer(3, GL_FLOAT, sizeof(float[3]), vertex3f, NULL, 0); @@ -4062,6 +4132,7 @@ void R_Mesh_PrepareVertices_Generic(int numvertices, const r_vertexgeneric_t *ve } break; case RENDERPATH_GL13: + case RENDERPATH_GLES1: if (vertexbuffer) { R_Mesh_VertexPointer( 3, GL_FLOAT , sizeof(*vertex), vertex->vertex3f , vertexbuffer, (int)((unsigned char *)vertex->vertex3f - (unsigned char *)vertex)); @@ -4165,8 +4236,9 @@ void R_Mesh_PrepareVertices_Mesh_Arrays(int numvertices, const float *vertex3f, return; } break; - case RENDERPATH_GL13: case RENDERPATH_GL11: + case RENDERPATH_GL13: + case RENDERPATH_GLES1: if (!vid.useinterleavedarrays) { R_Mesh_VertexPointer(3, GL_FLOAT, sizeof(float[3]), vertex3f, NULL, 0); @@ -4265,6 +4337,7 @@ void R_Mesh_PrepareVertices_Mesh(int numvertices, const r_vertexmesh_t *vertex, } break; case RENDERPATH_GL13: + case RENDERPATH_GLES1: if (vertexbuffer) { R_Mesh_VertexPointer( 3, GL_FLOAT , sizeof(*vertex), vertex->vertex3f , vertexbuffer, (int)((unsigned char *)vertex->vertex3f - (unsigned char *)vertex)); @@ -4323,3 +4396,61 @@ void R_Mesh_PrepareVertices_Mesh(int numvertices, const r_vertexmesh_t *vertex, break; } } + +void GL_BlendEquationSubtract(qboolean negated) +{ + if(negated) + { + switch(vid.renderpath) + { + case RENDERPATH_GL11: + case RENDERPATH_GL13: + case RENDERPATH_GL20: + case RENDERPATH_GLES1: + case RENDERPATH_GLES2: + qglBlendEquationEXT(GL_FUNC_REVERSE_SUBTRACT_EXT); + break; + case RENDERPATH_D3D9: +#ifdef SUPPORTD3D + IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_BLENDOP, D3DBLENDOP_SUBTRACT); +#endif + break; + case RENDERPATH_D3D10: + Con_DPrintf("FIXME D3D10 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__); + break; + case RENDERPATH_D3D11: + Con_DPrintf("FIXME D3D11 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__); + break; + case RENDERPATH_SOFT: + DPSOFTRAST_BlendSubtract(true); + break; + } + } + else + { + switch(vid.renderpath) + { + case RENDERPATH_GL11: + case RENDERPATH_GL13: + case RENDERPATH_GL20: + case RENDERPATH_GLES1: + case RENDERPATH_GLES2: + qglBlendEquationEXT(GL_FUNC_ADD_EXT); + break; + case RENDERPATH_D3D9: +#ifdef SUPPORTD3D + IDirect3DDevice9_SetRenderState(vid_d3d9dev, D3DRS_BLENDOP, D3DBLENDOP_ADD); +#endif + break; + case RENDERPATH_D3D10: + Con_DPrintf("FIXME D3D10 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__); + break; + case RENDERPATH_D3D11: + Con_DPrintf("FIXME D3D11 %s:%i %s\n", __FILE__, __LINE__, __FUNCTION__); + break; + case RENDERPATH_SOFT: + DPSOFTRAST_BlendSubtract(false); + break; + } + } +}