3 This file is part of the MSP Märklin suite
4 Copyright © 2010 Mikkosoft Productions, Mikko Rasa
5 Distributed under the GPL
12 #include "tracktype.h"
14 #include "vehicletype.h"
20 Vehicle::Vehicle(Layout &l, const VehicleType &t):
27 layout.add_vehicle(*this);
32 layout.remove_vehicle(*this);
35 void Vehicle::place(Track *t, unsigned e, float o, PlaceMode m)
37 track_pos = TrackPosition(t, e, o);
40 float front = type.get_length()/2;
41 if(!type.get_axles().empty())
42 front = type.get_axles().front().position;
43 if(!type.get_bogies().empty())
45 const VehicleType::Bogie &bogie = type.get_bogies().front();
46 front = max(front, bogie.position+bogie.axles.front().position);
48 track_pos.advance(-front);
53 void Vehicle::advance(float d)
59 void Vehicle::update_position()
63 const vector<VehicleType::Axle> &axles = type.get_axles();
65 tp = get_position(axles.front().position, axles.back().position, track_pos);
68 const vector<VehicleType::Bogie> &bogies = type.get_bogies();
70 // XXX Calculate bogie positions correctly
71 tp = get_position(bogies.front().position, bogies.back().position, track_pos);
73 tp = track_pos.get_point();
79 TrackPoint Vehicle::get_position(float front, float back, const TrackPosition &tpos)
81 TrackPosition front_pos = tpos;
82 front_pos.advance(front);
84 TrackPosition back_pos = tpos;
85 back_pos.advance(back);
87 float target_dist = front-back;
91 Point front_point = front_pos.get_point().pos;
92 Point back_point = back_pos.get_point().pos;
94 float dx = front_point.x-back_point.x;
95 float dy = front_point.y-back_point.y;
96 float dz = front_point.z-back_point.z;
97 float dist = sqrt(dx*dx+dy*dy+dz*dz);
101 float adjust = target_dist-dist+0.01*layout.get_catalogue().get_scale();
102 front_pos.advance(adjust/2);
103 back_pos.advance(-adjust/2);
107 float f = -back/target_dist;
109 pt.pos = Point(back_point.x+dx*f, back_point.y+dy*f, back_point.z+dz*f);
110 pt.dir = atan2(dy, dx);
117 Vehicle::TrackPosition::TrackPosition():
123 Vehicle::TrackPosition::TrackPosition(Track *t, unsigned e, float o):
129 void Vehicle::TrackPosition::advance(float d)
134 unsigned path = track->get_active_path();
137 float path_len = track->get_type().get_path_length(path);
138 while(track && offs>=path_len)
140 unsigned out = track->traverse(ep, path);
141 Track *next = track->get_link(out);
145 ep = next->get_endpoint_by_link(*track);
149 path = track->get_active_path();
150 path_len = track->get_type().get_path_length(path);
156 while(track && offs<0)
158 Track *prev = track->get_link(ep);
161 unsigned in = prev->get_endpoint_by_link(*track);
164 path = track->get_active_path();
165 ep = track->traverse(in, path);
167 path_len = track->get_type().get_path_length(path);
181 TrackPoint Vehicle::TrackPosition::get_point() const
184 return track->get_point(ep, offs);
189 } // namespace Marklin