3 This file is part of the MSP Märklin suite
4 Copyright © 2006-2010 Mikkosoft Productions, Mikko Rasa
5 Distributed under the GPL
10 #include <msp/gl/rendermode.h>
11 #include <msp/gl/select.h>
12 #include <msp/gl/texture.h>
13 #include <msp/datafile/parser.h>
21 Layout3D::Layout3D(Layout &l):
23 catalogue(layout.get_catalogue()),
26 layout.signal_track_added.connect(sigc::mem_fun(this, &Layout3D::track_added));
27 layout.signal_track_removed.connect(sigc::mem_fun(this, &Layout3D::track_removed));
32 for(list<Track3D *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
36 void Layout3D::set_quality(unsigned q)
41 void Layout3D::render(bool endpoints) const
43 GL::Texture::unbind();
44 glEnable(GL_DEPTH_TEST);
46 for(list<Track3D *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
52 for(list<Track3D *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
53 (*i)->render_endpoints();
58 Track3D &Layout3D::get_track(const Track &t) const
60 for(list<Track3D *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
61 if(&(*i)->get_track()==&t)
64 throw KeyError("Unknown track");
67 Track3D *Layout3D::pick_track(float x, float y, float size) const
69 vector<GL::SelectRecord> select_buf;
70 GL::select_buffer(select_buf);
71 GL::render_mode(GL::SELECT);
81 glClipPlane(GL_CLIP_PLANE0, clip);
82 glEnable(GL_CLIP_PLANE0);
86 glClipPlane(GL_CLIP_PLANE1, clip);
87 glEnable(GL_CLIP_PLANE1);
92 glClipPlane(GL_CLIP_PLANE2, clip);
93 glEnable(GL_CLIP_PLANE2);
97 glClipPlane(GL_CLIP_PLANE3, clip);
98 glEnable(GL_CLIP_PLANE3);
104 glDisable(GL_CLIP_PLANE0);
105 glDisable(GL_CLIP_PLANE1);
106 glDisable(GL_CLIP_PLANE2);
107 glDisable(GL_CLIP_PLANE3);
109 GL::render_mode(GL::RENDER);
111 unsigned track_depth = numeric_limits<unsigned>::max();
112 for(vector<GL::SelectRecord>::iterator i=select_buf.begin(); i!=select_buf.end(); ++i)
113 if(i->min_depth<track_depth)
115 track = reinterpret_cast<Track3D *>(i->names.back());
116 track_depth = i->min_depth;
122 void Layout3D::track_added(Track &t)
124 tracks.push_back(new Track3D(*this, t));
127 void Layout3D::track_removed(Track &t)
129 for(list<Track3D *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
130 if(&(*i)->get_track()==&t)
138 } // namespace Marklin