X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=sidebyside;f=source%2F3d%2Ftracktype.cpp;h=1e20c5d8aa82f966a904970f972d79e92b0feb5b;hb=1ff06c5bc46a677fa389ef86c6b26664368f1653;hp=26be52796dc4d827a221ab64bc788ae53388d208;hpb=7e382cc3cad8c4f6945b0c9d89e2ca917b42b740;p=r2c2.git diff --git a/source/3d/tracktype.cpp b/source/3d/tracktype.cpp index 26be527..1e20c5d 100644 --- a/source/3d/tracktype.cpp +++ b/source/3d/tracktype.cpp @@ -1,6 +1,6 @@ /* $Id$ -This file is part of the MSP Märklin suite +This file is part of R²C² Copyright © 2010 Mikkosoft Productions, Mikko Rasa Distributed under the GPL */ @@ -16,7 +16,7 @@ using namespace Msp; namespace { -bool compare_z(const Marklin::Point &p1, const Marklin::Point &p2) +bool compare_z(const R2C2::Point &p1, const R2C2::Point &p2) { return p1.zxx==lowest.x && i->y>lowest.y)) lowest = *i; @@ -69,9 +69,10 @@ Iter graham_scan(Iter begin, Iter end) } -namespace Marklin { +namespace R2C2 { TrackType3D::TrackType3D(const Catalogue3D &cat3d, const TrackType &tt): + catalogue(cat3d), ballast_mesh((GL::NORMAL3, GL::COLOR4_UBYTE, GL::VERTEX3)), rail_mesh((GL::NORMAL3, GL::COLOR4_UBYTE, GL::VERTEX3)) { @@ -81,10 +82,12 @@ TrackType3D::TrackType3D(const Catalogue3D &cat3d, const TrackType &tt): const Profile &ballast_profile = cat.get_ballast_profile(); const Point &ballast_min = ballast_profile.get_min_coords(); const Point &ballast_max = ballast_profile.get_max_coords(); + float ballast_h = ballast_max.y-ballast_min.y; const Profile &rail_profile = cat.get_rail_profile(); const Point &rail_min = rail_profile.get_min_coords(); const Point &rail_max = rail_profile.get_max_coords(); + float rail_h = rail_max.y-rail_min.y; float gauge = cat.get_gauge(); @@ -100,12 +103,28 @@ TrackType3D::TrackType3D(const Catalogue3D &cat3d, const TrackType &tt): unsigned index = 0; GL::MeshBuilder bld(rail_mesh); bld.color(0.85f, 0.85f, 0.85f); - float y = ballast_max.y-ballast_min.y-rail_min.y; + 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); 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); } + + unsigned paths = tt.get_paths(); + for(unsigned i=0; paths; ++i, paths>>=1) + { + GL::Mesh *mesh = 0; + if(paths&1) + { + mesh = new GL::Mesh(GL::VERTEX3); + GL::MeshBuilder bld(*mesh); + 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); + } + path_meshes.push_back(mesh); + } min_z = max_z = border.front().z; for(vector::iterator i=border.begin(); i!=border.end(); ++i) @@ -116,6 +135,12 @@ TrackType3D::TrackType3D(const Catalogue3D &cat3d, const TrackType &tt): border.erase(graham_scan(border.begin(), border.end()), border.end()); } +TrackType3D::~TrackType3D() +{ + for(vector::iterator i=path_meshes.begin(); i!=path_meshes.end(); ++i) + delete *i; +} + void TrackType3D::get_bounds(float angle, Point &minp, Point &maxp) const { float c = cos(-angle); @@ -137,26 +162,35 @@ void TrackType3D::get_bounds(float angle, Point &minp, Point &maxp) const } } -void TrackType3D::render() const +const GL::Mesh &TrackType3D::get_path_mesh(unsigned p) const +{ + if(p>=path_meshes.size() || !path_meshes[p]) + throw InvalidParameterValue("Invalid path"); + return *path_meshes[p]; +} + +void TrackType3D::render(const GL::Tag &tag) const { - ballast_mesh.draw(); - rail_mesh.draw(); + if(tag==0) + { + catalogue.get_ballast_material().bind(); + ballast_mesh.draw(); + catalogue.get_rail_material().bind(); + rail_mesh.draw(); + } } void TrackType3D::build_part(const TrackPart &part, const Profile &profile, const Point &offset, GL::MeshBuilder &bld, unsigned &base_index) { - unsigned nsegs = (part.radius ? static_cast(part.length*16)+1 : 1); - float plen = part.length; - if(part.radius) - plen *= abs(part.radius); + float plen = part.get_length(); + unsigned nsegs = (part.is_curved() ? static_cast(plen*32)+1 : 1); unsigned n_points = profile.get_n_points(); for(unsigned i=0; i<=nsegs; ++i) { - float a = part.dir+(part.radius ? i*plen/nsegs/part.radius : 0); - float c = cos(a); - float s = sin(a); - Point basep = part.get_point(i*plen/nsegs); + 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); @@ -196,4 +230,4 @@ void TrackType3D::build_part(const TrackPart &part, const Profile &profile, cons base_index += (nsegs+1)*(n_points-1)*2; } -} // namespace Marklin +} // namespace R2C2