Ivan Mahonin 2b429e
Ivan Mahonin 2b429e
Ivan Mahonin 2b429e
#include <tools/track.h>
Ivan Mahonin 2b429e
Ivan Mahonin 2b429e
Ivan Mahonin 2b429e
//*****************************************************************************************
Ivan Mahonin 49945e
//    Static fields
Ivan Mahonin 2b429e
//*****************************************************************************************
Ivan Mahonin 2b429e
Ivan Mahonin 49945e
TTrack::Id TTrack::m_lastId = 0;
Ivan Mahonin 2b429e
Ivan Mahonin 2b429e
Ivan Mahonin 2b429e
//*****************************************************************************************
Ivan Mahonin 2b429e
//    TTrackModifier implemantation
Ivan Mahonin 2b429e
//*****************************************************************************************
Ivan Mahonin 2b429e
Ivan Mahonin 2b429e
TTrackPoint
Ivan Mahonin 2b429e
TTrackModifier::calcPoint(double originalIndex) {
Ivan Mahonin 2b429e
  TTrackPoint p = original.calcPoint(originalIndex);
Ivan Mahonin 2b429e
  p.originalIndex = originalIndex;
Ivan Mahonin 2b429e
  return p;
Ivan Mahonin 2b429e
}
Ivan Mahonin 2b429e
Ivan Mahonin 2b429e
Ivan Mahonin 2b429e
//*****************************************************************************************
Ivan Mahonin 2b429e
//    TTrack implemantation
Ivan Mahonin 2b429e
//*****************************************************************************************
Ivan Mahonin 2b429e
Ivan Mahonin 2b429e
TTrack::TTrack(
Ivan Mahonin efa14d
  TInputState::DeviceId deviceId,
Ivan Mahonin efa14d
  TInputState::TouchId touchId,
Ivan Mahonin efa14d
  const TInputState::KeyHistory::Holder &keyHistory,
Ivan Mahonin 49945e
  const TInputState::ButtonHistory::Holder &buttonHistory,
Ivan Mahonin 49945e
  bool hasPressure,
Ivan Mahonin 49945e
  bool hasTilt
Ivan Mahonin 2b429e
):
Ivan Mahonin 49945e
  id(++m_lastId),
Ivan Mahonin 2b429e
  deviceId(deviceId),
Ivan Mahonin 2b429e
  touchId(touchId),
Ivan Mahonin 2b429e
  keyHistory(keyHistory),
Ivan Mahonin 2b429e
  buttonHistory(buttonHistory),
Ivan Mahonin 49945e
  hasPressure(hasPressure),
Ivan Mahonin 49945e
  hasTilt(hasTilt),
Ivan Mahonin 49945e
  pointsRemoved(),
Ivan Mahonin 49945e
  pointsAdded()
Ivan Mahonin 2b429e
  { }
Ivan Mahonin 2b429e
Ivan Mahonin 2b429e
TTrack::TTrack(const TTrackModifierP &modifier):
Ivan Mahonin 49945e
  id(++m_lastId),
Ivan Mahonin 2b429e
  deviceId(modifier->original.deviceId),
Ivan Mahonin 2b429e
  touchId(modifier->original.touchId),
Ivan Mahonin 2b429e
  keyHistory(modifier->original.keyHistory),
Ivan Mahonin 2b429e
  buttonHistory(modifier->original.buttonHistory),
Ivan Mahonin 49945e
  hasPressure(modifier->original.hasPressure),
Ivan Mahonin 49945e
  hasTilt(modifier->original.hasTilt),
Ivan Mahonin 7e9eb1
  modifier(modifier),
Ivan Mahonin 49945e
  pointsRemoved(),
Ivan Mahonin 49945e
  pointsAdded()
Ivan Mahonin 2b429e
  { }
Ivan Mahonin 2b429e
Ivan Mahonin 2b429e
const TTrack*
Ivan Mahonin 2b429e
TTrack::root() const
Ivan Mahonin 2b429e
  { return original() ? original()->root() : this; }
Ivan Mahonin 2b429e
Ivan Mahonin 2b429e
int
Ivan Mahonin 2b429e
TTrack::level() const
Ivan Mahonin 2b429e
  { return original() ? original()->level() + 1 : 0; }
Ivan Mahonin 2b429e
Ivan Mahonin 2b429e
int
Ivan Mahonin 7e9eb1
TTrack::floorIndex(double index, double *outFrac) const {
Ivan Mahonin 9f0c16
  int i = (int)floor(index + TConsts::epsilon);
Ivan Mahonin 7e9eb1
  if (i > size() - 1) {
Ivan Mahonin 7e9eb1
    if (outFrac) *outFrac = 0.0;
Ivan Mahonin 7e9eb1
    return size() - 1;
Ivan Mahonin 7e9eb1
  }
Ivan Mahonin 7e9eb1
  if (i < 0) {
Ivan Mahonin 7e9eb1
    if (outFrac) *outFrac = 0.0;
Ivan Mahonin 7e9eb1
    return 0;
Ivan Mahonin 7e9eb1
  }
Ivan Mahonin 7e9eb1
  if (outFrac) *outFrac = std::max(0.0, index - (double)i);
Ivan Mahonin 2b429e
  return i;
Ivan Mahonin 2b429e
}
Ivan Mahonin 2b429e
Ivan Mahonin 2b429e
void
Ivan Mahonin 2b429e
TTrack::push_back(const TTrackPoint &point) {
Ivan Mahonin 49945e
  m_points.push_back(point);
Ivan Mahonin 9f0c16
  if (size() > 1) {
Ivan Mahonin 9f0c16
    const TTrackPoint &prev = *(m_points.rbegin() + 1);
Ivan Mahonin 9f0c16
    TTrackPoint &p = m_points.back();
Ivan Mahonin 2b429e
Ivan Mahonin 9f0c16
    // fix originalIndex
Ivan Mahonin 9f0c16
    if (p.originalIndex < prev.originalIndex)
Ivan Mahonin 9f0c16
        p.originalIndex = prev.originalIndex;
Ivan Mahonin 2b429e
Ivan Mahonin 9f0c16
    // fix time
Ivan Mahonin 9f0c16
    p.time = std::max(p.time, prev.time + TToolTimer::step);
Ivan Mahonin 00337d
Ivan Mahonin 9f0c16
    // calculate length
Ivan Mahonin 9f0c16
    TPointD d = p.position - prev.position;
Ivan Mahonin 9f0c16
    p.length = prev.length + sqrt(d.x*d.x + d.y*d.y);
Ivan Mahonin 9f0c16
  }
Ivan Mahonin 00337d
  ++pointsAdded;
Ivan Mahonin 2b429e
}
Ivan Mahonin 2b429e
Ivan Mahonin 2b429e
void
Ivan Mahonin 2b429e
TTrack::pop_back(int count) {
Ivan Mahonin 00337d
  if (count > size()) count = size();
Ivan Mahonin 2b429e
  if (count <= 0) return;
Ivan Mahonin 00337d
  m_points.resize(size() - count);
Ivan Mahonin 7a5892
  if (pointsAdded > count)
Ivan Mahonin 7a5892
    { pointsAdded -= count; return; }
Ivan Mahonin 7a5892
  if (pointsAdded > 0)
Ivan Mahonin 7a5892
    { count -= pointsAdded; pointsAdded = 0; }
Ivan Mahonin 00337d
  pointsRemoved += count;
Ivan Mahonin 2b429e
}
Ivan Mahonin 2b429e
Ivan Mahonin 2b429e
Ivan Mahonin 2b429e
TTrackPoint
Ivan Mahonin 2b429e
TTrack::calcPoint(double index) const {
Ivan Mahonin 2b429e
  return modifier
Ivan Mahonin 2b429e
       ? modifier->calcPoint( originalIndexByIndex(index) )
Ivan Mahonin 2b429e
       : interpolateLinear(index);
Ivan Mahonin 2b429e
}
Ivan Mahonin 2b429e
Ivan Mahonin 2b429e
TPointD
Ivan Mahonin 2b429e
TTrack::calcTangent(double index, double distance) const {
Ivan Mahonin 9f0c16
  double minDistance = 10.0*TConsts::epsilon;
Ivan Mahonin 2b429e
  if (distance < minDistance) distance = minDistance;
Ivan Mahonin 2b429e
  TTrackPoint p = calcPoint(index);
Ivan Mahonin 2b429e
  TTrackPoint pp = calcPoint(indexByLength(p.length - distance));
Ivan Mahonin 2b429e
  TPointD dp = p.position - pp.position;
Ivan Mahonin 2b429e
  double lenSqr = dp.x*dp.x + dp.y*dp.y;
Ivan Mahonin 9f0c16
  return lenSqr > TConsts::epsilon*TConsts::epsilon ? dp*(1.0/sqrt(lenSqr)) : TPointD();
Ivan Mahonin 2b429e
}
Ivan Mahonin 49945e
Ivan Mahonin 49945e
double
Ivan Mahonin 49945e
TTrack::rootIndexByIndex(double index) const {
Ivan Mahonin 49945e
  return modifier
Ivan Mahonin 49945e
       ? modifier->original.rootIndexByIndex( originalIndexByIndex(index) )
Ivan Mahonin 49945e
       : index;
Ivan Mahonin 49945e
}
Ivan Mahonin 49945e
Ivan Mahonin 49945e
TTrackPoint
Ivan Mahonin 49945e
TTrack::calcRootPoint(double index) const {
Ivan Mahonin 49945e
  return modifier
Ivan Mahonin 49945e
       ? modifier->original.calcRootPoint( originalIndexByIndex(index) )
Ivan Mahonin 49945e
       : calcPoint(index);
Ivan Mahonin 49945e
}