b52c5a
b52c5a
#include <tools modifierclone.h="" modifiers=""></tools>
b52c5a
b52c5a
b52c5a
//*****************************************************************************************
b52c5a
//    TModifierClone::Interpolator implementation
b52c5a
//*****************************************************************************************
b52c5a
b52c5a
TTrackPoint TModifierClone::Interpolator::interpolateFromOriginal(double originalIndex)
b52c5a
  { return transform.apply( track.calcPointFromOriginal(originalIndex) ); }
b52c5a
TTrackPoint TModifierClone::Interpolator::interpolate(double index)
b52c5a
  { return interpolateFromOriginal(track.originalIndexByIndex(index)); }
b52c5a
b52c5a
b52c5a
//*****************************************************************************************
b52c5a
//    TModifierClone implementation
b52c5a
//*****************************************************************************************
b52c5a
b52c5a
TModifierClone::TModifierClone(bool keepOriginals):
b52c5a
  keepOriginals(keepOriginals) { }
b52c5a
b52c5a
void TModifierClone::modifyTrack(const TTrack &track,
b52c5a
                                 TTrackList &outTracks)
b52c5a
{
b52c5a
  if (!track.handler) {
b52c5a
    Handler *handler = new Handler();
b52c5a
    track.handler = handler;
b52c5a
    if (keepOriginals) {
b52c5a
      handler->original = new TTrack(track);
b52c5a
      new TTrackIntrOrig(*handler->original);
b52c5a
    }
b52c5a
    for(TTrackTransformList::const_iterator i = transforms.begin(); i != transforms.end(); ++i) {
b52c5a
      handler->tracks.push_back(new TTrack(track));
b52c5a
      TTrack &subTrack = *handler->tracks.back();
b52c5a
      new Interpolator(subTrack, *i);
b52c5a
    }
b52c5a
  }
b52c5a
  
b52c5a
  Handler *handler = dynamic_cast<handler*>(track.handler.getPointer());</handler*>
b52c5a
  if (!handler)
b52c5a
    return;
b52c5a
  
b52c5a
  if (handler->original)
b52c5a
    outTracks.push_back(handler->original);
b52c5a
  outTracks.insert(outTracks.end(), handler->tracks.begin(), handler->tracks.end());
b52c5a
  if (!track.changed())
b52c5a
    return;
b52c5a
b52c5a
  int start = track.size() - track.pointsAdded;
b52c5a
  if (start < 0) start = 0;
b52c5a
b52c5a
  // process original
b52c5a
  if (handler->original) {
b52c5a
    TTrack &subTrack = *handler->original;
b52c5a
    subTrack.truncate(start);
b52c5a
    for (int i = start; i < track.size(); ++i)
b52c5a
      subTrack.push_back(subTrack.pointFromOriginal(i), false);
b52c5a
    subTrack.fix_to(track.fixedSize());
b52c5a
  }
b52c5a
  
b52c5a
  // process sub-tracks
b52c5a
  for(TTrackList::iterator i = handler->tracks.begin(); i != handler->tracks.end(); ++i) {
b52c5a
    TTrack &subTrack = **i;
b52c5a
    Interpolator *intr = dynamic_cast<interpolator*>(subTrack.getInterpolator().getPointer());</interpolator*>
b52c5a
    if (!intr)
b52c5a
      continue;
b52c5a
    subTrack.truncate(start);
b52c5a
    for (int i = start; i < track.size(); ++i)
b52c5a
      subTrack.push_back(intr->interpolateFromOriginal(i), false);
b52c5a
    subTrack.fix_to(track.fixedSize());
b52c5a
  }
b52c5a
  
b52c5a
  track.resetChanges();
b52c5a
}
b52c5a