Vehicle::Vehicle(Layout &l, const VehicleType &t):
Object(l),
type(t),
+ train(0),
next(0),
prev(0),
front_sensor(0),
bogies.assign(type.get_bogies().begin(), type.get_bogies().end());
rods.assign(type.get_rods().begin(), type.get_rods().end());
- layout.add_vehicle(*this);
+ layout.add(*this);
}
Vehicle::~Vehicle()
detach_back();
if(prev)
detach_front();
- layout.remove_vehicle(*this);
+ layout.remove(*this);
}
Vehicle *Vehicle::clone(Layout *to_layout) const
return veh;
}
+void Vehicle::set_train(Train *t)
+{
+ train = t;
+}
+
void Vehicle::attach_back(Vehicle &veh)
{
if(next || veh.prev)
prev = 0;
}
-void Vehicle::place(Track &t, unsigned e, float o, PlaceMode m)
+void Vehicle::place(const TrackIter &t, float o, PlaceMode m)
{
- track_pos = TrackPosition(&t, e, o);
+ if(!t)
+ throw invalid_argument("Vehicle::place");
+
+ track_pos = TrackPosition(t, o);
if(m==FRONT_AXLE)
track_pos.advance(-type.get_front_axle_offset());
position = tp.pos;
position.z += layout.get_catalogue().get_rail_elevation();
rotation = tp.dir;
+ signal_moved.emit();
}
void Vehicle::update_position_from(const Vehicle &veh)
Vehicle::TrackPosition::TrackPosition():
- track(0),
- ep(0),
offs(0)
{ }
-Vehicle::TrackPosition::TrackPosition(Track *t, unsigned e, float o):
+Vehicle::TrackPosition::TrackPosition(const TrackIter &t, float o):
track(t),
- ep(e),
offs(o)
{ }
return;
offs += d;
- TrackIter iter(track, ep);
- while(iter)
+ while(track)
{
- float path_len = iter->get_type().get_path_length(iter->get_active_path());
+ float path_len = track->get_type().get_path_length(track->get_active_path());
if(offs>path_len)
{
offs -= path_len;
- iter = iter.next();
+ track = track.next();
}
else
break;
}
- while(iter && offs<0)
+ while(track && offs<0)
{
- iter = iter.flip().reverse();
+ track = track.flip().reverse();
- if(iter)
+ if(track)
{
- float path_len = iter->get_type().get_path_length(iter->get_active_path());
+ float path_len = track->get_type().get_path_length(track->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);
+ return track->get_point(track.entry(), offs);
else
return TrackPoint();
}