Thin canvas state, tools menu, and node canvas draw

This commit is contained in:
2026-06-16 10:13:59 +02:00
parent d68c97e609
commit 4a5bb68fe2
7 changed files with 729 additions and 521 deletions

View File

@@ -4,6 +4,7 @@
#include <array>
#include <functional>
#include <utility>
namespace pp::panopainter {
@@ -114,6 +115,21 @@ struct LegacyCanvasDrawMergeLayerPlaneExecution {
std::function<void()> draw_blend;
};
struct LegacyCanvasDrawMergeLayerPathExecution {
std::function<void()> bind_blender_framebuffer;
std::function<void()> clear_blender_framebuffer;
std::function<void()> unbind_blender_framebuffer;
std::function<void()> prepare_temporary_erase;
std::function<void()> cleanup_temporary_erase;
std::function<void()> prepare_temporary_paint;
std::function<void()> cleanup_temporary_paint;
std::function<void()> prepare_layer_texture;
std::function<void()> cleanup_layer_texture;
std::function<void()> draw_blend;
std::function<void()> draw_debug_outline;
std::function<void(int, float)> draw_frame;
};
struct LegacyCanvasDrawMergeTemporaryCompositeExecution {
std::function<void()> setup;
std::function<void()> bind_samplers;
@@ -613,6 +629,48 @@ inline void execute_legacy_canvas_draw_merge_layer_plane(
}
}
inline void execute_legacy_canvas_draw_merge_layer_path(
bool is_temporary_erase,
bool is_temporary_paint,
bool use_blend,
int first_frame,
int last_frame,
const std::function<float(int)>& frame_alpha,
const LegacyCanvasDrawMergeLayerPathExecution& execution)
{
if (use_blend) {
execution.bind_blender_framebuffer();
execution.clear_blender_framebuffer();
}
if (is_temporary_erase) {
execution.prepare_temporary_erase();
for (int frame = first_frame; frame <= last_frame; frame++) {
execution.draw_frame(frame, frame_alpha(frame));
}
execution.cleanup_temporary_erase();
} else if (is_temporary_paint) {
execution.prepare_temporary_paint();
for (int frame = first_frame; frame <= last_frame; frame++) {
execution.draw_frame(frame, frame_alpha(frame));
}
execution.cleanup_temporary_paint();
} else {
execution.prepare_layer_texture();
for (int frame = first_frame; frame <= last_frame; frame++) {
execution.draw_frame(frame, frame_alpha(frame));
}
execution.cleanup_layer_texture();
}
if (use_blend) {
execution.unbind_blender_framebuffer();
execution.draw_blend();
}
execution.draw_debug_outline();
}
inline void execute_legacy_canvas_draw_merge_temporary_composite(
const LegacyCanvasDrawMergeTemporaryCompositeExecution& execution)
{
@@ -759,6 +817,40 @@ inline void execute_legacy_canvas_draw_merge_post_draw(
execution.draw_current_modes();
}
template <
typename DrawMaskFree,
typename DrawMaskLine,
typename DrawSmaskFaces,
typename DrawGridModes,
typename DrawHeightmap,
typename DrawCurrentModes>
inline void execute_legacy_canvas_draw_merge_post_draw_callbacks(
bool smask_active,
bool draw_mask_overlay,
int smask_mode,
bool draw_grid_modes_enabled,
DrawMaskFree&& draw_mask_free,
DrawMaskLine&& draw_mask_line,
DrawSmaskFaces&& draw_smask_faces,
DrawGridModes&& draw_grid_modes_callback,
DrawHeightmap&& draw_heightmap,
DrawCurrentModes&& draw_current_modes)
{
execute_legacy_canvas_draw_merge_post_draw(
smask_active,
draw_mask_overlay,
smask_mode,
draw_grid_modes_enabled,
LegacyCanvasDrawMergePostDrawExecution {
.draw_mask_free = std::forward<DrawMaskFree>(draw_mask_free),
.draw_mask_line = std::forward<DrawMaskLine>(draw_mask_line),
.draw_smask_faces = std::forward<DrawSmaskFaces>(draw_smask_faces),
.draw_grid_modes = std::forward<DrawGridModes>(draw_grid_modes_callback),
.draw_heightmap = std::forward<DrawHeightmap>(draw_heightmap),
.draw_current_modes = std::forward<DrawCurrentModes>(draw_current_modes),
});
}
inline void execute_legacy_canvas_draw_merge_smask_faces(
const LegacyCanvasDrawMergeTextureMaskUniforms& uniforms,
const glm::mat4& proj,