Route NodeCanvas blend setup through helper

This commit is contained in:
2026-06-13 05:10:37 +02:00
parent 93488d0790
commit ea1557f7ea
4 changed files with 51 additions and 7 deletions

View File

@@ -16,9 +16,19 @@ struct LegacyCanvasDrawMergeTextureUniforms {
int texture_slot = 0;
};
struct LegacyCanvasDrawMergeTextureBlendUniforms {
glm::mat4 mvp { 1.0f };
int texture_slot = 0;
int destination_texture_slot = 2;
bool use_destination_texture = false;
int blend_mode = 0;
float alpha = 1.0f;
};
struct LegacyCanvasDrawMergeShaderExecution {
std::function<void(kShader)> use_shader;
std::function<void(kShaderUniform, int)> set_int;
std::function<void(kShaderUniform, float)> set_float;
std::function<void(kShaderUniform, const glm::mat4&)> set_mat4;
};
@@ -27,6 +37,7 @@ struct LegacyCanvasDrawMergeShaderExecution {
return {
.use_shader = [](kShader shader) { ShaderManager::use(shader); },
.set_int = [](kShaderUniform uniform, int value) { ShaderManager::u_int(uniform, value); },
.set_float = [](kShaderUniform uniform, float value) { ShaderManager::u_float(uniform, value); },
.set_mat4 = [](kShaderUniform uniform, const glm::mat4& value) { ShaderManager::u_mat4(uniform, value); },
};
}
@@ -61,4 +72,24 @@ inline void setup_legacy_canvas_draw_merge_texture_shader(
setup_legacy_canvas_draw_merge_texture_shader(uniforms, legacy_shader_manager_draw_merge_execution());
}
inline void setup_legacy_canvas_draw_merge_texture_blend_shader(
const LegacyCanvasDrawMergeTextureBlendUniforms& uniforms,
const LegacyCanvasDrawMergeShaderExecution& execution) noexcept
{
execution.use_shader(kShader::TextureBlend);
execution.set_int(kShaderUniform::Tex, uniforms.texture_slot);
if (uniforms.use_destination_texture) {
execution.set_int(kShaderUniform::TexBG, uniforms.destination_texture_slot);
}
execution.set_int(kShaderUniform::BlendMode, uniforms.blend_mode);
execution.set_float(kShaderUniform::Alpha, uniforms.alpha);
execution.set_mat4(kShaderUniform::MVP, uniforms.mvp);
}
inline void setup_legacy_canvas_draw_merge_texture_blend_shader(
const LegacyCanvasDrawMergeTextureBlendUniforms& uniforms)
{
setup_legacy_canvas_draw_merge_texture_blend_shader(uniforms, legacy_shader_manager_draw_merge_execution());
}
} // namespace pp::panopainter

View File

@@ -606,13 +606,15 @@ void NodeCanvas::draw()
m_sampler.bind(0);
m_sampler.bind(2);
ShaderManager::use(kShader::TextureBlend);
ShaderManager::u_int(kShaderUniform::Tex, 0);
if (copy_blend_destination)
ShaderManager::u_int(kShaderUniform::TexBG, 2);
ShaderManager::u_int(kShaderUniform::BlendMode, m_canvas->m_layers[layer_index]->m_blend_mode);
ShaderManager::u_float(kShaderUniform::Alpha, 1.f);
ShaderManager::u_mat4(kShaderUniform::MVP, glm::ortho(-1, 1, -1, 1));
pp::panopainter::setup_legacy_canvas_draw_merge_texture_blend_shader(
pp::panopainter::LegacyCanvasDrawMergeTextureBlendUniforms {
.mvp = glm::ortho(-1, 1, -1, 1),
.texture_slot = 0,
.destination_texture_slot = 2,
.use_destination_texture = copy_blend_destination,
.blend_mode = m_canvas->m_layers[layer_index]->m_blend_mode,
.alpha = 1.f,
});
set_active_texture_unit(0);
m_blender_rtt.bindTexture();