+ float width = max(max(-ballast_min.x, ballast_max.x)*2, gauge+(rail_max.x-rail_min.x)*2)+0.004;
+ float height = ballast_max.y-ballast_min.y+rail_max.y-rail_min.y+0.01;
+
+ GL::MeshBuilder bld(endpoint_mesh);
+ bld.normal(1, 0, 0);
+ bld.begin(GL::QUADS);
+ bld.vertex(0, width/2, 0);
+ bld.vertex(0, width/2, height);
+ bld.vertex(0, -width/2, height);
+ bld.vertex(0, -width/2, 0);
+ bld.end();
+}
+
+FS::Path Catalogue3D::locate_file(const string &name)
+{
+ if(FS::exists(name))
+ return name;
+
+ FS::Path path = FS::Path("data")/name;
+ if(FS::exists(path))
+ return path;
+
+ throw runtime_error("Can't locate "+name);
+}
+
+template<typename T>
+T *Catalogue3D::create(const string &name)
+{
+ RefPtr<T> obj = new T;
+ DataFile::load(*obj, locate_file(name).str());
+ return obj.release();
+}
+
+template<typename T>
+T *Catalogue3D::create2(const string &name)
+{
+ RefPtr<T> obj = new T;
+ DataFile::load(*obj, locate_file(name).str(), *this);
+ return obj.release();