move brush opacity from comp to stroke

This commit is contained in:
2019-02-24 20:55:06 +01:00
parent dfa44dbb55
commit 399bc3d433
9 changed files with 20 additions and 23 deletions

View File

@@ -23,7 +23,6 @@ uniform sampler2D tex;
uniform sampler2D tex_stroke; uniform sampler2D tex_stroke;
uniform sampler2D tex_mask; uniform sampler2D tex_mask;
uniform mediump float alpha; uniform mediump float alpha;
uniform mediump float stroke_alpha;
uniform int blend_mode; uniform int blend_mode;
uniform mediump vec2 resolution; uniform mediump vec2 resolution;
uniform bool lock; uniform bool lock;
@@ -81,7 +80,7 @@ void main()
stroke.a = blend_stroke(stroke.a, dual.a, dual_alpha, dual_blend_mode); 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) if (!lock && base.a == 0.0)
{ {
frag = stroke * vec4(1.0, 1.0, 1.0, alpha); frag = stroke * vec4(1.0, 1.0, 1.0, alpha);

View File

@@ -20,7 +20,6 @@ uniform sampler2D tex;
uniform sampler2D tex_stroke; uniform sampler2D tex_stroke;
uniform sampler2D tex_mask; uniform sampler2D tex_mask;
uniform mediump float alpha; uniform mediump float alpha;
uniform mediump float stroke_alpha;
uniform mediump vec2 resolution; uniform mediump vec2 resolution;
uniform bool mask; uniform bool mask;
@@ -31,6 +30,6 @@ void main()
{ {
mediump vec4 base = texture(tex, uv); mediump vec4 base = texture(tex, uv);
mediump vec4 stroke = texture(tex_stroke, 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)); frag = vec4(base.rgb, clamp((base.a - stroke.a) * alpha, 0.0, 1.0));
} }

View File

@@ -30,6 +30,7 @@ uniform mediump sampler2D tex_mix;
uniform mediump vec4 col; uniform mediump vec4 col;
uniform mediump vec2 resolution; uniform mediump vec2 resolution;
uniform mediump float alpha; uniform mediump float alpha;
uniform mediump float opacity;
uniform mediump float noise; uniform mediump float noise;
uniform mediump float mix_alpha; uniform mediump float mix_alpha;
uniform mediump float wet; uniform mediump float wet;
@@ -99,11 +100,11 @@ void main()
fg.rgb = mix(fg.rgb, mbg.rgb, mix_alpha * mbg.a); 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 float alpha_tot = bg.a + contribution;
mediump vec3 rgb = mix(bg.rgb, fg.rgb, fg.a / alpha_tot); 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_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); frag = mix(frag_dry, frag_wet, wet);
} }

View File

@@ -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::Tex, 0);
ShaderManager::u_int(kShaderUniform::TexStroke, 1); ShaderManager::u_int(kShaderUniform::TexStroke, 1);
ShaderManager::u_int(kShaderUniform::TexMask, 2); 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_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::Lock, m_canvas->m_layers[layer_index]->m_alpha_locked);
ShaderManager::u_int(kShaderUniform::Mask, canvas->m_canvas->m_smask_active); 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_int(kShaderUniform::TexMask, 2);
ShaderManager::u_vec2(kShaderUniform::Resolution, canvas->m_canvas->m_size); ShaderManager::u_vec2(kShaderUniform::Resolution, canvas->m_canvas->m_size);
ShaderManager::u_int(kShaderUniform::TexPattern, 3); 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_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::Lock, canvas->m_canvas->m_layers[layer_index]->m_alpha_locked);
ShaderManager::u_int(kShaderUniform::Mask, canvas->m_canvas->m_smask_active); ShaderManager::u_int(kShaderUniform::Mask, canvas->m_canvas->m_smask_active);

View File

@@ -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_int(kShaderUniform::TexMask, 2);
ShaderManager::u_vec2(kShaderUniform::Resolution, m_size); ShaderManager::u_vec2(kShaderUniform::Resolution, m_size);
ShaderManager::u_int(kShaderUniform::TexPattern, 3); ShaderManager::u_int(kShaderUniform::TexPattern, 3);
ShaderManager::u_float(kShaderUniform::StrokeAlpha, b->m_tip_opacity);
ShaderManager::u_float(kShaderUniform::Alpha, 1); ShaderManager::u_float(kShaderUniform::Alpha, 1);
ShaderManager::u_int(kShaderUniform::Lock, false/*m_layers[layer_index]->m_alpha_locked*/); ShaderManager::u_int(kShaderUniform::Lock, false/*m_layers[layer_index]->m_alpha_locked*/);
ShaderManager::u_int(kShaderUniform::Mask, false/*m_smask_active*/); 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::TexPattern, 2); // pattern
ShaderManager::u_int(kShaderUniform::TexMix, 3); // mixer ShaderManager::u_int(kShaderUniform::TexMix, 3); // mixer
//ShaderManager::u_int(kShaderUniform::TexMixA, 4); // 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::Resolution, { m_width, m_height });
ShaderManager::u_vec2(kShaderUniform::PatternScale, patt_scale); ShaderManager::u_vec2(kShaderUniform::PatternScale, patt_scale);
ShaderManager::u_float(kShaderUniform::PatternInvert, brush->m_pattern_invert); ShaderManager::u_float(kShaderUniform::PatternInvert, brush->m_pattern_invert);
@@ -529,6 +529,7 @@ void Canvas::stroke_draw()
ShaderManager::use(kShader::Stroke); ShaderManager::use(kShader::Stroke);
ShaderManager::u_vec4(kShaderUniform::Col, f.col); ShaderManager::u_vec4(kShaderUniform::Col, f.col);
ShaderManager::u_float(kShaderUniform::Alpha, f.pressure); ShaderManager::u_float(kShaderUniform::Alpha, f.pressure);
//ShaderManager::u_float(kShaderUniform::Opacity, f.opacity); // per-tip opacity
for (int i = 0; i < 6; i++) for (int i = 0; i < 6; i++)
{ {
auto& P = f.shapes[i]; auto& P = f.shapes[i];
@@ -548,12 +549,14 @@ void Canvas::stroke_draw()
// DRAW DUAL BRUSH // 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) 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); glActiveTexture(GL_TEXTURE0);
dual_brush->m_tip_texture->bind(); dual_brush->m_tip_texture->bind();
auto frames_dual = stroke_draw_compute(*m_dual_stroke); auto frames_dual = stroke_draw_compute(*m_dual_stroke);
@@ -562,6 +565,7 @@ void Canvas::stroke_draw()
ShaderManager::use(kShader::Stroke); ShaderManager::use(kShader::Stroke);
ShaderManager::u_vec4(kShaderUniform::Col, f.col); ShaderManager::u_vec4(kShaderUniform::Col, f.col);
ShaderManager::u_float(kShaderUniform::Alpha, f.pressure); ShaderManager::u_float(kShaderUniform::Alpha, f.pressure);
//ShaderManager::u_float(kShaderUniform::Opacity, f.opacity); // per-tip opacity
for (int i = 0; i < 6; i++) for (int i = 0; i < 6; i++)
{ {
auto& P = f.shapes[i]; auto& P = f.shapes[i];
@@ -769,7 +773,6 @@ void Canvas::stroke_commit()
ShaderManager::u_int(kShaderUniform::TexStroke, 1); ShaderManager::u_int(kShaderUniform::TexStroke, 1);
ShaderManager::u_int(kShaderUniform::TexMask, 2); ShaderManager::u_int(kShaderUniform::TexMask, 2);
ShaderManager::u_int(kShaderUniform::Mask, m_smask_active); 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_float(kShaderUniform::Alpha, 1);
ShaderManager::u_mat4(kShaderUniform::MVP, glm::ortho(-.5f, .5f, -.5f, .5f, -1.f, 1.f)); 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::TexDual, 3);
ShaderManager::u_int(kShaderUniform::TexPattern, 4); ShaderManager::u_int(kShaderUniform::TexPattern, 4);
ShaderManager::u_vec2(kShaderUniform::Resolution, m_size); ShaderManager::u_vec2(kShaderUniform::Resolution, m_size);
ShaderManager::u_float(kShaderUniform::StrokeAlpha, b->m_tip_opacity);
ShaderManager::u_float(kShaderUniform::Alpha, 1); ShaderManager::u_float(kShaderUniform::Alpha, 1);
ShaderManager::u_int(kShaderUniform::Mask, m_smask_active); ShaderManager::u_int(kShaderUniform::Mask, m_smask_active);
//ShaderManager::u_int(kShaderUniform::DrawOnScreen, false); //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::Tex, 0); // dest
ShaderManager::u_int(kShaderUniform::TexStroke, 1); // source ShaderManager::u_int(kShaderUniform::TexStroke, 1); // source
ShaderManager::u_vec2(kShaderUniform::Resolution, m_size); ShaderManager::u_vec2(kShaderUniform::Resolution, m_size);
ShaderManager::u_float(kShaderUniform::StrokeAlpha, 1);
ShaderManager::u_float(kShaderUniform::PatternAlpha, 0); ShaderManager::u_float(kShaderUniform::PatternAlpha, 0);
ShaderManager::u_float(kShaderUniform::Alpha, m_layers[source_idx]->m_opacity); ShaderManager::u_float(kShaderUniform::Alpha, m_layers[source_idx]->m_opacity);
ShaderManager::u_int(kShaderUniform::Lock, false); ShaderManager::u_int(kShaderUniform::Lock, false);

View File

@@ -1157,7 +1157,6 @@ void CanvasModeTransform::leave()
ShaderManager::u_int(kShaderUniform::TexStroke, 1); ShaderManager::u_int(kShaderUniform::TexStroke, 1);
ShaderManager::u_int(kShaderUniform::TexMask, 2); ShaderManager::u_int(kShaderUniform::TexMask, 2);
ShaderManager::u_float(kShaderUniform::Alpha, 1); ShaderManager::u_float(kShaderUniform::Alpha, 1);
ShaderManager::u_float(kShaderUniform::StrokeAlpha, 1);
ShaderManager::u_int(kShaderUniform::Lock, false); ShaderManager::u_int(kShaderUniform::Lock, false);
ShaderManager::u_int(kShaderUniform::Mask, false); ShaderManager::u_int(kShaderUniform::Mask, false);
ShaderManager::u_vec2(kShaderUniform::Resolution, Canvas::I->m_size); ShaderManager::u_vec2(kShaderUniform::Resolution, Canvas::I->m_size);

View File

@@ -182,7 +182,6 @@ void NodeCanvas::draw()
ShaderManager::u_int(kShaderUniform::TexStroke, 1); ShaderManager::u_int(kShaderUniform::TexStroke, 1);
ShaderManager::u_int(kShaderUniform::TexMask, 2); ShaderManager::u_int(kShaderUniform::TexMask, 2);
//ShaderManager::u_vec2(kShaderUniform::Resolution, zw(m_canvas->m_box) / zoom); //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_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::Lock, m_canvas->m_layers[layer_index]->m_alpha_locked);
ShaderManager::u_int(kShaderUniform::Mask, m_canvas->m_smask_active); 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_int(kShaderUniform::TexDual, 3);
ShaderManager::u_vec2(kShaderUniform::Resolution, Canvas::I->m_size); ShaderManager::u_vec2(kShaderUniform::Resolution, Canvas::I->m_size);
ShaderManager::u_int(kShaderUniform::TexPattern, 4); 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_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::Lock, m_canvas->m_layers[layer_index]->m_alpha_locked);
ShaderManager::u_int(kShaderUniform::Mask, m_canvas->m_smask_active); ShaderManager::u_int(kShaderUniform::Mask, m_canvas->m_smask_active);

View File

@@ -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::TexDual, 3);
ShaderManager::u_int(kShaderUniform::TexPattern, 4); ShaderManager::u_int(kShaderUniform::TexPattern, 4);
ShaderManager::u_vec2(kShaderUniform::Resolution, m_size); ShaderManager::u_vec2(kShaderUniform::Resolution, m_size);
ShaderManager::u_float(kShaderUniform::StrokeAlpha, b->m_tip_opacity);
ShaderManager::u_float(kShaderUniform::Alpha, 1); ShaderManager::u_float(kShaderUniform::Alpha, 1);
ShaderManager::u_int(kShaderUniform::Lock, false); ShaderManager::u_int(kShaderUniform::Lock, false);
ShaderManager::u_int(kShaderUniform::Mask, false); ShaderManager::u_int(kShaderUniform::Mask, false);
@@ -320,6 +319,7 @@ void NodeStrokePreview::draw_stroke()
m_rtt.clear(); m_rtt.clear();
ShaderManager::use(kShader::Stroke); ShaderManager::use(kShader::Stroke);
ShaderManager::u_int(kShaderUniform::UsePattern, false); 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::MixAlpha, 0);
ShaderManager::u_float(kShaderUniform::Wet, 0); ShaderManager::u_float(kShaderUniform::Wet, 0);
ShaderManager::u_float(kShaderUniform::Noise, 0); ShaderManager::u_float(kShaderUniform::Noise, 0);
@@ -328,8 +328,9 @@ void NodeStrokePreview::draw_stroke()
auto frames_dual = stroke_draw_compute(m_dual_stroke); auto frames_dual = stroke_draw_compute(m_dual_stroke);
for (auto& f : frames_dual) 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::Alpha, f.pressure);
//ShaderManager::u_float(kShaderUniform::Opacity, f.opacity); // per sample opacity
auto rect = stroke_draw_samples(f.shapes, m_tex_dual); auto rect = stroke_draw_samples(f.shapes, m_tex_dual);
} }
glActiveTexture(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0);
@@ -344,6 +345,7 @@ void NodeStrokePreview::draw_stroke()
// DRAW MAIN BRUSH // DRAW MAIN BRUSH
ShaderManager::use(kShader::Stroke); 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::MixAlpha, b->m_tip_mix);
ShaderManager::u_float(kShaderUniform::Wet, b->m_tip_wet); ShaderManager::u_float(kShaderUniform::Wet, b->m_tip_wet);
ShaderManager::u_float(kShaderUniform::Noise, b->m_tip_noise); ShaderManager::u_float(kShaderUniform::Noise, b->m_tip_noise);
@@ -369,6 +371,7 @@ void NodeStrokePreview::draw_stroke()
ShaderManager::use(kShader::Stroke); ShaderManager::use(kShader::Stroke);
ShaderManager::u_vec4(kShaderUniform::Col, { 0, 0, 0, 1 } /*f.col*/); 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::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); auto rect = stroke_draw_samples(f.shapes, m_tex);
} }
glActiveTexture(GL_TEXTURE3); glActiveTexture(GL_TEXTURE3);
@@ -400,7 +403,6 @@ void NodeStrokePreview::draw_stroke()
ShaderManager::u_int(kShaderUniform::TexDual, 3); ShaderManager::u_int(kShaderUniform::TexDual, 3);
ShaderManager::u_int(kShaderUniform::TexPattern, 4); ShaderManager::u_int(kShaderUniform::TexPattern, 4);
ShaderManager::u_vec2(kShaderUniform::Resolution, size); ShaderManager::u_vec2(kShaderUniform::Resolution, size);
ShaderManager::u_float(kShaderUniform::StrokeAlpha, b->m_tip_opacity);
ShaderManager::u_float(kShaderUniform::Alpha, 1); ShaderManager::u_float(kShaderUniform::Alpha, 1);
//ShaderManager::u_int(kShaderUniform::DrawOnScreen, false); //ShaderManager::u_int(kShaderUniform::DrawOnScreen, false);
ShaderManager::u_int(kShaderUniform::Mask, false); ShaderManager::u_int(kShaderUniform::Mask, false);

View File

@@ -17,7 +17,7 @@ enum class kShaderUniform : uint16_t
PatternOffset = const_hash("pattern_offset"), PatternOffset = const_hash("pattern_offset"),
PatternAlpha = const_hash("pattern_alpha"), PatternAlpha = const_hash("pattern_alpha"),
MixAlpha = const_hash("mix_alpha"), MixAlpha = const_hash("mix_alpha"),
StrokeAlpha = const_hash("stroke_alpha"), Opacity = const_hash("opacity"),
Wet = const_hash("wet"), Wet = const_hash("wet"),
Lock = const_hash("lock"), Lock = const_hash("lock"),
Col = const_hash("col"), Col = const_hash("col"),