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

@@ -1034,12 +1034,12 @@ void CanvasModeTransform::enter(kCanvasMode prev)
auto shape3d = triangulate(m_points_face[plane]);
m_shape[plane].update_vertices(shape3d.data(), shape3d.size());
Canvas::I->m_layers[Canvas::I->m_current_layer_idx].m_rtt[plane].bindFramebuffer();
Canvas::I->m_layers[Canvas::I->m_current_layer_idx]->m_rtt[plane].bindFramebuffer();
m_tex[plane].create(bb_sz.x, bb_sz.y);
m_tex[plane].bind();
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, bb_min.x, bb_min.y, bb_sz.x, bb_sz.y);
m_tex[plane].unbind();
Canvas::I->m_layers[Canvas::I->m_current_layer_idx].m_rtt[plane].unbindFramebuffer();
Canvas::I->m_layers[Canvas::I->m_current_layer_idx]->m_rtt[plane].unbindFramebuffer();
m_commit_on_leave = true;
}
@@ -1050,7 +1050,7 @@ void CanvasModeTransform::enter(kCanvasMode prev)
GLint vp[4];
glGetIntegerv(GL_VIEWPORT, vp);
glViewport(0, 0, layer.w, layer.h);
glViewport(0, 0, layer->w, layer->h);
bool depth = glIsEnabled(GL_DEPTH_TEST);
bool blend = glIsEnabled(GL_BLEND);
@@ -1072,7 +1072,7 @@ void CanvasModeTransform::enter(kCanvasMode prev)
auto mvp = proj * plane_camera * m_xform * m_xform_local;
ShaderManager::u_mat4(kShaderUniform::MVP, mvp);
layer.m_rtt[i].bindFramebuffer();
layer->m_rtt[i].bindFramebuffer();
glm::vec2 bb_min(Canvas::I->m_size);
glm::vec2 bb_max(0, 0);
@@ -1096,26 +1096,26 @@ void CanvasModeTransform::enter(kCanvasMode prev)
if (bb_sz.x <= 0.f || bb_sz.y <= 0.f)
{
layer.m_rtt[i].unbindFramebuffer();
layer->m_rtt[i].unbindFramebuffer();
continue;
}
action->m_image[i] = std::make_unique<uint8_t[]>(bb_sz.x * bb_sz.y * 4);
glReadPixels(bb_min.x, bb_min.y, bb_sz.x, bb_sz.y, GL_RGBA, GL_UNSIGNED_BYTE, action->m_image[i].get());
action->m_box[i] = { bb_min, bb_max };
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_dirty_face[i] = true;
layer.m_dirty_box[i] = {
glm::min(xy(layer.m_dirty_box[i]), bb_min),
glm::max(zw(layer.m_dirty_box[i]), bb_max),
layer->m_dirty_face[i] = true;
layer->m_dirty_box[i] = {
glm::min(xy(layer->m_dirty_box[i]), bb_min),
glm::max(zw(layer->m_dirty_box[i]), bb_max),
};
for (int j = 0; j < 6; j++)
m_shape[j].draw_fill();
layer.m_rtt[i].unbindFramebuffer();
layer->m_rtt[i].unbindFramebuffer();
}
depth ? glEnable(GL_DEPTH_TEST) : glDisable(GL_DEPTH_TEST);
@@ -1142,7 +1142,7 @@ void CanvasModeTransform::leave()
GLint vp[4];
glGetIntegerv(GL_VIEWPORT, vp);
glViewport(0, 0, layer.w, layer.h);
glViewport(0, 0, layer->w, layer->h);
bool depth = glIsEnabled(GL_DEPTH_TEST);
bool blend = glIsEnabled(GL_BLEND);
@@ -1179,7 +1179,7 @@ void CanvasModeTransform::leave()
auto mvp = proj * mv;
ShaderManager::u_mat4(kShaderUniform::MVP, mvp);
layer.m_rtt[i].bindFramebuffer();
layer->m_rtt[i].bindFramebuffer();
std::vector<glm::vec2> poly2d;
static std::vector<glm::vec2> face_corners{ {1,1}, {-1,1}, {-1,-1}, {1,-1} };
@@ -1219,20 +1219,20 @@ void CanvasModeTransform::leave()
if (clipped.empty() || bb_sz.x <= 0.f || bb_sz.y <= 0.f)
{
layer.m_rtt[i].unbindFramebuffer();
layer->m_rtt[i].unbindFramebuffer();
continue;
}
action->m_image[i] = std::make_unique<uint8_t[]>(bb_sz.x * bb_sz.y * 4);
glReadPixels(bb_min.x, bb_min.y, bb_sz.x, bb_sz.y, GL_RGBA, GL_UNSIGNED_BYTE, action->m_image[i].get());
action->m_box[i] = { bb_min, bb_max };
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_dirty_face[i] = true;
layer.m_dirty_box[i] = {
glm::min(xy(layer.m_dirty_box[i]), bb_min),
glm::max(zw(layer.m_dirty_box[i]), bb_max),
layer->m_dirty_face[i] = true;
layer->m_dirty_box[i] = {
glm::min(xy(layer->m_dirty_box[i]), bb_min),
glm::max(zw(layer->m_dirty_box[i]), bb_max),
};
glActiveTexture(GL_TEXTURE0);
@@ -1247,7 +1247,7 @@ void CanvasModeTransform::leave()
m_tex[j].unbind();
}
layer.m_rtt[i].unbindFramebuffer();
layer->m_rtt[i].unbindFramebuffer();
}
depth ? glEnable(GL_DEPTH_TEST) : glDisable(GL_DEPTH_TEST);
blend ? glEnable(GL_BLEND) : glDisable(GL_BLEND);
@@ -1257,7 +1257,7 @@ void CanvasModeTransform::leave()
action->m_canvas = Canvas::I;
//action->m_stroke = std::move(m_current_stroke);
ActionManager::add(action);
layer.optimize();
layer->optimize();
//auto m = static_cast<CanvasModeMaskFree*>(Canvas::I->modes[(int)kCanvasMode::MaskFree][0]);
//m->clear();
}