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