render stroke preview to image
This commit is contained in:
@@ -9,6 +9,7 @@
|
||||
|
||||
std::atomic_int NodeStrokePreview::s_instances{ 0 };
|
||||
std::atomic_bool NodeStrokePreview::s_running{ false };
|
||||
std::mutex NodeStrokePreview::s_render_mutex;
|
||||
std::thread NodeStrokePreview::s_renderer;
|
||||
BlockingQueue<std::shared_ptr<NodeStrokePreview>> NodeStrokePreview::s_queue;
|
||||
|
||||
@@ -498,6 +499,27 @@ void NodeStrokePreview::draw_stroke_immediate()
|
||||
glClearColor(cc[0], cc[1], cc[2], cc[3]);
|
||||
}
|
||||
|
||||
Image NodeStrokePreview::render_to_image()
|
||||
{
|
||||
std::lock_guard<std::mutex> _lock(s_render_mutex);
|
||||
|
||||
App::I->render_task([this] {
|
||||
auto new_size = m_preview_size;
|
||||
if (!m_tex_preview.ready() || m_tex_preview.size() != new_size)
|
||||
m_tex_preview.create((int)new_size.x, (int)new_size.y);
|
||||
if (m_tex.size() != new_size)
|
||||
{
|
||||
m_rtt.create((int)new_size.x, (int)new_size.y);
|
||||
m_rtt_mixer.create((int)new_size.x, (int)new_size.y);
|
||||
m_tex.create((int)new_size.x, (int)new_size.y);
|
||||
m_tex_dual.create((int)new_size.x, (int)new_size.y);
|
||||
m_tex_background.create((int)new_size.x, (int)new_size.y);
|
||||
}
|
||||
draw_stroke_immediate();
|
||||
});
|
||||
return m_tex_preview.get_image();
|
||||
}
|
||||
|
||||
void NodeStrokePreview::draw_stroke()
|
||||
{
|
||||
if (m_size.x == 0 || m_size.y == 0)
|
||||
@@ -519,6 +541,8 @@ void NodeStrokePreview::draw_stroke()
|
||||
auto node = s_queue.Get();
|
||||
if (node)
|
||||
{
|
||||
std::lock_guard<std::mutex> _lock(s_render_mutex);
|
||||
|
||||
// if the brush is not already loaded, load it and then destroy it
|
||||
bool to_unload = (node->m_brush->m_tip_texture == nullptr);
|
||||
node->m_brush->preload();
|
||||
|
||||
Reference in New Issue
Block a user