implement alpha locking per layer

This commit is contained in:
2017-05-02 03:43:16 +01:00
parent 182c0b1baf
commit 9f23021fb8
7 changed files with 77 additions and 11 deletions

View File

@@ -195,6 +195,28 @@ void App::initShaders()
" mediump vec3 rgb = mix(bg.rgb, fg.rgb, fg.a / alpha_tot);\n"
" frag = vec4(rgb, alpha_tot);\n"
"}\n";
// ALPHA LOCK
static const char* shader_stroke_lock_f =
SHADER_VERSION
"uniform mediump sampler2D tex;\n"
"uniform mediump sampler2D tex_bg;\n"
"uniform mediump sampler2D tex_mask;\n"
"uniform mediump vec4 col;\n"
"uniform mediump vec2 resolution;\n"
"uniform mediump float alpha;\n"
"in mediump vec2 uv;\n"
"out mediump vec4 frag;\n"
"void main(){\n"
" mediump vec2 uv2 = gl_FragCoord.st / resolution;\n"
" mediump float brush_alpha = ( 1.0 - texture(tex, uv).r ) * alpha;\n"
" mediump vec4 fg = vec4(col.rgb, brush_alpha);\n"
" mediump vec4 bg = texture(tex_bg, uv2);\n"
" mediump vec4 msk = texture(tex_mask, uv2);\n"
" if (fg.a < (1.0/255.0)) { frag = bg; return; }\n"
" mediump float alpha_tot = fg.a + (1.0 - fg.a) * bg.a;"
" mediump vec3 rgb = mix(bg.rgb, fg.rgb, fg.a / alpha_tot);\n"
" frag = vec4(rgb, min(alpha_tot, msk.a));\n"
"}\n";
// ERASER
static const char* shader_stroke_erase_f =
SHADER_VERSION
@@ -310,6 +332,8 @@ void App::initShaders()
LOG("Failed to create shader Atlas");
if (!ShaderManager::create(kShader::Stroke, shader_stroke_v, shader_stroke_f))
LOG("Failed to create shader Stroke");
if (!ShaderManager::create(kShader::StrokeLock, shader_stroke_v, shader_stroke_lock_f))
LOG("Failed to create shader StrokeLock");
if (!ShaderManager::create(kShader::StrokeErase, shader_stroke_v, shader_stroke_erase_f))
LOG("Failed to create shader StrokeErase");
if (!ShaderManager::create(kShader::StrokeLayer, shader_stroke_layer_v, shader_stroke_layer_f))
@@ -432,6 +456,10 @@ void App::initLayout()
canvas->m_canvas->m_layers[idx].m_opacity = value;
};
layers->on_layer_visibility_changed = [this](Node*, int idx, bool visible) {
canvas->m_canvas->m_layers[canvas->m_canvas->m_order[idx]].m_alpha_locked = visible;
};
if (auto* button = layout[main_id]->find<NodeButtonCustom>("btn-bucket"))
{
button->on_click = [this](Node*) {
@@ -602,7 +630,7 @@ void App::initLayout()
void App::initLog()
{
//LogRemote::I.start();
LogRemote::I.start();
}
void App::init()
{