Share retained stroke mix pass helper

This commit is contained in:
2026-06-13 10:54:28 +02:00
parent 87e51c37be
commit 3d4d0f99d1
5 changed files with 164 additions and 43 deletions

View File

@@ -137,6 +137,35 @@ struct LegacyCanvasStrokePadExecutionResult {
std::size_t padded_faces = 0;
};
struct LegacyCanvasStrokeMixPassPlane {
int index = 0;
bool visible = true;
bool has_target = false;
float opacity = 1.0f;
glm::mat4 mvp { 1.0f };
};
struct LegacyCanvasStrokeMixPassRequest {
std::string_view context;
glm::vec2 resolution {};
std::span<const LegacyCanvasStrokeMixPassPlane> planes;
std::function<void()> bind_mix_samplers;
std::function<void()> unbind_mix_samplers;
std::function<void(int, const glm::mat4&)> setup_plane_shader;
std::function<void(int)> bind_layer_texture;
std::function<void(int)> bind_stroke_texture;
std::function<void(int)> bind_mask_texture;
std::function<void()> draw_plane;
std::function<void(int)> unbind_mask_texture;
std::function<void(int)> unbind_stroke_texture;
std::function<void(int)> unbind_layer_texture;
};
struct LegacyCanvasStrokeMixPassResult {
bool ok = false;
std::size_t composed_planes = 0;
};
struct LegacyCanvasStrokeComputeRequest {
StrokeSample previous_sample {};
std::span<const StrokeSample> samples;
@@ -923,4 +952,49 @@ template <typename ExecuteSample, typename BeginFace, typename PrepareDirtyReque
});
}
[[nodiscard]] inline LegacyCanvasStrokeMixPassResult execute_legacy_canvas_stroke_mix_pass(
const LegacyCanvasStrokeMixPassRequest& request)
{
LegacyCanvasStrokeMixPassResult result;
if (request.resolution.x <= 0.0f ||
request.resolution.y <= 0.0f ||
!request.setup_plane_shader ||
!request.bind_layer_texture ||
!request.bind_stroke_texture ||
!request.bind_mask_texture ||
!request.draw_plane ||
!request.unbind_mask_texture ||
!request.unbind_stroke_texture ||
!request.unbind_layer_texture) {
return result;
}
if (request.bind_mix_samplers) {
request.bind_mix_samplers();
}
for (const auto& plane : request.planes) {
if (!plane.visible || plane.opacity <= 0.0f || !plane.has_target) {
continue;
}
request.setup_plane_shader(plane.index, plane.mvp);
request.bind_layer_texture(plane.index);
request.bind_stroke_texture(plane.index);
request.bind_mask_texture(plane.index);
request.draw_plane();
request.unbind_mask_texture(plane.index);
request.unbind_stroke_texture(plane.index);
request.unbind_layer_texture(plane.index);
++result.composed_planes;
}
if (request.unbind_mix_samplers) {
request.unbind_mix_samplers();
}
result.ok = true;
return result;
}
} // namespace pp::panopainter