remove direct use of rtt and dirty area from the layer

This commit is contained in:
2019-10-15 11:57:39 +02:00
parent 9e93fe48d6
commit 9ccd6ed2f4
12 changed files with 404 additions and 334 deletions

View File

@@ -1243,12 +1243,12 @@ void CanvasModeTransform::enter(kCanvasMode prev)
App::I->render_task([&]
{
m_shape[plane].update_vertices(shape3d.data(), (int)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]->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]->rtt(plane).unbindFramebuffer();
});
m_commit_on_leave = true;
@@ -1293,13 +1293,13 @@ void CanvasModeTransform::enter(kCanvasMode prev)
action->m_image[i] = std::make_unique<uint8_t[]>(bb_sz.x * bb_sz.y * 4);
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->box(i);
action->m_old_dirty[i] = layer->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->face(i) = true;
layer->box(i) = {
glm::min(xy(layer->box(i)), bb_min),
glm::max(zw(layer->box(i)), bb_max),
};
App::I->render_task([&]
@@ -1311,12 +1311,12 @@ void CanvasModeTransform::enter(kCanvasMode prev)
ShaderManager::use(kShader::Color);
ShaderManager::u_mat4(kShaderUniform::MVP, mvp);
ShaderManager::u_vec4(kShaderUniform::Col, { 0, 0, 0, 0 });
layer->m_rtt[i].bindFramebuffer();
layer->rtt(i).bindFramebuffer();
// copy framebuffer to action data
glReadPixels(bb_min.x, bb_min.y, bb_sz.x, bb_sz.y, GL_RGBA, GL_UNSIGNED_BYTE, action->m_image[i].get());
for (int j = 0; j < 6; j++)
m_shape[j].draw_fill();
layer->m_rtt[i].unbindFramebuffer();
layer->rtt(i).unbindFramebuffer();
});
}
@@ -1391,23 +1391,23 @@ void CanvasModeTransform::leave(kCanvasMode next)
action->m_image[i] = std::make_unique<uint8_t[]>(bb_sz.x * bb_sz.y * 4);
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->box(i);
action->m_old_dirty[i] = layer->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->face(i) = true;
layer->box(i) = {
glm::min(xy(layer->box(i)), bb_min),
glm::max(zw(layer->box(i)), bb_max),
};
App::I->render_task([&]
{
layer->m_rtt[i].bindFramebuffer();
layer->rtt(i).bindFramebuffer();
glDisable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
glActiveTexture(GL_TEXTURE0);
glViewport(0, 0, layer->m_rtt[i].getWidth(), layer->m_rtt[i].getHeight());
glViewport(0, 0, layer->rtt(i).getWidth(), layer->rtt(i).getHeight());
// save fb content for history
glReadPixels(bb_min.x, bb_min.y, bb_sz.x, bb_sz.y, GL_RGBA, GL_UNSIGNED_BYTE, action->m_image[i].get());
@@ -1437,7 +1437,7 @@ void CanvasModeTransform::leave(kCanvasMode next)
m_shape[j].draw_fill();
m_tex[j].unbind();
}
layer->m_rtt[i].unbindFramebuffer();
layer->rtt(i).unbindFramebuffer();
});
}
@@ -1674,8 +1674,8 @@ void CanvasModeFloodFill::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
a->m_layer_index = Canvas::I->m_current_layer_idx;
a->m_threshold = m_tool->get_threshold();
a->m_plane = plane;
a->m_dirty_box = plane_data.layer->m_dirty_box;
a->m_dirty_face = plane_data.layer->m_dirty_face;
a->m_dirty_box = plane_data.layer->frame().m_dirty_box;
a->m_dirty_face = plane_data.layer->frame().m_dirty_face;
ActionManager::add(a);
plane_data.apply();