]> git.tdb.fi Git - r2c2.git/blob - source/3d/layout.cpp
Reduce interface clutter in Layout by storing Objects in a uniform way
[r2c2.git] / source / 3d / layout.cpp
1 #include "layout.h"
2 #include "signal.h"
3 #include "track.h"
4 #include "vehicle.h"
5
6 using namespace std;
7 using namespace Msp;
8
9 namespace R2C2 {
10
11 Layout3D::Layout3D(Layout &l):
12         layout(l),
13         catalogue(layout.get_catalogue())
14 {
15         // South, 15° from zenith
16         sun.set_position(0, -0.259, 0.966, 0);
17         lighting.attach(0, sun);
18
19         layout.signal_object_added.connect(sigc::mem_fun(this, &Layout3D::object_added));
20         layout.signal_object_removed.connect(sigc::mem_fun(this, &Layout3D::object_removed));
21
22         const set<Object *> &lobjs = layout.get_all<Object>();
23         for(set<Object *>::iterator i=lobjs.begin(); i!=lobjs.end(); ++i)
24                 object_added(**i);
25 }
26
27 Layout3D::~Layout3D()
28 {
29         while(!signals.empty())
30                 delete signals.begin()->second;
31         while(!tracks.empty())
32                 delete tracks.begin()->second;
33         while(!vehicles.empty())
34                 delete vehicles.begin()->second;
35 }
36
37 void Layout3D::get_bounds(Vector &minp, Vector &maxp) const
38 {
39         Geometry::BoundingBox<float, 3> bbox;
40
41         for(TrackMap::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
42                 bbox = bbox|i->second->get_track().get_type().get_shape()->get_axis_aligned_bounding_box();
43
44         minp = bbox.get_minimum_point();
45         maxp = bbox.get_maximum_point();
46 }
47
48 void Layout3D::add_track(Track3D &t)
49 {
50         insert_unique(tracks, &t.get_track(), &t);
51 }
52
53 void Layout3D::remove_track(Track3D &t)
54 {
55         tracks.erase(&t.get_track());
56 }
57
58 Track3D &Layout3D::get_track(Track &t) const
59 {
60         return *get_item(tracks, &t);
61 }
62
63 void Layout3D::add_vehicle(Vehicle3D &v)
64 {
65         insert_unique(vehicles, &v.get_vehicle(), &v);
66 }
67
68 void Layout3D::remove_vehicle(Vehicle3D &v)
69 {
70         vehicles.erase(&v.get_vehicle());
71 }
72
73 Vehicle3D &Layout3D::get_vehicle(Vehicle &v) const
74 {
75         return *get_item(vehicles, &v);
76 }
77
78 void Layout3D::add_signal(Signal3D &s)
79 {
80         insert_unique(signals, &s.get_signal(), &s);
81 }
82
83 void Layout3D::remove_signal(Signal3D &s)
84 {
85         signals.erase(&s.get_signal());
86 }
87
88 Signal3D &Layout3D::get_signal(Signal &s) const
89 {
90         return *get_item(signals, &s);
91 }
92
93 void Layout3D::object_added(Object &o)
94 {
95         if(Track *t = dynamic_cast<Track *>(&o))
96                 new Track3D(*this, *t);
97         else if(Signal *s = dynamic_cast<Signal *>(&o))
98                 new Signal3D(*this, *s);
99         else if(Vehicle *v = dynamic_cast<Vehicle *>(&o))
100                 new Vehicle3D(*this, *v);
101 }
102
103 void Layout3D::object_removed(Object &o)
104 {
105         if(Track *t = dynamic_cast<Track *>(&o))
106         {
107                 TrackMap::iterator i = tracks.find(t);
108                 if(i!=tracks.end())
109                         delete i->second;
110         }
111         else if(Signal *s = dynamic_cast<Signal *>(&o))
112         {
113                 SignalMap::iterator i = signals.find(s);
114                 if(i!=signals.end())
115                         delete i->second;
116         }
117         else if(Vehicle *v = dynamic_cast<Vehicle *>(&o))
118         {
119                 VehicleMap::iterator i = vehicles.find(v);
120                 if(i!=vehicles.end())
121                         delete i->second;
122         }
123 }
124
125 } // namespace R2C2