diff --git a/data/layout.xml b/data/layout.xml index 8eb3ac6..af602b4 100644 --- a/data/layout.xml +++ b/data/layout.xml @@ -195,7 +195,7 @@ - + diff --git a/src/app_layout.cpp b/src/app_layout.cpp index c28edbd..ea21115 100644 --- a/src/app_layout.cpp +++ b/src/app_layout.cpp @@ -154,6 +154,10 @@ void App::init_sidebar() // if (canvas) // canvas->m_brush = stroke->m_canvas->m_brush; // }; + stroke->on_stencil_changed = [this](Node*target, uint16_t id) { + Canvas::I->m_current_brush.m_tex_stencil_id = id; + stroke->m_preview->draw_stroke(); + }; layers->on_layer_add = [this](Node*) { canvas->m_canvas->layer_add(layers->m_layers.back()->m_label_text.c_str()); diff --git a/src/app_vr.cpp b/src/app_vr.cpp index 857df99..b81836d 100644 --- a/src/app_vr.cpp +++ b/src/app_vr.cpp @@ -86,7 +86,7 @@ void App::vr_draw(const glm::mat4& proj, const glm::mat4& camera, const glm::mat else if (canvas->m_canvas->m_show_tmp && canvas->m_canvas->m_current_layer_idx == layer_index) { sampler.bind(0); - auto& paper = TextureManager::get(const_hash("data/paper.jpg")); + auto& paper = TextureManager::get(canvas->m_canvas->m_current_stroke->m_brush.m_tex_stencil_id); ShaderManager::use(kShader::CompDraw); ShaderManager::u_int(kShaderUniform::Tex, 0); ShaderManager::u_int(kShaderUniform::TexStroke, 1); diff --git a/src/brush.h b/src/brush.h index 71d00f6..6824f47 100644 --- a/src/brush.h +++ b/src/brush.h @@ -8,6 +8,7 @@ public: int id = 0; std::string m_name; uint16_t m_tex_id = 0; + uint16_t m_tex_stencil_id = const_hash("data/paper.jpg"); glm::vec4 m_tip_color{1, 0, 0, 1}; float m_tip_size = 0; float m_tip_spacing = 0; diff --git a/src/canvas.cpp b/src/canvas.cpp index f1c9204..688e058 100644 --- a/src/canvas.cpp +++ b/src/canvas.cpp @@ -290,7 +290,7 @@ void Canvas::stroke_draw_mix(const glm::vec2& bb_min, const glm::vec2& bb_sz) m_sampler.bind(0); m_sampler.bind(1); m_sampler.bind(2); - auto& paper = TextureManager::get(const_hash("data/paper.jpg")); + auto& paper = TextureManager::get(m_current_stroke->m_brush.m_tex_stencil_id); ShaderManager::use(kShader::CompDraw); ShaderManager::u_int(kShaderUniform::Tex, 0); //ShaderManager::u_int(kShaderUniform::TexA, 0); @@ -346,7 +346,7 @@ void Canvas::stroke_draw() auto m_brush = m_current_stroke->m_brush; auto samples = m_current_stroke->compute_samples(); auto& tex = TextureManager::get(m_brush.m_tex_id); - auto& stencil = TextureManager::get(const_hash("data/paper.jpg")); + auto& stencil = TextureManager::get(m_brush.m_tex_stencil_id); auto ortho_proj = glm::ortho(0.f, (float)m_width, 0.f, (float)m_height, -1.f, 1.f); std::vector B{ @@ -832,7 +832,7 @@ void Canvas::stroke_commit() } else { - auto& paper = TextureManager::get(const_hash("data/paper.jpg")); + auto& paper = TextureManager::get(m_current_stroke->m_brush.m_tex_stencil_id); ShaderManager::use(kShader::CompDraw); ShaderManager::u_int(kShaderUniform::Tex, 0); diff --git a/src/node_canvas.cpp b/src/node_canvas.cpp index edd8fe7..d993db6 100644 --- a/src/node_canvas.cpp +++ b/src/node_canvas.cpp @@ -201,7 +201,7 @@ void NodeCanvas::draw() else if(m_canvas->m_current_stroke && m_canvas->m_show_tmp && m_canvas->m_current_layer_idx == layer_index) { m_sampler.bind(0); - auto& paper = TextureManager::get(const_hash("data/paper.jpg")); + auto& paper = TextureManager::get(m_canvas->m_current_stroke->m_brush.m_tex_stencil_id); ShaderManager::use(kShader::CompDraw); ShaderManager::u_int(kShaderUniform::Tex, 0); ShaderManager::u_int(kShaderUniform::TexStroke, 1); diff --git a/src/node_panel_stroke.cpp b/src/node_panel_stroke.cpp index 7313623..0bc6b22 100644 --- a/src/node_panel_stroke.cpp +++ b/src/node_panel_stroke.cpp @@ -2,6 +2,8 @@ #include "log.h" #include "node_panel_stroke.h" #include "canvas.h" +#include "node_button.h" +#include "app.h" Node* NodePanelStroke::clone_instantiate() const { @@ -85,6 +87,17 @@ void NodePanelStroke::init_controls() m_preview->m_brush = Canvas::I->m_current_brush; m_preview->draw_stroke(); + + auto load_stencil = find("tip-stencil-load"); + load_stencil->on_click = [this](Node*) { + App::I.pick_image([this](std::string path) { + if (TextureManager::load(path.c_str())) + { + if (on_stencil_changed) + on_stencil_changed(this, const_hash(path.c_str())); + } + }); + }; } void NodePanelStroke::init_slider(NodeSliderH*& target, const char* id, float Brush::* prop) diff --git a/src/node_panel_stroke.h b/src/node_panel_stroke.h index daeab11..5954392 100644 --- a/src/node_panel_stroke.h +++ b/src/node_panel_stroke.h @@ -37,6 +37,7 @@ public: NodeCheckBox* m_tip_sat_pressure; NodeCheckBox* m_tip_val_pressure; std::function on_stroke_change; + std::function on_stencil_changed; std::map> m_curves; virtual Node* clone_instantiate() const override; diff --git a/src/node_stroke_preview.cpp b/src/node_stroke_preview.cpp index 9381176..53dc6de 100644 --- a/src/node_stroke_preview.cpp +++ b/src/node_stroke_preview.cpp @@ -80,7 +80,7 @@ void NodeStrokePreview::draw_stroke() tex.bind(); m_sampler_brush.bind(0); - auto& stencil = TextureManager::get(const_hash("data/paper.jpg")); + auto& stencil = TextureManager::get(b.m_tex_stencil_id); glActiveTexture(GL_TEXTURE1); stencil.bind(); m_sampler.bind(1);