diff --git a/engine/brush.cpp b/engine/brush.cpp index aaaad8b..9a72ba1 100644 --- a/engine/brush.cpp +++ b/engine/brush.cpp @@ -1,6 +1,7 @@ #include "pch.h" #include "log.h" #include "brush.h" +#include "canvas.h" void ui::BrushMesh::draw(const std::vector& samples, const glm::mat4& proj) { @@ -168,8 +169,8 @@ ui::StrokeSample ui::Stroke::randomize_sample(const glm::vec2& pos, float pressu s.origin = pos; s.angle = -curve_angle + (m_brush.m_tip_angle + rnd_nor() * m_brush.m_jitter_angle) * (float)(M_PI * 2.0); s.pos = pos + (rnd_vec() * m_brush.m_jitter_spread * 100.f); - s.size = 800.f * glm::pow(m_brush.m_tip_size, 3.f) * (1.f - rnd_nor() * m_brush.m_jitter_scale) * size_dyn; - s.flow = glm::pow(m_brush.m_tip_flow, 2.f) * (1.f - rnd_nor() * m_brush.m_jitter_flow) * flow_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; return s; } std::vector ui::Stroke::compute_samples() @@ -226,7 +227,7 @@ void ui::Stroke::add_point(glm::vec2 pos, float pressure) pressure = pressure * glm::pow(m_curve, 2.f); if (m_brush.m_tip_size_pressure) - m_step = glm::max(glm::pow(m_brush.m_tip_spacing * 4.f, 2.f) * glm::pow(m_brush.m_tip_size, 3.f) * 800.f * pressure, 1.f); + m_step = glm::max(m_brush.m_tip_spacing * m_brush.m_tip_size * pressure * 800.f, 1.f); float dist = m_keypoints.empty() ? 0.f : m_keypoints.back().dist + glm::distance(m_keypoints.back().pos, pos); @@ -245,6 +246,7 @@ void ui::Stroke::start(const ui::Brush& brush) m_last_kp = 0; m_dist = 0.f; m_brush = brush; - m_step = glm::max(glm::pow(m_brush.m_tip_spacing * 4.f, 2.f) * glm::pow(m_brush.m_tip_size, 3.f) * 800.f, 1.f); + m_brush.m_tip_size *= 1.f / glm::tan(glm::radians(Canvas::I->m_cam_fov * 0.5f)); + m_step = glm::max(m_brush.m_tip_spacing * m_brush.m_tip_size * 800.f, 1.f); prng.seed(0); } diff --git a/engine/canvas_modes.cpp b/engine/canvas_modes.cpp index 6526989..50d360a 100644 --- a/engine/canvas_modes.cpp +++ b/engine/canvas_modes.cpp @@ -36,6 +36,7 @@ void CanvasModeBasicCamera::on_MouseEvent(MouseEvent* me, glm::vec2& loc) case kEventType::MouseScroll: m_zoom_canvas += me->m_scroll_delta * 0.1f; canvas->m_cam_fov -= me->m_scroll_delta * 20.1f; + App::I.brush_update(); break; case kEventType::MouseCancel: m_draggingR = false; @@ -59,6 +60,7 @@ void CanvasModeBasicCamera::on_GestureEvent(GestureEvent* ge) canvas->m_pan = m_pan_start + ge->m_pos_delta * glm::vec2(-1, -1) * 0.3f * (canvas->m_cam_fov / 85.f); canvas->m_cam_fov = m_camera_fov - ge->m_distance_delta * .05f; canvas->m_cam_rot = canvas->m_pan * 0.003f; + App::I.brush_update(); break; default: break; diff --git a/engine/node_panel_stroke.cpp b/engine/node_panel_stroke.cpp index f06316f..b82f2cb 100644 --- a/engine/node_panel_stroke.cpp +++ b/engine/node_panel_stroke.cpp @@ -21,9 +21,9 @@ void NodePanelStroke::init() void NodePanelStroke::set_params(const ui::Brush &b) { - m_tip_size->m_value.x = b.m_tip_size; - m_tip_spacing->m_value.x = b.m_tip_spacing; - m_tip_flow->m_value.x = b.m_tip_flow; + m_tip_size->m_value.x = glm::pow(b.m_tip_size, 1.f/3.f); + m_tip_spacing->m_value.x = glm::pow(b.m_tip_spacing, 1.f/2.f) / 4.f; + m_tip_flow->m_value.x = glm::pow(b.m_tip_flow, 1.f/2.f); m_tip_opacity->m_value.x = b.m_tip_opacity; m_tip_angle->m_value.x = b.m_tip_angle; m_jitter_scale->m_value.x = b.m_jitter_scale; @@ -50,6 +50,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); + 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); }; init_checkbox(m_tip_angle_follow, "tip-angle-follow", &ui::Brush::m_tip_angle_follow); init_checkbox(m_tip_flow_pressure, "tip-flow-pressure", &ui::Brush::m_tip_flow_pressure); @@ -68,7 +71,8 @@ void NodePanelStroke::init_slider(NodeSliderH*& target, const char* id, float ui void NodePanelStroke::handle_slide(float ui::Brush::* prop, Node* target, float value) { - m_canvas->m_brush.*prop = value; + auto curve = m_curves.find((NodeSliderH*)target); + m_canvas->m_brush.*prop = curve != m_curves.end() ? curve->second(value) : value; m_canvas->draw_stroke(); if (on_stroke_change) on_stroke_change(this); diff --git a/engine/node_panel_stroke.h b/engine/node_panel_stroke.h index 5419a5c..dec31c1 100644 --- a/engine/node_panel_stroke.h +++ b/engine/node_panel_stroke.h @@ -22,12 +22,14 @@ public: NodeCheckBox* m_tip_flow_pressure; NodeCheckBox* m_tip_size_pressure; std::function on_stroke_change; + std::map> m_curves; + virtual Node* clone_instantiate() const override; virtual void clone_finalize(Node* dest) const override; virtual void init() override; void init_controls(); void set_params(const ui::Brush& b); - + void init_slider(NodeSliderH*& slider, const char* id, float ui::Brush::* prop); void handle_slide(float ui::Brush::* prop, Node* target, float value); diff --git a/engine/node_stroke_preview.cpp b/engine/node_stroke_preview.cpp index 234c409..ab5786b 100644 --- a/engine/node_stroke_preview.cpp +++ b/engine/node_stroke_preview.cpp @@ -67,7 +67,6 @@ void NodeStrokePreview::draw_stroke() glm::mat4 proj = glm::ortho(0, (float)m_rtt.getWidth(), 0, (float)m_rtt.getHeight(), -1, 1); auto b = m_brush; - //b.m_tip_size *= .7f; // reduce the size in the preview m_stroke.reset(); m_stroke.start(b); if (!m_stroke.m_keypoints.empty())