7a5892
7a5892
7a5892
#include <tools modifierline.h="" modifiers=""></tools>
7a5892
7a5892
7a5892
//*****************************************************************************************
7a5892
//    TModifierLine implementation
7a5892
//*****************************************************************************************
7a5892
7a5892
7a5892
static inline void calcFixedAngle(const TTrackPoint &p0, TTrackPoint &p1) {
7a5892
  TPointD p = p1.position - p0.position;
7a5892
  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);
7a5892
    a = round(a*4/M_PI)*M_PI/4;
7a5892
    p.x = cos(a)*l;
7a5892
    p.y = sin(a)*l;
7a5892
  }
7a5892
  p1.position = p0.position + p;
7a5892
}
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);
7a5892
  return TTrack::interpolationLinear(p0, p1, originalIndex/(original.size() - 1));
7a5892
}
7a5892
7a5892
void
7a5892
TModifierLine::modifyTrack(
7a5892
  const TTrack &track,
7a5892
  const TInputSavePoint::Holder &savePoint,
7a5892
  TTrackList &outTracks )
7a5892
{
7a5892
  if (!track.handler) {
7a5892
    track.handler = new TTrackHandler(track);
7a5892
    Modifier *modifier = new Modifier(*track.handler);
7a5892
    modifier->savePoint = savePoint;
7a5892
    track.handler->tracks.push_back( new TTrack(modifier) );
7a5892
  }
7a5892
7a5892
  if (!track.changed())
7a5892
    return;
7a5892
  if (track.handler->tracks.empty())
7a5892
    return;
7a5892
  
7a5892
  TTrack &subTrack = *track.handler->tracks.front();
7a5892
  Modifier* modifier = dynamic_cast<modifier*>(subTrack.modifier.getPointer());</modifier*>
7a5892
  if (!modifier)
7a5892
    { track.resetChanges(); return; }
7a5892
  
7a5892
  bool fixAngle = track.getKeyState(track.back()).isPressed(TKey::shift);
7a5892
  outTracks.push_back(track.handler->tracks.front());
7a5892
7a5892
  int i1 = track.size();
7a5892
  int i0 = i1 - track.pointsAdded;
7a5892
  double maxPressure = modifier->maxPressure;
7a5892
  if (track.pointsRemoved)
7a5892
    { maxPressure = 0; i0 = 0; }
7a5892
  for(int i = i0; i < i1; ++i) {
7a5892
    double p = track[i].pressure;
7a5892
    if (maxPressure < p) maxPressure = p;
7a5892
  }
7a5892
  modifier->maxPressure = maxPressure;
7a5892
  modifier->fixAngle = fixAngle;
7a5892
  if (track.finished())
7a5892
    modifier->savePoint.reset();
7a5892
7a5892
  subTrack.truncate(0);
7a5892
  
7a5892
  if (track.size() > 0) {
7a5892
    TTrackPoint p = track.front();
7a5892
    p.originalIndex = 0;
7a5892
    p.pressure = maxPressure;
7a5892
    p.tilt = TPointD();
7a5892
    subTrack.push_back(p);
7a5892
  }
7a5892
  
7a5892
  if (track.size() > 1) {
7a5892
    TTrackPoint p = track.back();
7a5892
    p.originalIndex = track.size() - 1;
7a5892
    p.pressure = maxPressure;
7a5892
    p.tilt = TPointD();
7a5892
    if (fixAngle) calcFixedAngle(subTrack.front(), p);
7a5892
    subTrack.push_back(p);
7a5892
  }
7a5892
  
7a5892
  track.resetChanges();
7a5892
}