X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibmarklin%2Fvehicle.cpp;h=b54b531e0de2964e9fe1fb87590d4d3835ed4da7;hb=9b05c573a38639827697fe393d55b7c76f5bde45;hp=5a26f9294b665c8a5178696e482f78a8489f17dd;hpb=1f9af43b6ab300693c044b431e95b25422b36507;p=r2c2.git diff --git a/source/libmarklin/vehicle.cpp b/source/libmarklin/vehicle.cpp index 5a26f92..b54b531 100644 --- a/source/libmarklin/vehicle.cpp +++ b/source/libmarklin/vehicle.cpp @@ -10,6 +10,7 @@ Distributed under the GPL #include "driver.h" #include "layout.h" #include "track.h" +#include "trackiter.h" #include "tracktype.h" #include "vehicle.h" #include "vehicletype.h" @@ -320,51 +321,36 @@ void Vehicle::TrackPosition::advance(float d) if(!track) return; - unsigned path = track->get_active_path(); - offs += d; - float path_len = track->get_type().get_path_length(path); - while(track && offs>=path_len) + TrackIter iter(track, ep); + while(iter) { - unsigned out = track->traverse(ep, path); - Track *next = track->get_link(out); + float path_len = iter->get_type().get_path_length(iter->get_active_path()); - if(next) + if(offs>path_len) { - ep = next->get_endpoint_by_link(*track); - track = next; - offs -= path_len; - path = track->get_active_path(); - path_len = track->get_type().get_path_length(path); + iter = iter.next(); } else - track = 0; + break; } - while(track && offs<0) + while(iter && offs<0) { - Track *prev = track->get_link(ep); - if(prev) - { - unsigned in = prev->get_endpoint_by_link(*track); - track = prev; - - path = track->get_active_path(); - ep = track->traverse(in, path); + iter = iter.flip().reverse(); - path_len = track->get_type().get_path_length(path); + if(iter) + { + float path_len = iter->get_type().get_path_length(iter->get_active_path()); offs += path_len; } - else - track = 0; } + track = iter.track(); + ep = iter.entry(); if(!track) - { - ep = 0; offs = 0; - } } TrackPoint Vehicle::TrackPosition::get_point() const