Share retained stroke mix pass helper
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user