From 7db1739df6a3d1a08ad8dd81390700ed1a68534c Mon Sep 17 00:00:00 2001 From: omigamedev Date: Sat, 2 Nov 2019 15:13:31 +0100 Subject: [PATCH] timelapse frame on stroke idle --- src/app.cpp | 50 ++-------------------------------------------- src/app_events.cpp | 21 +++++++++++++++++++ src/canvas.cpp | 1 + src/canvas.h | 1 + 4 files changed, 25 insertions(+), 48 deletions(-) diff --git a/src/app.cpp b/src/app.cpp index fc1671d..2657b27 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -613,53 +613,6 @@ void App::draw(float dt) glDisable(GL_SCISSOR_TEST); } - if (rec_running) - { - static float rec_timer = 0.f; - rec_timer += dt; - if (rec_timer > 0.3f && canvas->m_canvas->m_dirty_stroke) - { - canvas->m_canvas->m_dirty_stroke = false; - - LOG("rec tick"); - rec_timer = 0.f; - - Canvas::I->draw_merge(true); - Texture2D equirect = Canvas::I->m_layers_merge.gen_equirect({ 1024, 512 }); - auto img = std::make_unique(equirect.get_image()); - { - std::lock_guard lock(rec_mutex); - rec_frames.emplace_back(std::move(img)); - rec_cv.notify_all(); - } - equirect.destroy(); - -/* - auto img = std::make_unique(); - img->create(width, height); -#if __IOS__ - [ios_view->glview bindDrawable]; -#else - glBindFramebuffer(GL_FRAMEBUFFER, 0); -#endif - - GLint dfbo, rfbo; - glGetIntegerv(GL_READ_FRAMEBUFFER_BINDING, &rfbo); - glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &dfbo); - if (dfbo != rfbo) - LOG("DIFFERENT FB"); - - glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, img->m_data.get()); - { - std::lock_guard lock(rec_mutex); - rec_frames.emplace_back(std::move(img)); - rec_cv.notify_all(); - } -*/ - update_rec_frames(); - } - } - redraw = false; } @@ -745,7 +698,7 @@ void App::update_rec_frames() if (rec_running) { static char buffer[128]; - sprintf(buffer, "Recorder %d frames", rec_count); + sprintf(buffer, "Recorded %d frames", rec_count); txt->set_text(buffer); } else @@ -859,6 +812,7 @@ void App::rec_loop() lock.unlock(); if (frame) m_encoder->encode(*frame); + update_rec_frames(); } } diff --git a/src/app_events.cpp b/src/app_events.cpp index fd01662..685d126 100644 --- a/src/app_events.cpp +++ b/src/app_events.cpp @@ -79,6 +79,27 @@ void App::tick(float dt) main->tick(dt); if (auto* main = layout[main_id]) main->tick(dt); + + if (rec_running) + { + auto t_now = std::chrono::high_resolution_clock::now(); + float dt = std::chrono::duration(t_now - canvas->m_canvas->m_disrty_stroke_time).count(); + if (dt > 1.f && canvas->m_canvas->m_dirty_stroke) + { + canvas->m_canvas->m_dirty_stroke = false; + LOG("rec tick"); + + Canvas::I->draw_merge(true); + Texture2D equirect = Canvas::I->m_layers_merge.gen_equirect({ 1024, 512 }); + auto img = std::make_unique(equirect.get_image()); + { + std::lock_guard lock(rec_mutex); + rec_frames.emplace_back(std::move(img)); + rec_cv.notify_all(); + } + equirect.destroy(); + } + } } void App::resize(float w, float h) diff --git a/src/canvas.cpp b/src/canvas.cpp index de63d2b..da3b595 100644 --- a/src/canvas.cpp +++ b/src/canvas.cpp @@ -741,6 +741,7 @@ void Canvas::stroke_commit() m_dirty = false; m_dirty_stroke = true; // new stroke ready for timelapse capture + m_disrty_stroke_time = std::chrono::steady_clock::now(); App::I->redraw = true; // save viewport and clear color states diff --git a/src/canvas.h b/src/canvas.h index e68d338..110ff32 100644 --- a/src/canvas.h +++ b/src/canvas.h @@ -92,6 +92,7 @@ public: bool m_dirty = false; bool m_commit_delayed = false; bool m_dirty_stroke = false; + std::chrono::time_point m_disrty_stroke_time; std::stack m_camera_stack; static Canvas* I;