]> git.tdb.fi Git - r2c2.git/blob - source/libr2c2/signal.h
Introduce a tilt (vertical angle) property to Object
[r2c2.git] / source / libr2c2 / signal.h
1 #ifndef LIBR2C2_SIGNAL_H_
2 #define LIBR2C2_SIGNAL_H_
3
4 #include <msp/datafile/objectloader.h>
5 #include <msp/time/timedelta.h>
6 #include "geometry.h"
7 #include "object.h"
8 #include "signaltype.h"
9 #include "track.h"
10
11 namespace R2C2 {
12
13 class Block;
14 class Layout;
15 class Train;
16
17 class Signal: public Object
18 {
19 public:
20         class Loader: public Msp::DataFile::ObjectLoader<Signal>
21         {
22         public:
23                 Loader(Signal &);
24
25         private:
26                 void address(unsigned);
27                 void position(float, float, float);
28                 void rotation(float);
29         };
30
31 private:
32         const SignalType &type;
33         unsigned address;
34         Track *track;
35         Block *block;
36         unsigned entry;
37         Train *train;
38         sigc::connection train_conn;
39         bool check_allocated_blocks;
40         bool passing;
41
42 public:
43         Signal(Layout &, const SignalType &);
44         ~Signal();
45
46         virtual Signal *clone(Layout * = 0) const;
47         virtual const SignalType &get_type() const { return type; }
48
49         void set_address(unsigned);
50         virtual void set_position(const Vector &);
51         virtual void set_rotation(const Angle &);
52         virtual void set_tilt(const Angle &) { }
53 private:
54         void update_location();
55 public:
56         virtual Track *get_parent() const { return track; }
57
58         virtual unsigned get_n_snap_nodes() const;
59         virtual Snap get_snap_node(unsigned) const;
60 private:
61         virtual SnapType get_default_snap_type_to(const Object &) const;
62
63 public:
64         void tick(const Msp::Time::TimeDelta &);
65
66 private:
67         void block_reserved(const Block &, Train *);
68         void train_advanced(Block &);
69         void reset();
70
71 public:
72         void save(std::list<Msp::DataFile::Statement> &) const;
73 };
74 } // namespace R2C2
75
76
77 #endif