std::fill(binded_textures_.begin(), binded_textures_.end(), 0);\r
std::fill(viewport_.begin(), viewport_.end(), 0);\r
std::fill(scissor_.begin(), scissor_.end(), 0);\r
+ std::fill(blend_func_.begin(), blend_func_.end(), 0);\r
\r
invoke([=]\r
{\r
}\r
}\r
\r
+void ogl_device::blend_func_separate(int c1, int c2, int a1, int a2)\r
+{\r
+ std::array<int, 4> func = {c1, c2, a1, a2};\r
+\r
+ if(blend_func_ != func)\r
+ {\r
+ blend_func_ = func;\r
+ glBlendFuncSeparate(c1, c2, a1, a2);\r
+ }\r
+}\r
+\r
}}\r
\r
GLint attached_texture_;\r
GLint active_shader_;\r
std::array<GLint, 16> binded_textures_;\r
+ std::array<GLint, 4> blend_func_;\r
\r
std::unique_ptr<sf::Context> context_;\r
\r
\r
void begin_read(host_buffer& dest, device_buffer& source);\r
void begin_read(device_buffer& dest, host_buffer& source);\r
+\r
+ void blend_func_separate(int c1, int c2, int a1, int a2);\r
\r
void use(shader& shader);\r
\r
shader_->set("background", texture_id::background);\r
shader_->set("blend_mode", item.transform.get_is_key() ? core::image_transform::blend_mode::normal : item.transform.get_blend_mode());\r
}\r
+ else\r
+ {\r
+ switch(item.transform.get_blend_mode())\r
+ {\r
+ case image_transform::blend_mode::add: \r
+ ogl.blend_func_separate(GL_ONE, GL_ONE, GL_ONE, GL_ONE);\r
+ break;\r
+ case image_transform::blend_mode::replace: \r
+ ogl.blend_func_separate(GL_ONE, GL_ZERO, GL_ONE, GL_ONE);\r
+ break;\r
+ case image_transform::blend_mode::screen:\r
+ ogl.blend_func_separate(GL_ONE, GL_ONE_MINUS_SRC_COLOR, GL_ONE, GL_ONE);\r
+ default:\r
+ ogl.blend_func_separate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE);\r
+ break;\r
+ }\r
+ }\r
\r
// Setup image-adjustements\r
\r
{\r
auto local_draw_buffer = create_device_buffer(4); \r
\r
- BOOST_FOREACH(auto& item, layer) \r
+ // First item should just be "copied" to empty framebuffer.\r
+ auto item = layer.begin();\r
+ item->transform.set_blend_mode(image_transform::blend_mode::replace);\r
+ draw_item(std::move(*item++), local_draw_buffer, local_key_buffer, layer_key_buffer); \r
+\r
+ for(; item != layer.end(); ++item)\r
{\r
- item.transform.set_blend_mode(image_transform::blend_mode::normal); // Disable blending, it will be used when merging back into render stack.\r
- draw_item(std::move(item), local_draw_buffer, local_key_buffer, layer_key_buffer); \r
+ item->transform.set_blend_mode(image_transform::blend_mode::normal); // Disable blending, it will be used when merging back into render stack.\r
+ draw_item(std::move(*item), local_draw_buffer, local_key_buffer, layer_key_buffer); \r
}\r
\r
kernel_.draw(channel_.ogl(), create_render_item(local_draw_buffer, layer.front().transform.get_blend_mode()), draw_buffer, nullptr, nullptr);\r
// TODO: Optimize\r
bool has_overlapping_items(const layer& layer, image_transform::blend_mode::type blend_mode)\r
{\r
- if(layer.empty())\r
+ if(layer.size() < 2)\r
return false; \r
\r
implementation::layer fill;\r
" \n" \r
"vec4 blend(vec4 fore) \n"\r
"{ \n"\r
- " vec4 back = texture2D(background, gl_TexCoord[1].st); \n"\r
+ " if(blend_mode == 29) // replace \n"\r
+ " return fore; \n"\r
+ " vec4 back = texture2D(background, gl_TexCoord[1].st).bgra; \n"\r
" fore.rgb = get_blend_color(back.rgb, fore.rgb); \n"\r
- " return vec4(mix(back.bgr, fore.rgb, fore.a), back.a + fore.a); \n"\r
+ " return vec4(mix(back.rgb, fore.rgb, fore.a), back.a + fore.a); \n"\r
"} \n";\r
}\r
\r
saturation,\r
color,\r
luminosity,\r
+ replace,\r
blend_mode_count \r
};\r
};\r
<consumers>\r
<buffer-depth>3</buffer-depth>\r
</consumers>\r
+ <mixers>\r
+ <blend-modes>true</blend-modes>\r
+ </mixers>\r
<producers>\r
<buffer-depth>1</buffer-depth>\r
<auto-transcode>true</auto-transcode>\r
</producers>\r
<channels>\r
<channel>\r
- <video-mode>1080i5000</video-mode>\r
+ <video-mode>720p5000</video-mode>\r
<consumers>\r
<decklink>\r
<device>1</device>\r
<low-latency>true</low-latency>\r
<embedded-audio>true</embedded-audio>\r
</decklink>\r
- </consumers>\r
- </channel>\r
- <channel>\r
- <video-mode>1080i5000</video-mode>\r
- <consumers>\r
- <decklink>\r
- <device>2</device>\r
- <low-latency>true</low-latency>\r
- <embedded-audio>true</embedded-audio>\r
- </decklink>\r
+ <screen>\r
+ <device>1</device>\r
+ <key-only>true</key-only>\r
+ </screen>\r
</consumers>\r
</channel>\r
</channels>\r