]> git.tdb.fi Git - r2c2.git/blob - source/libmarklin/vehicle.h
Foundations of using physics simulation for trains
[r2c2.git] / source / libmarklin / vehicle.h
1 /* $Id$
2
3 This file is part of the MSP Märklin suite
4 Copyright © 2010  Mikkosoft Productions, Mikko Rasa
5 Distributed under the GPL
6 */
7
8 #ifndef LIBMARKLIN_VEHICLE_H_
9 #define LIBMARKLIN_VEHICLE_H_
10
11 #include "geometry.h"
12
13 namespace Marklin {
14
15 class Layout;
16 class Track;
17 class VehicleType;
18
19 class Vehicle
20 {
21 public:
22         enum PlaceMode
23         {
24                 CENTER,
25                 FRONT_AXLE,
26                 FRONT_BUFFER,
27                 BACK_AXLE,
28                 BACK_BUFFER
29         };
30
31 private:
32         struct TrackPosition
33         {
34                 Track *track;
35                 unsigned ep;
36                 float offs;
37
38                 TrackPosition();
39                 TrackPosition(Track *, unsigned, float);
40                 void advance(float);
41                 TrackPoint get_point() const;
42         };
43
44         Layout &layout;
45         const VehicleType &type;
46         Vehicle *next;
47         Vehicle *prev;
48         TrackPosition track_pos;
49         Point position;
50         float direction;
51
52 public:
53         Vehicle(Layout &, const VehicleType &);
54         ~Vehicle();
55
56         const VehicleType &get_type() const { return type; }
57
58         void place(Track *, unsigned, float, PlaceMode = CENTER);
59         void advance(float);
60         Track *get_track() const { return track_pos.track; }
61         unsigned get_entry() const { return track_pos.ep; }
62         float get_offset() const { return track_pos.offs; }
63         const Point &get_position() const { return position; }
64         float get_direction() const { return direction; }
65 private:
66         void update_position();
67         TrackPoint get_position(float, float, const TrackPosition &);
68 };
69
70 } // namespace Marklin
71
72 #endif