From: divverent Date: Sat, 11 Oct 2008 15:06:28 +0000 (+0000) Subject: add DRAWFLAG_SCREEN (which basically is like invert-modulate-invert, equivalent to... X-Git-Tag: xonotic-v0.1.0preview~2060 X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=commitdiff_plain;h=971ad66cc21064832305abca4e356213dd513d9b add DRAWFLAG_SCREEN (which basically is like invert-modulate-invert, equivalent to GIMP's "screen" layer operation, no idea how photoshop calls it) Just like modulate always darkens, screen always brightens. git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@8528 d7cf8633-e32d-0410-b094-e92efae38249 --- diff --git a/clvm_cmds.c b/clvm_cmds.c index 656fbc4e..0d30689c 100644 --- a/clvm_cmds.c +++ b/clvm_cmds.c @@ -2480,12 +2480,16 @@ static void VM_DrawPolygonCallback (const entity_render_t *ent, const rtlight_t int numtriangles = 0; rtexture_t *tex = polys->data_triangles[surfacelist[surfacelistindex]].texture; int drawflag = polys->data_triangles[surfacelist[surfacelistindex]].drawflag; + // this can't call _DrawQ_ProcessDrawFlag, but should be in sync with it + // FIXME factor this out if(drawflag == DRAWFLAG_ADDITIVE) GL_BlendFunc(GL_SRC_ALPHA, GL_ONE); else if(drawflag == DRAWFLAG_MODULATE) GL_BlendFunc(GL_DST_COLOR, GL_ZERO); else if(drawflag == DRAWFLAG_2XMODULATE) GL_BlendFunc(GL_DST_COLOR,GL_SRC_COLOR); + else if(drawflag == DRAWFLAG_SCREEN) + GL_BlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ONE); else GL_BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); R_Mesh_TexBind(0, R_GetTexture(tex)); diff --git a/draw.h b/draw.h index c9c8b745..88b3d5a1 100644 --- a/draw.h +++ b/draw.h @@ -76,6 +76,7 @@ DRAWFLAG_NORMAL, DRAWFLAG_ADDITIVE, DRAWFLAG_MODULATE, DRAWFLAG_2XMODULATE, +DRAWFLAG_SCREEN, DRAWFLAG_NUMFLAGS, DRAWFLAG_MASK = 0xFF, // ONLY R_BeginPolygon() DRAWFLAG_MIPMAP = 0x100 // ONLY R_BeginPolygon() diff --git a/gl_draw.c b/gl_draw.c index 468a1624..9d3d47b5 100644 --- a/gl_draw.c +++ b/gl_draw.c @@ -813,6 +813,8 @@ static void _DrawQ_ProcessDrawFlag(int flags) GL_BlendFunc(GL_DST_COLOR, GL_ZERO); else if(flags == DRAWFLAG_2XMODULATE) GL_BlendFunc(GL_DST_COLOR,GL_SRC_COLOR); + else if(flags == DRAWFLAG_SCREEN) + GL_BlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ONE); else GL_BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); }