@@ -93,14 +93,15 @@ r_shaderHnd_c::~r_shaderHnd_c()
9393struct r_layerCmd_s {
9494 enum {
9595 VIEWPORT,
96+ BLEND,
9697 BIND,
9798 COLOR,
9899 QUAD,
99100 } cmd;
100101 union {
101102 r_viewport_s viewport;
103+ int blendMode;
102104 r_tex_c* tex;
103- GLenum mode;
104105 col4_t col;
105106 struct {
106107 double s[4 ];
@@ -150,6 +151,13 @@ void r_layer_c::SetViewport(r_viewport_s* viewport)
150151 cmd->viewport .height = viewport->height ;
151152}
152153
154+ void r_layer_c::SetBlendMode (int mode)
155+ {
156+ r_layerCmd_s* cmd = NewCommand ();
157+ cmd->cmd = r_layerCmd_s::BLEND;
158+ cmd->blendMode = mode;
159+ }
160+
153161void r_layer_c::Bind (r_tex_c* tex)
154162{
155163 r_layerCmd_s* cmd = NewCommand ();
@@ -177,6 +185,7 @@ void r_layer_c::Quad(double s0, double t0, double x0, double y0, double s1, doub
177185void r_layer_c::Render ()
178186{
179187 r_viewport_s curViewPort = {-1 , -1 , -1 , -1 };
188+ int curBlendMode = -1 ;
180189 r_tex_c* curTex = NULL ;
181190 for (int i = 0 ; i < numCmd; i++) {
182191 r_layerCmd_s* cmd = cmdList[i];
@@ -191,6 +200,21 @@ void r_layer_c::Render()
191200 glLoadIdentity ();
192201 }
193202 break ;
203+ case r_layerCmd_s::BLEND:
204+ if (cmd->blendMode != curBlendMode) {
205+ switch (cmd->blendMode ) {
206+ case RB_ALPHA:
207+ glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
208+ break ;
209+ case RB_PRE_ALPHA:
210+ glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
211+ break ;
212+ case RB_ADDITIVE:
213+ glBlendFunc (GL_ONE, GL_ONE);
214+ break ;
215+ }
216+ }
217+ break ;
194218 case r_layerCmd_s::BIND:
195219 if (cmd->tex != curTex) {
196220 cmd->tex ->Bind ();
@@ -278,7 +302,6 @@ void r_renderer_c::Init()
278302 glEnable (GL_TEXTURE_2D);
279303 glDisable (GL_DEPTH_TEST);
280304 glEnable (GL_BLEND);
281- glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
282305
283306 // Load extensions
284307 sys->con ->Printf (" Loading OpenGL extensions...\n " );
@@ -372,11 +395,12 @@ void r_renderer_c::Shutdown()
372395
373396void r_renderer_c::BeginFrame ()
374397{
375- glClear (GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
398+ glClear (GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT );
376399
377400 curLayer = layerList[0 ];
378401
379402 SetViewport ();
403+ SetBlendMode (RB_ALPHA);
380404 DrawColor ();
381405}
382406
@@ -585,6 +609,7 @@ void r_renderer_c::SetDrawLayer(int layer, int subLayer)
585609 }
586610 curLayer = newCurLayer;
587611 curLayer->SetViewport (&curViewport);
612+ curLayer->SetBlendMode (curBlendMode);
588613}
589614
590615void r_renderer_c::SetDrawSubLayer (int subLayer)
@@ -610,6 +635,12 @@ void r_renderer_c::SetViewport(int x, int y, int width, int height)
610635 curLayer->SetViewport (&curViewport);
611636}
612637
638+ void r_renderer_c::SetBlendMode (int mode)
639+ {
640+ curBlendMode = mode;
641+ curLayer->SetBlendMode (mode);
642+ }
643+
613644void r_renderer_c::DrawColor (const col4_t col)
614645{
615646 if (col) {
0 commit comments