void opengl_state::SetZbufferType(gr_zbuffer_type zt) { switch (zt) { case ZBUFFER_TYPE_NONE: GL_state.DepthFunc(GL_ALWAYS); GL_state.DepthMask(GL_FALSE); break; case ZBUFFER_TYPE_READ: GL_state.DepthFunc(GL_LESS); GL_state.DepthMask(GL_FALSE); break; case ZBUFFER_TYPE_WRITE: GL_state.DepthFunc(GL_ALWAYS); GL_state.DepthMask(GL_TRUE); break; case ZBUFFER_TYPE_FULL: GL_state.DepthFunc(GL_LESS); GL_state.DepthMask(GL_TRUE); break; default: break; } GL_state.DepthTest( (zt == ZBUFFER_TYPE_NONE) ? GL_FALSE : GL_TRUE ); }
void opengl_state::SetStencilType(gr_stencil_type st) { if (st == Current_stencil_type) { return; } switch (st) { case STENCIL_TYPE_NONE: glStencilFunc( GL_NEVER, 1, 0xFFFF ); glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP ); break; case STENCIL_TYPE_READ: glStencilFunc( GL_NOTEQUAL, 1, 0XFFFF ); glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP ); break; case STENCIL_TYPE_WRITE: glStencilFunc( GL_ALWAYS, 1, 0xFFFF ); glStencilOp( GL_KEEP, GL_KEEP, GL_REPLACE ); break; default: break; } GL_state.StencilTest( (st == STENCIL_TYPE_NONE) ? GL_FALSE : GL_TRUE ); Current_stencil_type = st; }
void opengl_state::SetAlphaBlendMode(gr_alpha_blend ab) { switch (ab) { case ALPHA_BLEND_ALPHA_BLEND_ALPHA: GL_state.BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); break; case ALPHA_BLEND_NONE: GL_state.BlendFunc(GL_ONE, GL_ZERO); break; case ALPHA_BLEND_ADDITIVE: GL_state.BlendFunc(GL_ONE, GL_ONE); break; case ALPHA_BLEND_ALPHA_ADDITIVE: GL_state.BlendFunc(GL_SRC_ALPHA, GL_ONE); break; case ALPHA_BLEND_ALPHA_BLEND_SRC_COLOR: GL_state.BlendFunc(/*GL_SRC_COLOR*/GL_SRC_ALPHA, GL_ONE_MINUS_SRC_COLOR); break; case ALPHA_BLEND_PREMULTIPLIED: GL_state.BlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); break; default: break; } GL_state.Blend( (ab == ALPHA_BLEND_NONE) ? GL_FALSE : GL_TRUE ); }
void opengl_state::SetAlphaBlendModei(int buffer, gr_alpha_blend ab) { switch (ab) { case ALPHA_BLEND_ALPHA_BLEND_ALPHA: GL_state.BlendFunci(buffer, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); break; case ALPHA_BLEND_NONE: GL_state.BlendFunci(buffer, GL_ONE, GL_ZERO); break; case ALPHA_BLEND_ADDITIVE: GL_state.BlendFunci(buffer, GL_ONE, GL_ONE); break; case ALPHA_BLEND_ALPHA_ADDITIVE: GL_state.BlendFunci(buffer, GL_SRC_ALPHA, GL_ONE); break; case ALPHA_BLEND_ALPHA_BLEND_SRC_COLOR: GL_state.BlendFunci(buffer, /*GL_SRC_COLOR*/GL_SRC_ALPHA, GL_ONE_MINUS_SRC_COLOR); break; case ALPHA_BLEND_PREMULTIPLIED: GL_state.BlendFunci(buffer, GL_ONE, GL_ONE_MINUS_SRC_ALPHA); break; default: break; } }
void opengl_state::SetAlphaBlendMode(gr_alpha_blend ab) { if (ab == Current_alpha_blend_mode) { return; } switch (ab) { case ALPHA_BLEND_ALPHA_BLEND_ALPHA: GL_state.BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); break; case ALPHA_BLEND_NONE: GL_state.BlendFunc(GL_ONE, GL_ZERO); break; case ALPHA_BLEND_ADDITIVE: GL_state.BlendFunc(GL_ONE, GL_ONE); break; case ALPHA_BLEND_ALPHA_ADDITIVE: GL_state.BlendFunc(GL_SRC_ALPHA, GL_ONE); break; case ALPHA_BLEND_ALPHA_BLEND_SRC_COLOR: GL_state.BlendFunc(/*GL_SRC_COLOR*/GL_SRC_ALPHA, GL_ONE_MINUS_SRC_COLOR); break; default: break; } GL_state.Blend( (ab == ALPHA_BLEND_NONE) ? GL_FALSE : GL_TRUE ); Current_alpha_blend_mode = ab; }
void opengl_setup_render_states(int &r, int &g, int &b, int &alpha, int &tmap_type, int flags, int is_scaler) { gr_texture_source texture_source = (gr_texture_source)(-1); gr_alpha_blend alpha_blend = (gr_alpha_blend)(-1); gr_zbuffer_type zbuffer_type = (gr_zbuffer_type)(-1); if (gr_zbuffering) { if ( is_scaler || (gr_screen.current_alphablend_mode == GR_ALPHABLEND_FILTER) ) { zbuffer_type = ZBUFFER_TYPE_READ; } else { zbuffer_type = ZBUFFER_TYPE_FULL; } } else { zbuffer_type = ZBUFFER_TYPE_NONE; } tmap_type = TCACHE_TYPE_NORMAL; if (flags & TMAP_FLAG_TEXTURED) { r = g = b = 255; } else { r = gr_screen.current_color.red; g = gr_screen.current_color.green; b = gr_screen.current_color.blue; } if (flags & TMAP_FLAG_BW_TEXTURE) { r = gr_screen.current_color.red; g = gr_screen.current_color.green; b = gr_screen.current_color.blue; } if ( gr_screen.current_alphablend_mode == GR_ALPHABLEND_FILTER ) { if ( (gr_screen.current_bitmap >= 0) && bm_has_alpha_channel(gr_screen.current_bitmap) ) { tmap_type = TCACHE_TYPE_XPARENT; alpha_blend = ALPHA_BLEND_ALPHA_BLEND_ALPHA; // Blend with screen pixel using src*alpha+dst float factor = gr_screen.current_alpha; if (factor >= 1.0f) { alpha = 255; } else { alpha = fl2i(gr_screen.current_alpha*255.0f); } } else { tmap_type = TCACHE_TYPE_NORMAL; alpha_blend = ALPHA_BLEND_ADDITIVE; // ALPHA_BLEND_ALPHA_ADDITIVE; // Blend with screen pixel using src*alpha+dst float factor = gr_screen.current_alpha; alpha = 255; if (factor < 1.0f) { r = fl2i(r * gr_screen.current_alpha); g = fl2i(g * gr_screen.current_alpha); b = fl2i(b * gr_screen.current_alpha); } } } else { alpha_blend = ALPHA_BLEND_ALPHA_BLEND_ALPHA; alpha = fl2i(gr_screen.current_alpha * 255.0f); } if (flags & TMAP_FLAG_TEXTURED) { // use nonfiltered textures for interface graphics if (flags & TMAP_FLAG_INTERFACE) { tmap_type = TCACHE_TYPE_INTERFACE; texture_source = TEXTURE_SOURCE_NO_FILTERING; } else { texture_source = TEXTURE_SOURCE_DECAL; } } else { texture_source = TEXTURE_SOURCE_NONE; } GL_state.SetTextureSource(texture_source); GL_state.SetAlphaBlendMode(alpha_blend); GL_state.SetZbufferType(zbuffer_type); }