code cleanup and improve brush direction
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user