From c752434e98063efb1c09cd18fe173e3f35b1514b Mon Sep 17 00:00:00 2001 From: omigamedev Date: Wed, 20 Feb 2019 01:26:38 +0100 Subject: [PATCH] pattern tweaks --- src/app_shaders.cpp | 61 +++++++++++++++++++++++-------------- src/app_vr.cpp | 1 + src/canvas.cpp | 14 ++++++--- src/canvas.h | 2 +- src/canvas_modes.cpp | 2 +- src/node_canvas.cpp | 3 +- src/node_stroke_preview.cpp | 11 +++++-- 7 files changed, 60 insertions(+), 34 deletions(-) diff --git a/src/app_shaders.cpp b/src/app_shaders.cpp index 58f870a..c50d281 100644 --- a/src/app_shaders.cpp +++ b/src/app_shaders.cpp @@ -65,20 +65,20 @@ #define SHADER_FUNCTION_COLOR \ "mediump vec3 brightness3(mediump vec3 c, mediump float val) {\n"\ - " return c + vec3(val * 2.0 - 1.0);\n"\ + " return clamp(c + vec3(val * 2.0 - 1.0), vec3(0), vec3(1));\n"\ "}\n"\ "mediump vec3 contrast3(mediump vec3 c, mediump float val) {\n"\ " val = val * 2.0 - 1.0;\n"\ " mediump float factor = ((259.0 / 255.0) * (val + 1.0)) / (1.0 * ((259.0 / 255.0) - val));\n"\ - " return factor * (c - 0.5) + 0.5;\n"\ + " return clamp(factor * (c - 0.5) + 0.5, vec3(0), vec3(1));\n"\ "}\n"\ "mediump float brightness1(mediump float c, mediump float val) {\n"\ - " return c + (val * 2.0 - 1.0);\n"\ + " return clamp(c + (val * 2.0 - 1.0), 0.0, 1.0);\n"\ "}\n"\ "mediump float contrast1(mediump float c, mediump float val) {\n"\ " val = val * 2.0 - 1.0;\n"\ " mediump float factor = ((259.0 / 255.0) * (val + 1.0)) / (1.0 * ((259.0 / 255.0) - val));\n"\ - " return factor * (c - 0.5) + 0.5;\n"\ + " return clamp(factor * (c - 0.5) + 0.5, 0.0, 1.0);\n"\ "}\n" // http://byteblacksmith.com/improvements-to-the-canonical-one-liner-glsl-rand-for-opengl-es-2-0/ @@ -236,23 +236,27 @@ void App::initShaders() "uniform sampler2D tex;\n" "uniform sampler2D tex_stroke;\n" "uniform sampler2D tex_mask;\n" - "uniform sampler2D tex_dual;\n" - "uniform sampler2D tex_pattern;\n" "uniform mediump float alpha;\n" "uniform mediump float stroke_alpha;\n" - "uniform mediump float pattern_alpha;\n" "uniform mediump int blend_mode;\n" - "uniform mediump int dual_blend_mode;\n" "uniform mediump vec2 resolution;\n" - "uniform mediump vec2 pattern_scale;\n" - "uniform mediump float pattern_bright;\n" - "uniform mediump float pattern_contr;\n" - "uniform mediump float dual_alpha;\n" "uniform bool lock;\n" "uniform bool mask;\n" "uniform bool fragUV2;\n" + "uniform bool use_dual;\n" + "uniform sampler2D tex_dual;\n" + "uniform mediump float dual_alpha;\n" + "uniform mediump int dual_blend_mode;\n" + "uniform bool use_pattern;\n" + "uniform sampler2D tex_pattern;\n" + "uniform mediump float pattern_alpha;\n" + "uniform mediump vec2 pattern_scale;\n" + "uniform mediump float pattern_bright;\n" + "uniform mediump float pattern_contr;\n" + "uniform mediump vec2 pattern_offset;\n" + "in mediump vec2 uv;\n" "out mediump vec4 frag;\n" SHADER_FUNCTION_BLUR @@ -264,16 +268,16 @@ void App::initShaders() " mediump vec4 base = texture(tex, uv2);\n" " mediump vec4 stroke = texture(tex_stroke, uv);\n" " if (use_pattern){\n" - " mediump float patt = texture(tex_pattern, uv2 * pattern_scale * 10.0).r;\n" + " mediump vec2 rscale = resolution / vec2(512.0);\n" + " mediump float patt = texture(tex_pattern, uv2 * (0.5 / pattern_scale) * rscale + pattern_offset).r;\n" " if (pattern_bright != 0.5)\n" - " patt = brightness1(patt, pattern_bright);\n" + " patt = brightness1(patt, 1.0 - pattern_bright);\n" " if (pattern_contr != 0.5)\n" " patt = contrast1(patt, pattern_contr);\n" " stroke.a = mix(stroke.a, stroke.a * patt, pattern_alpha);\n" " }\n" " if (use_dual){\n" " mediump vec4 dual = texture(tex_dual, uv);\n" - //" stroke.a = stroke.a * dual.a;\n" " stroke.a = blend_stroke(stroke.a, dual.a * dual_alpha, dual_blend_mode);\n" " }\n" " stroke.a = mask ? stroke.a * stroke_alpha * blur(tex_mask, uv2).r : stroke.a * stroke_alpha;\n" @@ -418,17 +422,22 @@ void App::initShaders() SHADER_EXT_FB_FETCH "uniform mediump sampler2D tex;\n" "uniform mediump sampler2D tex_bg;\n" - "uniform mediump sampler2D tex_pattern;\n" "uniform mediump sampler2D tex_mix;\n" "uniform mediump vec4 col;\n" "uniform mediump vec2 resolution;\n" "uniform mediump float alpha;\n" "uniform mediump float noise;\n" - "uniform mediump vec2 pattern_offset;\n" - "uniform mediump float pattern_alpha;\n" "uniform mediump float mix_alpha;\n" "uniform mediump float wet;\n" + "uniform bool use_pattern;\n" + "uniform mediump sampler2D tex_pattern;\n" + "uniform mediump float pattern_alpha;\n" + "uniform mediump vec2 pattern_scale;\n" + "uniform mediump float pattern_bright;\n" + "uniform mediump float pattern_contr;\n" + "uniform mediump vec2 pattern_offset;\n" + "in mediump vec2 uv;\n" "in mediump vec2 uv_2;\n" "in mediump float q;\n" @@ -438,11 +447,20 @@ void App::initShaders() " out mediump vec4 frag;\n" "#endif\n" SHADER_FUNCTION_RAND + SHADER_FUNCTION_COLOR "void main() {\n" " mediump vec2 uv2 = gl_FragCoord.st / resolution;\n" - " mediump float pattern = use_pattern ? 1.0 - (texture(tex_pattern, (uv2+pattern_offset) * 5.0).r) * pattern_alpha : 1.0;\n" " mediump float brush_alpha = ( 1.0 - texture(tex, uv/q).r ) * alpha;\n" - " mediump vec4 fg = vec4(col.rgb, brush_alpha * pattern);\n" + " mediump vec4 fg = vec4(col.rgb, brush_alpha);\n" + " if (use_pattern){\n" + " mediump vec2 rscale = resolution / vec2(512.0);\n" + " mediump float patt = texture(tex_pattern, uv2 * (0.5 / pattern_scale) * rscale + pattern_offset).r;\n" + " if (pattern_bright != 0.5)\n" + " patt = brightness1(patt, 1.0 - pattern_bright);\n" + " if (pattern_contr != 0.5)\n" + " patt = contrast1(patt, pattern_contr);\n" + " fg.a = mix(fg.a, fg.a * patt, pattern_alpha);\n" + " }\n" "#if defined(GL_EXT_shader_framebuffer_fetch)\n" " mediump vec4 bg = frag;\n" "#elif defined(GL_ARM_shader_framebuffer_fetch)\n" @@ -464,9 +482,6 @@ void App::initShaders() " mediump vec4 frag_wet = vec4(rgb, max(bg.a, fg.a * 1.2));\n" " mediump vec4 frag_dry = vec4(rgb, alpha_tot);\n" " frag = mix(frag_dry, frag_wet, wet);\n" - -// " mediump vec4 mbg = texture(tex_mix, uv_2 / q);\n" -// " frag.rgb = mix(frag.rgb, mbg.rgb, mix_alpha * mbg.a);\n" "}\n"; static const char* shader_checkerboard_v = diff --git a/src/app_vr.cpp b/src/app_vr.cpp index 8d5a037..f0ecba2 100644 --- a/src/app_vr.cpp +++ b/src/app_vr.cpp @@ -106,6 +106,7 @@ void App::vr_draw(const glm::mat4& proj, const glm::mat4& camera, const glm::mat ShaderManager::u_vec2(kShaderUniform::PatternScale, glm::vec2(b->m_pattern_scale)); ShaderManager::u_float(kShaderUniform::PatternBright, b->m_pattern_brightness); ShaderManager::u_float(kShaderUniform::PatternContrast, b->m_pattern_contrast); + ShaderManager::u_vec2(kShaderUniform::PatternOffset, Canvas::I->m_pattern_offset); glActiveTexture(GL_TEXTURE0); canvas->m_canvas->m_layers[layer_index].m_rtt[plane_index].bindTexture(); diff --git a/src/canvas.cpp b/src/canvas.cpp index db2b2e4..346dc5d 100644 --- a/src/canvas.cpp +++ b/src/canvas.cpp @@ -246,7 +246,7 @@ void Canvas::stroke_draw_mix(const glm::vec2& bb_min, const glm::vec2& bb_sz) //ShaderManager::u_int(kShaderUniform::TexA, 0); ShaderManager::u_int(kShaderUniform::TexStroke, 1); 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_float(kShaderUniform::StrokeAlpha, b->m_tip_opacity); ShaderManager::u_float(kShaderUniform::PatternAlpha, b->m_pattern_opacity); @@ -493,8 +493,11 @@ void Canvas::stroke_draw() ShaderManager::u_int(kShaderUniform::TexMix, 3); // mixer //ShaderManager::u_int(kShaderUniform::TexMixA, 4); // mixer ShaderManager::u_vec2(kShaderUniform::Resolution, { m_width, m_height }); - ShaderManager::u_vec2(kShaderUniform::PatternOffset, stencil_offset); ShaderManager::u_float(kShaderUniform::PatternAlpha, brush->m_pattern_opacity); + ShaderManager::u_vec2(kShaderUniform::PatternScale, glm::vec2(brush->m_pattern_scale)); + ShaderManager::u_float(kShaderUniform::PatternBright, brush->m_pattern_brightness); + ShaderManager::u_float(kShaderUniform::PatternContrast, brush->m_pattern_contrast); + ShaderManager::u_vec2(kShaderUniform::PatternOffset, m_pattern_offset); ShaderManager::u_int(kShaderUniform::UsePattern, brush->m_pattern_enabled && brush->m_pattern_eachsample); ShaderManager::u_float(kShaderUniform::MixAlpha, brush->m_tip_mix); ShaderManager::u_float(kShaderUniform::Wet, brush->m_tip_wet); @@ -787,7 +790,7 @@ void Canvas::stroke_commit() ShaderManager::u_int(kShaderUniform::TexMask, 2); ShaderManager::u_int(kShaderUniform::TexDual, 3); 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::PatternAlpha, b->m_pattern_opacity); ShaderManager::u_float(kShaderUniform::Alpha, 1); @@ -801,6 +804,7 @@ void Canvas::stroke_commit() ShaderManager::u_vec2(kShaderUniform::PatternScale, glm::vec2(b->m_pattern_scale)); ShaderManager::u_float(kShaderUniform::PatternBright, b->m_pattern_brightness); ShaderManager::u_float(kShaderUniform::PatternContrast, b->m_pattern_contrast); + ShaderManager::u_vec2(kShaderUniform::PatternOffset, m_pattern_offset); ShaderManager::u_float(kShaderUniform::DualAlpha, b->m_dual_opacity); glActiveTexture(GL_TEXTURE0); @@ -875,7 +879,7 @@ void Canvas::stroke_start(glm::vec3 point, float pressure) m_commit_delayed = false; } - stencil_offset = glm::vec2((rand()%1000)*0.001f, (rand()%1000)*0.001f); + m_pattern_offset = glm::vec2((rand()%1000)*0.001f, (rand()%1000)*0.001f); m_current_stroke = std::make_unique(); m_current_stroke->m_camera.rot = m_cam_rot; @@ -1002,7 +1006,7 @@ void Canvas::layer_merge(int source_idx, int dest_idx) // m_layer index ShaderManager::use(kShader::CompDraw); ShaderManager::u_int(kShaderUniform::Tex, 0); // dest ShaderManager::u_int(kShaderUniform::TexStroke, 1); // source - //ShaderManager::u_vec2(kShaderUniform::Resolution, m_size); + ShaderManager::u_vec2(kShaderUniform::Resolution, m_size); ShaderManager::u_int(kShaderUniform::UseFragCoordUV2, false); ShaderManager::u_float(kShaderUniform::StrokeAlpha, 1); ShaderManager::u_float(kShaderUniform::PatternAlpha, 0); diff --git a/src/canvas.h b/src/canvas.h index cef249c..788013d 100644 --- a/src/canvas.h +++ b/src/canvas.h @@ -185,7 +185,7 @@ public: static glm::vec3 m_plane_normal[6]; static glm::vec3 m_plane_tangent[6]; static glm::mat4 m_plane_transform[6]; - glm::vec2 stencil_offset; + glm::vec2 m_pattern_offset; Sampler m_sampler; Sampler m_sampler_nearest; Sampler m_sampler_linear; diff --git a/src/canvas_modes.cpp b/src/canvas_modes.cpp index 6c5a4bf..5dcb2bb 100644 --- a/src/canvas_modes.cpp +++ b/src/canvas_modes.cpp @@ -1157,7 +1157,7 @@ void CanvasModeTransform::leave() ShaderManager::u_float(kShaderUniform::StrokeAlpha, 1); ShaderManager::u_int(kShaderUniform::Lock, false); ShaderManager::u_int(kShaderUniform::Mask, false); - ShaderManager::u_int(kShaderUniform::UseFragCoordUV2, true); + ShaderManager::u_int(kShaderUniform::UseFragCoordUV2, false); ShaderManager::u_vec2(kShaderUniform::Resolution, Canvas::I->m_size); ShaderManager::u_int(kShaderUniform::BlendMode, 0); ShaderManager::u_int(kShaderUniform::UseDual, false); diff --git a/src/node_canvas.cpp b/src/node_canvas.cpp index 2cfe256..cd92457 100644 --- a/src/node_canvas.cpp +++ b/src/node_canvas.cpp @@ -209,7 +209,7 @@ void NodeCanvas::draw() ShaderManager::u_int(kShaderUniform::TexStroke, 1); ShaderManager::u_int(kShaderUniform::TexMask, 2); ShaderManager::u_int(kShaderUniform::TexDual, 3); - //ShaderManager::u_vec2(kShaderUniform::Resolution, zw(m_canvas->m_box) / zoom); + 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::PatternAlpha, b->m_pattern_opacity); @@ -225,6 +225,7 @@ void NodeCanvas::draw() ShaderManager::u_vec2(kShaderUniform::PatternScale, glm::vec2(b->m_pattern_scale)); ShaderManager::u_float(kShaderUniform::PatternBright, b->m_pattern_brightness); ShaderManager::u_float(kShaderUniform::PatternContrast, b->m_pattern_contrast); + ShaderManager::u_vec2(kShaderUniform::PatternOffset, Canvas::I->m_pattern_offset); ShaderManager::u_float(kShaderUniform::DualAlpha, b->m_dual_opacity); glActiveTexture(GL_TEXTURE0); diff --git a/src/node_stroke_preview.cpp b/src/node_stroke_preview.cpp index 38d87d2..5ddfd92 100644 --- a/src/node_stroke_preview.cpp +++ b/src/node_stroke_preview.cpp @@ -76,7 +76,7 @@ void NodeStrokePreview::stroke_draw_mix(const glm::vec2& bb_min, const glm::vec2 ShaderManager::u_int(kShaderUniform::TexMask, 2); ShaderManager::u_int(kShaderUniform::TexDual, 3); 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::PatternAlpha, b->m_pattern_opacity); ShaderManager::u_float(kShaderUniform::Alpha, 1); @@ -91,6 +91,7 @@ void NodeStrokePreview::stroke_draw_mix(const glm::vec2& bb_min, const glm::vec2 ShaderManager::u_vec2(kShaderUniform::PatternScale, glm::vec2(b->m_pattern_scale)); ShaderManager::u_float(kShaderUniform::PatternBright, b->m_pattern_brightness); ShaderManager::u_float(kShaderUniform::PatternContrast, b->m_pattern_contrast); + ShaderManager::u_vec2(kShaderUniform::PatternOffset, glm::vec2(0)); ShaderManager::u_float(kShaderUniform::DualAlpha, b->m_dual_opacity); m_sampler_linear.bind(0); @@ -288,8 +289,11 @@ void NodeStrokePreview::draw_stroke() ShaderManager::u_int(kShaderUniform::TexMix, 3); // mixer //ShaderManager::u_int(kShaderUniform::TexMixA, 4); // mixer ShaderManager::u_vec2(kShaderUniform::Resolution, size); - ShaderManager::u_vec2(kShaderUniform::PatternOffset, glm::vec2(0)); ShaderManager::u_float(kShaderUniform::PatternAlpha, b->m_pattern_opacity); + ShaderManager::u_vec2(kShaderUniform::PatternScale, glm::vec2(b->m_pattern_scale)); + ShaderManager::u_float(kShaderUniform::PatternBright, b->m_pattern_brightness); + ShaderManager::u_float(kShaderUniform::PatternContrast, b->m_pattern_contrast); + ShaderManager::u_vec2(kShaderUniform::PatternOffset, glm::vec2(0)); ShaderManager::u_int(kShaderUniform::UsePattern, b->m_pattern_enabled && b->m_pattern_eachsample); ShaderManager::u_mat4(kShaderUniform::MVP, ortho_proj); @@ -378,7 +382,7 @@ void NodeStrokePreview::draw_stroke() ShaderManager::u_int(kShaderUniform::TexMask, 2); ShaderManager::u_int(kShaderUniform::TexDual, 3); ShaderManager::u_int(kShaderUniform::TexPattern, 4); - //ShaderManager::u_vec2(kShaderUniform::Resolution, m_size); + ShaderManager::u_vec2(kShaderUniform::Resolution, size); ShaderManager::u_float(kShaderUniform::StrokeAlpha, b->m_tip_opacity); ShaderManager::u_float(kShaderUniform::PatternAlpha, b->m_pattern_opacity); ShaderManager::u_float(kShaderUniform::Alpha, 1); @@ -392,6 +396,7 @@ void NodeStrokePreview::draw_stroke() ShaderManager::u_vec2(kShaderUniform::PatternScale, glm::vec2(b->m_pattern_scale)); ShaderManager::u_float(kShaderUniform::PatternBright, b->m_pattern_brightness); ShaderManager::u_float(kShaderUniform::PatternContrast, b->m_pattern_contrast); + ShaderManager::u_vec2(kShaderUniform::PatternOffset, glm::vec2(0)); ShaderManager::u_float(kShaderUniform::DualAlpha, b->m_dual_opacity); m_sampler_linear.bind(0);