]> git.tdb.fi Git - r2c2.git/blob - source/libr2c2/object.h
Don't crash if a train has no router
[r2c2.git] / source / libr2c2 / object.h
1 #ifndef LIBR2C2_OBJECT_H_
2 #define LIBR2C2_OBJECT_H_
3
4 #include "geometry.h"
5 #include "objecttype.h"
6 #include "snap.h"
7
8 namespace R2C2 {
9
10 class Layout;
11
12 class Object
13 {
14 public:
15         sigc::signal<void> signal_moved;
16
17 protected:
18         Layout &layout;
19         Vector position;
20         Angle rotation;
21         Angle tilt;
22         Shape *shape;
23
24         Object(Layout &);
25 public:
26         virtual ~Object() { }
27
28         virtual Object *clone(Layout * = 0) const = 0;
29         virtual const ObjectType &get_type() const = 0;
30         Layout &get_layout() const { return layout; }
31         virtual void set_position(const Vector &) = 0;
32         virtual void set_rotation(const Angle &) = 0;
33         virtual void set_tilt(const Angle &) = 0;
34         const Vector &get_position() const { return position; }
35         const Angle &get_rotation() const { return rotation; }
36         const Angle &get_tilt() const { return tilt; }
37         virtual Object *get_parent() const { return 0; }
38
39         virtual unsigned get_n_snap_nodes() const { return 0; }
40         virtual Snap get_snap_node(unsigned) const;
41         virtual bool snap(Snap &, float, SnapType = SNAP_DEFAULT) const;
42         virtual bool snap_to(const Object &, float, SnapType = SNAP_DEFAULT);
43 protected:
44         virtual SnapType get_default_snap_type_to(const Object &) const { return NO_SNAP; }
45
46 public:
47         virtual unsigned get_n_link_slots() const { return 0; }
48         virtual Object *get_link(unsigned) const;
49         virtual int get_link_slot(const Object &) const { return -1; }
50         virtual bool link_to(Object &) { return false; }
51         virtual bool break_link(Object &);
52         virtual bool break_link(unsigned) { return false; }
53         virtual void break_links();
54
55         const Shape *get_shape() const;
56         virtual bool collide_ray(const Ray &, float * = 0) const;
57         virtual BoundingBox get_bounding_box() const;
58 };
59
60 } // namespace R2C2
61
62 #endif