change brush size based on camera fov / zoom, refactor brush value curves
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
#include "pch.h"
|
#include "pch.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "brush.h"
|
#include "brush.h"
|
||||||
|
#include "canvas.h"
|
||||||
|
|
||||||
void ui::BrushMesh::draw(const std::vector<StrokeSample>& samples, const glm::mat4& proj)
|
void ui::BrushMesh::draw(const std::vector<StrokeSample>& 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.origin = pos;
|
||||||
s.angle = -curve_angle + (m_brush.m_tip_angle + rnd_nor() * m_brush.m_jitter_angle) * (float)(M_PI * 2.0);
|
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.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.size = 800.f * m_brush.m_tip_size * (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.flow = m_brush.m_tip_flow * (1.f - rnd_nor() * m_brush.m_jitter_flow) * flow_dyn;
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
std::vector<ui::StrokeSample> ui::Stroke::compute_samples()
|
std::vector<ui::StrokeSample> 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);
|
pressure = pressure * glm::pow(m_curve, 2.f);
|
||||||
|
|
||||||
if (m_brush.m_tip_size_pressure)
|
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 :
|
float dist = m_keypoints.empty() ? 0.f :
|
||||||
m_keypoints.back().dist + glm::distance(m_keypoints.back().pos, pos);
|
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_last_kp = 0;
|
||||||
m_dist = 0.f;
|
m_dist = 0.f;
|
||||||
m_brush = brush;
|
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);
|
prng.seed(0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ void CanvasModeBasicCamera::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
|
|||||||
case kEventType::MouseScroll:
|
case kEventType::MouseScroll:
|
||||||
m_zoom_canvas += me->m_scroll_delta * 0.1f;
|
m_zoom_canvas += me->m_scroll_delta * 0.1f;
|
||||||
canvas->m_cam_fov -= me->m_scroll_delta * 20.1f;
|
canvas->m_cam_fov -= me->m_scroll_delta * 20.1f;
|
||||||
|
App::I.brush_update();
|
||||||
break;
|
break;
|
||||||
case kEventType::MouseCancel:
|
case kEventType::MouseCancel:
|
||||||
m_draggingR = false;
|
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_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_fov = m_camera_fov - ge->m_distance_delta * .05f;
|
||||||
canvas->m_cam_rot = canvas->m_pan * 0.003f;
|
canvas->m_cam_rot = canvas->m_pan * 0.003f;
|
||||||
|
App::I.brush_update();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -21,9 +21,9 @@ void NodePanelStroke::init()
|
|||||||
|
|
||||||
void NodePanelStroke::set_params(const ui::Brush &b)
|
void NodePanelStroke::set_params(const ui::Brush &b)
|
||||||
{
|
{
|
||||||
m_tip_size->m_value.x = b.m_tip_size;
|
m_tip_size->m_value.x = glm::pow(b.m_tip_size, 1.f/3.f);
|
||||||
m_tip_spacing->m_value.x = b.m_tip_spacing;
|
m_tip_spacing->m_value.x = glm::pow(b.m_tip_spacing, 1.f/2.f) / 4.f;
|
||||||
m_tip_flow->m_value.x = b.m_tip_flow;
|
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_opacity->m_value.x = b.m_tip_opacity;
|
||||||
m_tip_angle->m_value.x = b.m_tip_angle;
|
m_tip_angle->m_value.x = b.m_tip_angle;
|
||||||
m_jitter_scale->m_value.x = b.m_jitter_scale;
|
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_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);
|
||||||
|
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_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);
|
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)
|
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();
|
m_canvas->draw_stroke();
|
||||||
if (on_stroke_change)
|
if (on_stroke_change)
|
||||||
on_stroke_change(this);
|
on_stroke_change(this);
|
||||||
|
|||||||
@@ -22,12 +22,14 @@ public:
|
|||||||
NodeCheckBox* m_tip_flow_pressure;
|
NodeCheckBox* m_tip_flow_pressure;
|
||||||
NodeCheckBox* m_tip_size_pressure;
|
NodeCheckBox* m_tip_size_pressure;
|
||||||
std::function<void(Node* target)> on_stroke_change;
|
std::function<void(Node* target)> on_stroke_change;
|
||||||
|
std::map<NodeSliderH*, std::function<float(float)>> m_curves;
|
||||||
|
|
||||||
virtual Node* clone_instantiate() const override;
|
virtual Node* clone_instantiate() const override;
|
||||||
virtual void clone_finalize(Node* dest) const override;
|
virtual void clone_finalize(Node* dest) const override;
|
||||||
virtual void init() override;
|
virtual void init() override;
|
||||||
void init_controls();
|
void init_controls();
|
||||||
void set_params(const ui::Brush& b);
|
void set_params(const ui::Brush& b);
|
||||||
|
|
||||||
void init_slider(NodeSliderH*& slider, const char* id, float ui::Brush::* prop);
|
void init_slider(NodeSliderH*& slider, const char* id, float ui::Brush::* prop);
|
||||||
void handle_slide(float ui::Brush::* prop, Node* target, float value);
|
void handle_slide(float ui::Brush::* prop, Node* target, float value);
|
||||||
|
|
||||||
|
|||||||
@@ -67,7 +67,6 @@ void NodeStrokePreview::draw_stroke()
|
|||||||
glm::mat4 proj = glm::ortho<float>(0, (float)m_rtt.getWidth(), 0, (float)m_rtt.getHeight(), -1, 1);
|
glm::mat4 proj = glm::ortho<float>(0, (float)m_rtt.getWidth(), 0, (float)m_rtt.getHeight(), -1, 1);
|
||||||
|
|
||||||
auto b = m_brush;
|
auto b = m_brush;
|
||||||
//b.m_tip_size *= .7f; // reduce the size in the preview
|
|
||||||
m_stroke.reset();
|
m_stroke.reset();
|
||||||
m_stroke.start(b);
|
m_stroke.start(b);
|
||||||
if (!m_stroke.m_keypoints.empty())
|
if (!m_stroke.m_keypoints.empty())
|
||||||
|
|||||||
Reference in New Issue
Block a user