use unique_ptr to hold the Layers vector

This commit is contained in:
2019-02-24 13:19:15 +01:00
parent 3d1412aee2
commit dfa44dbb55
13 changed files with 216 additions and 200 deletions

View File

@@ -94,12 +94,12 @@ void Canvas::pick_update(int plane)
m_sampler.bind(0);
for (auto layer_index : m_order)
{
if (!m_layers[layer_index].m_visible || m_layers[layer_index].m_opacity == 0.f)
if (!m_layers[layer_index]->m_visible || m_layers[layer_index]->m_opacity == 0.f)
continue;
ShaderManager::u_float(kShaderUniform::Alpha, m_layers[layer_index].m_opacity);
m_layers[layer_index].m_rtt[i].bindTexture();
ShaderManager::u_float(kShaderUniform::Alpha, m_layers[layer_index]->m_opacity);
m_layers[layer_index]->m_rtt[i].bindTexture();
m_plane.draw_fill();
m_layers[layer_index].m_rtt[i].unbindTexture();
m_layers[layer_index]->m_rtt[i].unbindTexture();
}
m_sampler.unbind();
@@ -141,13 +141,13 @@ void Canvas::pick_end()
void Canvas::clear(const glm::vec4& c/*={0,0,0,1}*/)
{
snap_history({ 0, 1, 2, 3, 4, 5 });
m_layers[m_current_layer_idx].clear(c);
m_layers[m_current_layer_idx]->clear(c);
m_unsaved = true;
}
void Canvas::clear_all()
{
for (auto& l : m_layers)
l.clear({0, 0, 0, 0});
l->clear({0, 0, 0, 0});
}
void Canvas::snap_history(const std::vector<int>& planes)
{
@@ -155,15 +155,15 @@ void Canvas::snap_history(const std::vector<int>& planes)
action->was_saved = !m_unsaved;
for (auto i : planes)
{
if (!m_layers[m_current_layer_idx].m_dirty_face[i])
if (!m_layers[m_current_layer_idx]->m_dirty_face[i])
continue; // no stroke on this face, skip it
m_layers[m_current_layer_idx].m_rtt[i].bindFramebuffer();
m_layers[m_current_layer_idx]->m_rtt[i].bindFramebuffer();
// save image before commit
glm::vec2 box_or = xy(m_layers[m_current_layer_idx].m_dirty_box[i]);
glm::vec2 box_sz = zw(m_layers[m_current_layer_idx].m_dirty_box[i]) - xy(m_layers[m_current_layer_idx].m_dirty_box[i]);
if (box_sz.x > 0 && box_sz.y > 0 && box_sz.x <= m_layers[m_current_layer_idx].w && box_sz.y <= m_layers[m_current_layer_idx].h)
glm::vec2 box_or = xy(m_layers[m_current_layer_idx]->m_dirty_box[i]);
glm::vec2 box_sz = zw(m_layers[m_current_layer_idx]->m_dirty_box[i]) - xy(m_layers[m_current_layer_idx]->m_dirty_box[i]);
if (box_sz.x > 0 && box_sz.y > 0 && box_sz.x <= m_layers[m_current_layer_idx]->w && box_sz.y <= m_layers[m_current_layer_idx]->h)
{
action->m_image[i] = std::make_unique<uint8_t[]>(box_sz.x * box_sz.y * 4);
glReadPixels(box_or.x, box_or.y, box_sz.x, box_sz.y, GL_RGBA, GL_UNSIGNED_BYTE, action->m_image[i].get());
@@ -173,11 +173,11 @@ void Canvas::snap_history(const std::vector<int>& planes)
LOG("snap_history invalid box size (%d, %d)", (int)box_sz.x, (int)box_sz.y);
}
action->m_box[i] = m_layers[m_current_layer_idx].m_dirty_box[i];
action->m_old_box[i] = m_layers[m_current_layer_idx].m_dirty_box[i];
action->m_old_dirty[i] = m_layers[m_current_layer_idx].m_dirty_face[i];
action->m_box[i] = m_layers[m_current_layer_idx]->m_dirty_box[i];
action->m_old_box[i] = m_layers[m_current_layer_idx]->m_dirty_box[i];
action->m_old_dirty[i] = m_layers[m_current_layer_idx]->m_dirty_face[i];
m_layers[m_current_layer_idx].m_rtt[i].unbindFramebuffer();
m_layers[m_current_layer_idx]->m_rtt[i].unbindFramebuffer();
}
// save history
action->m_layer_idx = m_current_layer_idx;
@@ -225,9 +225,9 @@ void Canvas::stroke_draw_mix(const glm::vec2& bb_min, const glm::vec2& bb_sz)
auto layer_index = m_current_layer_idx;
for (int plane_index = 0; plane_index < 6; plane_index++)
{
if (!m_layers[layer_index].m_visible ||
m_layers[layer_index].m_opacity == .0f ||
!m_layers[layer_index].m_dirty_face[plane_index])
if (!m_layers[layer_index]->m_visible ||
m_layers[layer_index]->m_opacity == .0f ||
!m_layers[layer_index]->m_dirty_face[plane_index])
continue;
glm::mat4 proj = glm::perspective(glm::radians(m_cam_fov), (float)m_mixer.getWidth() / m_mixer.getHeight(), 0.1f, 1000.f);
@@ -250,7 +250,7 @@ void Canvas::stroke_draw_mix(const glm::vec2& bb_min, const glm::vec2& bb_sz)
ShaderManager::u_int(kShaderUniform::TexPattern, 3);
ShaderManager::u_float(kShaderUniform::StrokeAlpha, b->m_tip_opacity);
ShaderManager::u_float(kShaderUniform::Alpha, 1);
ShaderManager::u_int(kShaderUniform::Lock, false/*m_layers[layer_index].m_alpha_locked*/);
ShaderManager::u_int(kShaderUniform::Lock, false/*m_layers[layer_index]->m_alpha_locked*/);
ShaderManager::u_int(kShaderUniform::Mask, false/*m_smask_active*/);
//ShaderManager::u_int(kShaderUniform::DrawOnScreen, false);
ShaderManager::u_int(kShaderUniform::UseDual, false);
@@ -258,7 +258,7 @@ void Canvas::stroke_draw_mix(const glm::vec2& bb_min, const glm::vec2& bb_sz)
ShaderManager::u_int(kShaderUniform::BlendMode, b->m_blend_mode);
ShaderManager::u_mat4(kShaderUniform::MVP, plane_mvp_z);
glActiveTexture(GL_TEXTURE0);
m_layers[layer_index].m_rtt[plane_index].bindTexture();
m_layers[layer_index]->m_rtt[plane_index].bindTexture();
glActiveTexture(GL_TEXTURE1);
m_tmp[plane_index].bindTexture();
glActiveTexture(GL_TEXTURE2);
@@ -268,7 +268,7 @@ void Canvas::stroke_draw_mix(const glm::vec2& bb_min, const glm::vec2& bb_sz)
glActiveTexture(GL_TEXTURE1);
m_tmp[plane_index].unbindTexture();
glActiveTexture(GL_TEXTURE0);
m_layers[layer_index].m_rtt[plane_index].unbindTexture();
m_layers[layer_index]->m_rtt[plane_index].unbindTexture();
}
m_sampler.unbind();
m_mixer.unbindFramebuffer();
@@ -730,7 +730,7 @@ void Canvas::stroke_commit()
if (!m_dirty_face[i])
continue; // no stroke on this face, skip it
m_layers[m_current_layer_idx].m_rtt[i].bindFramebuffer();
m_layers[m_current_layer_idx]->m_rtt[i].bindFramebuffer();
// save image before commit
glm::vec2 box_sz = zw(m_dirty_box[i]) - xy(m_dirty_box[i]);
@@ -738,15 +738,15 @@ void Canvas::stroke_commit()
glReadPixels(m_dirty_box[i].x, m_dirty_box[i].y, box_sz.x, box_sz.y, GL_RGBA, GL_UNSIGNED_BYTE, action->m_image[i].get());
action->m_box[i] = m_dirty_box[i];
action->m_old_box[i] = m_layers[m_current_layer_idx].m_dirty_box[i];
action->m_old_dirty[i] = m_layers[m_current_layer_idx].m_dirty_face[i];
action->m_old_box[i] = m_layers[m_current_layer_idx]->m_dirty_box[i];
action->m_old_dirty[i] = m_layers[m_current_layer_idx]->m_dirty_face[i];
auto& lbox = m_layers[m_current_layer_idx].m_dirty_box[i];
auto& lbox = m_layers[m_current_layer_idx]->m_dirty_box[i];
lbox = glm::vec4(
glm::min(xy(m_dirty_box[i]), xy(lbox)),
glm::max(zw(m_dirty_box[i]), zw(lbox))
);
m_layers[m_current_layer_idx].m_dirty_face[i] = true;
m_layers[m_current_layer_idx]->m_dirty_face[i] = true;
// copy to tmp2 for layer blending
glActiveTexture(GL_TEXTURE0);
@@ -844,7 +844,7 @@ void Canvas::stroke_commit()
// {
// ShaderManager::use(kShader::StrokeLayer);
// ShaderManager::u_int(kShaderUniform::TexBG, 1);
// ShaderManager::u_int(kShaderUniform::Lock, m_layers[m_current_layer_idx].m_alpha_locked);
// ShaderManager::u_int(kShaderUniform::Lock, m_layers[m_current_layer_idx]->m_alpha_locked);
// ShaderManager::u_float(kShaderUniform::Alpha, b->m_tip_opacity);
//
// ShaderManager::u_int(kShaderUniform::Tex, 0);
@@ -856,7 +856,7 @@ void Canvas::stroke_commit()
// m_tmp[i].unbindTexture();
// }
m_layers[m_current_layer_idx].m_rtt[i].unbindFramebuffer();
m_layers[m_current_layer_idx]->m_rtt[i].unbindFramebuffer();
}
// restore viewport and clear color states
@@ -944,8 +944,8 @@ void Canvas::stroke_start(glm::vec3 point, float pressure)
void Canvas::layer_add(std::string name)
{
int idx = (int)m_layers.size();
m_layers.emplace_back();
m_layers.back().create(m_width, m_height, name);
m_layers.push_back(std::make_unique<Layer>());
m_layers.back()->create(m_width, m_height, name);
m_order.push_back(idx);
m_current_layer_idx = idx;
}
@@ -955,6 +955,7 @@ void Canvas::layer_remove(int idx) // m_order index
for (auto& i : m_order)
if (i > n)
i--;
m_layers[n]->destroy();
m_layers.erase(m_layers.begin() + n);
m_order.erase(m_order.begin() + idx);
m_current_layer_idx = m_order[std::min<int>((int)m_layers.size() - 1, idx)];
@@ -983,10 +984,10 @@ void Canvas::layer_merge(int source_idx, int dest_idx) // m_layer index
for (int i = 0; i < 6; i++)
{
if (!m_layers[source_idx].m_dirty_face[i])
if (!m_layers[source_idx]->m_dirty_face[i])
continue; // no stroke on this face, skip it
m_layers[dest_idx].m_rtt[i].bindFramebuffer();
m_layers[dest_idx]->m_rtt[i].bindFramebuffer();
/*
// save image before commit
@@ -995,16 +996,16 @@ void Canvas::layer_merge(int source_idx, int dest_idx) // m_layer index
glReadPixels(m_dirty_box[i].x, m_dirty_box[i].y, box_sz.x, box_sz.y, GL_RGBA, GL_UNSIGNED_BYTE, action->m_image[i].get());
action->m_box[i] = m_dirty_box[i];
action->m_old_box[i] = m_layers[m_current_layer_idx].m_dirty_box[i];
action->m_old_dirty[i] = m_layers[m_current_layer_idx].m_dirty_face[i];
action->m_old_box[i] = m_layers[m_current_layer_idx]->m_dirty_box[i];
action->m_old_dirty[i] = m_layers[m_current_layer_idx]->m_dirty_face[i];
*/
auto& lbox = m_layers[dest_idx].m_dirty_box[i];
auto& lbox = m_layers[dest_idx]->m_dirty_box[i];
lbox = glm::vec4(
glm::min(xy(m_layers[source_idx].m_dirty_box[i]), xy(lbox)),
glm::max(zw(m_layers[source_idx].m_dirty_box[i]), zw(lbox))
glm::min(xy(m_layers[source_idx]->m_dirty_box[i]), xy(lbox)),
glm::max(zw(m_layers[source_idx]->m_dirty_box[i]), zw(lbox))
);
m_layers[dest_idx].m_dirty_face[i] = true;
m_layers[dest_idx]->m_dirty_face[i] = true;
// copy to tmp2 for layer blending
glActiveTexture(GL_TEXTURE0);
@@ -1021,10 +1022,10 @@ void Canvas::layer_merge(int source_idx, int dest_idx) // m_layer index
ShaderManager::u_vec2(kShaderUniform::Resolution, m_size);
ShaderManager::u_float(kShaderUniform::StrokeAlpha, 1);
ShaderManager::u_float(kShaderUniform::PatternAlpha, 0);
ShaderManager::u_float(kShaderUniform::Alpha, m_layers[source_idx].m_opacity);
ShaderManager::u_float(kShaderUniform::Alpha, m_layers[source_idx]->m_opacity);
ShaderManager::u_int(kShaderUniform::Lock, false);
//ShaderManager::u_int(kShaderUniform::DrawOnScreen, false);
ShaderManager::u_int(kShaderUniform::BlendMode, m_layers[source_idx].m_blend_mode);
ShaderManager::u_int(kShaderUniform::BlendMode, m_layers[source_idx]->m_blend_mode);
ShaderManager::u_mat4(kShaderUniform::MVP, glm::ortho(-.5f, .5f, -.5f, .5f, -1.f, 1.f));
ShaderManager::u_int(kShaderUniform::UseDual, false);
ShaderManager::u_int(kShaderUniform::UsePattern, false);
@@ -1032,14 +1033,14 @@ void Canvas::layer_merge(int source_idx, int dest_idx) // m_layer index
glActiveTexture(GL_TEXTURE0);
m_tex2[i].bind();
glActiveTexture(GL_TEXTURE1);
m_layers[source_idx].m_rtt[i].bindTexture();
m_layers[source_idx]->m_rtt[i].bindTexture();
m_plane.draw_fill();
m_layers[source_idx].m_rtt[i].unbindTexture();
m_layers[source_idx]->m_rtt[i].unbindTexture();
glActiveTexture(GL_TEXTURE0);
m_tex2[i].unbind();
}
m_layers[dest_idx].m_rtt[i].unbindFramebuffer();
m_layers[dest_idx]->m_rtt[i].unbindFramebuffer();
}
// restore viewport and clear color states
@@ -1075,7 +1076,7 @@ void Canvas::resize(int width, int height)
m_tex2[i].create(width, height, GL_RGBA8);
}
for (auto& l : m_layers)
l.resize(width, height);
l->resize(width, height);
m_smask.create(width, height, "mask");
m_unsaved = true;
}
@@ -1090,7 +1091,7 @@ void Canvas::destroy()
m_tex2[i].destroy();
}
for (auto& l : m_layers)
l.destroy();
l->destroy();
m_smask.destroy();
m_mixer.destroy();
}
@@ -1131,9 +1132,7 @@ bool Canvas::create(int width, int height)
m_mesh.create();
m_brush_mix.create(8, 8);
for (auto& l : m_layers)
{
l.create(width, height, "");
}
l->create(width, height, "");
m_smask.create(width, height, "mask");
//m_smask.clear({1, 1, 1, 1});
m_unsaved = true;
@@ -1146,14 +1145,14 @@ void Canvas::snapshot_save()
m_layers_snapshot.clear();
m_layers_snapshot.resize(m_layers.size());
for (int i = 0; i < m_layers.size(); i++)
m_layers_snapshot[i] = m_layers[i].snapshot();
m_layers_snapshot[i] = m_layers[i]->snapshot();
}
void Canvas::snapshot_restore()
{
LOG("RESTORE SNAPSHOT");
for (int i = 0; i < m_layers.size(); i++)
m_layers[i].restore(m_layers_snapshot[i]);
m_layers[i]->restore(m_layers_snapshot[i]);
m_layers_snapshot.clear();
}
@@ -1161,7 +1160,7 @@ void Canvas::clear_context()
{
LOG("Canvas CLEAR CONTEXT");
for (auto& layer : m_layers)
layer.destroy();
layer->destroy();
for (int i = 0; i < 6; i++)
{
m_tmp[i].destroy();
@@ -1233,8 +1232,8 @@ void Canvas::import_equirectangular_thread(std::string file_path)
}
for (int i = 0; i < 6; i++)
{
m_layers[m_current_layer_idx].m_dirty_box[i] = glm::vec4(0, 0, m_width, m_height);
m_layers[m_current_layer_idx].m_dirty_face[i] = true;
m_layers[m_current_layer_idx]->m_dirty_box[i] = glm::vec4(0, 0, m_width, m_height);
m_layers[m_current_layer_idx]->m_dirty_face[i] = true;
}
App::I.async_update();
gl.restore();
@@ -1334,25 +1333,25 @@ void Canvas::export_equirectangular_thread(std::string file_path)
m_sampler_mask.bind(1); // linear
for (auto layer_index : m_order)
{
if (!m_layers[layer_index].m_visible ||
m_layers[layer_index].m_opacity == 0.f ||
!m_layers[layer_index].m_dirty_face[i])
if (!m_layers[layer_index]->m_visible ||
m_layers[layer_index]->m_opacity == 0.f ||
!m_layers[layer_index]->m_dirty_face[i])
continue;
if (!ShaderManager::ext_framebuffer_fetch)
{
glActiveTexture(GL_TEXTURE2);
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, m_width, m_height);
}
ShaderManager::u_int(kShaderUniform::BlendMode, m_layers[layer_index].m_blend_mode);
ShaderManager::u_float(kShaderUniform::Alpha, m_layers[layer_index].m_opacity);
ShaderManager::u_int(kShaderUniform::BlendMode, m_layers[layer_index]->m_blend_mode);
ShaderManager::u_float(kShaderUniform::Alpha, m_layers[layer_index]->m_opacity);
glActiveTexture(GL_TEXTURE0);
m_layers[layer_index].m_rtt[i].bindTexture();
m_layers[layer_index]->m_rtt[i].bindTexture();
glActiveTexture(GL_TEXTURE1);
m_layers[layer_index].m_rtt[i].bindTexture();
m_layers[layer_index]->m_rtt[i].bindTexture();
m_plane.draw_fill();
m_layers[layer_index].m_rtt[i].unbindTexture();
m_layers[layer_index]->m_rtt[i].unbindTexture();
glActiveTexture(GL_TEXTURE0);
m_layers[layer_index].m_rtt[i].unbindTexture();
m_layers[layer_index]->m_rtt[i].unbindTexture();
}
if (!ShaderManager::ext_framebuffer_fetch)
@@ -1631,9 +1630,9 @@ void Canvas::export_layers_thread(std::string file_name)
ShaderManager::u_mat4(kShaderUniform::MVP, glm::ortho(-.5f, .5f, -.5f, .5f, -1.f, 1.f));
m_sampler_mask.bind(0);
m_layers[layer_index].m_rtt[i].bindTexture();
m_layers[layer_index]->m_rtt[i].bindTexture();
m_plane.draw_fill();
m_layers[layer_index].m_rtt[i].unbindTexture();
m_layers[layer_index]->m_rtt[i].unbindTexture();
m_sampler_mask.unbind();
// copy result to cubemap
@@ -1732,9 +1731,9 @@ void Canvas::export_cubes()
for (int plane = 0; plane < 6; plane++)
{
auto& l = m_layers[m_order[layer]];
l.m_rtt[plane].bindFramebuffer();
l->m_rtt[plane].bindFramebuffer();
glReadPixels(0, 0, m_width, m_height, GL_RGBA, GL_UNSIGNED_BYTE, buffer.get());
l.m_rtt[plane].unbindFramebuffer();
l->m_rtt[plane].unbindFramebuffer();
if (plane < 4)
{
@@ -1910,22 +1909,22 @@ bool Canvas::project_save_thread(std::string file_path)
int n_order = m_order[i];
fwrite(&n_order, sizeof(int), 1, fp);
float layer_alpha = m_layers[i].m_opacity;
float layer_alpha = m_layers[i]->m_opacity;
fwrite(&layer_alpha, sizeof(float), 1, fp);
int name_len = (int)m_layers[i].m_name.size();
int name_len = (int)m_layers[i]->m_name.size();
fwrite(&name_len, sizeof(int), 1, fp);
fwrite(m_layers[i].m_name.data(), name_len, 1, fp);
fwrite(m_layers[i]->m_name.data(), name_len, 1, fp);
if (ppi_header.doc_version.minor > 1)
{
fwrite(&m_layers[i].m_blend_mode, sizeof(int), 1, fp);
fwrite(&m_layers[i].m_alpha_locked, sizeof(bool), 1, fp);
fwrite(&m_layers[i].m_visible, sizeof(bool), 1, fp);
fwrite(&m_layers[i]->m_blend_mode, sizeof(int), 1, fp);
fwrite(&m_layers[i]->m_alpha_locked, sizeof(bool), 1, fp);
fwrite(&m_layers[i]->m_visible, sizeof(bool), 1, fp);
}
App::I.async_start();
auto snap = m_layers[i].snapshot();
auto snap = m_layers[i]->snapshot();
App::I.async_update();
App::I.async_end();
for (int plane_index = 0; plane_index < 6; plane_index++)
@@ -2076,7 +2075,7 @@ bool Canvas::project_open_thread(std::string file_path)
App::I.async_start();
for (auto& l : m_layers)
l.destroy();
l->destroy();
m_layers.clear();
m_order.clear();
//clear_all();
@@ -2084,17 +2083,17 @@ bool Canvas::project_open_thread(std::string file_path)
App::I.async_end();
std::vector<int> tmp_order;
std::vector<Layer> tmp_layers;
std::vector<std::unique_ptr<Layer>> tmp_layers;
for (int i = 0; i < n_layers; i++)
{
int n_order;
fread(&n_order, sizeof(int), 1, fp);
tmp_layers.emplace_back();
tmp_layers.push_back(std::make_unique<Layer>());
auto& layer = tmp_layers.back();
fread(&layer.m_opacity, sizeof(float), 1, fp);
fread(&layer->m_opacity, sizeof(float), 1, fp);
int name_len;
fread(&name_len, sizeof(int), 1, fp);
@@ -2103,9 +2102,9 @@ bool Canvas::project_open_thread(std::string file_path)
if (ppi_header.doc_version.minor > 1)
{
fread(&layer.m_blend_mode, sizeof(int), 1, fp);
fread(&layer.m_alpha_locked, sizeof(bool), 1, fp);
fread(&layer.m_visible, sizeof(bool), 1, fp);
fread(&layer->m_blend_mode, sizeof(int), 1, fp);
fread(&layer->m_alpha_locked, sizeof(bool), 1, fp);
fread(&layer->m_visible, sizeof(bool), 1, fp);
}
snap.clear();
@@ -2151,9 +2150,9 @@ bool Canvas::project_open_thread(std::string file_path)
}
App::I.async_start();
tmp_layers.back().create(m_width, m_height, name.c_str());
tmp_layers.back().clear({0, 0, 0, 0});
tmp_layers.back().restore(snap);
tmp_layers.back()->create(m_width, m_height, name.c_str());
tmp_layers.back()->clear({ 0, 0, 0, 0 });
tmp_layers.back()->restore(snap);
tmp_order.push_back(n_order);
App::I.async_end();
}
@@ -2223,25 +2222,25 @@ Image Canvas::thumbnail_generate(int w, int h)
m_sampler_mask.bind(1); // linear
for (auto layer_index : m_order)
{
if (!m_layers[layer_index].m_visible ||
m_layers[layer_index].m_opacity == 0.f ||
!m_layers[layer_index].m_dirty_face[i])
if (!m_layers[layer_index]->m_visible ||
m_layers[layer_index]->m_opacity == 0.f ||
!m_layers[layer_index]->m_dirty_face[i])
continue;
if (!ShaderManager::ext_framebuffer_fetch)
{
glActiveTexture(GL_TEXTURE2);
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, w, h);
}
ShaderManager::u_int(kShaderUniform::BlendMode, m_layers[layer_index].m_blend_mode);
ShaderManager::u_float(kShaderUniform::Alpha, m_layers[layer_index].m_opacity);
ShaderManager::u_int(kShaderUniform::BlendMode, m_layers[layer_index]->m_blend_mode);
ShaderManager::u_float(kShaderUniform::Alpha, m_layers[layer_index]->m_opacity);
glActiveTexture(GL_TEXTURE0);
m_layers[layer_index].m_rtt[i].bindTexture();
m_layers[layer_index]->m_rtt[i].bindTexture();
glActiveTexture(GL_TEXTURE1);
m_layers[layer_index].m_rtt[i].bindTexture();
m_layers[layer_index]->m_rtt[i].bindTexture();
m_face_plane.draw_fill();
m_layers[layer_index].m_rtt[i].unbindTexture();
m_layers[layer_index]->m_rtt[i].unbindTexture();
glActiveTexture(GL_TEXTURE0);
m_layers[layer_index].m_rtt[i].unbindTexture();
m_layers[layer_index]->m_rtt[i].unbindTexture();
}
if (!ShaderManager::ext_framebuffer_fetch)
@@ -2453,7 +2452,7 @@ void Canvas::draw_objects(std::function<void(const glm::mat4& camera, const glm:
void Canvas::draw_objects(std::function<void(const glm::mat4& camera, const glm::mat4& proj, int i)> observer)
{
draw_objects(observer, m_layers[m_current_layer_idx]);
draw_objects(observer, *m_layers[m_current_layer_idx]);
}
void Canvas::project2Dpoints(std::vector<vertex_t>& vertices)
@@ -2725,7 +2724,7 @@ void Layer::resize(int width, int height)
void ActionStroke::undo()
{
if (clear_layer)
m_canvas->m_layers[m_layer_idx].clear({ 0, 0, 0, 0 });
m_canvas->m_layers[m_layer_idx]->clear({ 0, 0, 0, 0 });
for (int i = 0; i < 6; i++)
{
// empty data
@@ -2734,26 +2733,26 @@ void ActionStroke::undo()
LOG("undo box %d dirty=%s [%d,%d,%d,%d] to dirty=%s [%d,%d,%d,%d]",
i,
m_canvas->m_layers[m_layer_idx].m_dirty_face[i] ? "true" : "false",
(int)m_canvas->m_layers[m_layer_idx].m_dirty_box[i].x,
(int)m_canvas->m_layers[m_layer_idx].m_dirty_box[i].y,
(int)m_canvas->m_layers[m_layer_idx].m_dirty_box[i].z,
(int)m_canvas->m_layers[m_layer_idx].m_dirty_box[i].w,
m_canvas->m_layers[m_layer_idx]->m_dirty_face[i] ? "true" : "false",
(int)m_canvas->m_layers[m_layer_idx]->m_dirty_box[i].x,
(int)m_canvas->m_layers[m_layer_idx]->m_dirty_box[i].y,
(int)m_canvas->m_layers[m_layer_idx]->m_dirty_box[i].z,
(int)m_canvas->m_layers[m_layer_idx]->m_dirty_box[i].w,
m_old_dirty[i] ? "true" : "false",
(int)m_old_box[i].x,
(int)m_old_box[i].y,
(int)m_old_box[i].z,
(int)m_old_box[i].w);
m_canvas->m_layers[m_layer_idx].m_dirty_box[i] = m_old_box[i];
m_canvas->m_layers[m_layer_idx].m_dirty_face[i] = m_old_dirty[i];
m_canvas->m_layers[m_layer_idx]->m_dirty_box[i] = m_old_box[i];
m_canvas->m_layers[m_layer_idx]->m_dirty_face[i] = m_old_dirty[i];
glm::vec2 box_sz = zw(m_box[i]) - xy(m_box[i]);
if (box_sz.x > 0 && box_sz.y > 0 && box_sz.x <= m_canvas->m_layers[m_layer_idx].w && box_sz.y <= m_canvas->m_layers[m_layer_idx].h)
if (box_sz.x > 0 && box_sz.y > 0 && box_sz.x <= m_canvas->m_layers[m_layer_idx]->w && box_sz.y <= m_canvas->m_layers[m_layer_idx]->h)
{
m_canvas->m_layers[m_layer_idx].m_rtt[i].bindTexture();
m_canvas->m_layers[m_layer_idx]->m_rtt[i].bindTexture();
glTexSubImage2D(GL_TEXTURE_2D, 0, (int)m_box[i].x, (int)m_box[i].y, (int)box_sz.x, (int)box_sz.y, GL_RGBA, GL_UNSIGNED_BYTE, m_image[i].get());
m_canvas->m_layers[m_layer_idx].m_rtt[i].unbindTexture();
m_canvas->m_layers[m_layer_idx]->m_rtt[i].unbindTexture();
}
else
{
@@ -2779,15 +2778,15 @@ Action* ActionStroke::get_redo()
auto& layer = m_canvas->m_layers[m_layer_idx];
for (int i = 0; i < 6; i++)
{
if (!layer.m_dirty_face[i] && !m_image[i])
if (!layer->m_dirty_face[i] && !m_image[i])
continue; // no stroke on this face, skip it
layer.m_rtt[i].bindFramebuffer();
layer->m_rtt[i].bindFramebuffer();
// save image before commit
glm::vec2 box_or = xy(m_box[i]);
glm::vec2 box_sz = zw(m_box[i]) - xy(m_box[i]);
if (box_sz.x > 0 && box_sz.y > 0 && box_sz.x <= layer.w && box_sz.y <= layer.h)
if (box_sz.x > 0 && box_sz.y > 0 && box_sz.x <= layer->w && box_sz.y <= layer->h)
{
action->m_image[i] = std::make_unique<uint8_t[]>(box_sz.x * box_sz.y * 4);
glReadPixels(box_or.x, box_or.y, box_sz.x, box_sz.y, GL_RGBA, GL_UNSIGNED_BYTE, action->m_image[i].get());
@@ -2798,10 +2797,10 @@ Action* ActionStroke::get_redo()
}
action->m_box[i] = m_box[i];
action->m_old_box[i] = layer.m_dirty_box[i];
action->m_old_dirty[i] = layer.m_dirty_face[i];
action->m_old_box[i] = layer->m_dirty_box[i];
action->m_old_dirty[i] = layer->m_dirty_face[i];
layer.m_rtt[i].unbindFramebuffer();
layer->m_rtt[i].unbindFramebuffer();
}
// save history
action->m_layer_idx = m_layer_idx;