implement frame buffer fetch extension for iOS, change composition on stroke drawing and commit, add rename layer dialog
This commit is contained in:
@@ -81,9 +81,11 @@ 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
|
||||
|
||||
m_layers[layer_index].m_rtt[i].bindTexture();
|
||||
glActiveTexture(GL_TEXTURE1);
|
||||
@@ -122,12 +124,12 @@ glm::vec4 ui::Canvas::pick_get(glm::vec2 canvas_loc)
|
||||
glm::vec3 ray_dir;
|
||||
glm::vec3 hit_pos;
|
||||
glm::vec3 hit_normal;
|
||||
glm::vec2 fb_pos;
|
||||
int plane_id;
|
||||
if (point_trace(canvas_loc, ray_origin, ray_dir, hit_pos, hit_normal, plane_id))
|
||||
if (point_trace(canvas_loc, ray_origin, ray_dir, hit_pos, fb_pos, hit_normal, plane_id))
|
||||
{
|
||||
pick_update(plane_id);
|
||||
glm::vec2 fbpos = (hit_pos.xy() * 0.5f + 0.5f) * glm::vec2(m_width, m_height);
|
||||
int i = (int)fbpos.x + (int)fbpos.y * m_width;
|
||||
int i = (int)fb_pos.x + (int)fb_pos.y * m_width;
|
||||
return glm::vec4(m_pick_data[plane_id][i]) / 255.f;
|
||||
}
|
||||
return {0,0,0,1};
|
||||
@@ -229,21 +231,21 @@ void ui::Canvas::stroke_draw()
|
||||
else
|
||||
{
|
||||
glDisable(GL_BLEND);
|
||||
if (m_state == kCanvasMode::Erase)
|
||||
{
|
||||
ShaderManager::use(ui::kShader::StrokeErase);
|
||||
//ShaderManager::u_vec4(kShaderUniform::Col, m_brush.m_tip_color);
|
||||
}
|
||||
else if(m_layers[m_current_layer_idx].m_alpha_locked)
|
||||
{
|
||||
ShaderManager::use(kShader::StrokeLock);
|
||||
ShaderManager::u_vec4(kShaderUniform::Col, m_brush.m_tip_color);
|
||||
ShaderManager::u_int(kShaderUniform::TexMask, 2); // alpha mask
|
||||
glActiveTexture(GL_TEXTURE2);
|
||||
m_layers[m_current_layer_idx].m_rtt[i].bindTexture();
|
||||
glActiveTexture(GL_TEXTURE1);
|
||||
}
|
||||
else
|
||||
// if (0 && m_state == kCanvasMode::Erase)
|
||||
// {
|
||||
// ShaderManager::use(ui::kShader::StrokeErase);
|
||||
// //ShaderManager::u_vec4(kShaderUniform::Col, m_brush.m_tip_color);
|
||||
// }
|
||||
// else if(m_layers[m_current_layer_idx].m_alpha_locked)
|
||||
// {
|
||||
// ShaderManager::use(kShader::StrokeLock);
|
||||
// ShaderManager::u_vec4(kShaderUniform::Col, m_brush.m_tip_color);
|
||||
// ShaderManager::u_int(kShaderUniform::TexMask, 2); // alpha mask
|
||||
// glActiveTexture(GL_TEXTURE2);
|
||||
// m_layers[m_current_layer_idx].m_rtt[i].bindTexture();
|
||||
// glActiveTexture(GL_TEXTURE1);
|
||||
// }
|
||||
// else
|
||||
{
|
||||
ShaderManager::use(ui::kShader::Stroke);
|
||||
ShaderManager::u_vec4(kShaderUniform::Col, m_brush.m_tip_color);
|
||||
@@ -311,10 +313,12 @@ void ui::Canvas::stroke_draw()
|
||||
glm::vec2 pad(1);
|
||||
glm::ivec2 tex_pos = glm::clamp(glm::floor(bb_min) - pad , { 0, 0 }, { m_width, m_height });
|
||||
glm::ivec2 tex_sz = glm::clamp(glm::ceil(bb_sz ) + pad*2.f, { 0, 0 }, (glm::vec2)(glm::ivec2(m_width, m_height) - tex_pos));
|
||||
#ifndef __IOS__
|
||||
glCopyTexSubImage2D(GL_TEXTURE_2D, 0,
|
||||
tex_pos.x, tex_pos.y,
|
||||
tex_pos.x, tex_pos.y,
|
||||
tex_sz.x, tex_sz.y);
|
||||
#endif
|
||||
|
||||
m_dirty_box[i].xy = glm::min(m_dirty_box[i].xy(), (glm::vec2)tex_pos);
|
||||
m_dirty_box[i].zw = glm::max(m_dirty_box[i].zw(), (glm::vec2)(tex_pos + tex_sz));
|
||||
@@ -358,11 +362,10 @@ void ui::Canvas::stroke_draw()
|
||||
}
|
||||
}
|
||||
bool ui::Canvas::point_trace(glm::vec2 loc, glm::vec3& ray_origin, glm::vec3& ray_dir,
|
||||
glm::vec3& hit_pos, glm::vec3& hit_normal, int& out_plane_id)
|
||||
glm::vec3& hit_pos, glm::vec2& fb_pos, glm::vec3& hit_normal, int& out_plane_id)
|
||||
{
|
||||
point_unproject(loc, { 0, 0, m_box.zw }, m_mv, m_proj, ray_origin, ray_dir);
|
||||
glm::vec3 hit;
|
||||
glm::vec2 fb_pos;
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
if (ray_intersect(ray_origin, ray_dir, m_plane_origin[i], m_plane_normal[i], m_plane_tangent[i], hit))
|
||||
@@ -450,7 +453,7 @@ void ui::Canvas::stroke_commit()
|
||||
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
m_dirty_box[i] = glm::vec4(0, 0, m_width, m_height); // reset bounding box
|
||||
//m_dirty_box[i] = glm::vec4(0, 0, m_width, m_height); // reset bounding box
|
||||
if (!m_dirty_face[i])
|
||||
continue; // no stroke on this face, skip it
|
||||
|
||||
@@ -483,21 +486,53 @@ void ui::Canvas::stroke_commit()
|
||||
m_sampler_bg.bind(1);
|
||||
if (m_state == kCanvasMode::Erase)
|
||||
{
|
||||
ShaderManager::use(ui::kShader::Texture);
|
||||
ui::ShaderManager::use(kShader::CompErase);
|
||||
ui::ShaderManager::u_int(kShaderUniform::Tex, 0);
|
||||
ui::ShaderManager::u_int(kShaderUniform::TexStroke, 1);
|
||||
ui::ShaderManager::u_float(kShaderUniform::Alpha, m_current_stroke->m_brush.m_tip_opacity);
|
||||
ShaderManager::u_mat4(kShaderUniform::MVP, glm::ortho(-.5f, .5f, -.5f, .5f, -1.f, 1.f));
|
||||
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
m_tex2[i].bind();
|
||||
glActiveTexture(GL_TEXTURE1);
|
||||
m_tmp[i].bindTexture();
|
||||
m_plane.draw_fill();
|
||||
m_tmp[i].unbindTexture();
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
m_tex2[i].unbind();
|
||||
}
|
||||
else
|
||||
{
|
||||
ShaderManager::use(ui::kShader::StrokeLayer);
|
||||
ShaderManager::u_int(kShaderUniform::TexBG, 1);
|
||||
ShaderManager::u_float(kShaderUniform::Alpha, m_current_stroke->m_brush.m_tip_opacity);
|
||||
ui::ShaderManager::use(kShader::CompDraw);
|
||||
ui::ShaderManager::u_int(kShaderUniform::Tex, 0);
|
||||
ui::ShaderManager::u_int(kShaderUniform::TexStroke, 1);
|
||||
ui::ShaderManager::u_float(kShaderUniform::Alpha, m_current_stroke->m_brush.m_tip_opacity);
|
||||
ShaderManager::u_mat4(kShaderUniform::MVP, glm::ortho(-.5f, .5f, -.5f, .5f, -1.f, 1.f));
|
||||
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
m_tex2[i].bind();
|
||||
glActiveTexture(GL_TEXTURE1);
|
||||
m_tmp[i].bindTexture();
|
||||
m_plane.draw_fill();
|
||||
m_tmp[i].unbindTexture();
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
m_tex2[i].unbind();
|
||||
}
|
||||
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();
|
||||
m_sampler.unbind();
|
||||
m_sampler_bg.unbind();
|
||||
m_tex2[i].unbind();
|
||||
m_tmp[i].unbindTexture();
|
||||
// else
|
||||
// {
|
||||
// ShaderManager::use(ui::kShader::StrokeLayer);
|
||||
// ShaderManager::u_int(kShaderUniform::TexBG, 1);
|
||||
// ShaderManager::u_int(kShaderUniform::Lock, m_layers[m_current_layer_idx].m_alpha_locked);
|
||||
// ShaderManager::u_float(kShaderUniform::Alpha, m_current_stroke->m_brush.m_tip_opacity);
|
||||
//
|
||||
// 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();
|
||||
// m_sampler.unbind();
|
||||
// m_sampler_bg.unbind();
|
||||
// m_tex2[i].unbind();
|
||||
// m_tmp[i].unbindTexture();
|
||||
// }
|
||||
|
||||
m_layers[m_current_layer_idx].m_rtt[i].unbindFramebuffer();
|
||||
}
|
||||
@@ -539,15 +574,15 @@ void ui::Canvas::stroke_start(glm::vec2 point, float pressure, const ui::Brush&
|
||||
m_dirty_box[i] = glm::vec4(m_width, m_height, 0, 0); // reset bounding box
|
||||
m_dirty_face[i] = false;
|
||||
|
||||
if (m_state == kCanvasMode::Erase)
|
||||
{
|
||||
m_layers[m_current_layer_idx].m_rtt[i].bindFramebuffer();
|
||||
m_tmp[i].bindTexture();
|
||||
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, m_width, m_height);
|
||||
m_tmp[i].unbindTexture();
|
||||
m_layers[m_current_layer_idx].m_rtt[i].unbindFramebuffer();
|
||||
}
|
||||
else
|
||||
// if (m_state == kCanvasMode::Erase || m_layers[m_current_layer_idx].m_alpha_locked)
|
||||
// {
|
||||
// m_layers[m_current_layer_idx].m_rtt[i].bindFramebuffer();
|
||||
// m_tmp[i].bindTexture();
|
||||
// glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, m_width, m_height);
|
||||
// m_tmp[i].unbindTexture();
|
||||
// m_layers[m_current_layer_idx].m_rtt[i].unbindFramebuffer();
|
||||
// }
|
||||
// else
|
||||
{
|
||||
m_tmp[i].bindFramebuffer();
|
||||
m_tmp[i].clear({ 0, 0, 0, 0 });
|
||||
|
||||
Reference in New Issue
Block a user