next = &veh;
veh.prev = this;
+
+ if(track_pos.track)
+ propagate_backward();
}
void Vehicle::attach_front(Vehicle &veh)
if(prev || veh.next)
throw InvalidState("Already attached");
- next = &veh;
- veh.prev = this;
+ prev = &veh;
+ veh.next = this;
+
+ if(prev->get_track())
+ prev->propagate_backward();
}
void Vehicle::detach_back()
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);
check_sensor(type.get_back_axle_offset(), back_sensor);
position = tp.pos;
+ position.z += layout.get_catalogue().get_rail_elevation();
direction = tp.dir;
}
{
/* Sensor ID under axle has changed. Deduce movement direction by using
the sensor ID under the midpoint of the vehicle. */
+ /* XXX This depends on the simulation running fast enough. Something
+ more robust would be preferable. */
unsigned old = sensor;
sensor = s;
unsigned mid = track_pos.track->get_sensor_id();
if(s && s!=mid)
/* There's a sensor and it's different from mid. We've just entered
that sensor. */
- // XXX The Train will reset the vehicles to the start of the sensor, which is somewhat undesirable
layout.get_driver().set_sensor(sensor, true);
if(old && old!=mid)
/* A sensor was under the axle and it was different from mid. We've