X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibmarklin%2Fvehicle.cpp;h=109c3f420d91621a44f427b70fae241669dfce71;hb=77f8c0e033b9b5e7085de5d22a62128a996a5b2a;hp=8d52a7f07816121d071b5d1e6aaf4adc42f23dcd;hpb=6968273080fa2a1cbcfc506610d5f249299611e9;p=r2c2.git diff --git a/source/libmarklin/vehicle.cpp b/source/libmarklin/vehicle.cpp index 8d52a7f..109c3f4 100644 --- a/source/libmarklin/vehicle.cpp +++ b/source/libmarklin/vehicle.cpp @@ -23,13 +23,18 @@ Vehicle::Vehicle(Layout &l, const VehicleType &t): type(t), next(0), prev(0), - direction(0) + direction(0), + bogie_dirs(type.get_bogies().size()) { layout.add_vehicle(*this); } Vehicle::~Vehicle() { + if(next) + detach_back(); + if(prev) + detach_front(); layout.remove_vehicle(*this); } @@ -113,6 +118,13 @@ void Vehicle::advance(float d) propagate_position(); } +float Vehicle::get_bogie_direction(unsigned i) const +{ + if(i>=bogie_dirs.size()) + throw InvalidParameterValue("Bogie index out of range"); + return bogie_dirs[i]; +} + void Vehicle::update_position() { TrackPoint tp; @@ -137,13 +149,16 @@ void Vehicle::update_position() const vector &front_axles = bogies.front().axles; float wheelbase = front_axles.front().position-front_axles.back().position; - Point front_point = get_point(front, wheelbase, -front_axles.back().position/wheelbase).pos; + TrackPoint front_point = get_point(front, wheelbase, -front_axles.back().position/wheelbase); const vector &back_axles = bogies.back().axles; wheelbase = back_axles.front().position-back_axles.back().position; - Point back_point = get_point(back, wheelbase, -back_axles.back().position/wheelbase).pos; + TrackPoint back_point = get_point(back, wheelbase, -back_axles.back().position/wheelbase); + + tp = get_point(front_point.pos, back_point.pos, -bogies.back().position/bogie_spacing); - tp = get_point(front_point, back_point, -bogies.back().position/bogie_spacing); + bogie_dirs.front() = front_point.dir-tp.dir; + bogie_dirs.back() = back_point.dir-tp.dir; } else tp = track_pos.get_point();