if(has_overlapping_items(layer, layer.front().transform.get_blend_mode()))\r
{\r
auto local_draw_buffer = create_device_buffer(4); \r
- \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
+ int mode = 0;\r
+ BOOST_FOREACH(auto& item, layer)\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
+ if(mode & item.mode)\r
+ item.transform.set_blend_mode(image_transform::blend_mode::normal); // Disable blending, it will be used when merging back into render stack.\r
+ else\r
+ {\r
+ item.transform.set_blend_mode(image_transform::blend_mode::replace); // Target field is empty, no blending\r
+ mode |= item.mode;\r
+ }\r
+\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