7a5892
7a5892
7a5892
#include <tools modifierline.h="" modifiers=""></tools>
7a5892
7a5892
//*****************************************************************************************
7a5892
//    TModifierLine implementation
7a5892
//*****************************************************************************************
7a5892
7a5892
static inline void calcFixedAngle(const TTrackPoint &p0, TTrackPoint &p1) {
7a5892
  TPointD p = p1.position - p0.position;
shun-iwasawa 87c65e
  double l  = sqrt(p.x * p.x + p.y * p.y);
7a5892
  if (l < TConsts::epsilon) {
7a5892
    p = TPointD();
7a5892
  } else {
7a5892
    double a = atan2(p.y, p.x);
shun-iwasawa 87c65e
    a        = round(a * 4 / M_PI) * M_PI / 4;
shun-iwasawa 87c65e
    p.x      = cos(a) * l;
shun-iwasawa 87c65e
    p.y      = sin(a) * l;
7a5892
  }
7a5892
  p1.position = p0.position + p;
7a5892
}
7a5892
7a5892
TTrackPoint TModifierLine::Modifier::calcPoint(double originalIndex) {
7a5892
  if (original.empty()) return TTrackPoint();
7a5892
  if (original.size() < 2) return original.front();
7a5892
  TTrackPoint p0 = original.front();
7a5892
  TTrackPoint p1 = original.back();
7a5892
  if (fixAngle) calcFixedAngle(p0, p1);
shun-iwasawa 87c65e
  return TTrack::interpolationLinear(p0, p1,
shun-iwasawa 87c65e
                                     originalIndex / (original.size() - 1));
7a5892
}
7a5892
shun-iwasawa 87c65e
void TModifierLine::modifyTrack(const TTrack &track,
shun-iwasawa 87c65e
                                TTrackList &outTracks) {
7a5892
  if (!track.handler) {
shun-iwasawa 87c65e
    track.handler       = new TTrackHandler(track);
shun-iwasawa 87c65e
    Modifier *modifier  = new Modifier(*track.handler);
shun-iwasawa 87c65e
    track.handler->tracks.push_back(new TTrack(modifier));
7a5892
  }
7a5892
shun-iwasawa 87c65e
  if (!track.changed()) return;
shun-iwasawa 87c65e
  if (track.handler->tracks.empty()) return;
shun-iwasawa 87c65e
shun-iwasawa 87c65e
  TTrack &subTrack   = *track.handler->tracks.front();
shun-iwasawa 87c65e
  Modifier *modifier = dynamic_cast<modifier *="">(subTrack.modifier.getPointer());</modifier>
shun-iwasawa 87c65e
  if (!modifier) {
shun-iwasawa 87c65e
    track.resetChanges();
7a5892
    return;
shun-iwasawa 87c65e
  }
shun-iwasawa 87c65e
shun-iwasawa 87c65e
  bool fixAngle = track.getKeyState(track.back()).isPressed(TKey::control);
7a5892
  outTracks.push_back(track.handler->tracks.front());
7a5892
shun-iwasawa 87c65e
  int i1             = track.size();
shun-iwasawa 87c65e
  int i0             = i1 - track.pointsAdded;
7a5892
  double maxPressure = modifier->maxPressure;
shun-iwasawa 87c65e
  if (track.pointsRemoved) {
shun-iwasawa 87c65e
    maxPressure = 0;
shun-iwasawa 87c65e
    i0          = 0;
shun-iwasawa 87c65e
  }
shun-iwasawa 87c65e
  for (int i = i0; i < i1; ++i) {
7a5892
    double p = track[i].pressure;
7a5892
    if (maxPressure < p) maxPressure = p;
7a5892
  }
7a5892
  modifier->maxPressure = maxPressure;
shun-iwasawa 87c65e
  modifier->fixAngle    = fixAngle;
7a5892
7a5892
  subTrack.truncate(0);
shun-iwasawa 87c65e
7a5892
  if (track.size() > 0) {
shun-iwasawa 87c65e
    TTrackPoint p   = track.front();
7a5892
    p.originalIndex = 0;
shun-iwasawa 87c65e
    p.pressure      = maxPressure;
shun-iwasawa 87c65e
    p.tilt          = TPointD();
f278a5
    subTrack.push_back(p, false);
7a5892
  }
shun-iwasawa 87c65e
7a5892
  if (track.size() > 1) {
shun-iwasawa 87c65e
    TTrackPoint p   = track.back();
7a5892
    p.originalIndex = track.size() - 1;
shun-iwasawa 87c65e
    p.pressure      = maxPressure;
shun-iwasawa 87c65e
    p.tilt          = TPointD();
7a5892
    if (fixAngle) calcFixedAngle(subTrack.front(), p);
f278a5
    subTrack.push_back(p, false);
7a5892
  }
shun-iwasawa 87c65e
f278a5
  if (track.fixedFinished())
f278a5
    subTrack.fix_all();
f278a5
7a5892
  track.resetChanges();
7a5892
}