#include "driver.h"
#include "layout.h"
#include "track.h"
+#include "trackiter.h"
#include "tracktype.h"
#include "vehicle.h"
#include "vehicletype.h"
prev = 0;
}
-void Vehicle::place(Track *t, unsigned e, float o, PlaceMode m)
+void Vehicle::place(Track &t, unsigned e, float o, PlaceMode m)
{
- track_pos = TrackPosition(t, e, o);
+ track_pos = TrackPosition(&t, e, o);
if(m==FRONT_AXLE)
track_pos.advance(-type.get_front_axle_offset());
propagate_position();
}
+void Vehicle::unplace()
+{
+ if(!track_pos.track)
+ return;
+
+ track_pos = TrackPosition();
+
+ if(prev)
+ prev->unplace();
+ if(next)
+ next->unplace();
+}
+
void Vehicle::advance(float d)
{
track_pos.advance(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