Extract draw merge temporary branch helper

This commit is contained in:
2026-06-13 19:01:01 +02:00
parent 1a5d828d5c
commit d441e5e2bc
4 changed files with 136 additions and 120 deletions

View File

@@ -80,6 +80,11 @@ agent or engineer to remove them without reconstructing context from chat.
composite setup now routes through `execute_canvas_draw_merge_temporary_composite(...)`; composite setup now routes through `execute_canvas_draw_merge_temporary_composite(...)`;
setup, sampler, texture, draw, and unbind callbacks still remain retained in setup, sampler, texture, draw, and unbind callbacks still remain retained in
the legacy Canvas path. the legacy Canvas path.
- 2026-06-13: DEBT-0036 was narrowed again. `Canvas::draw_merge()` temporary
erase and paint branch wiring now routes through
`execute_legacy_canvas_draw_merge_temporary_composite(...)`; the retained
path still owns the concrete setup, sampler, texture, draw, and unbind
callbacks.
- 2026-06-13: DEBT-0036 was narrowed again. `NodeStrokePreview::draw_stroke_immediate()` - 2026-06-13: DEBT-0036 was narrowed again. `NodeStrokePreview::draw_stroke_immediate()`
now routes retained preview feedback/material/composite planning plus stroke now routes retained preview feedback/material/composite planning plus stroke
shader uniform assembly through shader uniform assembly through

View File

@@ -660,6 +660,11 @@ Progress Notes:
path still owns the concrete setup, sampler, texture, draw, and unbind path still owns the concrete setup, sampler, texture, draw, and unbind
callbacks. Next slice should target another narrow draw-merge seam without callbacks. Next slice should target another narrow draw-merge seam without
reopening the landed temporary-composite helper. reopening the landed temporary-composite helper.
- 2026-06-13: `Canvas::draw_merge()` temporary erase and paint branch wiring
now routes through `execute_legacy_canvas_draw_merge_temporary_composite(...)`;
the retained path still owns the concrete setup, sampler, texture, draw, and
unbind callbacks. Next slice should target another narrow draw-merge seam
without reopening the landed temporary-composite helper.
- 2026-06-13: `pp_paint_renderer_stroke_execution_tests` now also covers - 2026-06-13: `pp_paint_renderer_stroke_execution_tests` now also covers
retained frame-plan assembly for previous-sample projection mode and zoom retained frame-plan assembly for previous-sample projection mode and zoom
scaling. Next slice should target the remaining preview/Canvas stroke scaling. Next slice should target the remaining preview/Canvas stroke

View File

@@ -480,22 +480,6 @@ void Canvas::stroke_draw_mix(const glm::vec2& bb_min, const glm::vec2& bb_sz)
gl.restore(); gl.restore();
} }
template <typename Setup, typename BindSamplers, typename BindTextures, typename Draw, typename UnbindTextures>
static void execute_canvas_draw_merge_temporary_composite(
Setup&& setup,
BindSamplers&& bind_samplers,
BindTextures&& bind_textures,
Draw&& draw,
UnbindTextures&& unbind_textures)
{
pp::panopainter::execute_legacy_canvas_stroke_temporary_composite(
std::forward<Setup>(setup),
std::forward<BindSamplers>(bind_samplers),
std::forward<BindTextures>(bind_textures),
std::forward<Draw>(draw),
std::forward<UnbindTextures>(unbind_textures));
}
std::array<std::vector<vertex_t>, 6> Canvas::stroke_draw_project(std::array<vertex_t, 4>& B, bool project_3d /*= false*/, glm::mat4 mv /*= glm::mat4(1)*/) const std::array<std::vector<vertex_t>, 6> Canvas::stroke_draw_project(std::array<vertex_t, 4>& B, bool project_3d /*= false*/, glm::mat4 mv /*= glm::mat4(1)*/) const
{ {
// intersect P with the current face to clip diverging points from the plane // intersect P with the current face to clip diverging points from the plane
@@ -1451,8 +1435,9 @@ void Canvas::draw_merge(bool draw_checkerboard, std::array<bool, 6> faces /*= SI
use_blend, use_blend,
pp::panopainter::LegacyCanvasDrawMergeLayerCompositeExecution { pp::panopainter::LegacyCanvasDrawMergeLayerCompositeExecution {
.execute_temporary_erase = [&] { .execute_temporary_erase = [&] {
execute_canvas_draw_merge_temporary_composite( pp::panopainter::execute_legacy_canvas_draw_merge_temporary_composite(
[&] { pp::panopainter::LegacyCanvasDrawMergeTemporaryCompositeExecution {
.setup = [&] {
//ShaderManager::u_vec2(kShaderUniform::Resolution, zw(m_box) / zoom); //ShaderManager::u_vec2(kShaderUniform::Resolution, zw(m_box) / zoom);
//ShaderManager::u_int(kShaderUniform::Lock, m_layers[layer_index]->m_alpha_locked); //ShaderManager::u_int(kShaderUniform::Lock, m_layers[layer_index]->m_alpha_locked);
pp::panopainter::setup_legacy_stroke_erase_shader( pp::panopainter::setup_legacy_stroke_erase_shader(
@@ -1465,12 +1450,12 @@ void Canvas::draw_merge(bool draw_checkerboard, std::array<bool, 6> faces /*= SI
.mask_enabled = m_smask_active, .mask_enabled = m_smask_active,
}); });
}, },
[&] { .bind_samplers = [&] {
m_sampler.bind(0); m_sampler.bind(0);
m_sampler.bind(1); m_sampler.bind(1);
m_sampler.bind(2); m_sampler.bind(2);
}, },
[&] { .bind_textures = [&] {
set_active_texture_unit(0); set_active_texture_unit(0);
m_layers[layer_index]->rtt(plane_index).bindTexture(); m_layers[layer_index]->rtt(plane_index).bindTexture();
set_active_texture_unit(1); set_active_texture_unit(1);
@@ -1478,15 +1463,16 @@ void Canvas::draw_merge(bool draw_checkerboard, std::array<bool, 6> faces /*= SI
set_active_texture_unit(2); set_active_texture_unit(2);
m_smask.rtt(plane_index).bindTexture(); m_smask.rtt(plane_index).bindTexture();
}, },
[&] { .draw = [&] {
m_plane.draw_fill(); m_plane.draw_fill();
}, },
[&] { .unbind_textures = [&] {
m_smask.rtt(plane_index).unbindTexture(); m_smask.rtt(plane_index).unbindTexture();
set_active_texture_unit(1); set_active_texture_unit(1);
m_tmp[plane_index].unbindTexture(); m_tmp[plane_index].unbindTexture();
set_active_texture_unit(0); set_active_texture_unit(0);
m_layers[layer_index]->rtt(plane_index).unbindTexture(); m_layers[layer_index]->rtt(plane_index).unbindTexture();
},
}); });
}, },
.execute_temporary_paint = [&] { .execute_temporary_paint = [&] {
@@ -1495,8 +1481,9 @@ void Canvas::draw_merge(bool draw_checkerboard, std::array<bool, 6> faces /*= SI
if (b->m_pattern_flipx) patt_scale.x *= -1.f; if (b->m_pattern_flipx) patt_scale.x *= -1.f;
if (b->m_pattern_flipy) patt_scale.y *= -1.f; if (b->m_pattern_flipy) patt_scale.y *= -1.f;
execute_canvas_draw_merge_temporary_composite( pp::panopainter::execute_legacy_canvas_draw_merge_temporary_composite(
[&] { pp::panopainter::LegacyCanvasDrawMergeTemporaryCompositeExecution {
.setup = [&] {
pp::panopainter::setup_legacy_stroke_composite_shader( pp::panopainter::setup_legacy_stroke_composite_shader(
pp::panopainter::LegacyStrokeCompositeUniforms { pp::panopainter::LegacyStrokeCompositeUniforms {
.resolution = Canvas::I->m_size, .resolution = Canvas::I->m_size,
@@ -1521,14 +1508,14 @@ void Canvas::draw_merge(bool draw_checkerboard, std::array<bool, 6> faces /*= SI
.use_pattern = stroke_material.composite_pass.use_pattern, .use_pattern = stroke_material.composite_pass.use_pattern,
}); });
}, },
[&] { .bind_samplers = [&] {
m_sampler.bind(0); m_sampler.bind(0);
m_sampler.bind(1); m_sampler.bind(1);
m_sampler.bind(2); m_sampler.bind(2);
m_sampler.bind(3); m_sampler.bind(3);
m_sampler_stencil.bind(4); m_sampler_stencil.bind(4);
}, },
[&] { .bind_textures = [&] {
set_active_texture_unit(0); set_active_texture_unit(0);
m_layers[layer_index]->rtt(plane_index).bindTexture(); m_layers[layer_index]->rtt(plane_index).bindTexture();
set_active_texture_unit(1); set_active_texture_unit(1);
@@ -1543,10 +1530,10 @@ void Canvas::draw_merge(bool draw_checkerboard, std::array<bool, 6> faces /*= SI
b->m_pattern_texture->bind() : b->m_pattern_texture->bind() :
unbind_texture_2d(); unbind_texture_2d();
}, },
[&] { .draw = [&] {
m_plane.draw_fill(); m_plane.draw_fill();
}, },
[&] { .unbind_textures = [&] {
set_active_texture_unit(3); set_active_texture_unit(3);
if (stroke_material.composite_pass.use_dual) if (stroke_material.composite_pass.use_dual)
m_tmp_dual[plane_index].unbindTexture(); m_tmp_dual[plane_index].unbindTexture();
@@ -1556,6 +1543,7 @@ void Canvas::draw_merge(bool draw_checkerboard, std::array<bool, 6> faces /*= SI
m_tmp[plane_index].unbindTexture(); m_tmp[plane_index].unbindTexture();
set_active_texture_unit(0); set_active_texture_unit(0);
m_layers[layer_index]->rtt(plane_index).unbindTexture(); m_layers[layer_index]->rtt(plane_index).unbindTexture();
},
}); });
}, },
.execute_layer_texture = [&] { .execute_layer_texture = [&] {

View File

@@ -94,6 +94,14 @@ struct LegacyCanvasDrawMergeLayerCompositeExecution {
std::function<void()> execute_layer_blend; std::function<void()> execute_layer_blend;
}; };
struct LegacyCanvasDrawMergeTemporaryCompositeExecution {
std::function<void()> setup;
std::function<void()> bind_samplers;
std::function<void()> bind_textures;
std::function<void()> draw;
std::function<void()> unbind_textures;
};
struct LegacyCanvasDrawMergePlaneSetupUniforms { struct LegacyCanvasDrawMergePlaneSetupUniforms {
LegacyCanvasDrawMergeCheckerboardUniforms checkerboard; LegacyCanvasDrawMergeCheckerboardUniforms checkerboard;
bool use_blend = false; bool use_blend = false;
@@ -330,6 +338,16 @@ inline void execute_legacy_canvas_draw_merge_layer_composite(
} }
} }
inline void execute_legacy_canvas_draw_merge_temporary_composite(
const LegacyCanvasDrawMergeTemporaryCompositeExecution& execution)
{
execution.setup();
execution.bind_samplers();
execution.bind_textures();
execution.draw();
execution.unbind_textures();
}
inline void execute_legacy_canvas_draw_merge_plane_setup( inline void execute_legacy_canvas_draw_merge_plane_setup(
const LegacyCanvasDrawMergePlaneSetupUniforms& uniforms, const LegacyCanvasDrawMergePlaneSetupUniforms& uniforms,
const LegacyCanvasDrawMergePlaneSetupExecution& execution) const LegacyCanvasDrawMergePlaneSetupExecution& execution)