diff --git a/data/layout.xml b/data/layout.xml index c062683..9137157 100644 --- a/data/layout.xml +++ b/data/layout.xml @@ -155,6 +155,7 @@ + @@ -183,6 +184,7 @@ + diff --git a/engine/app_shaders.cpp b/engine/app_shaders.cpp index b2a3d73..abfc61a 100644 --- a/engine/app_shaders.cpp +++ b/engine/app_shaders.cpp @@ -258,6 +258,7 @@ void App::initShaders() "uniform mediump vec4 col;\n" "uniform mediump vec2 resolution;\n" "uniform mediump float alpha;\n" + "uniform mediump float noise;\n" "uniform mediump vec2 stencil_offset;\n" "uniform mediump float stencil_alpha;\n" "uniform mediump float wet;\n" @@ -268,6 +269,7 @@ void App::initShaders() #else "out mediump vec4 frag;\n" #endif + "mediump float rand(vec2 co) { return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453); }\n" "void main(){\n" " mediump vec2 uv2 = gl_FragCoord.st / resolution;\n" " mediump float stencil = 1.0 - (texture(tex_stencil, (uv2+stencil_offset) * 2.0).r * 0.9) * stencil_alpha;\n" @@ -278,6 +280,7 @@ void App::initShaders() #else " mediump vec4 bg = texture(tex_bg, uv2);\n" #endif + " fg.a *= 1.0-rand(uv2+uv)*noise;\n" " if (fg.a == 0.0) discard;\n" " mediump float contribution = (1.0 - bg.a) * fg.a * stencil;\n" " mediump float alpha_tot = bg.a + contribution;" diff --git a/engine/brush.h b/engine/brush.h index 7cb0868..00ad76b 100644 --- a/engine/brush.h +++ b/engine/brush.h @@ -18,6 +18,7 @@ public: float m_tip_angle = 0; float m_tip_stencil = 0; float m_tip_wet = 0; + float m_tip_noise = 0; bool m_tip_angle_follow = false; bool m_tip_flow_pressure = false; bool m_tip_size_pressure = false; diff --git a/engine/canvas.cpp b/engine/canvas.cpp index d6c0740..b146331 100644 --- a/engine/canvas.cpp +++ b/engine/canvas.cpp @@ -247,6 +247,7 @@ void ui::Canvas::stroke_draw() //ShaderManager::u_vec2(kShaderUniform::StencilOffset, glm::vec2((rand()%1000)*0.001f, (rand()%1000)*0.001f)); ShaderManager::u_float(kShaderUniform::StencilAlpha, m_brush.m_tip_stencil); 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) { glm::vec2 dx(s.size * 0.5f, 0), dy(0, s.size * 0.5f); diff --git a/engine/canvas_modes.cpp b/engine/canvas_modes.cpp index 6b3dbf0..80e2e7a 100644 --- a/engine/canvas_modes.cpp +++ b/engine/canvas_modes.cpp @@ -490,7 +490,7 @@ void CanvasModeMaskFree::on_MouseEvent(MouseEvent* me, glm::vec2& loc) void CanvasModeMaskFree::on_Draw(const glm::mat4& ortho, const glm::mat4& proj, const glm::mat4& camera) { - if (!m_points.empty()) + if (m_points.size() > 3) { if (m_dragging) { @@ -623,7 +623,7 @@ void CanvasModeMaskLine::on_MouseEvent(MouseEvent* me, glm::vec2& loc) void CanvasModeMaskLine::on_Draw(const glm::mat4& ortho, const glm::mat4& proj, const glm::mat4& camera) { - if (!m_points.empty()) + if (m_points.size() > 3) { if (m_active_tool) { diff --git a/engine/node_panel_stroke.cpp b/engine/node_panel_stroke.cpp index 0317f01..cc0e486 100644 --- a/engine/node_panel_stroke.cpp +++ b/engine/node_panel_stroke.cpp @@ -29,6 +29,8 @@ void NodePanelStroke::update_controls() m_tip_opacity->m_value.x = b.m_tip_opacity; m_tip_angle->m_value.x = b.m_tip_angle; m_tip_stencil->m_value.x = b.m_tip_stencil; + m_tip_wet->m_value.x = b.m_tip_wet; + m_tip_noise->m_value.x = b.m_tip_noise; m_jitter_scale->m_value.x = b.m_jitter_scale; m_jitter_angle->m_value.x = b.m_jitter_angle; m_jitter_spread->m_value.x = b.m_jitter_spread; @@ -55,6 +57,7 @@ void NodePanelStroke::init_controls() init_slider(m_tip_angle, "tip-angle", &ui::Brush::m_tip_angle); init_slider(m_tip_stencil, "tip-stencil", &ui::Brush::m_tip_stencil); init_slider(m_tip_wet, "tip-wet", &ui::Brush::m_tip_wet); + init_slider(m_tip_noise, "tip-wet", &ui::Brush::m_tip_noise); init_slider(m_jitter_scale, "jitter-scale", &ui::Brush::m_jitter_scale); init_slider(m_jitter_angle, "jitter-angle", &ui::Brush::m_jitter_angle); init_slider(m_jitter_spread, "jitter-spread", &ui::Brush::m_jitter_spread); diff --git a/engine/node_panel_stroke.h b/engine/node_panel_stroke.h index 8e4c912..4faf743 100644 --- a/engine/node_panel_stroke.h +++ b/engine/node_panel_stroke.h @@ -18,6 +18,7 @@ public: NodeSliderH* m_tip_angle; NodeSliderH* m_tip_stencil; NodeSliderH* m_tip_wet; + NodeSliderH* m_tip_noise; NodeSliderH* m_jitter_scale; NodeSliderH* m_jitter_angle; NodeSliderH* m_jitter_spread; diff --git a/engine/shader.h b/engine/shader.h index 8582d60..9a5af83 100644 --- a/engine/shader.h +++ b/engine/shader.h @@ -24,6 +24,7 @@ enum class kShaderUniform : uint16_t Resolution = const_hash("resolution"), Highlight = const_hash("highlight"), BlendMode = const_hash("blend_mode"), + Noise = const_hash("noise"), }; enum class kShader : uint16_t