diff --git a/src/canvas.cpp b/src/canvas.cpp index ea5739c..77ff73d 100644 --- a/src/canvas.cpp +++ b/src/canvas.cpp @@ -508,6 +508,68 @@ static void execute_canvas_draw_merge_final_plane_composite( pp::panopainter::execute_legacy_canvas_draw_merge_final_plane_composite(uniforms, execution); } +static void execute_canvas_draw_merge_plane_iteration( + Canvas& canvas, + const std::array& faces, + const std::vector>& layers, + const Brush& brush, + const glm::mat4& ortho, + bool use_blend, + bool copy_blend_destination, + bool draw_checkerboard) +{ + for (int plane_index = 0; plane_index < 6; plane_index++) + { + if (!faces[plane_index]) + continue; + + canvas.m_layers_merge.rtt(plane_index).bindFramebuffer(); + pp::panopainter::execute_legacy_canvas_draw_merge_plane_setup( + pp::panopainter::LegacyCanvasDrawMergePlaneSetupUniforms { + .checkerboard = { + .mvp = ortho, + .colorize = false, + }, + .use_blend = use_blend, + .draw_checkerboard = draw_checkerboard, + }, + pp::panopainter::LegacyCanvasDrawMergePlaneSetupExecution { + .clear_plane = [&] { + canvas.m_layers_merge.rtt(plane_index).clear({ 1, 1, 1, 0 }); + }, + .disable_blend = [&] { + apply_canvas_capability(blend_state(), false); + }, + .enable_blend = [&] { + apply_canvas_capability(blend_state(), true); + }, + .draw = [&] { + canvas.m_plane.draw_fill(); + }, + }); + + for (int layer_index = 0; layer_index < layers.size(); layer_index++) + { + canvas.draw_merge_branch_orchestration( + plane_index, + layer_index, + layers[layer_index], + brush, + ortho, + use_blend, + copy_blend_destination, + draw_checkerboard); + } + + if (use_blend) + { + canvas.draw_merge_final_plane_composite(ortho, draw_checkerboard); + } + + canvas.m_layers_merge.rtt(plane_index).unbindFramebuffer(); + } +} + static auto make_canvas_stroke_mix_pass_shell( Canvas& canvas, const glm::vec2& bb_min, @@ -1794,56 +1856,15 @@ void Canvas::draw_merge(bool draw_checkerboard, std::array faces /*= SI // if not using shader blend, use gl rasterizer blend apply_canvas_capability(depth_test_state(), false); - for (int plane_index = 0; plane_index < 6; plane_index++) - { - if (!faces[plane_index]) - continue; - - m_layers_merge.rtt(plane_index).bindFramebuffer(); - pp::panopainter::execute_legacy_canvas_draw_merge_plane_setup( - pp::panopainter::LegacyCanvasDrawMergePlaneSetupUniforms { - .checkerboard = { - .mvp = ortho, - .colorize = false, - }, - .use_blend = use_blend, - .draw_checkerboard = draw_checkerboard, - }, - pp::panopainter::LegacyCanvasDrawMergePlaneSetupExecution { - .clear_plane = [&] { - m_layers_merge.rtt(plane_index).clear({ 1, 1, 1, 0 }); - }, - .disable_blend = [&] { - apply_canvas_capability(blend_state(), false); - }, - .enable_blend = [&] { - apply_canvas_capability(blend_state(), true); - }, - .draw = [&] { - m_plane.draw_fill(); - }, - }); - - for (int layer_index = 0; layer_index < m_layers.size(); layer_index++) - { - draw_merge_branch_orchestration( - plane_index, - layer_index, - m_layers[layer_index], - *b, - ortho, - use_blend, - copy_blend_destination, - draw_checkerboard); - } - - if (use_blend) - { - draw_merge_final_plane_composite(ortho, draw_checkerboard); - } - - m_layers_merge.rtt(plane_index).unbindFramebuffer(); - } + execute_canvas_draw_merge_plane_iteration( + *this, + faces, + m_layers, + *b, + ortho, + use_blend, + copy_blend_destination, + draw_checkerboard); } void Canvas::stroke_update(glm::vec3 point, float pressure)