threaded brush preview rendering
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user