#pragma once #include "node_border.h" #include "rtt.h" #include "brush.h" #include "texture.h" class NodeStrokePreview : public NodeBorder { struct StrokeFrame { glm::vec4 col; float flow; float opacity; std::array shapes; glm::vec4 m_mixer_rect; }; static RTT m_rtt; static RTT m_rtt_mixer; static Texture2D m_tex; // blending tmp texture static Texture2D m_tex_dual; static Texture2D m_tex_background; static Sampler m_sampler_linear; static Sampler m_sampler_linear_repeat; static Sampler m_sampler_mipmap; static DynamicShape m_brush_shape; Texture2D m_tex_preview; public: using parent = NodeBorder; static std::atomic_int s_instances; static std::atomic_bool s_running; static std::thread s_renderer; static BlockingQueue> s_queue; static void terminate_renderer(); static void empty_queue(); std::shared_ptr m_brush; bool m_draw_first = false; glm::vec2 m_preview_size = { 0, 0 }; float m_min_flow = 0.f; float m_max_size = 0.f; float m_pad_override = NAN; virtual Node* clone_instantiate() const override; virtual void clone_copy(Node* dest) const override; virtual void clone_children(Node* dest) const override; virtual void clone_finalize(Node* dest) const override; void init_controls(); virtual void restore_context() override; virtual void clear_context() override; void stroke_draw_mix(const glm::vec2& bb_min, const glm::vec2& bb_sz); // return rect {origin, size} glm::vec4 stroke_draw_samples(std::array& P, Texture2D& blend_tex); std::vector stroke_draw_compute(Stroke& stroke) const; void draw_stroke(); void draw_stroke_immediate(); virtual void draw() override; virtual void handle_resize(glm::vec2 old_size, glm::vec2 new_size, float zoom) override; virtual void destroy() override; virtual void handle_on_screen(bool old_visibility, bool new_visibility) override; };