]> git.tdb.fi Git - r2c2.git/blob - source/3d/layout.cpp
Use raycasting instead of OpenGL selection mode to pick tracks
[r2c2.git] / source / 3d / layout.cpp
1 /* $Id$
2
3 This file is part of R²C²
4 Copyright © 2006-2011 Mikkosoft Productions, Mikko Rasa
5 Distributed under the GPL
6 */
7
8 #include "layout.h"
9 #include "track.h"
10 #include "vehicle.h"
11
12 using namespace std;
13 using namespace Msp;
14
15 namespace R2C2 {
16
17 Layout3D::Layout3D(Layout &l):
18         layout(l),
19         catalogue(layout.get_catalogue())
20 {
21         layout.signal_track_added.connect(sigc::mem_fun(this, &Layout3D::track_added));
22         layout.signal_track_removed.connect(sigc::mem_fun(this, &Layout3D::track_removed));
23         layout.signal_vehicle_added.connect(sigc::mem_fun(this, &Layout3D::vehicle_added));
24         layout.signal_vehicle_removed.connect(sigc::mem_fun(this, &Layout3D::vehicle_removed));
25
26         const set<Track *> &ltracks = layout.get_tracks();
27         for(set<Track *>::iterator i=ltracks.begin(); i!=ltracks.end(); ++i)
28                 track_added(**i);
29 }
30
31 Layout3D::~Layout3D()
32 {
33         while(!tracks.empty())
34                 delete tracks.begin()->second;
35         while(!vehicles.empty())
36                 delete vehicles.begin()->second;
37 }
38
39 void Layout3D::add_track(Track3D &t)
40 {
41         if(tracks.count(&t.get_track()))
42                 throw KeyError("Duplicate track");
43
44         tracks[&t.get_track()] = &t;
45 }
46
47 void Layout3D::remove_track(Track3D &t)
48 {
49         tracks.erase(&t.get_track());
50 }
51
52 Track3D &Layout3D::get_track(Track &t) const
53 {
54         TrackMap::const_iterator i = tracks.find(&t);
55         if(i==tracks.end())
56                 throw KeyError("Unknown track");
57
58         return *i->second;
59 }
60
61 void Layout3D::add_vehicle(Vehicle3D &v)
62 {
63         if(vehicles.count(&v.get_vehicle()))
64                 throw KeyError("Duplicate vehicle");
65
66         vehicles[&v.get_vehicle()] = &v;
67 }
68
69 void Layout3D::remove_vehicle(Vehicle3D &v)
70 {
71         vehicles.erase(&v.get_vehicle());
72 }
73
74 Vehicle3D &Layout3D::get_vehicle(Vehicle &v) const
75 {
76         VehicleMap::const_iterator i = vehicles.find(&v);
77         if(i==vehicles.end())
78                 throw KeyError("Unknown vehicle");
79
80         return *i->second;
81 }
82
83 void Layout3D::track_added(Track &t)
84 {
85         new Track3D(*this, t);
86 }
87
88 void Layout3D::track_removed(Track &t)
89 {
90         TrackMap::iterator i = tracks.find(&t);
91         if(i!=tracks.end())
92                 delete i->second;
93 }
94
95 void Layout3D::vehicle_added(Vehicle &v)
96 {
97         new Vehicle3D(*this, v);
98 }
99
100 void Layout3D::vehicle_removed(Vehicle &v)
101 {
102         VehicleMap::iterator i = vehicles.find(&v);
103         if(i!=vehicles.end())
104                 delete i->second;
105 }
106
107 } // namespace R2C2