diff --git a/data/layout.xml b/data/layout.xml index 503a9c4..49b431e 100644 --- a/data/layout.xml +++ b/data/layout.xml @@ -119,7 +119,7 @@ - + diff --git a/engine/app_shaders.cpp b/engine/app_shaders.cpp index 015b56e..db154de 100644 --- a/engine/app_shaders.cpp +++ b/engine/app_shaders.cpp @@ -76,19 +76,10 @@ void App::initShaders() " mediump vec4 stroke = texture(tex_stroke, uv.xy);\n" " stroke.a = stroke.a * alpha;\n" - " if (lock){\n" - " mediump float alpha_tot = stroke.a + (1.0 - stroke.a) * base.a;" - " mediump vec3 rgb = mix(base.rgb, stroke.rgb, stroke.a / alpha_tot);\n" - " frag = vec4(rgb, base.a);\n" - " } else {\n" - " mediump float alpha_tot = stroke.a + (1.0 - stroke.a) * base.a;" - " mediump vec3 rgb = mix(base.rgb, stroke.rgb, stroke.a / alpha_tot);\n" - " frag = vec4(rgb, alpha_tot);\n" - " }\n" - -// " mediump float alpha_tot = stroke.a + (1.0 - stroke.a) * base.a;" -// " mediump vec3 rgb = mix(base.rgb, stroke.rgb, stroke.a / alpha_tot);\n" -// " frag = vec4(rgb, alpha_tot);\n" + " mediump float contribution = (1.0 - base.a) * stroke.a;\n" + " mediump float alpha_tot = base.a + contribution;" + " mediump vec3 rgb = mix(base.rgb, stroke.rgb, stroke.a / alpha_tot);\n" + " frag = vec4(rgb, lock ? base.a : alpha_tot);\n" "}\n"; // TEXTURE ATLAS @@ -213,9 +204,9 @@ void App::initShaders() "}\n"; static const char* shader_stroke_f = SHADER_VERSION - #ifdef __IOS__ +#ifdef __IOS__ "#extension GL_EXT_shader_framebuffer_fetch : enable\n" - #endif +#endif "uniform mediump sampler2D tex;\n" "uniform mediump sampler2D tex_bg;\n" "uniform mediump vec4 col;\n" @@ -223,130 +214,26 @@ void App::initShaders() "uniform mediump float alpha;\n" "in mediump vec2 uv;\n" "in mediump float q;\n" - #ifdef __IOS__ +#ifdef __IOS__ "inout mediump vec4 frag;\n" - #else +#else "out mediump vec4 frag;\n" - #endif +#endif "void main(){\n" " mediump vec2 uv2 = gl_FragCoord.st / resolution;\n" " mediump float brush_alpha = ( 1.0 - texture(tex, uv/q).r ) * alpha;\n" " mediump vec4 fg = vec4(col.rgb, brush_alpha);\n" - #ifdef __IOS__ +#ifdef __IOS__ " mediump vec4 bg = frag;\n" - #else +#else " mediump vec4 bg = texture(tex_bg, uv2);\n" - #endif - //" if (fg.a < 1.0/255.0) { frag = bg; return; }\n" - " mediump float alpha_tot = fg.a + (1.0 - fg.a) * bg.a;" +#endif + " if (fg.a == 1.0/255.0) { frag = bg; return; }\n" + " mediump float contribution = max((1.0 - bg.a) * fg.a, 1.0/255.0);\n" + " mediump float alpha_tot = bg.a + contribution;" " mediump vec3 rgb = mix(bg.rgb, fg.rgb, fg.a / alpha_tot);\n" " frag = vec4(rgb, clamp(alpha_tot, 0.0, 1.0));\n" "}\n"; - // ALPHA LOCK - static const char* shader_stroke_lock_f = - SHADER_VERSION - #ifdef __IOS__ - "#extension GL_EXT_shader_framebuffer_fetch : enable\n" - #endif - "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" - #ifdef __IOS__ - "inout mediump vec4 frag;\n" - #else - "out mediump vec4 frag;\n" - #endif - "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" - #ifdef __IOS__ - " mediump vec4 bg = frag;\n" - #else - " mediump vec4 bg = texture(tex_bg, uv2);\n" - #endif - " mediump vec4 msk = texture(tex_mask, uv2);\n" - //" if (fg.a < (1.0/255.0)) { 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, msk.a);\n" - "}\n"; - // ERASER - static const char* shader_stroke_erase_f = - SHADER_VERSION - #ifdef __IOS__ - "#extension GL_EXT_shader_framebuffer_fetch : enable\n" - #endif - "uniform mediump sampler2D tex;\n" - "uniform mediump sampler2D tex_bg;\n" - "uniform mediump vec4 col;\n" - "uniform mediump vec2 resolution;\n" - "uniform mediump float alpha;\n" - "in mediump vec2 uv;\n" - #ifdef __IOS__ - "inout mediump vec4 frag;\n" - #else - "out mediump vec4 frag;\n" - #endif - "void main(){\n" - " mediump vec2 uv2 = gl_FragCoord.st / resolution;\n" - " mediump float brush_alpha = ( 1.0 - texture(tex, uv).r ) * alpha;\n" - #ifdef __IOS__ - " mediump vec4 bg = frag;\n" - #else - " mediump vec4 bg = texture(tex_bg, uv2);\n" - #endif - " frag = vec4(bg.rgb, bg.a - bg.a * brush_alpha);\n" - "}\n"; - - // STROKE LAYER BLEND - static const char* shader_stroke_layer_v = - SHADER_VERSION - "uniform mat4 mvp;" - "in vec4 pos;" - "in vec2 uvs;" - "out vec2 uv;" - "void main(){" - " uv = uvs;" - " gl_Position = mvp * vec4(pos.xyz, 1.0);" - "}"; - static const char* shader_stroke_layer_f = - SHADER_VERSION - #ifdef __IOS__ - "#extension GL_EXT_shader_framebuffer_fetch : enable\n" - #endif - "uniform mediump sampler2D tex;\n" - "uniform mediump sampler2D tex_bg;\n" - "uniform mediump vec2 resolution;\n" - "uniform mediump float alpha;\n" - "uniform bool lock;\n" - "uniform bool erase;\n" - "in mediump vec2 uv;\n" - #ifdef __IOS__ - "inout mediump vec4 frag;\n" - #else - "out mediump vec4 frag;\n" - #endif - "void main(){\n" - " mediump vec4 fg = texture(tex, uv) * vec4(1,1,1,alpha);\n" - #ifdef __IOS__ - " mediump vec4 bg = frag;\n" - #else - " mediump vec4 bg = texture(tex_bg, uv);\n" - #endif - //" if (fg.a < (1.0/255.0)) { frag = bg; return; }\n" - " if (erase){\n" - " frag = vec4(bg.rgb, bg.a - fg.a);\n" - " } else {\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, lock ? bg.a : alpha_tot);\n" - " }\n" - "}\n"; static const char* shader_checkerboard_v = SHADER_VERSION @@ -422,12 +309,6 @@ 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)) - LOG("Failed to create shader StrokeLayer"); if (!ShaderManager::create(kShader::Checkerboard, shader_checkerboard_v, shader_checkerboard_f)) LOG("Failed to create shader Checkerboard"); if (!ShaderManager::create(kShader::Equirect, shader_equirect_v, shader_equirect_f)) diff --git a/engine/brush.cpp b/engine/brush.cpp index aeb38f9..b685626 100644 --- a/engine/brush.cpp +++ b/engine/brush.cpp @@ -164,7 +164,7 @@ ui::StrokeSample ui::Stroke::randomize_sample(const glm::vec2& pos, float pressu StrokeSample s; s.angle = (m_brush.m_tip_angle + rnd_nor() * m_brush.m_jitter_angle) * (float)(M_PI * 2.0); s.pos = pos + (rnd_vec() * m_brush.m_jitter_spread * 100.f); - s.size = 800.f * glm::pow(m_brush.m_tip_size, 2.f) * (1.f - rnd_nor() * m_brush.m_jitter_scale); + s.size = 800.f * glm::pow(m_brush.m_tip_size, 3.f) * (1.f - rnd_nor() * m_brush.m_jitter_scale); s.flow = glm::pow(m_brush.m_tip_flow, 2.f) * (1.f - rnd_nor() * m_brush.m_jitter_flow) * pressure; return s; } @@ -214,7 +214,7 @@ void ui::Stroke::start(const ui::Brush& brush) { m_last_kp = 0; m_dist = 0.f; - m_step = glm::max(brush.m_tip_spacing * 10, 1.f); + m_step = glm::max(brush.m_tip_spacing * brush.m_tip_size * 100, 1.f); m_brush = brush; prng.seed(0); } \ No newline at end of file diff --git a/engine/canvas.cpp b/engine/canvas.cpp index 1e1ca4e..6670e5d 100644 --- a/engine/canvas.cpp +++ b/engine/canvas.cpp @@ -81,20 +81,21 @@ void ui::Canvas::pick_update(int plane) { // copy to tmp2 for layer blending glActiveTexture(GL_TEXTURE0); // TODO: maybe remove this line - #ifndef __IOS__ - m_tex2[i].bind(); - glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, m_width, m_height); - m_tex2[i].unbind(); - #endif +// #ifndef __IOS__ +// m_tex2[i].bind(); +// glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, m_width, m_height); +// m_tex2[i].unbind(); +// #endif m_layers[layer_index].m_rtt[i].bindTexture(); glActiveTexture(GL_TEXTURE1); m_tex2[i].bind(); m_sampler.bind(0); m_sampler_bg.bind(1); - ShaderManager::use(ui::kShader::StrokeLayer); + ShaderManager::use(ui::kShader::TextureAlpha); ShaderManager::u_int(kShaderUniform::TexBG, 1); ShaderManager::u_float(kShaderUniform::Alpha, m_layers[layer_index].m_opacity); + ShaderManager::u_int(kShaderUniform::Highlight, false); ShaderManager::u_int(kShaderUniform::Tex, 0); ShaderManager::u_mat4(kShaderUniform::MVP, glm::ortho(-.5f, .5f, -.5f, .5f, -1.f, 1.f)); m_plane.draw_fill(); @@ -765,7 +766,7 @@ void ui::Canvas::export_equirectangular(std::string data_path) // prepare common states glViewport(0, 0, m_width, m_height); - glDisable(GL_BLEND); + glEnable(GL_BLEND); RTT m_latlong; m_latlong.create(m_width * 4, m_height * 2); // NOTE: w and h must be equal to make sense @@ -792,18 +793,19 @@ void ui::Canvas::export_equirectangular(std::string data_path) { // copy to tmp2 for layer blending glActiveTexture(GL_TEXTURE0); // TODO: maybe remove this line - m_tex2[i].bind(); - glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, m_width, m_height); - m_tex2[i].unbind(); +// m_tex2[i].bind(); +// glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, m_width, m_height); +// m_tex2[i].unbind(); m_layers[layer_index].m_rtt[i].bindTexture(); glActiveTexture(GL_TEXTURE1); m_tex2[i].bind(); m_sampler.bind(0); m_sampler_bg.bind(1); - ShaderManager::use(ui::kShader::StrokeLayer); - ShaderManager::u_int(kShaderUniform::TexBG, 1); + ShaderManager::use(ui::kShader::TextureAlpha); + //ShaderManager::u_int(kShaderUniform::TexBG, 1); ShaderManager::u_float(kShaderUniform::Alpha, m_layers[layer_index].m_opacity); + ShaderManager::u_int(kShaderUniform::Highlight, false); ShaderManager::u_int(kShaderUniform::Tex, 0); ShaderManager::u_mat4(kShaderUniform::MVP, glm::ortho(-.5f, .5f, -.5f, .5f, -1.f, 1.f)); m_plane.draw_fill(); @@ -921,9 +923,10 @@ void ui::Canvas::export_anim(std::string data_path) m_tex2[i].bind(); m_sampler.bind(0); m_sampler_bg.bind(1); - ShaderManager::use(ui::kShader::StrokeLayer); + ShaderManager::use(ui::kShader::TextureAlpha); ShaderManager::u_int(kShaderUniform::TexBG, 1); ShaderManager::u_float(kShaderUniform::Alpha, 1); + ShaderManager::u_int(kShaderUniform::Highlight, false); ShaderManager::u_int(kShaderUniform::Tex, 0); ShaderManager::u_mat4(kShaderUniform::MVP, glm::ortho(-.5f, .5f, -.5f, .5f, -1.f, 1.f)); m_plane.draw_fill(); diff --git a/engine/canvas_modes.cpp b/engine/canvas_modes.cpp index ba82a58..7522b20 100644 --- a/engine/canvas_modes.cpp +++ b/engine/canvas_modes.cpp @@ -30,7 +30,7 @@ void CanvasModeBasicCamera::on_MouseEvent(MouseEvent* me, glm::vec2& loc) break; case kEventType::MouseMove: if (m_draggingR) - canvas->m_pan = m_pan_start + (me->m_pos - m_dragR_start) * glm::vec2(-1, -1); + canvas->m_pan = m_pan_start + (me->m_pos - m_dragR_start) * glm::vec2(-1, -1) * (canvas->m_cam_fov / 85.f); canvas->m_cam_rot = canvas->m_pan * 0.003f; break; case kEventType::MouseScroll: @@ -56,7 +56,7 @@ void CanvasModeBasicCamera::on_GestureEvent(GestureEvent* ge) m_camera_fov = canvas->m_cam_fov; break; case kEventType::GestureMove: - canvas->m_pan = m_pan_start + ge->m_pos_delta * glm::vec2(-1, -1) * 0.3f; + canvas->m_pan = m_pan_start + ge->m_pos_delta * glm::vec2(-1, -1) * 0.3f * (canvas->m_cam_fov / 85.f); canvas->m_cam_fov = m_camera_fov - ge->m_distance_delta * .05f; canvas->m_cam_rot = canvas->m_pan * 0.003f; break; diff --git a/engine/shader.h b/engine/shader.h index dfed262..a1becef 100644 --- a/engine/shader.h +++ b/engine/shader.h @@ -33,9 +33,6 @@ enum class kShader : uint16_t Font = const_hash("font"), Atlas = const_hash("atlas"), Stroke = const_hash("stroke"), - StrokeLock = const_hash("stroke-lock"), - StrokeErase = const_hash("stroke-erase"), - StrokeLayer = const_hash("stroke-layer"), Checkerboard= const_hash("checkerboard"), Equirect = const_hash("equirect"), };