Extract layout bootstrap and thin NodeCanvas startup shells
This commit is contained in:
@@ -582,11 +582,6 @@ void NodeCanvas::draw()
|
||||
glm::mat4 proj = glm::perspective(glm::radians(m_canvas->m_cam_fov), box.z / box.w, 0.001f, 1000.f);
|
||||
glm::mat4 camera = glm::translate(m_canvas->m_cam_pos) * m_canvas->m_cam_rot;
|
||||
|
||||
m_canvas->m_mv = camera;
|
||||
m_canvas->m_proj = proj;
|
||||
m_canvas->m_box = box;
|
||||
m_canvas->m_vp = c;
|
||||
|
||||
float pitch = 0;
|
||||
if (auto slider = root()->find<NodeSliderH>("pitch-slider"))
|
||||
pitch = (slider->get_value() - 0.5) * glm::half_pi<float>();
|
||||
@@ -597,123 +592,81 @@ void NodeCanvas::draw()
|
||||
if (auto slider = root()->find<NodeSliderH>("roll-slider"))
|
||||
roll = (slider->get_value() - 0.5) * glm::half_pi<float>();
|
||||
|
||||
// pre computed helpers
|
||||
for (int plane_index = 0; plane_index < 6; plane_index++)
|
||||
{
|
||||
//glm::mat4 plane_camera = glm::lookAt(m_canvas->m_plane_origin[plane_index], m_canvas->m_plane_normal[plane_index], m_canvas->m_plane_tangent[plane_index]);
|
||||
m_canvas->m_plane_unproject[plane_index] = glm::inverse(m_canvas->m_proj * m_canvas->m_mv * m_canvas->m_plane_transform[plane_index]);
|
||||
m_canvas->m_plane_dir[plane_index] = -(m_canvas->m_plane_transform[plane_index] * glm::vec4(m_canvas->m_plane_origin[plane_index], 1));
|
||||
// face is the 2d shape of the cube plane i projected onto the window space
|
||||
m_canvas->m_plane_shape[plane_index] = m_canvas->face_to_shape2D(plane_index);
|
||||
}
|
||||
|
||||
|
||||
if (m_density != 1.f)
|
||||
{
|
||||
m_rtt.bindFramebuffer();
|
||||
clear_node_canvas_color_buffer({ 1.f, 1.f, 0.f, 0.f });
|
||||
apply_node_canvas_viewport(0, 0, m_rtt.getWidth(), m_rtt.getHeight());
|
||||
}
|
||||
else
|
||||
{
|
||||
clear_node_canvas_color_buffer({ 1.f, 1.f, 1.f, 0.f });
|
||||
apply_node_canvas_viewport(c.x + App::I->off_x, c.y + App::I->off_y, c.z, c.w);
|
||||
}
|
||||
pp::panopainter::prepare_legacy_node_canvas_draw_setup(*this, box, c, proj, camera);
|
||||
|
||||
// NOTE: draw_merge has been disabled for worst performance
|
||||
bool draw_merged = !(m_canvas->m_current_mode == kCanvasMode::Camera);
|
||||
draw_merged = false;
|
||||
|
||||
if (draw_merged)
|
||||
{
|
||||
pp::panopainter::execute_legacy_canvas_draw_merge_background_setup(
|
||||
{
|
||||
.draw_merged = true,
|
||||
},
|
||||
{
|
||||
.disable_blend = [&] {
|
||||
apply_node_canvas_capability(pp::renderer::gl::blend_state(), false);
|
||||
pp::panopainter::execute_legacy_canvas_draw_node_canvas_shell(
|
||||
m_density != 1.f,
|
||||
draw_merged,
|
||||
[&] {
|
||||
m_rtt.bindFramebuffer();
|
||||
clear_node_canvas_color_buffer({ 1.f, 1.f, 0.f, 0.f });
|
||||
apply_node_canvas_viewport(0, 0, m_rtt.getWidth(), m_rtt.getHeight());
|
||||
},
|
||||
[&] {
|
||||
clear_node_canvas_color_buffer({ 1.f, 1.f, 1.f, 0.f });
|
||||
apply_node_canvas_viewport(c.x + App::I->off_x, c.y + App::I->off_y, c.z, c.w);
|
||||
},
|
||||
[&] {
|
||||
pp::panopainter::execute_legacy_canvas_draw_merged_pass(
|
||||
*this,
|
||||
proj,
|
||||
camera,
|
||||
[&](auto state, bool enabled) {
|
||||
apply_node_canvas_capability(state, enabled);
|
||||
},
|
||||
.draw_checkerboard_plane = pp::panopainter::make_legacy_canvas_draw_merge_background_checkerboard_plane(
|
||||
proj,
|
||||
camera,
|
||||
m_canvas->m_layers.size() + 500.f,
|
||||
m_canvas->m_plane_transform,
|
||||
[&] {
|
||||
m_face_plane.draw_fill();
|
||||
}),
|
||||
});
|
||||
[](int unit) {
|
||||
set_active_texture_unit(unit);
|
||||
},
|
||||
[&] {
|
||||
m_face_plane.draw_fill();
|
||||
});
|
||||
},
|
||||
[&] {
|
||||
const auto blend_gate = node_canvas_blend_gate_plan(
|
||||
m_cache_rtt.getWidth(),
|
||||
m_cache_rtt.getHeight(),
|
||||
m_canvas->m_layers,
|
||||
m_canvas->m_current_stroke ? m_canvas->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;
|
||||
const auto layer_orientation = glm::eulerAngleYXZ(yaw, pitch, roll);
|
||||
|
||||
const auto draw_merged_texture_plane = pp::panopainter::make_legacy_canvas_draw_merge_layer_texture_draw(
|
||||
&m_canvas->m_layers_merge,
|
||||
&m_sampler,
|
||||
&m_face_plane,
|
||||
set_active_texture_unit,
|
||||
proj,
|
||||
camera,
|
||||
m_canvas->m_plane_transform);
|
||||
|
||||
for (int plane_index = 0; plane_index < 6; plane_index++)
|
||||
{
|
||||
draw_merged_texture_plane(plane_index);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
const auto blend_gate = node_canvas_blend_gate_plan(
|
||||
m_cache_rtt.getWidth(),
|
||||
m_cache_rtt.getHeight(),
|
||||
m_canvas->m_layers,
|
||||
m_canvas->m_current_stroke ? m_canvas->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;
|
||||
const auto layer_orientation = glm::eulerAngleYXZ(yaw, pitch, roll);
|
||||
|
||||
const auto& b = m_canvas->m_current_stroke->m_brush;
|
||||
pp::panopainter::execute_legacy_canvas_draw_unmerged_node_canvas_pass(
|
||||
*this,
|
||||
use_blend,
|
||||
proj,
|
||||
camera,
|
||||
layer_orientation,
|
||||
c,
|
||||
[&](int x, int y, int width, int height) {
|
||||
apply_node_canvas_viewport(x, y, width, height);
|
||||
},
|
||||
[&](auto state, bool enabled) {
|
||||
apply_node_canvas_capability(state, enabled);
|
||||
},
|
||||
[&] {
|
||||
m_face_plane.draw_fill();
|
||||
},
|
||||
[&] {
|
||||
m_sampler.bind(0);
|
||||
set_active_texture_unit(0);
|
||||
},
|
||||
[&](size_t layer_index, int plane_index, const glm::mat4& plane_mvp_z) {
|
||||
return make_node_canvas_layer_path_execution(
|
||||
*this,
|
||||
layer_index,
|
||||
plane_index,
|
||||
plane_mvp_z,
|
||||
b.get(),
|
||||
copy_blend_destination,
|
||||
m_canvas->m_cam_fov < 20.f);
|
||||
},
|
||||
[&] {
|
||||
return pp::panopainter::make_legacy_canvas_draw_merge_cache_to_screen_checkerboard_plane(
|
||||
proj,
|
||||
camera,
|
||||
m_canvas->m_layers.size() + 500.f,
|
||||
m_canvas->m_plane_transform,
|
||||
[&] {
|
||||
m_face_plane.draw_fill();
|
||||
});
|
||||
},
|
||||
[&](const char* message) {
|
||||
LOG("NodeCanvas onion frame range failed: %s", message);
|
||||
});
|
||||
}
|
||||
pp::panopainter::execute_legacy_canvas_draw_node_canvas_unmerged_pass(
|
||||
*this,
|
||||
use_blend,
|
||||
copy_blend_destination,
|
||||
proj,
|
||||
camera,
|
||||
layer_orientation,
|
||||
c,
|
||||
[&](int x, int y, int width, int height) {
|
||||
apply_node_canvas_viewport(x, y, width, height);
|
||||
},
|
||||
[&](auto state, bool enabled) {
|
||||
apply_node_canvas_capability(state, enabled);
|
||||
},
|
||||
[&] {
|
||||
m_sampler.bind(0);
|
||||
set_active_texture_unit(0);
|
||||
},
|
||||
[&](size_t layer_index, int plane_index, const glm::mat4& plane_mvp_z, const Brush* brush, bool copy_blend_destination, bool use_nearest_sampler) {
|
||||
return make_node_canvas_layer_path_execution(
|
||||
*this,
|
||||
layer_index,
|
||||
plane_index,
|
||||
plane_mvp_z,
|
||||
brush,
|
||||
copy_blend_destination,
|
||||
use_nearest_sampler);
|
||||
},
|
||||
[&](const char* message) {
|
||||
LOG("NodeCanvas onion frame range failed: %s", message);
|
||||
});
|
||||
});
|
||||
|
||||
execute_node_canvas_draw_merge_tail(*this, ortho_proj, proj, camera, c);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user