Extract app runtime shell, canvas render shell, and node tree services
This commit is contained in:
657
src/canvas.cpp
657
src/canvas.cpp
@@ -1,8 +1,8 @@
|
||||
#include "pch.h"
|
||||
#include "log.h"
|
||||
#include "canvas.h"
|
||||
#include "app.h"
|
||||
#include "legacy_canvas_draw_merge_services.h"
|
||||
#include "legacy_canvas_render_shell_services.h"
|
||||
#include "legacy_ui_gl_dispatch.h"
|
||||
#include "legacy_canvas_stroke_erase_services.h"
|
||||
#include "legacy_gl_renderbuffer_dispatch.h"
|
||||
#include "legacy_canvas_stroke_commit_services.h"
|
||||
@@ -14,7 +14,6 @@
|
||||
#include "legacy_canvas_object_draw_services.h"
|
||||
#include "legacy_canvas_projection_services.h"
|
||||
#include "legacy_canvas_stroke_services.h"
|
||||
#include "legacy_ui_gl_dispatch.h"
|
||||
#include "legacy_ui_overlay_services.h"
|
||||
#include "app_core/document_canvas.h"
|
||||
#include "texture.h"
|
||||
@@ -314,507 +313,6 @@ std::array<std::vector<vertex_t>, 6> Canvas::stroke_draw_project(std::array<vert
|
||||
return pp::panopainter::legacy_canvas_stroke_draw_project(*this, B, project_3d, mv);
|
||||
}
|
||||
|
||||
static void execute_canvas_draw_merge_layer_composite(
|
||||
bool is_temporary_erase,
|
||||
bool is_temporary_paint,
|
||||
bool use_blend,
|
||||
const pp::panopainter::LegacyCanvasDrawMergeLayerCompositeExecution& execution)
|
||||
{
|
||||
pp::panopainter::execute_legacy_canvas_draw_merge_layer_composite(
|
||||
is_temporary_erase,
|
||||
is_temporary_paint,
|
||||
use_blend,
|
||||
execution);
|
||||
}
|
||||
|
||||
static void execute_canvas_draw_merge_layer_texture(
|
||||
const pp::panopainter::LegacyCanvasDrawMergeTextureAlphaUniforms& uniforms,
|
||||
const pp::panopainter::LegacyCanvasDrawMergeLayerTextureExecution& execution)
|
||||
{
|
||||
pp::panopainter::execute_legacy_canvas_draw_merge_layer_texture(uniforms, execution);
|
||||
}
|
||||
|
||||
static void execute_canvas_draw_merge_layer_blend(
|
||||
const pp::panopainter::LegacyCanvasDrawMergeLayerBlendUniforms& uniforms,
|
||||
const pp::panopainter::LegacyCanvasDrawMergeLayerBlendExecution& execution)
|
||||
{
|
||||
pp::panopainter::execute_legacy_canvas_draw_merge_layer_blend(uniforms, execution);
|
||||
}
|
||||
|
||||
static void execute_canvas_draw_merge_final_plane_composite(
|
||||
const pp::panopainter::LegacyCanvasDrawMergeFinalPlaneCompositeUniforms& uniforms,
|
||||
const pp::panopainter::LegacyCanvasDrawMergeFinalPlaneCompositeExecution& execution)
|
||||
{
|
||||
pp::panopainter::execute_legacy_canvas_draw_merge_final_plane_composite(uniforms, execution);
|
||||
}
|
||||
|
||||
static void execute_canvas_draw_merge_temporary_erase_dispatch(
|
||||
Canvas& canvas,
|
||||
int plane_index,
|
||||
int layer_index,
|
||||
const std::shared_ptr<Layer>& layer,
|
||||
const glm::mat4& ortho);
|
||||
|
||||
static pp::panopainter::LegacyCanvasDrawMergeTemporaryCompositeExecution
|
||||
make_canvas_draw_merge_temporary_paint_request(
|
||||
Canvas& canvas,
|
||||
int layer_index,
|
||||
int plane_index,
|
||||
const std::shared_ptr<Layer>& layer,
|
||||
const Brush& brush,
|
||||
const glm::mat4& ortho);
|
||||
|
||||
static pp::panopainter::LegacyCanvasDrawMergeLayerTextureExecution
|
||||
make_canvas_draw_merge_layer_texture_dispatch(
|
||||
Canvas& canvas,
|
||||
int plane_index,
|
||||
int layer_index);
|
||||
|
||||
static pp::panopainter::LegacyCanvasDrawMergeLayerBlendExecution
|
||||
make_canvas_draw_merge_layer_blend_dispatch(Canvas& canvas);
|
||||
|
||||
static pp::panopainter::LegacyCanvasDrawMergeFinalPlaneCompositeExecution
|
||||
make_canvas_draw_merge_final_plane_composite_execution(Canvas& canvas)
|
||||
{
|
||||
return {
|
||||
.bind_merged_texture_copy_target = [&] {
|
||||
set_active_texture_unit(2);
|
||||
canvas.m_merge_tex.bind();
|
||||
},
|
||||
.copy_merged_framebuffer = [&] {
|
||||
copy_framebuffer_to_texture_2d(0, 0, 0, 0, canvas.m_width, canvas.m_height);
|
||||
},
|
||||
.enable_blend = [&] {
|
||||
apply_canvas_capability(blend_state(), true);
|
||||
},
|
||||
.draw = [&] {
|
||||
canvas.m_plane.draw_fill();
|
||||
},
|
||||
.bind_sampler = [&] {
|
||||
canvas.m_sampler.bind(0);
|
||||
},
|
||||
.bind_merged_texture = [&] {
|
||||
set_active_texture_unit(0);
|
||||
canvas.m_merge_tex.bind();
|
||||
},
|
||||
.unbind_merged_texture = [&] {
|
||||
canvas.m_merge_tex.unbind();
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
static void execute_canvas_draw_merge_plane_final_composite(
|
||||
Canvas& canvas,
|
||||
const glm::mat4& ortho,
|
||||
bool draw_checkerboard,
|
||||
bool use_blend);
|
||||
|
||||
static void execute_canvas_draw_merge_plane_dispatch(
|
||||
Canvas& canvas,
|
||||
int plane_index,
|
||||
const std::vector<std::shared_ptr<Layer>>& layers,
|
||||
const Brush& brush,
|
||||
const glm::mat4& ortho,
|
||||
bool use_blend,
|
||||
bool copy_blend_destination,
|
||||
bool draw_checkerboard);
|
||||
|
||||
static pp::panopainter::LegacyCanvasDrawMergeLayerCompositeExecution make_canvas_draw_merge_branch_dispatch(
|
||||
Canvas& canvas,
|
||||
int plane_index,
|
||||
int layer_index,
|
||||
const std::shared_ptr<Layer>& layer,
|
||||
const Brush& brush,
|
||||
const glm::mat4& ortho,
|
||||
bool copy_blend_destination);
|
||||
|
||||
static void execute_canvas_draw_merge_branch_body(
|
||||
Canvas& canvas,
|
||||
int plane_index,
|
||||
int layer_index,
|
||||
const std::shared_ptr<Layer>& layer,
|
||||
const Brush& brush,
|
||||
const glm::mat4& ortho,
|
||||
bool use_blend,
|
||||
bool copy_blend_destination)
|
||||
{
|
||||
if (use_blend)
|
||||
{
|
||||
canvas.m_merge_rtt.bindFramebuffer();
|
||||
canvas.m_merge_rtt.clear();
|
||||
}
|
||||
|
||||
execute_canvas_draw_merge_layer_composite(
|
||||
canvas.m_current_stroke && canvas.m_current_mode == kCanvasMode::Erase && canvas.m_show_tmp && canvas.m_current_layer_idx == layer_index,
|
||||
canvas.m_current_stroke && canvas.m_show_tmp && canvas.m_current_layer_idx == layer_index,
|
||||
use_blend,
|
||||
make_canvas_draw_merge_branch_dispatch(
|
||||
canvas,
|
||||
plane_index,
|
||||
layer_index,
|
||||
layer,
|
||||
brush,
|
||||
ortho,
|
||||
copy_blend_destination));
|
||||
}
|
||||
|
||||
static pp::panopainter::LegacyCanvasDrawMergeLayerCompositeExecution make_canvas_draw_merge_branch_dispatch(
|
||||
Canvas& canvas,
|
||||
int plane_index,
|
||||
int layer_index,
|
||||
const std::shared_ptr<Layer>& layer,
|
||||
const Brush& brush,
|
||||
const glm::mat4& ortho,
|
||||
bool copy_blend_destination)
|
||||
{
|
||||
return pp::panopainter::LegacyCanvasDrawMergeLayerCompositeExecution {
|
||||
.execute_temporary_erase = [&] {
|
||||
execute_canvas_draw_merge_temporary_erase_dispatch(
|
||||
canvas,
|
||||
plane_index,
|
||||
layer_index,
|
||||
layer,
|
||||
ortho);
|
||||
},
|
||||
.execute_temporary_paint = [&] {
|
||||
pp::panopainter::execute_legacy_canvas_draw_merge_temporary_composite(
|
||||
make_canvas_draw_merge_temporary_paint_request(
|
||||
canvas,
|
||||
layer_index,
|
||||
plane_index,
|
||||
layer,
|
||||
brush,
|
||||
ortho));
|
||||
},
|
||||
.execute_layer_texture = [&] {
|
||||
execute_canvas_draw_merge_layer_texture(
|
||||
pp::panopainter::LegacyCanvasDrawMergeTextureAlphaUniforms {
|
||||
.mvp = ortho,
|
||||
.texture_slot = 0,
|
||||
.alpha = layer->m_opacity,
|
||||
.highlight = layer->m_hightlight,
|
||||
},
|
||||
make_canvas_draw_merge_layer_texture_dispatch(
|
||||
canvas,
|
||||
plane_index,
|
||||
layer_index));
|
||||
},
|
||||
.execute_layer_blend = [&] {
|
||||
execute_canvas_draw_merge_layer_blend(
|
||||
pp::panopainter::LegacyCanvasDrawMergeLayerBlendUniforms {
|
||||
.shader = {
|
||||
.mvp = ortho,
|
||||
.texture_slot = 0,
|
||||
.destination_texture_slot = 2,
|
||||
.use_destination_texture = copy_blend_destination,
|
||||
.blend_mode = layer->m_blend_mode,
|
||||
.alpha = 1.f,
|
||||
},
|
||||
.copy_destination = copy_blend_destination,
|
||||
},
|
||||
make_canvas_draw_merge_layer_blend_dispatch(
|
||||
canvas));
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
static auto make_canvas_draw_merge_temporary_erase_dispatch(
|
||||
Canvas& canvas,
|
||||
int plane_index,
|
||||
int layer_index,
|
||||
const std::shared_ptr<Layer>& layer,
|
||||
const glm::mat4& ortho)
|
||||
{
|
||||
return pp::panopainter::make_legacy_canvas_draw_merge_temporary_erase_composite(
|
||||
[&] {
|
||||
pp::panopainter::setup_legacy_stroke_erase_shader(
|
||||
pp::panopainter::LegacyStrokeEraseUniforms {
|
||||
.mvp = ortho,
|
||||
.texture_slot = 0,
|
||||
.stroke_texture_slot = 1,
|
||||
.mask_texture_slot = 2,
|
||||
.alpha = layer->m_opacity,
|
||||
.mask_enabled = canvas.m_smask_active,
|
||||
});
|
||||
},
|
||||
[&] {
|
||||
canvas.m_sampler.bind(0);
|
||||
canvas.m_sampler.bind(1);
|
||||
canvas.m_sampler.bind(2);
|
||||
},
|
||||
[&] {
|
||||
set_active_texture_unit(0);
|
||||
canvas.m_layers[layer_index]->rtt(plane_index).bindTexture();
|
||||
set_active_texture_unit(1);
|
||||
canvas.m_tmp[plane_index].bindTexture();
|
||||
set_active_texture_unit(2);
|
||||
canvas.m_smask.rtt(plane_index).bindTexture();
|
||||
},
|
||||
[&] {
|
||||
canvas.m_plane.draw_fill();
|
||||
},
|
||||
[&] {
|
||||
canvas.m_smask.rtt(plane_index).unbindTexture();
|
||||
set_active_texture_unit(1);
|
||||
canvas.m_tmp[plane_index].unbindTexture();
|
||||
set_active_texture_unit(0);
|
||||
canvas.m_layers[layer_index]->rtt(plane_index).unbindTexture();
|
||||
});
|
||||
}
|
||||
static void execute_canvas_draw_merge_temporary_erase_dispatch(
|
||||
Canvas& canvas,
|
||||
int plane_index,
|
||||
int layer_index,
|
||||
const std::shared_ptr<Layer>& layer,
|
||||
const glm::mat4& ortho)
|
||||
{
|
||||
pp::panopainter::execute_legacy_canvas_draw_merge_temporary_composite(
|
||||
make_canvas_draw_merge_temporary_erase_dispatch(
|
||||
canvas,
|
||||
plane_index,
|
||||
layer_index,
|
||||
layer,
|
||||
ortho));
|
||||
}
|
||||
|
||||
static pp::panopainter::LegacyCanvasDrawMergeLayerTextureExecution
|
||||
make_canvas_draw_merge_layer_texture_dispatch(
|
||||
Canvas& canvas,
|
||||
int plane_index,
|
||||
int layer_index)
|
||||
{
|
||||
return pp::panopainter::LegacyCanvasDrawMergeLayerTextureExecution {
|
||||
.bind_sampler = [&] {
|
||||
canvas.m_cam_fov < 20.f ? canvas.m_sampler_nearest.bind(0) : canvas.m_sampler.bind(0);
|
||||
},
|
||||
.bind_layer_texture = [&] {
|
||||
set_active_texture_unit(0);
|
||||
canvas.m_layers[layer_index]->rtt(plane_index).bindTexture();
|
||||
},
|
||||
.draw = [&] {
|
||||
canvas.m_plane.draw_fill();
|
||||
},
|
||||
.unbind_layer_texture = [&] {
|
||||
canvas.m_layers[layer_index]->rtt(plane_index).unbindTexture();
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
static pp::panopainter::LegacyCanvasDrawMergeLayerBlendExecution
|
||||
make_canvas_draw_merge_layer_blend_dispatch(Canvas& canvas)
|
||||
{
|
||||
return pp::panopainter::LegacyCanvasDrawMergeLayerBlendExecution {
|
||||
.unbind_merge_framebuffer = [&] {
|
||||
canvas.m_merge_rtt.unbindFramebuffer();
|
||||
},
|
||||
.bind_samplers = [&] {
|
||||
canvas.m_sampler.bind(0);
|
||||
canvas.m_sampler.bind(2);
|
||||
},
|
||||
.bind_merge_texture = [&] {
|
||||
set_active_texture_unit(0);
|
||||
canvas.m_merge_rtt.bindTexture();
|
||||
},
|
||||
.bind_destination_texture = [&] {
|
||||
set_active_texture_unit(2);
|
||||
canvas.m_merge_tex.bind();
|
||||
},
|
||||
.copy_destination_framebuffer = [&] {
|
||||
copy_framebuffer_to_texture_2d(0, 0, 0, 0, canvas.m_width, canvas.m_height);
|
||||
},
|
||||
.draw = [&] {
|
||||
canvas.m_plane.draw_fill();
|
||||
},
|
||||
.unbind_destination_texture = [&] {
|
||||
set_active_texture_unit(2);
|
||||
canvas.m_merge_tex.unbind();
|
||||
},
|
||||
.unbind_merge_texture = [&] {
|
||||
set_active_texture_unit(0);
|
||||
canvas.m_merge_rtt.unbindTexture();
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
static void execute_canvas_draw_merge_plane_iteration(
|
||||
Canvas& canvas,
|
||||
const std::array<bool, 6>& faces,
|
||||
const std::vector<std::shared_ptr<Layer>>& 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;
|
||||
|
||||
execute_canvas_draw_merge_plane_dispatch(
|
||||
canvas,
|
||||
plane_index,
|
||||
layers,
|
||||
brush,
|
||||
ortho,
|
||||
use_blend,
|
||||
copy_blend_destination,
|
||||
draw_checkerboard);
|
||||
}
|
||||
}
|
||||
|
||||
static void execute_canvas_draw_merge_plane_dispatch(
|
||||
Canvas& canvas,
|
||||
int plane_index,
|
||||
const std::vector<std::shared_ptr<Layer>>& layers,
|
||||
const Brush& brush,
|
||||
const glm::mat4& ortho,
|
||||
bool use_blend,
|
||||
bool copy_blend_destination,
|
||||
bool draw_checkerboard)
|
||||
{
|
||||
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++)
|
||||
{
|
||||
execute_canvas_draw_merge_branch_body(
|
||||
canvas,
|
||||
plane_index,
|
||||
layer_index,
|
||||
layers[layer_index],
|
||||
brush,
|
||||
ortho,
|
||||
use_blend,
|
||||
copy_blend_destination);
|
||||
}
|
||||
|
||||
execute_canvas_draw_merge_plane_final_composite(canvas, ortho, draw_checkerboard, use_blend);
|
||||
canvas.m_layers_merge.rtt(plane_index).unbindFramebuffer();
|
||||
}
|
||||
|
||||
static void execute_canvas_draw_merge_plane_final_composite(
|
||||
Canvas& canvas,
|
||||
const glm::mat4& ortho,
|
||||
bool draw_checkerboard,
|
||||
bool use_blend)
|
||||
{
|
||||
if (use_blend)
|
||||
{
|
||||
execute_canvas_draw_merge_final_plane_composite(
|
||||
pp::panopainter::LegacyCanvasDrawMergeFinalPlaneCompositeUniforms {
|
||||
.checkerboard = {
|
||||
.mvp = ortho,
|
||||
.colorize = false,
|
||||
},
|
||||
.texture = {
|
||||
.mvp = ortho,
|
||||
.texture_slot = 0,
|
||||
},
|
||||
.draw_checkerboard = draw_checkerboard,
|
||||
},
|
||||
make_canvas_draw_merge_final_plane_composite_execution(canvas));
|
||||
}
|
||||
}
|
||||
|
||||
static pp::panopainter::LegacyCanvasDrawMergeTemporaryCompositeExecution
|
||||
make_canvas_draw_merge_temporary_paint_request(
|
||||
Canvas& canvas,
|
||||
int layer_index,
|
||||
int plane_index,
|
||||
const std::shared_ptr<Layer>& layer,
|
||||
const Brush& brush,
|
||||
const glm::mat4& ortho)
|
||||
{
|
||||
const auto stroke_material = canvas_stroke_material_plan(brush, false);
|
||||
glm::vec2 patt_scale = glm::vec2(brush.m_pattern_scale);
|
||||
if (brush.m_pattern_flipx) patt_scale.x *= -1.f;
|
||||
if (brush.m_pattern_flipy) patt_scale.y *= -1.f;
|
||||
|
||||
return pp::panopainter::make_legacy_canvas_draw_merge_temporary_paint_composite(
|
||||
[&] {
|
||||
pp::panopainter::setup_legacy_stroke_composite_shader(
|
||||
pp::panopainter::LegacyStrokeCompositeUniforms {
|
||||
.resolution = Canvas::I->m_size,
|
||||
.pattern = {
|
||||
.scale = patt_scale,
|
||||
.invert = static_cast<float>(brush.m_pattern_invert),
|
||||
.brightness = brush.m_pattern_brightness,
|
||||
.contrast = brush.m_pattern_contrast,
|
||||
.depth = brush.m_pattern_depth,
|
||||
.blend_mode = brush.m_pattern_blend_mode,
|
||||
.offset = Canvas::I->m_pattern_offset,
|
||||
},
|
||||
.mvp = ortho,
|
||||
.layer_alpha = layer->m_opacity,
|
||||
.alpha_lock = layer->m_alpha_locked,
|
||||
.mask_enabled = canvas.m_smask_active,
|
||||
.use_fragcoord = false,
|
||||
.blend_mode = brush.m_blend_mode,
|
||||
.use_dual = stroke_material.composite_pass.use_dual,
|
||||
.dual_blend_mode = stroke_material.composite_pass.dual_blend_mode,
|
||||
.dual_alpha = stroke_material.composite_pass.dual_alpha,
|
||||
.use_pattern = stroke_material.composite_pass.use_pattern,
|
||||
});
|
||||
},
|
||||
[&] {
|
||||
canvas.m_sampler.bind(0);
|
||||
canvas.m_sampler.bind(1);
|
||||
canvas.m_sampler.bind(2);
|
||||
canvas.m_sampler.bind(3);
|
||||
canvas.m_sampler_stencil.bind(4);
|
||||
},
|
||||
[&] {
|
||||
set_active_texture_unit(0);
|
||||
canvas.m_layers[layer_index]->rtt(plane_index).bindTexture();
|
||||
set_active_texture_unit(1);
|
||||
canvas.m_tmp[plane_index].bindTexture();
|
||||
set_active_texture_unit(2);
|
||||
canvas.m_smask.rtt(plane_index).bindTexture();
|
||||
set_active_texture_unit(3);
|
||||
if (stroke_material.composite_pass.use_dual)
|
||||
canvas.m_tmp_dual[plane_index].bindTexture();
|
||||
set_active_texture_unit(4);
|
||||
brush.m_pattern_texture ? brush.m_pattern_texture->bind() : unbind_texture_2d();
|
||||
},
|
||||
[&] {
|
||||
canvas.m_plane.draw_fill();
|
||||
},
|
||||
[&] {
|
||||
set_active_texture_unit(3);
|
||||
if (stroke_material.composite_pass.use_dual)
|
||||
canvas.m_tmp_dual[plane_index].unbindTexture();
|
||||
set_active_texture_unit(2);
|
||||
canvas.m_smask.rtt(plane_index).unbindTexture();
|
||||
set_active_texture_unit(1);
|
||||
canvas.m_tmp[plane_index].unbindTexture();
|
||||
set_active_texture_unit(0);
|
||||
canvas.m_layers[layer_index]->rtt(plane_index).unbindTexture();
|
||||
});
|
||||
}
|
||||
|
||||
void Canvas::draw_merge_temporary_paint_branch(
|
||||
int layer_index,
|
||||
int plane_index,
|
||||
@@ -822,14 +320,13 @@ void Canvas::draw_merge_temporary_paint_branch(
|
||||
const Brush& brush,
|
||||
const glm::mat4& ortho)
|
||||
{
|
||||
pp::panopainter::execute_legacy_canvas_draw_merge_temporary_composite(
|
||||
make_canvas_draw_merge_temporary_paint_request(
|
||||
*this,
|
||||
layer_index,
|
||||
plane_index,
|
||||
layer,
|
||||
brush,
|
||||
ortho));
|
||||
pp::panopainter::legacy_canvas_draw_merge_temporary_paint_branch(
|
||||
*this,
|
||||
layer_index,
|
||||
plane_index,
|
||||
std::move(layer),
|
||||
brush,
|
||||
ortho);
|
||||
}
|
||||
|
||||
void Canvas::draw_merge_branch_orchestration(
|
||||
@@ -841,12 +338,7 @@ void Canvas::draw_merge_branch_orchestration(
|
||||
bool use_blend,
|
||||
bool copy_blend_destination)
|
||||
{
|
||||
if (!(m_show_tmp && m_current_layer_idx == layer_index) &&
|
||||
(!layer->m_visible ||
|
||||
layer->m_opacity == .0f ||
|
||||
!layer->face(plane_index)))
|
||||
return;
|
||||
execute_canvas_draw_merge_branch_body(
|
||||
pp::panopainter::legacy_canvas_draw_merge_branch_orchestration(
|
||||
*this,
|
||||
plane_index,
|
||||
layer_index,
|
||||
@@ -861,19 +353,10 @@ void Canvas::draw_merge_final_plane_composite(
|
||||
const glm::mat4& ortho,
|
||||
bool draw_checkerboard)
|
||||
{
|
||||
execute_canvas_draw_merge_final_plane_composite(
|
||||
pp::panopainter::LegacyCanvasDrawMergeFinalPlaneCompositeUniforms {
|
||||
.checkerboard = {
|
||||
.mvp = ortho,
|
||||
.colorize = false,
|
||||
},
|
||||
.texture = {
|
||||
.mvp = ortho,
|
||||
.texture_slot = 0,
|
||||
},
|
||||
.draw_checkerboard = draw_checkerboard,
|
||||
},
|
||||
make_canvas_draw_merge_final_plane_composite_execution(*this));
|
||||
pp::panopainter::legacy_canvas_draw_merge_final_plane_composite(
|
||||
*this,
|
||||
ortho,
|
||||
draw_checkerboard);
|
||||
}
|
||||
|
||||
void Canvas::stroke_draw()
|
||||
@@ -918,126 +401,30 @@ glm::vec3 Canvas::point_trace(glm::vec2 loc)
|
||||
}
|
||||
void Canvas::stroke_commit_timelapse()
|
||||
{
|
||||
if (m_encoder && App::I->rec_running)
|
||||
{
|
||||
auto t_now = std::chrono::high_resolution_clock::now();
|
||||
float dt = std::chrono::duration<float>(t_now - m_disrty_stroke_time).count();
|
||||
if (dt > 2.f && m_dirty_stroke && App::I->rec_mutex.try_lock())
|
||||
{
|
||||
draw_merge(true);
|
||||
App::I->rec_mutex.unlock();
|
||||
App::I->rec_cv.notify_one();
|
||||
LOG("rec frame generated");
|
||||
m_dirty_stroke = false;
|
||||
m_disrty_stroke_time = std::chrono::steady_clock::now();
|
||||
}
|
||||
}
|
||||
pp::panopainter::legacy_canvas_stroke_commit_timelapse(*this);
|
||||
}
|
||||
|
||||
void Canvas::draw_merge(bool draw_checkerboard, std::array<bool, 6> faces /*= SIXPLETTE(true)*/)
|
||||
{
|
||||
assert(App::I->is_render_thread());
|
||||
|
||||
apply_canvas_viewport(0, 0, m_width, m_height);
|
||||
auto ortho = glm::ortho<float>(-0.5f, 0.5f, -0.5f, 0.5f, -1.f, 1.f);
|
||||
const auto& b = m_current_stroke->m_brush;
|
||||
|
||||
const auto blend_gate = draw_merge_blend_gate_plan(
|
||||
m_width,
|
||||
m_height,
|
||||
m_layers,
|
||||
m_current_stroke ? m_current_stroke->m_brush.get() : nullptr);
|
||||
const bool use_blend = blend_gate.shader_blend;
|
||||
const bool copy_blend_destination = use_blend && !blend_gate.reads_destination_color;
|
||||
|
||||
// if not using shader blend, use gl rasterizer blend
|
||||
apply_canvas_capability(depth_test_state(), false);
|
||||
|
||||
execute_canvas_draw_merge_plane_iteration(
|
||||
*this,
|
||||
faces,
|
||||
m_layers,
|
||||
*b,
|
||||
ortho,
|
||||
use_blend,
|
||||
copy_blend_destination,
|
||||
draw_checkerboard);
|
||||
pp::panopainter::legacy_canvas_draw_merge(*this, draw_checkerboard, faces);
|
||||
}
|
||||
|
||||
void Canvas::stroke_update(glm::vec3 point, float pressure) { pp::panopainter::legacy_canvas_stroke_update(*this, point, pressure); }
|
||||
void Canvas::stroke_start(glm::vec3 point, float pressure) { pp::panopainter::legacy_canvas_stroke_start(*this, point, pressure); }
|
||||
void Canvas::destroy()
|
||||
{
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
m_tmp[i].destroy();
|
||||
m_tmp_dual[i].destroy();
|
||||
m_tex[i].destroy();
|
||||
m_tex2[i].destroy();
|
||||
}
|
||||
for (auto& l : m_layers)
|
||||
l->destroy();
|
||||
m_smask.destroy();
|
||||
m_mixer.destroy();
|
||||
m_layers_merge.destroy();
|
||||
m_merge_rtt.destroy();
|
||||
m_merge_tex.destroy();
|
||||
pp::panopainter::legacy_canvas_destroy(*this);
|
||||
}
|
||||
|
||||
bool Canvas::create(int width, int height)
|
||||
{
|
||||
m_width = width;
|
||||
m_height = height;
|
||||
m_size = { width, height };
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
const auto stroke_format = current_canvas_stroke_internal_format();
|
||||
m_tmp[i].create(width, height, -1, stroke_format);
|
||||
m_tmp_dual[i].create(width, height, -1, stroke_format);
|
||||
m_tex[i].create(width, height, rgba8_internal_format());
|
||||
m_tex2[i].create(width, height, rgba8_internal_format());
|
||||
}
|
||||
#if defined(__GLES__)
|
||||
m_sampler_brush.create();
|
||||
#else
|
||||
m_sampler_brush.create(texture_filter_linear(), texture_wrap_clamp_to_border());
|
||||
#endif
|
||||
m_sampler.create(texture_filter_linear());
|
||||
m_sampler_nearest.create(texture_filter_nearest());
|
||||
m_sampler_brush.set_filter(texture_filter_linear_mipmap_linear(), texture_filter_linear());
|
||||
m_sampler_brush.set_border({ 1, 1, 1, 1 });
|
||||
m_sampler_stencil.create(texture_filter_linear(), texture_wrap_repeat());
|
||||
m_sampler_mix.create(texture_filter_nearest(), texture_wrap_repeat());
|
||||
m_sampler_linear.create();
|
||||
m_plane.create<1>(1, 1);
|
||||
m_plane_brush.create<1>(1, 1);
|
||||
m_brush_shape.create();
|
||||
for (auto& l : m_layers)
|
||||
l->create(width, height, "");
|
||||
m_smask.create(width, height, "mask");
|
||||
//m_smask.clear({1, 1, 1, 1});
|
||||
m_layers_merge.create(width, height, "merge");
|
||||
m_merge_rtt.create(width, height);
|
||||
m_merge_tex.create(width, height);
|
||||
m_unsaved = true;
|
||||
|
||||
timelapse_reset_encoder();
|
||||
|
||||
return true;
|
||||
return pp::panopainter::legacy_canvas_create(*this, width, height);
|
||||
}
|
||||
|
||||
void Canvas::clear_context()
|
||||
{
|
||||
LOG("Canvas CLEAR CONTEXT");
|
||||
for (auto& layer : m_layers)
|
||||
layer->destroy();
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
m_tmp[i].destroy();
|
||||
m_tex[i].destroy();
|
||||
m_tex2[i].destroy();
|
||||
}
|
||||
};
|
||||
pp::panopainter::legacy_canvas_clear_context(*this);
|
||||
}
|
||||
|
||||
void Canvas::draw_objects_direct(std::function<void(const glm::mat4& camera, const glm::mat4& proj, int i)> observer, Layer& layer, int frame)
|
||||
{
|
||||
@@ -1085,12 +472,12 @@ void Canvas::pop_camera()
|
||||
|
||||
CameraData Canvas::get_camera()
|
||||
{
|
||||
return pp::panopainter::legacy_canvas_get_camera(*this);
|
||||
return pp::panopainter::legacy_canvas_render_shell_get_camera(*this);
|
||||
}
|
||||
|
||||
void Canvas::set_camera(const CameraData& c)
|
||||
{
|
||||
pp::panopainter::legacy_canvas_set_camera(*this, c);
|
||||
pp::panopainter::legacy_canvas_render_shell_set_camera(*this, c);
|
||||
}
|
||||
|
||||
void Canvas::timelapse_reset_encoder() noexcept
|
||||
|
||||
Reference in New Issue
Block a user