toggle ui with Tab, add hsv jitter
This commit is contained in:
@@ -200,12 +200,18 @@
|
|||||||
<node height="20" justify="center"><text text="Angle" font-face="arial" font-size="11"/></node>
|
<node height="20" justify="center"><text text="Angle" font-face="arial" font-size="11"/></node>
|
||||||
<node height="20" justify="center"><text text="Spread" font-face="arial" font-size="11"/></node>
|
<node height="20" justify="center"><text text="Spread" font-face="arial" font-size="11"/></node>
|
||||||
<node height="20" justify="center"><text text="Flow" font-face="arial" font-size="11"/></node>
|
<node height="20" justify="center"><text text="Flow" font-face="arial" font-size="11"/></node>
|
||||||
|
<node height="20" justify="center"><text text="Hue" font-face="arial" font-size="11"/></node>
|
||||||
|
<node height="20" justify="center"><text text="Saturation" font-face="arial" font-size="11"/></node>
|
||||||
|
<node height="20" justify="center"><text text="Value" font-face="arial" font-size="11"/></node>
|
||||||
</node>
|
</node>
|
||||||
<border dir="col" align="center" grow="1" width="1">
|
<border dir="col" align="center" grow="1" width="1">
|
||||||
<node height="20" pad="1" width="100%"><slider-h id="jitter-scale"/></node>
|
<node height="20" pad="1" width="100%"><slider-h id="jitter-scale"/></node>
|
||||||
<node height="20" pad="1" width="100%"><slider-h id="jitter-angle"/></node>
|
<node height="20" pad="1" width="100%"><slider-h id="jitter-angle"/></node>
|
||||||
<node height="20" pad="1" width="100%"><slider-h id="jitter-spread"/></node>
|
<node height="20" pad="1" width="100%"><slider-h id="jitter-spread"/></node>
|
||||||
<node height="20" pad="1" width="100%"><slider-h id="jitter-flow"/></node>
|
<node height="20" pad="1" width="100%"><slider-h id="jitter-flow"/></node>
|
||||||
|
<node height="20" pad="1" width="100%"><slider-h id="jitter-hue"/></node>
|
||||||
|
<node height="20" pad="1" width="100%"><slider-h id="jitter-sat"/></node>
|
||||||
|
<node height="20" pad="1" width="100%"><slider-h id="jitter-val"/></node>
|
||||||
</border>
|
</border>
|
||||||
</node>
|
</node>
|
||||||
|
|
||||||
|
|||||||
@@ -120,6 +120,7 @@ public:
|
|||||||
bool key_down(kKey key);
|
bool key_down(kKey key);
|
||||||
bool key_up(kKey key);
|
bool key_up(kKey key);
|
||||||
bool key_char(char key);
|
bool key_char(char key);
|
||||||
|
void toggle_ui();
|
||||||
|
|
||||||
void rec_clear();
|
void rec_clear();
|
||||||
void rec_loop();
|
void rec_loop();
|
||||||
|
|||||||
@@ -185,3 +185,12 @@ bool App::key_char(char key)
|
|||||||
layout[main_id]->update();
|
layout[main_id]->update();
|
||||||
return ret == kEventResult::Consumed;
|
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;
|
||||||
|
}
|
||||||
|
|||||||
@@ -661,11 +661,6 @@ void App::initLayout()
|
|||||||
layout[main_id]->add_child(butt);
|
layout[main_id]->add_child(butt);
|
||||||
|
|
||||||
butt->on_click = [this](Node*){
|
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<NodeSliderH>("frames-slider"))
|
if (auto* slider = layout[main_id]->find<NodeSliderH>("frames-slider"))
|
||||||
|
|||||||
@@ -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.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.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;
|
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;
|
return s;
|
||||||
}
|
}
|
||||||
std::vector<ui::StrokeSample> ui::Stroke::compute_samples()
|
std::vector<ui::StrokeSample> ui::Stroke::compute_samples()
|
||||||
|
|||||||
@@ -26,11 +26,15 @@ public:
|
|||||||
float m_jitter_angle = 0;
|
float m_jitter_angle = 0;
|
||||||
float m_jitter_spread = 0;
|
float m_jitter_spread = 0;
|
||||||
float m_jitter_flow = 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;
|
int m_blend_mode = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct StrokeSample
|
struct StrokeSample
|
||||||
{
|
{
|
||||||
|
glm::vec3 col = { 0, 0, 0 };
|
||||||
glm::vec2 pos = { 0, 0 };
|
glm::vec2 pos = { 0, 0 };
|
||||||
glm::vec2 origin = { 0,0 };
|
glm::vec2 origin = { 0,0 };
|
||||||
float size = 0;
|
float size = 0;
|
||||||
|
|||||||
@@ -278,7 +278,6 @@ void ui::Canvas::stroke_draw()
|
|||||||
ShaderManager::u_int(kShaderUniform::TexBG, 1); // bg
|
ShaderManager::u_int(kShaderUniform::TexBG, 1); // bg
|
||||||
#endif
|
#endif
|
||||||
ShaderManager::u_int(kShaderUniform::TexStencil, 3); // stencil
|
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::Resolution, { m_width, m_height });
|
||||||
ShaderManager::u_vec2(kShaderUniform::StencilOffset, stencil_offset);
|
ShaderManager::u_vec2(kShaderUniform::StencilOffset, stencil_offset);
|
||||||
ShaderManager::u_float(kShaderUniform::StencilAlpha, m_brush.m_tip_stencil);
|
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_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);
|
ShaderManager::u_float(kShaderUniform::Alpha, s.flow);
|
||||||
m_plane_brush.update_vertices(P);
|
m_plane_brush.update_vertices(P);
|
||||||
m_plane_brush.draw_fill();
|
m_plane_brush.draw_fill();
|
||||||
|
|||||||
@@ -9,7 +9,8 @@ enum class kKey : uint8_t
|
|||||||
AndroidBack,
|
AndroidBack,
|
||||||
KeySpacebar,
|
KeySpacebar,
|
||||||
KeyE,
|
KeyE,
|
||||||
KeyAlt
|
KeyAlt,
|
||||||
|
KeyTab,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class kEventResult : uint8_t
|
enum class kEventResult : uint8_t
|
||||||
|
|||||||
@@ -189,7 +189,7 @@ kKey convert_key(int key)
|
|||||||
CASE(kVK_ANSI_Keypad8, kKey::Unknown);
|
CASE(kVK_ANSI_Keypad8, kKey::Unknown);
|
||||||
CASE(kVK_ANSI_Keypad9, kKey::Unknown);
|
CASE(kVK_ANSI_Keypad9, kKey::Unknown);
|
||||||
CASE(kVK_Return, kKey::Unknown);
|
CASE(kVK_Return, kKey::Unknown);
|
||||||
CASE(kVK_Tab, kKey::Unknown);
|
CASE(kVK_Tab, kKey::KeyTab);
|
||||||
CASE(kVK_Space, kKey::Unknown);
|
CASE(kVK_Space, kKey::Unknown);
|
||||||
CASE(kVK_Delete, kKey::Unknown);
|
CASE(kVK_Delete, kKey::Unknown);
|
||||||
CASE(kVK_Escape, kKey::Unknown);
|
CASE(kVK_Escape, kKey::Unknown);
|
||||||
@@ -243,7 +243,7 @@ kKey convert_key(int key)
|
|||||||
CASE(VK_XBUTTON1, kKey::Unknown);
|
CASE(VK_XBUTTON1, kKey::Unknown);
|
||||||
CASE(VK_XBUTTON2, kKey::Unknown);
|
CASE(VK_XBUTTON2, kKey::Unknown);
|
||||||
CASE(VK_BACK, kKey::Unknown);
|
CASE(VK_BACK, kKey::Unknown);
|
||||||
CASE(VK_TAB, kKey::Unknown);
|
CASE(VK_TAB, kKey::KeyTab);
|
||||||
CASE(VK_CLEAR, kKey::Unknown);
|
CASE(VK_CLEAR, kKey::Unknown);
|
||||||
CASE(VK_RETURN, kKey::Unknown);
|
CASE(VK_RETURN, kKey::Unknown);
|
||||||
CASE(VK_SHIFT, kKey::Unknown);
|
CASE(VK_SHIFT, kKey::Unknown);
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#include "pch.h"
|
#include "pch.h"
|
||||||
|
#include "app.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "node_canvas.h"
|
#include "node_canvas.h"
|
||||||
|
|
||||||
@@ -312,6 +313,8 @@ kEventResult NodeCanvas::handle_event(Event* e)
|
|||||||
ui::Canvas::set_mode(ui::Canvas::kCanvasMode::Draw);
|
ui::Canvas::set_mode(ui::Canvas::kCanvasMode::Draw);
|
||||||
// if (ke->m_key == kKey::KeySpacebar)
|
// if (ke->m_key == kKey::KeySpacebar)
|
||||||
// m_canvas->m_alpha_lock = false;
|
// m_canvas->m_alpha_lock = false;
|
||||||
|
if (ke->m_key == kKey::KeyTab)
|
||||||
|
App::I.toggle_ui();
|
||||||
break;
|
break;
|
||||||
case kEventType::GestureStart:
|
case kEventType::GestureStart:
|
||||||
mouse_capture();
|
mouse_capture();
|
||||||
|
|||||||
@@ -35,6 +35,9 @@ void NodePanelStroke::update_controls()
|
|||||||
m_jitter_angle->m_value.x = b.m_jitter_angle;
|
m_jitter_angle->m_value.x = b.m_jitter_angle;
|
||||||
m_jitter_spread->m_value.x = b.m_jitter_spread;
|
m_jitter_spread->m_value.x = b.m_jitter_spread;
|
||||||
m_jitter_flow->m_value.x = b.m_jitter_flow;
|
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_angle_follow->checked = b.m_tip_angle_follow;
|
||||||
m_tip_flow_pressure->checked = b.m_tip_flow_pressure;
|
m_tip_flow_pressure->checked = b.m_tip_flow_pressure;
|
||||||
m_tip_size_pressure->checked = b.m_tip_size_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_angle, "jitter-angle", &ui::Brush::m_jitter_angle);
|
||||||
init_slider(m_jitter_spread, "jitter-spread", &ui::Brush::m_jitter_spread);
|
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_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_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_spacing] = [](float v){ return glm::pow(v * 4.f, 2.f); };
|
||||||
m_curves[m_tip_flow] = [](float v){ return glm::pow(v, 2.f); };
|
m_curves[m_tip_flow] = [](float v){ return glm::pow(v, 2.f); };
|
||||||
|
|||||||
@@ -23,6 +23,9 @@ public:
|
|||||||
NodeSliderH* m_jitter_angle;
|
NodeSliderH* m_jitter_angle;
|
||||||
NodeSliderH* m_jitter_spread;
|
NodeSliderH* m_jitter_spread;
|
||||||
NodeSliderH* m_jitter_flow;
|
NodeSliderH* m_jitter_flow;
|
||||||
|
NodeSliderH* m_jitter_hue;
|
||||||
|
NodeSliderH* m_jitter_sat;
|
||||||
|
NodeSliderH* m_jitter_val;
|
||||||
NodeCheckBox* m_tip_angle_follow;
|
NodeCheckBox* m_tip_angle_follow;
|
||||||
NodeCheckBox* m_tip_flow_pressure;
|
NodeCheckBox* m_tip_flow_pressure;
|
||||||
NodeCheckBox* m_tip_size_pressure;
|
NodeCheckBox* m_tip_size_pressure;
|
||||||
|
|||||||
Reference in New Issue
Block a user