improve progress bar, refactor node destruction, simplify layers export
This commit is contained in:
113
src/canvas.cpp
113
src/canvas.cpp
@@ -1921,113 +1921,16 @@ void Canvas::export_layers(std::string file_name, std::function<void()> on_compl
|
||||
|
||||
void Canvas::export_layers_thread(std::string file_name)
|
||||
{
|
||||
std::shared_ptr<NodeProgressBar> pb;
|
||||
if (App::I->layout.m_loaded)
|
||||
static std::array<const char*, 6> plane_names { "front", "right", "back", "left", "top", "bottom" };
|
||||
auto pb = App::I->show_progress("Export Layers", m_layers.size());
|
||||
for (int i = 0; i < m_layers.size(); i++)
|
||||
{
|
||||
pb = std::make_shared<NodeProgressBar>();
|
||||
pb->m_manager = &App::I->layout;
|
||||
pb->init();
|
||||
pb->create();
|
||||
pb->loaded();
|
||||
pb->m_progress->SetWidthP(0);
|
||||
pb->m_title->set_text("Export Pano Layers");
|
||||
App::I->layout[App::I->main_id]->add_child(pb);
|
||||
}
|
||||
int progress = 0;
|
||||
int total = (int)(m_layers.size() + 1) * 6;
|
||||
|
||||
RTT m_latlong;
|
||||
m_latlong.create(m_width * 4, m_height * 2); // NOTE: w and h must be equal to make sense
|
||||
|
||||
GLuint cube_id;
|
||||
int faces[]{
|
||||
GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, // front
|
||||
GL_TEXTURE_CUBE_MAP_NEGATIVE_X, // right
|
||||
GL_TEXTURE_CUBE_MAP_POSITIVE_Z, // back
|
||||
GL_TEXTURE_CUBE_MAP_POSITIVE_X, // left
|
||||
GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, // top
|
||||
GL_TEXTURE_CUBE_MAP_POSITIVE_Y, // bottom
|
||||
};
|
||||
App::I->render_task([&]
|
||||
{
|
||||
glGenTextures(1, &cube_id);
|
||||
glBindTexture(GL_TEXTURE_CUBE_MAP, cube_id);
|
||||
for (GLuint i = 0; i < 6; i++)
|
||||
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGBA8, m_width, m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
|
||||
});
|
||||
|
||||
int seq = 0;
|
||||
for (int layer_index = 0; layer_index < m_layers.size(); layer_index++)
|
||||
{
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
App::I->render_task([&]
|
||||
{
|
||||
// copy layer to cubemap
|
||||
m_layers[layer_index]->m_rtt[i].bindFramebuffer();
|
||||
glBindTexture(GL_TEXTURE_CUBE_MAP, cube_id);
|
||||
glCopyTexImage2D(faces[i], 0, GL_RGBA8, 0, 0, m_width, m_height, 0);
|
||||
glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
|
||||
m_layers[layer_index]->m_rtt[i].unbindFramebuffer();
|
||||
});
|
||||
|
||||
progress++;
|
||||
float p = (float)progress / total * 100.f;
|
||||
LOG("progress: %f", p);
|
||||
|
||||
if (App::I->layout.m_loaded)
|
||||
{
|
||||
pb->m_progress->SetWidthP(p);
|
||||
}
|
||||
}
|
||||
|
||||
App::I->render_task([&]
|
||||
{
|
||||
glViewport(0, 0, m_latlong.getWidth(), m_latlong.getHeight());
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
m_latlong.bindFramebuffer();
|
||||
m_latlong.clear({ 1, 1, 1, 0 });
|
||||
ShaderManager::use(kShader::Equirect);
|
||||
ShaderManager::u_mat4(kShaderUniform::MVP, glm::ortho(-.5f, .5f, -.5f, .5f, -1.f, 1.f));
|
||||
ShaderManager::u_int(kShaderUniform::Tex, 0);
|
||||
glBindTexture(GL_TEXTURE_CUBE_MAP, cube_id);
|
||||
glDisable(GL_BLEND);
|
||||
m_sampler_linear.bind(0);
|
||||
m_plane.draw_fill();
|
||||
glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
|
||||
m_latlong.unbindFramebuffer();
|
||||
});
|
||||
|
||||
{
|
||||
auto latlong_data = std::make_unique<uint8_t[]>(m_latlong.bytes());
|
||||
m_latlong.readTextureData(latlong_data.get());
|
||||
static char name[128];
|
||||
sprintf(name, "%s/%s-layer-%02d.png", App::I->work_path.c_str(), file_name.c_str(), seq);
|
||||
seq++;
|
||||
LOG("writing %s", name);
|
||||
int ret = stbi_write_png(name, m_latlong.getWidth(), m_latlong.getHeight(), 4, latlong_data.get(), m_latlong.stride());
|
||||
}
|
||||
|
||||
progress++;
|
||||
float p = (float)progress / total * 100.f;
|
||||
LOG("progress: %f", p);
|
||||
|
||||
if (App::I->layout.m_loaded)
|
||||
{
|
||||
pb->m_progress->SetWidthP(p);
|
||||
}
|
||||
}
|
||||
|
||||
App::I->render_task([&]
|
||||
{
|
||||
glDeleteTextures(1, &cube_id);
|
||||
m_latlong.destroy();
|
||||
});
|
||||
|
||||
if (App::I->layout.m_loaded)
|
||||
{
|
||||
pb->destroy();
|
||||
auto l = m_layers[i];
|
||||
Image img = l->gen_equirect().get_image();
|
||||
img.save_png(fmt::format("{}/{}-layer{:02d}-{}.png", App::I->work_path, file_name, i, l->m_name));
|
||||
pb->increment();
|
||||
}
|
||||
pb->destroy();
|
||||
}
|
||||
|
||||
void Canvas::export_cubes()
|
||||
|
||||
Reference in New Issue
Block a user