\r
namespace caspar { namespace core {\r
\r
+GLubyte upper_pattern[] = {\r
+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,\r
+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,\r
+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,\r
+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00};\r
+ \r
+GLubyte lower_pattern[] = {\r
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, \r
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,\r
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,\r
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff};\r
+\r
struct image_kernel::implementation : boost::noncopyable\r
{ \r
std::unique_ptr<shader> shader_;\r
"uniform bool has_layer_key; \n"\r
"uniform int blend_mode; \n"\r
"uniform int alpha_mode; \n"\r
- "uniform int interlace_mode; \n"\r
"uniform int pixel_format; \n"\r
" \n"\r
"uniform bool levels; \n"\r
" \n"\r
"void main() \n"\r
"{ \n"\r
- " switch(interlace_mode) \n"\r
- " { \n"\r
- " case 1: // lower \n"\r
- " { \n"\r
- " bool odd = mod(floor(gl_FragCoord.y), 2.0) > 0.5; \n"\r
- " if(!odd) \n"\r
- " discard; \n"\r
- " break; \n"\r
- " } \n"\r
- " case 2: //upper \n"\r
- " { \n"\r
- " bool odd = mod(floor(gl_FragCoord.y), 2.0) > 0.5; \n"\r
- " if(odd) \n"\r
- " discard; \n"\r
- " break; \n"\r
- " } \n"\r
- " } \n"\r
- " \n"\r
" vec4 color = get_rgba_color(); \n"\r
" if(has_local_key) \n"\r
" color.a *= texture2D(local_key, gl_TexCoord[1].st).r; \n"\r
const std::shared_ptr<device_buffer>& layer_key)\r
{\r
GL(glEnable(GL_TEXTURE_2D));\r
+ GL(glEnable(GL_POLYGON_STIPPLE));\r
\r
- // Setup depth for interlacing and explicit z-culling\r
- double z = 0.0;\r
if(transform.get_mode() == core::video_mode::upper)\r
- { \r
- GL(glEnable(GL_DEPTH_TEST)); \r
- z = 1.0;\r
- }\r
+ glPolygonStipple(upper_pattern);\r
else if(transform.get_mode() == core::video_mode::lower)\r
- GL(glClear(GL_DEPTH_BUFFER_BIT)); \r
+ glPolygonStipple(lower_pattern);\r
+ else\r
+ GL(glDisable(GL_POLYGON_STIPPLE));\r
\r
// Bind textures\r
\r
// Draw\r
\r
glBegin(GL_QUADS);\r
- glMultiTexCoord2d(GL_TEXTURE0, 0.0, 0.0); glMultiTexCoord2d(GL_TEXTURE1, f_p[0] , f_p[1] ); glVertex3d( f_p[0] *2.0-1.0, f_p[1] *2.0-1.0, z);\r
- glMultiTexCoord2d(GL_TEXTURE0, 1.0, 0.0); glMultiTexCoord2d(GL_TEXTURE1, (f_p[0]+f_s[0]), f_p[1] ); glVertex3d((f_p[0]+f_s[0])*2.0-1.0, f_p[1] *2.0-1.0, z);\r
- glMultiTexCoord2d(GL_TEXTURE0, 1.0, 1.0); glMultiTexCoord2d(GL_TEXTURE1, (f_p[0]+f_s[0]), (f_p[1]+f_s[1])); glVertex3d((f_p[0]+f_s[0])*2.0-1.0, (f_p[1]+f_s[1])*2.0-1.0, z);\r
- glMultiTexCoord2d(GL_TEXTURE0, 0.0, 1.0); glMultiTexCoord2d(GL_TEXTURE1, f_p[0] , (f_p[1]+f_s[1])); glVertex3d( f_p[0] *2.0-1.0, (f_p[1]+f_s[1])*2.0-1.0, z);\r
+ glMultiTexCoord2d(GL_TEXTURE0, 0.0, 0.0); glMultiTexCoord2d(GL_TEXTURE1, f_p[0] , f_p[1] ); glVertex2d( f_p[0] *2.0-1.0, f_p[1] *2.0-1.0);\r
+ glMultiTexCoord2d(GL_TEXTURE0, 1.0, 0.0); glMultiTexCoord2d(GL_TEXTURE1, (f_p[0]+f_s[0]), f_p[1] ); glVertex2d((f_p[0]+f_s[0])*2.0-1.0, f_p[1] *2.0-1.0);\r
+ glMultiTexCoord2d(GL_TEXTURE0, 1.0, 1.0); glMultiTexCoord2d(GL_TEXTURE1, (f_p[0]+f_s[0]), (f_p[1]+f_s[1])); glVertex2d((f_p[0]+f_s[0])*2.0-1.0, (f_p[1]+f_s[1])*2.0-1.0);\r
+ glMultiTexCoord2d(GL_TEXTURE0, 0.0, 1.0); glMultiTexCoord2d(GL_TEXTURE1, f_p[0] , (f_p[1]+f_s[1])); glVertex2d( f_p[0] *2.0-1.0, (f_p[1]+f_s[1])*2.0-1.0);\r
glEnd();\r
\r
GL(glDisable(GL_SCISSOR_TEST)); \r
- GL(glDisable(GL_DEPTH_TEST)); \r
+ GL(glDisable(GL_POLYGON_STIPPLE));\r
}\r
};\r
\r