X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2F3d%2Ftracktype.cpp;h=755f0080807771f7e1bd4ddf76d34a86c0affaf5;hb=c5f5ec54e81a6a85f911fa1075a0939a7352fbfd;hp=1196b32ce18b7eb161f87e4c64487fcf45207378;hpb=949b13aae247fa53579ec1cda9142ccc8755acde;p=r2c2.git diff --git a/source/3d/tracktype.cpp b/source/3d/tracktype.cpp index 1196b32..755f008 100644 --- a/source/3d/tracktype.cpp +++ b/source/3d/tracktype.cpp @@ -73,7 +73,8 @@ namespace R2C2 { TrackType3D::TrackType3D(Catalogue3D &cat3d, const TrackType &tt): catalogue(cat3d), - mesh((GL::NORMAL3, GL::TEXCOORD2, GL::VERTEX3)) + mesh(0), + object(0) { const Catalogue &cat = cat3d.get_catalogue(); const vector &parts = tt.get_parts(); @@ -90,24 +91,34 @@ TrackType3D::TrackType3D(Catalogue3D &cat3d, const TrackType &tt): float gauge = cat.get_gauge(); + string obj_name = tt.get_object(); + if(!obj_name.empty()) { + object = catalogue.get(obj_name); + // XXX border + } + else + { + mesh = new GL::Mesh((GL::NORMAL3, GL::TEXCOORD2, GL::VERTEX3)); + mesh->set_winding(&GL::WindingTest::counterclockwise()); + GL::MeshBuilder bld(*mesh); + unsigned index = 0; - GL::MeshBuilder bld(mesh); bld.texcoord(0.25, 0.5); for(vector::const_iterator i=parts.begin(); i!=parts.end(); ++i) - build_part(*i, ballast_profile, Point(0, -ballast_min.y), bld, index); + build_part(*i, ballast_profile, Point(0, -ballast_min.y), false, bld, index); bld.texcoord(0.75, 0.5); float y = ballast_h-rail_min.y; for(vector::const_iterator i=parts.begin(); i!=parts.end(); ++i) - build_part(*i, rail_profile, Point(-gauge/2-rail_max.x, y), bld, index); + build_part(*i, rail_profile, Point(-gauge/2, y), true, bld, index); for(vector::const_iterator i=parts.begin(); i!=parts.end(); ++i) - build_part(*i, rail_profile, Point(gauge/2-rail_min.x, y), bld, index); - } + build_part(*i, rail_profile, Point(gauge/2, y), false, bld, index); - mesh.set_winding(&GL::WindingTest::counterclockwise()); - object.set_mesh(&mesh); - object.set_technique(catalogue.get(cat.get_track_technique())); + object = new GL::Object; + object->set_mesh(mesh); + object->set_technique(catalogue.get(cat.get_track_technique())); + } unsigned paths = tt.get_paths(); for(unsigned i=0; paths; ++i, paths>>=1) @@ -120,7 +131,7 @@ TrackType3D::TrackType3D(Catalogue3D &cat3d, const TrackType &tt): unsigned index = 0; for(vector::const_iterator j=parts.begin(); j!=parts.end(); ++j) if(j->get_path()==i) - build_part(*j, cat.get_path_profile(), Point(0, ballast_h+1.5*rail_h), bld, index); + build_part(*j, cat.get_path_profile(), Point(0, ballast_h+1.5*rail_h), false, bld, index); } path_meshes.push_back(m); } @@ -168,54 +179,56 @@ const GL::Mesh &TrackType3D::get_path_mesh(unsigned p) const return *path_meshes[p]; } -void TrackType3D::build_part(const TrackPart &part, const Profile &profile, const Point &offset, GL::MeshBuilder &bld, unsigned &base_index) +void TrackType3D::build_part(const TrackPart &part, const Profile &profile, const Point &offset, bool mirror, GL::MeshBuilder &bld, unsigned &base_index) { float plen = part.get_length(); unsigned nsegs = (part.is_curved() ? static_cast(plen*32)+1 : 1); - unsigned n_points = profile.get_n_points(); + unsigned n_vertices = profile.get_n_vertices(); for(unsigned i=0; i<=nsegs; ++i) { TrackPoint basep = part.get_point(i*plen/nsegs); float c = cos(basep.dir); float s = sin(basep.dir); - Point p; - for(unsigned j=0; j0) - bld.vertex(p.x, p.y, p.z); - if(j+1