Extract preview mix-pass material planning

This commit is contained in:
2026-06-13 11:00:41 +02:00
parent 6cdf8c13a7
commit fae108d520
5 changed files with 218 additions and 28 deletions

View File

@@ -72,6 +72,11 @@ bool near(float a, float b)
return std::fabs(a - b) < 0.0001F;
}
bool near(const glm::vec2& a, const glm::vec2& b)
{
return near(a.x, b.x) && near(a.y, b.y);
}
bool has_texture_binding(
const pp::paint_renderer::CanvasStrokeMaterialPlan& plan,
CanvasStrokeTextureRole role,
@@ -2186,6 +2191,55 @@ void legacy_node_stroke_preview_composite_adapter_preserves_retained_inputs(pp::
PP_EXPECT(h, has_preview_texture_slot(plan, StrokePreviewTextureRole::mixer, 3));
}
void legacy_node_stroke_preview_mix_pass_adapter_preserves_retained_material_and_uniforms(pp::tests::Harness& h)
{
const pp::panopainter::LegacyNodeStrokePreviewMixPassRequest request {
.resolution = glm::vec2(128.0F, 64.0F),
.pattern_scale = 0.25F,
.pattern_flipx = true,
.pattern_flipy = true,
.pattern_invert = true,
.pattern_brightness = 0.6F,
.pattern_contrast = 0.8F,
.pattern_depth = 0.9F,
.pattern_rand_offset = true,
.pattern_enabled = true,
.pattern_eachsample = false,
.tip_wet = 0.3F,
.tip_mix = 0.7F,
.tip_noise = 0.2F,
.dual_enabled = true,
.dual_blend_mode = 9,
.pattern_blend_mode = 7,
.dual_opacity = 0.4F,
.blend_mode = 5,
};
const auto plan = pp::panopainter::plan_legacy_node_stroke_preview_mix_pass(request);
PP_EXPECT(h, plan.material.dual_pass.enabled);
PP_EXPECT(h, !plan.material.stroke_pass.uses_pattern);
PP_EXPECT(h, plan.material.composite_pass.use_dual);
PP_EXPECT(h, plan.material.composite_pass.use_pattern);
PP_EXPECT(h, plan.material.composite_pass.dual_blend_mode == request.dual_blend_mode);
PP_EXPECT(h, near(plan.material.composite_pass.dual_alpha, request.dual_opacity));
PP_EXPECT(h, plan.material.composite_pass.pattern_blend_mode == request.pattern_blend_mode);
PP_EXPECT(h, near(plan.shader.resolution, request.resolution));
PP_EXPECT(h, near(plan.shader.pattern_scale, glm::vec2(-0.25F, -0.25F)));
PP_EXPECT(h, near(plan.shader.pattern_invert, 1.0F));
PP_EXPECT(h, near(plan.shader.pattern_brightness, request.pattern_brightness));
PP_EXPECT(h, near(plan.shader.pattern_contrast, request.pattern_contrast));
PP_EXPECT(h, near(plan.shader.pattern_depth, request.pattern_depth));
PP_EXPECT(h, plan.shader.pattern_blend_mode == request.pattern_blend_mode);
PP_EXPECT(h, near(plan.shader.pattern_offset, glm::vec2(0.5F, 0.5F)));
PP_EXPECT(h, plan.shader.blend_mode == request.blend_mode);
PP_EXPECT(h, plan.shader.use_dual == plan.material.composite_pass.use_dual);
PP_EXPECT(h, plan.shader.dual_blend_mode == plan.material.composite_pass.dual_blend_mode);
PP_EXPECT(h, near(plan.shader.dual_alpha, plan.material.composite_pass.dual_alpha));
PP_EXPECT(h, plan.shader.use_pattern == plan.material.composite_pass.use_pattern);
}
void plans_canvas_blend_gate_from_persisted_indices(pp::tests::Harness& h)
{
const std::vector<int> normal_layers { 0, 0, 0 };
@@ -2637,6 +2691,9 @@ int main()
harness.run(
"legacy_node_stroke_preview_composite_adapter_preserves_retained_inputs",
legacy_node_stroke_preview_composite_adapter_preserves_retained_inputs);
harness.run(
"legacy_node_stroke_preview_mix_pass_adapter_preserves_retained_material_and_uniforms",
legacy_node_stroke_preview_mix_pass_adapter_preserves_retained_material_and_uniforms);
harness.run("plans_canvas_blend_gate_from_persisted_indices", plans_canvas_blend_gate_from_persisted_indices);
harness.run("canvas_blend_gate_preserves_legacy_fallbacks", canvas_blend_gate_preserves_legacy_fallbacks);
harness.run("plans_canvas_stroke_feedback_paths", plans_canvas_stroke_feedback_paths);