code cleanup and improve brush direction

This commit is contained in:
2019-02-11 18:39:26 +01:00
parent 97c3ac0d19
commit 171ab31b47
5 changed files with 97 additions and 144 deletions

View File

@@ -161,6 +161,7 @@ std::vector<StrokeSample> Stroke::compute_samples()
{
bool is_first = m_last_kp == 0;
m_dist += m_step;
m_dir_dist += m_step;
while (m_dist > m_keypoints[m_last_kp + 1].dist)
m_last_kp++;
const auto& A = m_keypoints[m_last_kp];
@@ -168,28 +169,41 @@ std::vector<StrokeSample> Stroke::compute_samples()
float t = (m_dist - A.dist) / (B.dist - A.dist); // NOTE: must be A != B
auto pos = glm::lerp(A.pos, B.pos, t);
float pressure = glm::lerp(A.pressure, B.pressure, t);
auto s = randomize_sample(pos, pressure, 0);
if (s.valid())
{
if (m_brush->m_tip_angle_follow)
{
glm::vec2 v = s.origin - m_prev_sample.origin;
if (v.length() > 0)
if (m_dir_dist > m_dir_step)
{
m_direction.add((v));
auto avg = m_direction.average();
float curve_angle = -glm::orientedAngle(glm::normalize(avg), glm::vec2(1, 0));
glm::vec2 v = glm::normalize(m_keypoints[m_last_kp].pos - m_keypoints[m_dir_kp].pos);
m_dir_angle = -glm::orientedAngle(v, m_dir_ref);
if (glm::abs(m_dir_angle) > glm::pi<float>() / 2.f || !m_dir_valid)
{
m_direction.clear();
m_dir_ref = v;
m_dir_ref_angle = -glm::orientedAngle(m_dir_ref, { 1, 0 });
m_dir_angle = 0;
}
m_dir_kp = m_last_kp;
m_dir_dist = 0;
m_dir_valid = true;
}
// NOTE: average angles need correction for 0-360 discontinuity
//m_curve_angles.add(curve_angle);
//float avg = m_curve_angles.average();
s.angle += curve_angle;
if (m_dir_valid)
{
m_direction.add(m_dir_angle);
s.angle += m_direction.average() + m_dir_ref_angle;
m_prev_sample = s;
samples.push_back(s);
}
}
m_prev_sample = s;
samples.push_back(s);
else
{
m_prev_sample = s;
samples.push_back(s);
}
}
else
{
@@ -205,6 +219,10 @@ bool Stroke::has_sample()
}
void Stroke::reset(bool clear_keypoints /*= false*/)
{
m_dir_kp = 0;
m_dir_angle = 0;
m_dir_valid = false;
m_dir_dist = 0;
m_last_kp = 0;
m_dist = 0.f;
if (clear_keypoints)
@@ -251,6 +269,10 @@ void Stroke::start(const std::shared_ptr<Brush>& brush)
m_hsv_jitter.clear();
m_last_kp = 0;
m_dist = 0.f;
m_dir_kp = 0;
m_dir_angle = 0;
m_dir_valid = false;
m_dir_dist = 0;
m_brush = brush;
float size = glm::min(m_brush->m_tip_size / glm::tan(glm::radians(m_camera.fov * 0.5f)), m_max_size);
m_step = glm::max(m_brush->m_tip_spacing * size * 800.f, 1.f);