diff --git a/src/canvas.cpp b/src/canvas.cpp index 16e0ec8..a780ccb 100644 --- a/src/canvas.cpp +++ b/src/canvas.cpp @@ -74,48 +74,16 @@ void Canvas::pick_update(int plane) App::I->render_task([this, plane] { - // save viewport and clear color states - GLint vp[4]; - GLfloat cc[4]; - glGetIntegerv(GL_VIEWPORT, vp); - glGetFloatv(GL_COLOR_CLEAR_VALUE, cc); - GLboolean blend = glIsEnabled(GL_BLEND); - - // prepare common states - glViewport(0, 0, m_width, m_height); - glEnable(GL_BLEND); + std::array faces{ false }; + faces[plane] = true; + draw_merge(faces); int i = plane; - m_tmp[i].bindFramebuffer(); - m_tmp[i].clear({ 1, 1, 1, 1 }); - - ShaderManager::use(kShader::TextureAlpha); - 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)); - glActiveTexture(GL_TEXTURE0); - m_sampler.bind(0); - for (auto& l : m_layers) - { - if (!l->m_visible || l->m_opacity == 0.f) - continue; - ShaderManager::u_float(kShaderUniform::Alpha, l->m_opacity); - l->m_rtt[i].bindTexture(); - m_plane.draw_fill(); - l->m_rtt[i].unbindTexture(); - } - m_sampler.unbind(); - + m_layers_merge.m_rtt[i].bindFramebuffer(); if (!m_pick_data[plane]) m_pick_data[plane] = std::make_unique(m_width * m_height); glReadPixels(0, 0, m_width, m_height, GL_RGBA, GL_UNSIGNED_BYTE, m_pick_data[plane].get()); - m_tmp[i].unbindFramebuffer(); - - // restore viewport and clear color states - blend ? glEnable(GL_BLEND) : glDisable(GL_BLEND); - glViewport(vp[0], vp[1], vp[2], vp[3]); - glClearColor(cc[0], cc[1], cc[2], cc[3]); - glActiveTexture(GL_TEXTURE0); + m_layers_merge.m_rtt[i].unbindFramebuffer(); }); m_pick_ready[plane] = true; @@ -958,6 +926,8 @@ void Canvas::draw_merge(std::array faces /*= SIXPLETTE(false)*/) { use_blend |= l->m_blend_mode != 0; } + if (Canvas::I->m_current_stroke) + use_blend |= Canvas::I->m_current_stroke->m_brush->m_blend_mode != 0; // if not using shader blend, use gl rasterizer blend glDisable(GL_DEPTH_TEST); @@ -1000,6 +970,9 @@ void Canvas::draw_merge(std::array faces /*= SIXPLETTE(false)*/) if (m_current_stroke && m_current_mode == kCanvasMode::Erase && m_show_tmp && m_current_layer_idx == layer_index) { m_sampler.bind(0); + m_sampler.bind(1); + m_sampler.bind(2); + ShaderManager::use(kShader::CompErase); ShaderManager::u_int(kShaderUniform::Tex, 0); ShaderManager::u_int(kShaderUniform::TexStroke, 1); @@ -1025,6 +998,10 @@ void Canvas::draw_merge(std::array faces /*= SIXPLETTE(false)*/) else if (m_current_stroke && m_show_tmp && m_current_layer_idx == layer_index) { m_sampler.bind(0); + m_sampler.bind(1); + m_sampler.bind(2); + m_sampler.bind(3); + m_sampler_stencil.bind(4); glm::vec2 patt_scale = glm::vec2(b->m_pattern_scale); if (b->m_pattern_flipx) patt_scale.x *= -1.f; @@ -1081,7 +1058,7 @@ void Canvas::draw_merge(std::array faces /*= SIXPLETTE(false)*/) } else { - m_sampler.bind(0); + m_cam_fov < 20.f ? m_sampler_nearest.bind(0) : m_sampler.bind(0); ShaderManager::use(kShader::TextureAlpha); ShaderManager::u_int(kShaderUniform::Tex, 0); ShaderManager::u_float(kShaderUniform::Alpha, m_layers[layer_index]->m_opacity); @@ -1103,6 +1080,7 @@ void Canvas::draw_merge(std::array faces /*= SIXPLETTE(false)*/) if (use_blend) { m_sampler.bind(0); + m_sampler.bind(2); ShaderManager::use(kShader::TextureBlend); ShaderManager::u_int(kShaderUniform::Tex, 0);