3 This file is part of the MSP Märklin suite
4 Copyright © 2006-2008 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):
25 layout.signal_track_added.connect(sigc::mem_fun(this, &Layout3D::track_added));
26 layout.signal_track_removed.connect(sigc::mem_fun(this, &Layout3D::track_removed));
31 for(list<Track3D *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
35 void Layout3D::set_quality(unsigned q)
38 for(list<Track3D *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
39 (*i)->set_quality(quality);
42 void Layout3D::render(bool endpoints) const
44 GL::Texture::unbind();
45 glEnable(GL_DEPTH_TEST);
47 for(list<Track3D *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
53 for(list<Track3D *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
54 (*i)->render_endpoints();
59 Track3D &Layout3D::get_track(const Track &t) const
61 for(list<Track3D *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
62 if(&(*i)->get_track()==&t)
65 throw KeyError("Unknown track");
68 Track3D *Layout3D::pick_track(float x, float y, float size) const
70 vector<GL::SelectRecord> select_buf;
71 GL::select_buffer(select_buf);
72 GL::render_mode(GL::SELECT);
82 glClipPlane(GL_CLIP_PLANE0, clip);
83 glEnable(GL_CLIP_PLANE0);
87 glClipPlane(GL_CLIP_PLANE1, clip);
88 glEnable(GL_CLIP_PLANE1);
93 glClipPlane(GL_CLIP_PLANE2, clip);
94 glEnable(GL_CLIP_PLANE2);
98 glClipPlane(GL_CLIP_PLANE3, clip);
99 glEnable(GL_CLIP_PLANE3);
105 glDisable(GL_CLIP_PLANE0);
106 glDisable(GL_CLIP_PLANE1);
107 glDisable(GL_CLIP_PLANE2);
108 glDisable(GL_CLIP_PLANE3);
110 GL::render_mode(GL::RENDER);
112 unsigned track_depth = numeric_limits<unsigned>::max();
113 for(vector<GL::SelectRecord>::iterator i=select_buf.begin(); i!=select_buf.end(); ++i)
114 if(i->min_depth<track_depth)
116 track = reinterpret_cast<Track3D *>(i->names.back());
117 track_depth = i->min_depth;
123 void Layout3D::track_added(Track &t)
125 tracks.push_back(new Track3D(t, quality));
128 void Layout3D::track_removed(Track &t)
130 for(list<Track3D *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
131 if(&(*i)->get_track()==&t)
139 } // namespace Marklin