mixer brush wip

This commit is contained in:
2018-08-01 10:48:04 +02:00
parent 5c2264ba8b
commit 57e2fa1abd
9 changed files with 84 additions and 14 deletions

View File

@@ -219,6 +219,46 @@ void ui::Canvas::stroke_cancel()
m_current_stroke = nullptr;
m_show_tmp = false;
}
void ui::Canvas::stroke_draw_mix()
{
m_mixer.bindFramebuffer();
m_mixer.clear({ 0, 1, 1, 1 });
glViewport(m_vp.x, m_vp.y, m_vp.z, m_vp.w);
glDisable(GL_BLEND);
glDisable(GL_DEPTH_TEST);
m_sampler_bg.bind(0);
auto layer_index = m_current_layer_idx;
for (int plane_index = 0; plane_index < 6; plane_index++)
{
if (m_layers[layer_index].m_opacity == .0f)
continue;
auto plane_mvp_z = m_proj * m_mv *
m_plane_transform[plane_index] *
glm::translate(glm::vec3(0, 0, -1));
{
ui::ShaderManager::use(kShader::TextureAlpha);
ui::ShaderManager::u_int(kShaderUniform::Tex, 0);
ui::ShaderManager::u_float(kShaderUniform::Alpha, m_layers[layer_index].m_opacity);
ui::ShaderManager::u_int(kShaderUniform::Highlight, false);
ui::ShaderManager::u_mat4(kShaderUniform::MVP, plane_mvp_z);
glActiveTexture(GL_TEXTURE0);
// m_layers[layer_index].m_rtt[plane_index].bindTexture();
// m_node->m_face_plane.draw_fill();
// m_layers[layer_index].m_rtt[plane_index].unbindTexture();
m_tmp[plane_index].bindTexture();
m_node->m_face_plane.draw_fill();
m_tmp[plane_index].unbindTexture();
}
}
m_sampler_bg.unbind();
m_mixer.unbindFramebuffer();
}
void ui::Canvas::stroke_draw()
{
if (!(m_current_stroke && m_current_stroke->has_sample()))
@@ -231,6 +271,8 @@ void ui::Canvas::stroke_draw()
glGetIntegerv(GL_VIEWPORT, vp);
glGetFloatv(GL_COLOR_CLEAR_VALUE, cc);
stroke_draw_mix();
glViewport(0, 0, m_width, m_height);
auto ortho_proj = glm::ortho(0.f, (float)m_width, 0.f, (float)m_height, -1.f, 1.f);
@@ -243,11 +285,13 @@ void ui::Canvas::stroke_draw()
tex.bind();
m_sampler_brush.bind(0);
m_sampler_bg.bind(1);
m_sampler_mask.bind(2);
m_sampler_stencil.bind(3);
m_sampler_stencil.bind(2);
m_sampler_mix.bind(3);
glActiveTexture(GL_TEXTURE3);
glActiveTexture(GL_TEXTURE2);
stencil.bind();
glActiveTexture(GL_TEXTURE3);
m_mixer.bindTexture();
for (int i = 0; i < 6; i++)
{
@@ -280,10 +324,12 @@ void ui::Canvas::stroke_draw()
#ifndef __IOS__
ShaderManager::u_int(kShaderUniform::TexBG, 1); // bg
#endif
ShaderManager::u_int(kShaderUniform::TexStencil, 3); // stencil
ShaderManager::u_int(kShaderUniform::TexStencil, 2); // stencil
ShaderManager::u_int(kShaderUniform::TexMix, 3); // mixer
ShaderManager::u_vec2(kShaderUniform::Resolution, { m_width, m_height });
ShaderManager::u_vec2(kShaderUniform::StencilOffset, stencil_offset);
ShaderManager::u_float(kShaderUniform::StencilAlpha, m_brush.m_tip_stencil);
ShaderManager::u_float(kShaderUniform::MixAlpha, m_brush.m_tip_mix);
ShaderManager::u_float(kShaderUniform::Wet, m_brush.m_tip_wet);
ShaderManager::u_float(kShaderUniform::Noise, m_brush.m_tip_noise);
for (const auto& s : samples)
@@ -360,11 +406,11 @@ void ui::Canvas::stroke_draw()
}
}
if (m_alpha_lock)
{
glActiveTexture(GL_TEXTURE2);
m_layers[m_current_layer_idx].m_rtt[i].unbindTexture();
}
// if (m_alpha_lock)
// {
// glActiveTexture(GL_TEXTURE2);
// m_layers[m_current_layer_idx].m_rtt[i].unbindTexture();
// }
glActiveTexture(GL_TEXTURE1);
m_tex[i].unbind();
@@ -374,10 +420,15 @@ void ui::Canvas::stroke_draw()
glDisable(GL_BLEND);
glActiveTexture(GL_TEXTURE2);
stencil.unbind();
glActiveTexture(GL_TEXTURE3);
m_mixer.unbindTexture();
glActiveTexture(GL_TEXTURE0);
m_sampler_brush.unbind();
m_sampler_bg.unbind();
m_sampler_mask.unbind();
m_sampler_stencil.unbind();
tex.unbind();
glViewport(vp[0], vp[1], vp[2], vp[3]);
@@ -803,6 +854,7 @@ bool ui::Canvas::create(int width, int height)
m_sampler_bg.create(GL_NEAREST);
m_sampler_mask.create(GL_LINEAR);
m_sampler_stencil.create(GL_LINEAR, GL_REPEAT);
m_sampler_mix.create(GL_LINEAR, GL_REPEAT);
m_plane.create<1>(1, 1);
m_plane_brush.create<1>(1, 1);
m_mesh.create();