Extract retained stroke preview setup planner
This commit is contained in:
@@ -687,6 +687,20 @@ void NodeStrokePreview::draw_stroke_immediate()
|
||||
float zoom = root()->m_zoom;
|
||||
|
||||
glm::vec2 size = { m_rtt.getWidth(), m_rtt.getHeight() };
|
||||
const auto stroke_setup = pp::panopainter::plan_legacy_node_stroke_preview_stroke_setup(
|
||||
pp::panopainter::LegacyNodeStrokePreviewStrokeSetupRequest {
|
||||
.preview_size = m_size,
|
||||
.zoom = zoom,
|
||||
.brush_tip_size = m_brush->m_tip_size,
|
||||
.stroke_max_size_override = m_max_size,
|
||||
.pad_override = m_pad_override,
|
||||
.tip_size_pressure = m_brush->m_tip_size_pressure,
|
||||
.dual_enabled = m_brush->m_dual_enabled,
|
||||
.dual_size = m_brush->m_dual_size,
|
||||
.pattern_scale = m_brush->m_pattern_scale,
|
||||
.pattern_flipx = m_brush->m_pattern_flipx,
|
||||
.pattern_flipy = m_brush->m_pattern_flipy,
|
||||
});
|
||||
glm::mat4 ortho_proj = glm::ortho<float>(0, size.x, 0, size.y, -1, 1);
|
||||
apply_stroke_preview_viewport(0, 0, m_rtt.getWidth(), m_rtt.getHeight());
|
||||
m_rtt.bindFramebuffer();
|
||||
@@ -702,7 +716,7 @@ void NodeStrokePreview::draw_stroke_immediate()
|
||||
Stroke m_dual_stroke;
|
||||
|
||||
m_stroke.m_filter_points = false;
|
||||
m_stroke.m_max_size = m_max_size > 0 ? m_max_size : m_size.y * .75f;
|
||||
m_stroke.m_max_size = stroke_setup.stroke_max_size;
|
||||
m_stroke.m_camera.fov = Canvas::I->m_cam_fov;
|
||||
m_stroke.m_camera.rot = Canvas::I->m_cam_rot;
|
||||
m_stroke.reset(true);
|
||||
@@ -727,44 +741,24 @@ void NodeStrokePreview::draw_stroke_immediate()
|
||||
dual_brush->m_tip_texture = b->m_dual_texture;
|
||||
dual_brush->m_tip_aspect = b->m_dual_aspect;
|
||||
|
||||
if (b->m_dual_enabled)
|
||||
if (stroke_setup.dual_enabled)
|
||||
{
|
||||
m_dual_stroke.m_filter_points = false;
|
||||
m_dual_stroke.m_max_size = m_stroke.m_max_size * b->m_dual_size;
|
||||
m_dual_stroke.m_max_size = stroke_setup.dual_stroke_max_size;
|
||||
m_dual_stroke.m_camera.fov = Canvas::I->m_cam_fov;
|
||||
m_dual_stroke.m_camera.rot = Canvas::I->m_cam_rot;
|
||||
m_dual_stroke.reset(true);
|
||||
m_dual_stroke.start(dual_brush);
|
||||
}
|
||||
|
||||
for (const auto& point : stroke_setup.points)
|
||||
{
|
||||
float min_pad = size.x * 0.05f;
|
||||
float pad = (5.f + glm::max(glm::min(m_stroke.m_max_size, m_brush->m_tip_size) / 2.f, min_pad)) * zoom;
|
||||
if (b->m_tip_size_pressure)
|
||||
pad = min_pad * zoom;
|
||||
if (!glm::isnan(m_pad_override))
|
||||
pad = m_pad_override;
|
||||
float w = m_size.x * zoom;
|
||||
float h = m_size.y * zoom;
|
||||
std::vector<glm::vec2> kp = {
|
||||
{ pad, h / 2.f },
|
||||
{ w / 2.f, 0 },
|
||||
{ w / 2.f, h },
|
||||
{ w - pad, h / 2.f },
|
||||
};
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
float t = (float)i / 100.f;
|
||||
float p = glm::clamp((1.f - glm::abs(t * 2.f - 1.f)) * 1.1f, 0.f, 1.f);
|
||||
m_stroke.add_point(glm::vec3(BezierCurve::Bezier2D(kp, t), 0), p);
|
||||
if (b->m_dual_enabled)
|
||||
m_dual_stroke.add_point(glm::vec3(BezierCurve::Bezier2D(kp, t), 0), p);
|
||||
}
|
||||
m_stroke.add_point(point.position, point.pressure);
|
||||
if (stroke_setup.dual_enabled)
|
||||
m_dual_stroke.add_point(point.position, point.pressure);
|
||||
}
|
||||
|
||||
glm::vec2 patt_scale = glm::vec2(b->m_pattern_scale);
|
||||
if (b->m_pattern_flipx) patt_scale.x *= -1.f;
|
||||
if (b->m_pattern_flipy) patt_scale.y *= -1.f;
|
||||
const glm::vec2 patt_scale = stroke_setup.pattern_scale;
|
||||
|
||||
apply_stroke_preview_capability(pp::renderer::gl::blend_state(), false);
|
||||
const auto stroke_feedback = stroke_preview_destination_feedback_plan(m_rtt.getWidth(), m_rtt.getHeight());
|
||||
|
||||
Reference in New Issue
Block a user