]> git.tdb.fi Git - r2c2.git/blobdiff - source/3d/tracktype.cpp
New approach for displaying track state
[r2c2.git] / source / 3d / tracktype.cpp
index e402c89c5f597823e6daabde9943ef27b30d72bb..f6b3d5fb8b053635cbb1732c9885860f59cc61e6 100644 (file)
@@ -57,28 +57,45 @@ TrackType3D::TrackType3D(Catalogue3D &cat3d, const TrackType &tt):
 
                own_data = true;
        }
+
        unsigned paths = tt.get_paths();
-       for(unsigned i=0; paths; ++i, paths>>=1)
+       for(int i=-1; i<=1; ++i)
        {
-               GL::Mesh *m = 0;
-               if(paths&1)
+               // TODO Make profile width configurable
+               Profile profile;
+               if(i==0)
+               {
+                       float rail_w = (rail_max.x-rail_min.x)*2;
+                       profile.append_vertex(Vector(rail_w*-0.5, 0, 0), false);
+                       profile.append_vertex(Vector(rail_w*0.5, 0, 0), false);
+               }
+               else
                {
-                       m = new GL::Mesh(GL::VERTEX3);
+                       profile.append_vertex(Vector(i*(gauge*0.5+rail_min.x*2), 0, 0), false);
+                       profile.append_vertex(Vector(i*(gauge*0.5+rail_max.x*2), 0, 0), false);
+               }
+
+               // TODO Avoid generating redundant meshes for single-path tracks
+               for(int j=-1; j<=4; ++j)
+               {
+                       if(j>=0 && !((paths>>j)&1))
+                               continue;
+
+                       GL::Mesh *m = new GL::Mesh(GL::VERTEX3);
                        GL::MeshBuilder bld(*m);
                        unsigned index = 0;
-                       for(vector<TrackPart>::const_iterator j=parts.begin(); j!=parts.end(); ++j)
-                               if(j->get_path()==i)
-                                       build_part(*j, cat.get_path_profile(), Vector(0, 0, ballast_h+1.5*rail_h), false, bld, index);
+                       for(vector<TrackPart>::const_iterator k=parts.begin(); k!=parts.end(); ++k)
+                               if(j<0 || k->get_path()==static_cast<unsigned>(j))
+                                       build_part(*k, profile, Vector(0, 0, ballast_h+1.5*rail_h), false, bld, index);
+                       path_meshes[(j&0xFF)|((i&3)<<8)] = m;
                }
-               path_meshes.push_back(m);
        }
 }
 
 TrackType3D::~TrackType3D()
 {
-       for(vector<GL::Mesh *>::iterator i=path_meshes.begin(); i!=path_meshes.end(); ++i)
-               delete *i;
+       for(map<unsigned, GL::Mesh *>::iterator i=path_meshes.begin(); i!=path_meshes.end(); ++i)
+               delete i->second;
        if(own_data)
        {
                delete object;
@@ -86,13 +103,10 @@ TrackType3D::~TrackType3D()
        }
 }
 
-const GL::Mesh &TrackType3D::get_path_mesh(unsigned p) const
+const GL::Mesh &TrackType3D::get_path_mesh(int p, int s) const
 {
-       if(p>=path_meshes.size())
-               throw out_of_range("TrackType3D::get_path_mesh");
-       if(!path_meshes[p])
-               throw invalid_argument("TrackType3D::get_path_mesh");
-       return *path_meshes[p];
+       unsigned key = (p<0 ? 0xFF : p) | ((s&3)<<8);
+       return *get_item(path_meshes, key);
 }
 
 void TrackType3D::build_part(const TrackPart &part, const Profile &profile, const Vector &offset, bool mirror, GL::MeshBuilder &bld, unsigned &base_index)