3 This file is part of the MSP Märklin suite
4 Copyright © 2006-2008 Mikkosoft Productions, Mikko Rasa
5 Distributed under the GPL
11 #include <msp/gl/rendermode.h>
12 #include <msp/gl/select.h>
13 #include <msp/gl/texture.h>
14 #include <msp/datafile/parser.h>
22 Layout3D::Layout3D(Layout &l):
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)
39 for(list<Track3D *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
40 (*i)->set_quality(quality);
43 void Layout3D::render(bool endpoints) const
45 GL::Texture::unbind();
46 glEnable(GL_DEPTH_TEST);
48 for(list<Track3D *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
54 for(list<Track3D *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
55 (*i)->render_endpoints();
60 Track3D &Layout3D::get_track(const Track &t) const
62 for(list<Track3D *>::const_iterator i=tracks.begin(); i!=tracks.end(); ++i)
63 if(&(*i)->get_track()==&t)
66 throw KeyError("Unknown track");
69 Track3D *Layout3D::pick_track(float x, float y, float size) const
71 vector<GL::SelectRecord> select_buf;
72 GL::select_buffer(select_buf);
73 GL::render_mode(GL::SELECT);
83 glClipPlane(GL_CLIP_PLANE0, clip);
84 glEnable(GL_CLIP_PLANE0);
88 glClipPlane(GL_CLIP_PLANE1, clip);
89 glEnable(GL_CLIP_PLANE1);
94 glClipPlane(GL_CLIP_PLANE2, clip);
95 glEnable(GL_CLIP_PLANE2);
99 glClipPlane(GL_CLIP_PLANE3, clip);
100 glEnable(GL_CLIP_PLANE3);
106 glDisable(GL_CLIP_PLANE0);
107 glDisable(GL_CLIP_PLANE1);
108 glDisable(GL_CLIP_PLANE2);
109 glDisable(GL_CLIP_PLANE3);
111 GL::render_mode(GL::RENDER);
113 unsigned track_depth = numeric_limits<unsigned>::max();
114 for(vector<GL::SelectRecord>::iterator i=select_buf.begin(); i!=select_buf.end(); ++i)
115 if(i->min_depth<track_depth)
117 track = reinterpret_cast<Track3D *>(i->names.back());
118 track_depth = i->min_depth;
124 void Layout3D::track_added(Track &t)
126 tracks.push_back(new Track3D(t, quality));
129 void Layout3D::track_removed(Track &t)
131 for(list<Track3D *>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
132 if(&(*i)->get_track()==&t)
140 } // namespace Marklin