diff --git a/data/shaders/comp-draw.glsl b/data/shaders/comp-draw.glsl index 825a1b1..646ee8c 100644 --- a/data/shaders/comp-draw.glsl +++ b/data/shaders/comp-draw.glsl @@ -23,7 +23,6 @@ uniform sampler2D tex; uniform sampler2D tex_stroke; uniform sampler2D tex_mask; uniform mediump float alpha; -uniform mediump float stroke_alpha; uniform int blend_mode; uniform mediump vec2 resolution; uniform bool lock; @@ -81,7 +80,7 @@ void main() stroke.a = blend_stroke(stroke.a, dual.a, dual_alpha, dual_blend_mode); } - stroke.a = mask ? stroke.a * stroke_alpha * blur(tex_mask, uv).r : stroke.a * stroke_alpha; + stroke.a = mask ? stroke.a * blur(tex_mask, uv).r : stroke.a; if (!lock && base.a == 0.0) { frag = stroke * vec4(1.0, 1.0, 1.0, alpha); diff --git a/data/shaders/comp-erase.glsl b/data/shaders/comp-erase.glsl index 4f1d8b7..882d076 100644 --- a/data/shaders/comp-erase.glsl +++ b/data/shaders/comp-erase.glsl @@ -20,7 +20,6 @@ uniform sampler2D tex; uniform sampler2D tex_stroke; uniform sampler2D tex_mask; uniform mediump float alpha; -uniform mediump float stroke_alpha; uniform mediump vec2 resolution; uniform bool mask; @@ -31,6 +30,6 @@ void main() { mediump vec4 base = texture(tex, uv); mediump vec4 stroke = texture(tex_stroke, uv); - stroke.a = mask ? stroke.a * stroke_alpha * blur(tex_mask, uv).r : stroke.a * stroke_alpha; + stroke.a = mask ? stroke.a * blur(tex_mask, uv).r : stroke.a; frag = vec4(base.rgb, clamp((base.a - stroke.a) * alpha, 0.0, 1.0)); } diff --git a/data/shaders/stroke.glsl b/data/shaders/stroke.glsl index a9fc43d..e7b972d 100644 --- a/data/shaders/stroke.glsl +++ b/data/shaders/stroke.glsl @@ -30,6 +30,7 @@ uniform mediump sampler2D tex_mix; uniform mediump vec4 col; uniform mediump vec2 resolution; uniform mediump float alpha; +uniform mediump float opacity; uniform mediump float noise; uniform mediump float mix_alpha; uniform mediump float wet; @@ -99,11 +100,11 @@ void main() fg.rgb = mix(fg.rgb, mbg.rgb, mix_alpha * mbg.a); } - mediump float contribution = (1.0 - bg.a) * fg.a; + mediump float contribution = (opacity - bg.a) * fg.a; mediump float alpha_tot = bg.a + contribution; mediump vec3 rgb = mix(bg.rgb, fg.rgb, fg.a / alpha_tot); mediump vec4 frag_wet = vec4(rgb, max(bg.a, fg.a * 1.2)); - mediump vec4 frag_dry = vec4(rgb, alpha_tot); + mediump vec4 frag_dry = vec4(rgb, min(alpha_tot, opacity)); frag = mix(frag_dry, frag_wet, wet); } diff --git a/src/app_vr.cpp b/src/app_vr.cpp index 55ada29..8807350 100644 --- a/src/app_vr.cpp +++ b/src/app_vr.cpp @@ -66,7 +66,6 @@ void App::vr_draw(const glm::mat4& proj, const glm::mat4& camera, const glm::mat ShaderManager::u_int(kShaderUniform::Tex, 0); ShaderManager::u_int(kShaderUniform::TexStroke, 1); ShaderManager::u_int(kShaderUniform::TexMask, 2); - ShaderManager::u_float(kShaderUniform::StrokeAlpha, canvas->m_canvas->m_current_stroke->m_brush->m_tip_opacity); ShaderManager::u_float(kShaderUniform::Alpha, canvas->m_canvas->m_layers[layer_index]->m_opacity); //ShaderManager::u_int(kShaderUniform::Lock, m_canvas->m_layers[layer_index]->m_alpha_locked); ShaderManager::u_int(kShaderUniform::Mask, canvas->m_canvas->m_smask_active); @@ -99,7 +98,6 @@ void App::vr_draw(const glm::mat4& proj, const glm::mat4& camera, const glm::mat ShaderManager::u_int(kShaderUniform::TexMask, 2); ShaderManager::u_vec2(kShaderUniform::Resolution, canvas->m_canvas->m_size); ShaderManager::u_int(kShaderUniform::TexPattern, 3); - ShaderManager::u_float(kShaderUniform::StrokeAlpha, b->m_tip_opacity); ShaderManager::u_float(kShaderUniform::Alpha, canvas->m_canvas->m_layers[layer_index]->m_opacity); ShaderManager::u_int(kShaderUniform::Lock, canvas->m_canvas->m_layers[layer_index]->m_alpha_locked); ShaderManager::u_int(kShaderUniform::Mask, canvas->m_canvas->m_smask_active); diff --git a/src/canvas.cpp b/src/canvas.cpp index da270c3..6905d5e 100644 --- a/src/canvas.cpp +++ b/src/canvas.cpp @@ -248,7 +248,6 @@ void Canvas::stroke_draw_mix(const glm::vec2& bb_min, const glm::vec2& bb_sz) ShaderManager::u_int(kShaderUniform::TexMask, 2); ShaderManager::u_vec2(kShaderUniform::Resolution, m_size); ShaderManager::u_int(kShaderUniform::TexPattern, 3); - ShaderManager::u_float(kShaderUniform::StrokeAlpha, b->m_tip_opacity); ShaderManager::u_float(kShaderUniform::Alpha, 1); ShaderManager::u_int(kShaderUniform::Lock, false/*m_layers[layer_index]->m_alpha_locked*/); ShaderManager::u_int(kShaderUniform::Mask, false/*m_smask_active*/); @@ -495,6 +494,7 @@ void Canvas::stroke_draw() ShaderManager::u_int(kShaderUniform::TexPattern, 2); // pattern ShaderManager::u_int(kShaderUniform::TexMix, 3); // mixer //ShaderManager::u_int(kShaderUniform::TexMixA, 4); // mixer + ShaderManager::u_float(kShaderUniform::Opacity, brush->m_tip_opacity); ShaderManager::u_vec2(kShaderUniform::Resolution, { m_width, m_height }); ShaderManager::u_vec2(kShaderUniform::PatternScale, patt_scale); ShaderManager::u_float(kShaderUniform::PatternInvert, brush->m_pattern_invert); @@ -529,6 +529,7 @@ void Canvas::stroke_draw() ShaderManager::use(kShader::Stroke); ShaderManager::u_vec4(kShaderUniform::Col, f.col); ShaderManager::u_float(kShaderUniform::Alpha, f.pressure); + //ShaderManager::u_float(kShaderUniform::Opacity, f.opacity); // per-tip opacity for (int i = 0; i < 6; i++) { auto& P = f.shapes[i]; @@ -548,12 +549,14 @@ void Canvas::stroke_draw() // DRAW DUAL BRUSH - ShaderManager::u_int(kShaderUniform::UsePattern, false); - ShaderManager::u_float(kShaderUniform::MixAlpha, 0); - ShaderManager::u_float(kShaderUniform::Wet, 0); - ShaderManager::u_float(kShaderUniform::Noise, 0); if (brush->m_dual_enabled) { + ShaderManager::u_int(kShaderUniform::UsePattern, false); + ShaderManager::u_float(kShaderUniform::Opacity, brush->m_dual_opacity); + ShaderManager::u_float(kShaderUniform::MixAlpha, 0); + ShaderManager::u_float(kShaderUniform::Wet, 0); + ShaderManager::u_float(kShaderUniform::Noise, 0); + glActiveTexture(GL_TEXTURE0); dual_brush->m_tip_texture->bind(); auto frames_dual = stroke_draw_compute(*m_dual_stroke); @@ -562,6 +565,7 @@ void Canvas::stroke_draw() ShaderManager::use(kShader::Stroke); ShaderManager::u_vec4(kShaderUniform::Col, f.col); ShaderManager::u_float(kShaderUniform::Alpha, f.pressure); + //ShaderManager::u_float(kShaderUniform::Opacity, f.opacity); // per-tip opacity for (int i = 0; i < 6; i++) { auto& P = f.shapes[i]; @@ -769,7 +773,6 @@ void Canvas::stroke_commit() ShaderManager::u_int(kShaderUniform::TexStroke, 1); ShaderManager::u_int(kShaderUniform::TexMask, 2); ShaderManager::u_int(kShaderUniform::Mask, m_smask_active); - ShaderManager::u_float(kShaderUniform::StrokeAlpha, b->m_tip_opacity); ShaderManager::u_float(kShaderUniform::Alpha, 1); ShaderManager::u_mat4(kShaderUniform::MVP, glm::ortho(-.5f, .5f, -.5f, .5f, -1.f, 1.f)); @@ -799,7 +802,6 @@ void Canvas::stroke_commit() ShaderManager::u_int(kShaderUniform::TexDual, 3); ShaderManager::u_int(kShaderUniform::TexPattern, 4); ShaderManager::u_vec2(kShaderUniform::Resolution, m_size); - ShaderManager::u_float(kShaderUniform::StrokeAlpha, b->m_tip_opacity); ShaderManager::u_float(kShaderUniform::Alpha, 1); ShaderManager::u_int(kShaderUniform::Mask, m_smask_active); //ShaderManager::u_int(kShaderUniform::DrawOnScreen, false); @@ -1020,7 +1022,6 @@ void Canvas::layer_merge(int source_idx, int dest_idx) // m_layer index ShaderManager::u_int(kShaderUniform::Tex, 0); // dest ShaderManager::u_int(kShaderUniform::TexStroke, 1); // source ShaderManager::u_vec2(kShaderUniform::Resolution, m_size); - ShaderManager::u_float(kShaderUniform::StrokeAlpha, 1); ShaderManager::u_float(kShaderUniform::PatternAlpha, 0); ShaderManager::u_float(kShaderUniform::Alpha, m_layers[source_idx]->m_opacity); ShaderManager::u_int(kShaderUniform::Lock, false); diff --git a/src/canvas_modes.cpp b/src/canvas_modes.cpp index 4802fc5..fb1b1ff 100644 --- a/src/canvas_modes.cpp +++ b/src/canvas_modes.cpp @@ -1157,7 +1157,6 @@ void CanvasModeTransform::leave() ShaderManager::u_int(kShaderUniform::TexStroke, 1); ShaderManager::u_int(kShaderUniform::TexMask, 2); ShaderManager::u_float(kShaderUniform::Alpha, 1); - ShaderManager::u_float(kShaderUniform::StrokeAlpha, 1); ShaderManager::u_int(kShaderUniform::Lock, false); ShaderManager::u_int(kShaderUniform::Mask, false); ShaderManager::u_vec2(kShaderUniform::Resolution, Canvas::I->m_size); diff --git a/src/node_canvas.cpp b/src/node_canvas.cpp index 1ab8fdc..cca1f3f 100644 --- a/src/node_canvas.cpp +++ b/src/node_canvas.cpp @@ -182,7 +182,6 @@ void NodeCanvas::draw() ShaderManager::u_int(kShaderUniform::TexStroke, 1); ShaderManager::u_int(kShaderUniform::TexMask, 2); //ShaderManager::u_vec2(kShaderUniform::Resolution, zw(m_canvas->m_box) / zoom); - ShaderManager::u_float(kShaderUniform::StrokeAlpha, b->m_tip_opacity); ShaderManager::u_float(kShaderUniform::Alpha, m_canvas->m_layers[layer_index]->m_opacity); //ShaderManager::u_int(kShaderUniform::Lock, m_canvas->m_layers[layer_index]->m_alpha_locked); ShaderManager::u_int(kShaderUniform::Mask, m_canvas->m_smask_active); @@ -215,7 +214,6 @@ void NodeCanvas::draw() ShaderManager::u_int(kShaderUniform::TexDual, 3); ShaderManager::u_vec2(kShaderUniform::Resolution, Canvas::I->m_size); ShaderManager::u_int(kShaderUniform::TexPattern, 4); - ShaderManager::u_float(kShaderUniform::StrokeAlpha, b->m_tip_opacity); ShaderManager::u_float(kShaderUniform::Alpha, m_canvas->m_layers[layer_index]->m_opacity); ShaderManager::u_int(kShaderUniform::Lock, m_canvas->m_layers[layer_index]->m_alpha_locked); ShaderManager::u_int(kShaderUniform::Mask, m_canvas->m_smask_active); diff --git a/src/node_stroke_preview.cpp b/src/node_stroke_preview.cpp index 4d6176c..11ddf2d 100644 --- a/src/node_stroke_preview.cpp +++ b/src/node_stroke_preview.cpp @@ -80,7 +80,6 @@ void NodeStrokePreview::stroke_draw_mix(const glm::vec2& bb_min, const glm::vec2 ShaderManager::u_int(kShaderUniform::TexDual, 3); ShaderManager::u_int(kShaderUniform::TexPattern, 4); ShaderManager::u_vec2(kShaderUniform::Resolution, m_size); - ShaderManager::u_float(kShaderUniform::StrokeAlpha, b->m_tip_opacity); ShaderManager::u_float(kShaderUniform::Alpha, 1); ShaderManager::u_int(kShaderUniform::Lock, false); ShaderManager::u_int(kShaderUniform::Mask, false); @@ -320,6 +319,7 @@ void NodeStrokePreview::draw_stroke() m_rtt.clear(); ShaderManager::use(kShader::Stroke); ShaderManager::u_int(kShaderUniform::UsePattern, false); + ShaderManager::u_float(kShaderUniform::Opacity, b->m_dual_opacity); ShaderManager::u_float(kShaderUniform::MixAlpha, 0); ShaderManager::u_float(kShaderUniform::Wet, 0); ShaderManager::u_float(kShaderUniform::Noise, 0); @@ -328,8 +328,9 @@ void NodeStrokePreview::draw_stroke() auto frames_dual = stroke_draw_compute(m_dual_stroke); for (auto& f : frames_dual) { - ShaderManager::u_vec4(kShaderUniform::Col, f.col); + ShaderManager::u_vec4(kShaderUniform::Col, { 0, 0, 0, 1 }); ShaderManager::u_float(kShaderUniform::Alpha, f.pressure); + //ShaderManager::u_float(kShaderUniform::Opacity, f.opacity); // per sample opacity auto rect = stroke_draw_samples(f.shapes, m_tex_dual); } glActiveTexture(GL_TEXTURE0); @@ -344,6 +345,7 @@ void NodeStrokePreview::draw_stroke() // DRAW MAIN BRUSH ShaderManager::use(kShader::Stroke); + ShaderManager::u_float(kShaderUniform::Opacity, b->m_tip_opacity); ShaderManager::u_float(kShaderUniform::MixAlpha, b->m_tip_mix); ShaderManager::u_float(kShaderUniform::Wet, b->m_tip_wet); ShaderManager::u_float(kShaderUniform::Noise, b->m_tip_noise); @@ -369,6 +371,7 @@ void NodeStrokePreview::draw_stroke() ShaderManager::use(kShader::Stroke); ShaderManager::u_vec4(kShaderUniform::Col, { 0, 0, 0, 1 } /*f.col*/); ShaderManager::u_float(kShaderUniform::Alpha, glm::max(f.pressure, m_min_flow)); + //ShaderManager::u_float(kShaderUniform::Opacity, f.opacity); // per sample opacity auto rect = stroke_draw_samples(f.shapes, m_tex); } glActiveTexture(GL_TEXTURE3); @@ -400,7 +403,6 @@ void NodeStrokePreview::draw_stroke() ShaderManager::u_int(kShaderUniform::TexDual, 3); ShaderManager::u_int(kShaderUniform::TexPattern, 4); ShaderManager::u_vec2(kShaderUniform::Resolution, size); - ShaderManager::u_float(kShaderUniform::StrokeAlpha, b->m_tip_opacity); ShaderManager::u_float(kShaderUniform::Alpha, 1); //ShaderManager::u_int(kShaderUniform::DrawOnScreen, false); ShaderManager::u_int(kShaderUniform::Mask, false); diff --git a/src/shader.h b/src/shader.h index d26f63c..1e47a13 100644 --- a/src/shader.h +++ b/src/shader.h @@ -17,7 +17,7 @@ enum class kShaderUniform : uint16_t PatternOffset = const_hash("pattern_offset"), PatternAlpha = const_hash("pattern_alpha"), MixAlpha = const_hash("mix_alpha"), - StrokeAlpha = const_hash("stroke_alpha"), + Opacity = const_hash("opacity"), Wet = const_hash("wet"), Lock = const_hash("lock"), Col = const_hash("col"),