-Vehicle::TrackPosition::TrackPosition(Track *t, unsigned e, float o):
- track(t),
- ep(e),
- offs(o)
-{ }
-
-void Vehicle::TrackPosition::advance(float d)
-{
- if(!track)
- return;
-
- offs += d;
- TrackIter iter(track, ep);
- while(iter)
- {
- float path_len = iter->get_type().get_path_length(iter->get_active_path());
-
- if(offs>path_len)
- {
- offs -= path_len;
- iter = iter.next();
- }
- else
- break;
- }
-
- while(iter && offs<0)
- {
- iter = iter.flip().reverse();
-
- if(iter)
- {
- float path_len = iter->get_type().get_path_length(iter->get_active_path());
- offs += path_len;
- }
- }
-
- track = iter.track();
- ep = iter.entry();
- if(!track)
- offs = 0;
-}
-
-TrackPoint Vehicle::TrackPosition::get_point() const
-{
- if(track)
- return track->get_point(ep, offs);
- else
- return TrackPoint();
-}
-