render stroke preview to image

This commit is contained in:
2019-09-03 08:09:16 +02:00
parent 6639414e54
commit 304d9c994a
2 changed files with 26 additions and 0 deletions

View File

@@ -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();

View File

@@ -29,6 +29,7 @@ public:
using parent = NodeBorder;
static std::atomic_int s_instances;
static std::atomic_bool s_running;
static std::mutex s_render_mutex;
static std::thread s_renderer;
static BlockingQueue<std::shared_ptr<NodeStrokePreview>> s_queue;
static void terminate_renderer();
@@ -52,6 +53,7 @@ public:
std::vector<StrokeFrame> stroke_draw_compute(Stroke& stroke) const;
void draw_stroke();
void draw_stroke_immediate();
Image render_to_image();
virtual void draw() override;
virtual void handle_resize(glm::vec2 old_size, glm::vec2 new_size, float zoom) override;
virtual void destroy() override;