diff --git a/data/layout.xml b/data/layout.xml
index 99e13d4..43574f6 100644
--- a/data/layout.xml
+++ b/data/layout.xml
@@ -200,12 +200,18 @@
+
+
+
+
+
+
diff --git a/engine/app.h b/engine/app.h
index efb53df..9802493 100644
--- a/engine/app.h
+++ b/engine/app.h
@@ -120,6 +120,7 @@ public:
bool key_down(kKey key);
bool key_up(kKey key);
bool key_char(char key);
+ void toggle_ui();
void rec_clear();
void rec_loop();
diff --git a/engine/app_events.cpp b/engine/app_events.cpp
index c1f20d5..effc834 100644
--- a/engine/app_events.cpp
+++ b/engine/app_events.cpp
@@ -185,3 +185,12 @@ bool App::key_char(char key)
layout[main_id]->update();
return ret == kEventResult::Consumed;
}
+
+void App::toggle_ui()
+{
+ static bool fullscreen = false;
+ auto m = layout[main_id]->m_children[0];
+ for (int i = 2; i < m->m_children.size(); i++)
+ m->m_children[i]->m_display = fullscreen;
+ fullscreen = !fullscreen;
+}
diff --git a/engine/app_layout.cpp b/engine/app_layout.cpp
index cc08ef5..ae14c6f 100644
--- a/engine/app_layout.cpp
+++ b/engine/app_layout.cpp
@@ -661,11 +661,6 @@ void App::initLayout()
layout[main_id]->add_child(butt);
butt->on_click = [this](Node*){
- static bool fullscreen = false;
- auto m = layout[main_id]->m_children[0];
- for (int i = 2; i < m->m_children.size(); i++)
- m->m_children[i]->m_display = fullscreen;
- fullscreen = !fullscreen;
};
if (auto* slider = layout[main_id]->find("frames-slider"))
diff --git a/engine/brush.cpp b/engine/brush.cpp
index 12b405b..6cb8307 100644
--- a/engine/brush.cpp
+++ b/engine/brush.cpp
@@ -143,6 +143,11 @@ ui::StrokeSample ui::Stroke::randomize_sample(const glm::vec2& pos, float pressu
s.pos = pos + (rnd_vec() * m_brush.m_jitter_spread * 100.f);
s.size = 800.f * m_brush.m_tip_size * (1.f - rnd_nor() * m_brush.m_jitter_scale) * size_dyn;
s.flow = m_brush.m_tip_flow * (1.f - rnd_nor() * m_brush.m_jitter_flow) * flow_dyn;
+ auto hsv = convert_rgb2hsv(m_brush.m_tip_color);
+ hsv.x = hsv.x + (rnd_nor() - 0.5f) * m_brush.m_jitter_hue;
+ hsv.y = hsv.y + (rnd_nor() - 0.5f) * m_brush.m_jitter_sat;
+ hsv.z = hsv.z + (rnd_nor() - 0.5f) * m_brush.m_jitter_val;
+ s.col = convert_hsv2rgb(hsv);
return s;
}
std::vector ui::Stroke::compute_samples()
diff --git a/engine/brush.h b/engine/brush.h
index c7a9e92..5b31e8d 100644
--- a/engine/brush.h
+++ b/engine/brush.h
@@ -26,11 +26,15 @@ public:
float m_jitter_angle = 0;
float m_jitter_spread = 0;
float m_jitter_flow = 0;
+ float m_jitter_hue = 0;
+ float m_jitter_sat = 0;
+ float m_jitter_val = 0;
int m_blend_mode = 0;
};
struct StrokeSample
{
+ glm::vec3 col = { 0, 0, 0 };
glm::vec2 pos = { 0, 0 };
glm::vec2 origin = { 0,0 };
float size = 0;
diff --git a/engine/canvas.cpp b/engine/canvas.cpp
index 183bd1e..2782e94 100644
--- a/engine/canvas.cpp
+++ b/engine/canvas.cpp
@@ -278,7 +278,6 @@ void ui::Canvas::stroke_draw()
ShaderManager::u_int(kShaderUniform::TexBG, 1); // bg
#endif
ShaderManager::u_int(kShaderUniform::TexStencil, 3); // stencil
- ShaderManager::u_vec4(kShaderUniform::Col, m_brush.m_tip_color);
ShaderManager::u_vec2(kShaderUniform::Resolution, { m_width, m_height });
ShaderManager::u_vec2(kShaderUniform::StencilOffset, stencil_offset);
ShaderManager::u_float(kShaderUniform::StencilAlpha, m_brush.m_tip_stencil);
@@ -351,6 +350,7 @@ void ui::Canvas::stroke_draw()
);
ShaderManager::u_mat4(kShaderUniform::MVP, ortho_proj);
+ ShaderManager::u_vec4(kShaderUniform::Col, glm::vec4(s.col, m_brush.m_tip_color.a));
ShaderManager::u_float(kShaderUniform::Alpha, s.flow);
m_plane_brush.update_vertices(P);
m_plane_brush.draw_fill();
diff --git a/engine/event.h b/engine/event.h
index c081a5f..aaffe40 100644
--- a/engine/event.h
+++ b/engine/event.h
@@ -9,7 +9,8 @@ enum class kKey : uint8_t
AndroidBack,
KeySpacebar,
KeyE,
- KeyAlt
+ KeyAlt,
+ KeyTab,
};
enum class kEventResult : uint8_t
diff --git a/engine/keymap.h b/engine/keymap.h
index 029a467..dc67958 100644
--- a/engine/keymap.h
+++ b/engine/keymap.h
@@ -189,7 +189,7 @@ kKey convert_key(int key)
CASE(kVK_ANSI_Keypad8, kKey::Unknown);
CASE(kVK_ANSI_Keypad9, kKey::Unknown);
CASE(kVK_Return, kKey::Unknown);
- CASE(kVK_Tab, kKey::Unknown);
+ CASE(kVK_Tab, kKey::KeyTab);
CASE(kVK_Space, kKey::Unknown);
CASE(kVK_Delete, kKey::Unknown);
CASE(kVK_Escape, kKey::Unknown);
@@ -243,7 +243,7 @@ kKey convert_key(int key)
CASE(VK_XBUTTON1, kKey::Unknown);
CASE(VK_XBUTTON2, kKey::Unknown);
CASE(VK_BACK, kKey::Unknown);
- CASE(VK_TAB, kKey::Unknown);
+ CASE(VK_TAB, kKey::KeyTab);
CASE(VK_CLEAR, kKey::Unknown);
CASE(VK_RETURN, kKey::Unknown);
CASE(VK_SHIFT, kKey::Unknown);
diff --git a/engine/node_canvas.cpp b/engine/node_canvas.cpp
index 9ac1d80..7cc60e5 100644
--- a/engine/node_canvas.cpp
+++ b/engine/node_canvas.cpp
@@ -1,4 +1,5 @@
#include "pch.h"
+#include "app.h"
#include "log.h"
#include "node_canvas.h"
@@ -312,6 +313,8 @@ kEventResult NodeCanvas::handle_event(Event* e)
ui::Canvas::set_mode(ui::Canvas::kCanvasMode::Draw);
// if (ke->m_key == kKey::KeySpacebar)
// m_canvas->m_alpha_lock = false;
+ if (ke->m_key == kKey::KeyTab)
+ App::I.toggle_ui();
break;
case kEventType::GestureStart:
mouse_capture();
diff --git a/engine/node_panel_stroke.cpp b/engine/node_panel_stroke.cpp
index 6bf244e..293b173 100644
--- a/engine/node_panel_stroke.cpp
+++ b/engine/node_panel_stroke.cpp
@@ -35,6 +35,9 @@ void NodePanelStroke::update_controls()
m_jitter_angle->m_value.x = b.m_jitter_angle;
m_jitter_spread->m_value.x = b.m_jitter_spread;
m_jitter_flow->m_value.x = b.m_jitter_flow;
+ m_jitter_hue->m_value.x = b.m_jitter_hue;
+ m_jitter_sat->m_value.x = b.m_jitter_sat;
+ m_jitter_val->m_value.x = b.m_jitter_val;
m_tip_angle_follow->checked = b.m_tip_angle_follow;
m_tip_flow_pressure->checked = b.m_tip_flow_pressure;
m_tip_size_pressure->checked = b.m_tip_size_pressure;
@@ -62,6 +65,9 @@ void NodePanelStroke::init_controls()
init_slider(m_jitter_angle, "jitter-angle", &ui::Brush::m_jitter_angle);
init_slider(m_jitter_spread, "jitter-spread", &ui::Brush::m_jitter_spread);
init_slider(m_jitter_flow, "jitter-flow", &ui::Brush::m_jitter_flow);
+ init_slider(m_jitter_hue, "jitter-hue", &ui::Brush::m_jitter_hue);
+ init_slider(m_jitter_sat, "jitter-sat", &ui::Brush::m_jitter_sat);
+ init_slider(m_jitter_val, "jitter-val", &ui::Brush::m_jitter_val);
m_curves[m_tip_size] = [](float v){ return glm::pow(v, 3.f); };
m_curves[m_tip_spacing] = [](float v){ return glm::pow(v * 4.f, 2.f); };
m_curves[m_tip_flow] = [](float v){ return glm::pow(v, 2.f); };
diff --git a/engine/node_panel_stroke.h b/engine/node_panel_stroke.h
index 4faf743..316ce67 100644
--- a/engine/node_panel_stroke.h
+++ b/engine/node_panel_stroke.h
@@ -23,6 +23,9 @@ public:
NodeSliderH* m_jitter_angle;
NodeSliderH* m_jitter_spread;
NodeSliderH* m_jitter_flow;
+ NodeSliderH* m_jitter_hue;
+ NodeSliderH* m_jitter_sat;
+ NodeSliderH* m_jitter_val;
NodeCheckBox* m_tip_angle_follow;
NodeCheckBox* m_tip_flow_pressure;
NodeCheckBox* m_tip_size_pressure;