threaded brush preview rendering

This commit is contained in:
2019-02-28 14:47:06 +01:00
parent e59dd66b46
commit f20f935d43
5 changed files with 71 additions and 4 deletions

View File

@@ -7,6 +7,21 @@
#include "canvas.h"
#include "app.h"
std::atomic_int NodeStrokePreview::s_instances{ 0 };
std::atomic_bool NodeStrokePreview::s_running{ false };
std::thread NodeStrokePreview::s_renderer;
BlockingQueue<NodeStrokePreview*> NodeStrokePreview::s_queue;
void NodeStrokePreview::terminate_renderer()
{
if (s_running && s_renderer.joinable())
{
s_running = false;
s_queue.UnlockGetters();
s_renderer.join();
}
}
Node* NodeStrokePreview::clone_instantiate() const
{
return new NodeStrokePreview();
@@ -224,7 +239,7 @@ std::vector<NodeStrokePreview::StrokeFrame> NodeStrokePreview::stroke_draw_compu
return ret;
}
void NodeStrokePreview::draw_stroke()
void NodeStrokePreview::draw_stroke_immediate()
{
if (m_size.x == 0 || m_size.y == 0)
return;
@@ -458,6 +473,35 @@ void NodeStrokePreview::draw_stroke()
glClearColor(cc[0], cc[1], cc[2], cc[3]);
}
void NodeStrokePreview::draw_stroke()
{
if (m_size.x == 0 || m_size.y == 0)
return;
s_queue.mutex.lock();
if (!s_running)
{
s_running = true;
s_renderer = std::thread([] {
while (s_running)
{
auto node = s_queue.Get();
if (node)
{
node->async_start();
gl_state gl;
gl.save();
node->draw_stroke_immediate();
gl.restore();
node->async_end();
std::this_thread::sleep_for(std::chrono::milliseconds(30));
}
}
});
}
s_queue.mutex.unlock();
s_queue.PostUnique(this);
}
void NodeStrokePreview::draw()
{
//glEnable(GL_BLEND);