Route canvas stroke material decisions through planner
This commit is contained in:
@@ -61,6 +61,25 @@ pp::paint_renderer::CanvasStrokeFeedbackPlan canvas_destination_feedback_plan(
|
||||
return canvas_stroke_rasterization_plan(width, height).feedback;
|
||||
}
|
||||
|
||||
pp::paint_renderer::CanvasStrokeMaterialPlan canvas_stroke_material_plan(
|
||||
const Brush& brush,
|
||||
bool destination_feedback_needed) noexcept
|
||||
{
|
||||
return pp::panopainter::plan_legacy_canvas_stroke_material(
|
||||
pp::paint_renderer::CanvasStrokeMaterialRequest {
|
||||
.destination_feedback_needed = destination_feedback_needed,
|
||||
.pattern_enabled = brush.m_pattern_enabled,
|
||||
.pattern_eachsample = brush.m_pattern_eachsample,
|
||||
.wet_blend = brush.m_tip_wet > 0.F,
|
||||
.mix_blend = brush.m_tip_mix > 0.F,
|
||||
.noise_enabled = brush.m_tip_noise > 0.F,
|
||||
.dual_brush_enabled = brush.m_dual_enabled,
|
||||
.dual_blend_mode = brush.m_dual_blend_mode,
|
||||
.pattern_blend_mode = brush.m_pattern_blend_mode,
|
||||
.dual_alpha = brush.m_dual_opacity,
|
||||
});
|
||||
}
|
||||
|
||||
pp::paint_renderer::CanvasBlendGatePlan draw_merge_blend_gate_plan(
|
||||
int width,
|
||||
int height,
|
||||
@@ -666,11 +685,12 @@ void Canvas::stroke_draw()
|
||||
|
||||
const auto stroke_rasterization = canvas_stroke_rasterization_plan(m_width, m_height);
|
||||
const bool copy_stroke_destination = stroke_rasterization.copy_stroke_destination;
|
||||
const auto stroke_material = canvas_stroke_material_plan(*brush, copy_stroke_destination);
|
||||
|
||||
apply_canvas_capability(blend_state(), false);
|
||||
ShaderManager::use(kShader::Stroke);
|
||||
ShaderManager::u_int(kShaderUniform::Tex, 0); // brush
|
||||
if (copy_stroke_destination)
|
||||
if (stroke_material.stroke_pass.uses_destination_feedback)
|
||||
ShaderManager::u_int(kShaderUniform::TexBG, 1); // bg
|
||||
ShaderManager::u_int(kShaderUniform::TexPattern, 2); // pattern
|
||||
ShaderManager::u_int(kShaderUniform::TexMix, 3); // mixer
|
||||
@@ -684,7 +704,7 @@ void Canvas::stroke_draw()
|
||||
ShaderManager::u_float(kShaderUniform::PatternDepth, brush->m_pattern_depth);
|
||||
ShaderManager::u_int(kShaderUniform::PatternBlendMode, brush->m_pattern_blend_mode);
|
||||
ShaderManager::u_vec2(kShaderUniform::PatternOffset, m_pattern_offset);
|
||||
ShaderManager::u_int(kShaderUniform::UsePattern, brush->m_pattern_enabled && brush->m_pattern_eachsample);
|
||||
ShaderManager::u_int(kShaderUniform::UsePattern, stroke_material.stroke_pass.uses_pattern);
|
||||
ShaderManager::u_float(kShaderUniform::MixAlpha, brush->m_tip_mix);
|
||||
ShaderManager::u_float(kShaderUniform::Wet, brush->m_tip_wet);
|
||||
ShaderManager::u_float(kShaderUniform::Noise, brush->m_tip_noise);
|
||||
@@ -803,10 +823,10 @@ void Canvas::stroke_draw()
|
||||
|
||||
// DRAW DUAL BRUSH
|
||||
|
||||
if (brush->m_dual_enabled)
|
||||
if (stroke_material.dual_pass.enabled)
|
||||
{
|
||||
ShaderManager::use(kShader::Stroke);
|
||||
ShaderManager::u_int(kShaderUniform::UsePattern, false);
|
||||
ShaderManager::u_int(kShaderUniform::UsePattern, stroke_material.dual_pass.uses_pattern);
|
||||
ShaderManager::u_float(kShaderUniform::MixAlpha, 0);
|
||||
ShaderManager::u_float(kShaderUniform::Wet, 0);
|
||||
ShaderManager::u_float(kShaderUniform::Noise, 0);
|
||||
@@ -831,7 +851,7 @@ void Canvas::stroke_draw()
|
||||
m_tmp_dual[i].unbindFramebuffer();
|
||||
|
||||
// this mode overflows the main brush boundries
|
||||
if (brush->m_dual_blend_mode == 0)
|
||||
if (stroke_material.composite_pass.dual_blend_mode == 0)
|
||||
m_dirty_box[i] = glm::clamp(box_union(m_dirty_box[i], box_sample), glm::vec4(0), glm::vec4(m_width));
|
||||
}
|
||||
}
|
||||
@@ -1040,6 +1060,7 @@ void Canvas::stroke_commit()
|
||||
}
|
||||
else
|
||||
{
|
||||
const auto stroke_material = canvas_stroke_material_plan(*b, false);
|
||||
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;
|
||||
@@ -1057,10 +1078,10 @@ void Canvas::stroke_commit()
|
||||
ShaderManager::u_int(kShaderUniform::UseFragcoord, false);
|
||||
ShaderManager::u_int(kShaderUniform::BlendMode, b->m_blend_mode);
|
||||
ShaderManager::u_mat4(kShaderUniform::MVP, glm::ortho(-.5f, .5f, -.5f, .5f, -1.f, 1.f));
|
||||
ShaderManager::u_int(kShaderUniform::UseDual, b->m_dual_enabled);
|
||||
ShaderManager::u_int(kShaderUniform::DualBlendMode, b->m_dual_blend_mode);
|
||||
ShaderManager::u_float(kShaderUniform::DualAlpha, b->m_dual_opacity);
|
||||
ShaderManager::u_int(kShaderUniform::UsePattern, b->m_pattern_enabled && !b->m_pattern_eachsample);
|
||||
ShaderManager::u_int(kShaderUniform::UseDual, stroke_material.composite_pass.use_dual);
|
||||
ShaderManager::u_int(kShaderUniform::DualBlendMode, stroke_material.composite_pass.dual_blend_mode);
|
||||
ShaderManager::u_float(kShaderUniform::DualAlpha, stroke_material.composite_pass.dual_alpha);
|
||||
ShaderManager::u_int(kShaderUniform::UsePattern, stroke_material.composite_pass.use_pattern);
|
||||
ShaderManager::u_vec2(kShaderUniform::PatternScale, patt_scale);
|
||||
ShaderManager::u_float(kShaderUniform::PatternInvert, b->m_pattern_invert);
|
||||
ShaderManager::u_float(kShaderUniform::PatternBright, b->m_pattern_brightness);
|
||||
@@ -1076,7 +1097,7 @@ void Canvas::stroke_commit()
|
||||
set_active_texture_unit(2);
|
||||
m_smask.rtt(i).bindTexture();
|
||||
set_active_texture_unit(3);
|
||||
if (b->m_dual_enabled)
|
||||
if (stroke_material.composite_pass.use_dual)
|
||||
m_tmp_dual[i].bindTexture();
|
||||
set_active_texture_unit(4);
|
||||
b->m_pattern_texture ?
|
||||
@@ -1084,7 +1105,7 @@ void Canvas::stroke_commit()
|
||||
unbind_texture_2d();
|
||||
m_plane.draw_fill();
|
||||
set_active_texture_unit(3);
|
||||
if (b->m_dual_enabled)
|
||||
if (stroke_material.composite_pass.use_dual)
|
||||
m_tmp_dual[i].unbindTexture();
|
||||
set_active_texture_unit(2);
|
||||
m_smask.rtt(i).unbindTexture();
|
||||
@@ -1248,6 +1269,7 @@ void Canvas::draw_merge(bool draw_checkerboard, std::array<bool, 6> faces /*= SI
|
||||
m_sampler.bind(3);
|
||||
m_sampler_stencil.bind(4);
|
||||
|
||||
const auto stroke_material = canvas_stroke_material_plan(*b, false);
|
||||
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;
|
||||
@@ -1265,9 +1287,9 @@ void Canvas::draw_merge(bool draw_checkerboard, std::array<bool, 6> faces /*= SI
|
||||
ShaderManager::u_int(kShaderUniform::UseFragcoord, false);
|
||||
ShaderManager::u_int(kShaderUniform::BlendMode, b->m_blend_mode);
|
||||
ShaderManager::u_mat4(kShaderUniform::MVP, ortho);
|
||||
ShaderManager::u_int(kShaderUniform::UseDual, b->m_dual_enabled);
|
||||
ShaderManager::u_int(kShaderUniform::DualBlendMode, b->m_dual_blend_mode);
|
||||
ShaderManager::u_int(kShaderUniform::UsePattern, b->m_pattern_enabled && !b->m_pattern_eachsample);
|
||||
ShaderManager::u_int(kShaderUniform::UseDual, stroke_material.composite_pass.use_dual);
|
||||
ShaderManager::u_int(kShaderUniform::DualBlendMode, stroke_material.composite_pass.dual_blend_mode);
|
||||
ShaderManager::u_int(kShaderUniform::UsePattern, stroke_material.composite_pass.use_pattern);
|
||||
ShaderManager::u_vec2(kShaderUniform::PatternScale, patt_scale);
|
||||
ShaderManager::u_float(kShaderUniform::PatternInvert, b->m_pattern_invert);
|
||||
ShaderManager::u_float(kShaderUniform::PatternBright, b->m_pattern_brightness);
|
||||
@@ -1275,7 +1297,7 @@ void Canvas::draw_merge(bool draw_checkerboard, std::array<bool, 6> faces /*= SI
|
||||
ShaderManager::u_float(kShaderUniform::PatternDepth, b->m_pattern_depth);
|
||||
ShaderManager::u_int(kShaderUniform::PatternBlendMode, b->m_pattern_blend_mode);
|
||||
ShaderManager::u_vec2(kShaderUniform::PatternOffset, Canvas::I->m_pattern_offset);
|
||||
ShaderManager::u_float(kShaderUniform::DualAlpha, b->m_dual_opacity);
|
||||
ShaderManager::u_float(kShaderUniform::DualAlpha, stroke_material.composite_pass.dual_alpha);
|
||||
|
||||
set_active_texture_unit(0);
|
||||
m_layers[layer_index]->rtt(plane_index).bindTexture();
|
||||
@@ -1284,7 +1306,7 @@ void Canvas::draw_merge(bool draw_checkerboard, std::array<bool, 6> faces /*= SI
|
||||
set_active_texture_unit(2);
|
||||
m_smask.rtt(plane_index).bindTexture();
|
||||
set_active_texture_unit(3);
|
||||
if (b->m_dual_enabled)
|
||||
if (stroke_material.composite_pass.use_dual)
|
||||
m_tmp_dual[plane_index].bindTexture();
|
||||
set_active_texture_unit(4);
|
||||
b->m_pattern_texture ?
|
||||
@@ -1292,7 +1314,7 @@ void Canvas::draw_merge(bool draw_checkerboard, std::array<bool, 6> faces /*= SI
|
||||
unbind_texture_2d();
|
||||
m_plane.draw_fill();
|
||||
set_active_texture_unit(3);
|
||||
if (b->m_dual_enabled)
|
||||
if (stroke_material.composite_pass.use_dual)
|
||||
m_tmp_dual[plane_index].unbindTexture();
|
||||
set_active_texture_unit(2);
|
||||
m_smask.rtt(plane_index).unbindTexture();
|
||||
|
||||
Reference in New Issue
Block a user