From 4bbd0cc40408c59d48e615b7cc3276e1069b77b8 Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Thu, 5 Jan 2023 06:07:56 +0300 Subject: [PATCH] ref: add new special rendermode that specifically used for modulate mode in engine's ScreenFade --- engine/ref_api.h | 4 ++++ ref/gl/gl_backend.c | 4 ++++ ref/soft/r_draw.c | 8 ++++++-- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/engine/ref_api.h b/engine/ref_api.h index c5215541..427b3f05 100644 --- a/engine/ref_api.h +++ b/engine/ref_api.h @@ -67,6 +67,10 @@ GNU General Public License for more details. #define FWORLD_WATERALPHA BIT( 2 ) #define FWORLD_HAS_DELUXEMAP BIT( 3 ) +// special rendermode for screenfade modulate +// (probably will be expanded at some point) +#define kRenderScreenFadeModulate 0x1000 + typedef enum { DEMO_INACTIVE = 0, diff --git a/ref/gl/gl_backend.c b/ref/gl/gl_backend.c index da530405..f3f4e2a5 100644 --- a/ref/gl/gl_backend.c +++ b/ref/gl/gl_backend.c @@ -417,6 +417,10 @@ void GL_SetRenderMode( int mode ) pglDisable( GL_ALPHA_TEST ); pglBlendFunc( GL_SRC_ALPHA, GL_ONE ); break; + case kRenderScreenFadeModulate: + pglEnable( GL_BLEND ); + pglDisable( GL_ALPHA_TEST ); + pglBlendFunc( GL_ZERO, GL_SRC_COLOR ); } } diff --git a/ref/soft/r_draw.c b/ref/soft/r_draw.c index 24ff99f7..22ffe279 100644 --- a/ref/soft/r_draw.c +++ b/ref/soft/r_draw.c @@ -165,11 +165,15 @@ void R_DrawStretchPicImplementation( int x, int y, int w, int h, int s1, int t1, pixel_t screen = dest[u]; dest[u] = vid.addmap[(src & 0xff00)|(screen>>8)] << 8 | (screen & 0xff) | ((src & 0xff) >> 0); } + else if( vid.rendermode == kRenderScreenFadeModulate ) + { + pixel_t screen = dest[u]; + dest[u] = BLEND_COLOR( screen, vid.color ); + } else if( alpha < 7) // && (vid.rendermode == kRenderTransAlpha || vid.rendermode == kRenderTransTexture ) ) { pixel_t screen = dest[u]; // | 0xff & screen & src ; - dest[u] = BLEND_ALPHA( alpha, src, screen);//vid.alphamap[( alpha << 16)|(src & 0xff00)|(screen>>8)] << 8 | (screen & 0xff) >> 3 | ((src & 0xff) >> 3); - + dest[u] = BLEND_ALPHA( alpha, src, screen );//vid.alphamap[( alpha << 16)|(src & 0xff00)|(screen>>8)] << 8 | (screen & 0xff) >> 3 | ((src & 0xff) >> 3); } else dest[u] = src;