X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2F3d%2Ftracktype.cpp;h=a5e97cc55a09ad10e89c0a7babbfa119fad1467b;hb=7a36d396eded897c421424905b2c938d770df341;hp=ab417cff171155a6c8bc4eea15b5903396b02503;hpb=c984792845515b18f7b886c488c2500fd5443c8a;p=r2c2.git diff --git a/source/3d/tracktype.cpp b/source/3d/tracktype.cpp index ab417cf..a5e97cc 100644 --- a/source/3d/tracktype.cpp +++ b/source/3d/tracktype.cpp @@ -33,7 +33,7 @@ Iter graham_scan(Iter begin, Iter end) for(Iter k=begin, i=k++, j=k++;; ) { // Compute winding by cross product - float turn = (j->x-i->x)*(k->y-j->y) - (k->x-j->x)*(j->y-i->y); + float turn = cross(*j-*i, *k-*j).z; if(turn<1e-5) { @@ -96,7 +96,7 @@ TrackType3D::TrackType3D(Catalogue3D &cat3d, const TrackType &tt): for(unsigned i=0; i::const_iterator i=parts.begin(); i!=parts.end(); ++i) - build_part(*i, ballast_profile, Vector(0, -ballast_min.y), false, bld, index); + build_part(*i, ballast_profile, Vector(0, -ballast_min.y, 0), 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, Vector(-gauge/2, y), true, bld, index); + build_part(*i, rail_profile, Vector(0, gauge/2, y), true, bld, index); for(vector::const_iterator i=parts.begin(); i!=parts.end(); ++i) - build_part(*i, rail_profile, Vector(gauge/2, y), false, bld, index); + build_part(*i, rail_profile, Vector(0, -gauge/2, y), false, bld, index); object = new GL::Object; object->set_mesh(mesh); @@ -134,7 +134,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(), Vector(0, ballast_h+1.5*rail_h), false, bld, index); + build_part(*j, cat.get_path_profile(), Vector(0, 0, ballast_h+1.5*rail_h), false, bld, index); } path_meshes.push_back(m); } @@ -154,10 +154,9 @@ TrackType3D::~TrackType3D() delete *i; } -void TrackType3D::get_bounds(float angle, Vector &minp, Vector &maxp) const +void TrackType3D::get_bounds(const Angle &angle, Vector &minp, Vector &maxp) const { - float c = cos(-angle); - float s = sin(-angle); + Transform trans = Transform::rotation(-angle, Vector(0, 0, 1)); minp = maxp = Vector(); minp.z = min_z; @@ -165,13 +164,12 @@ void TrackType3D::get_bounds(float angle, Vector &minp, Vector &maxp) const for(vector::const_iterator i=border.begin(); i!=border.end(); ++i) { - float x = c*i->x-s*i->y; - float y = s*i->x+c*i->y; + Vector v = trans.transform(*i); - minp.x = min(minp.x, x); - minp.y = min(minp.y, y); - maxp.x = max(maxp.x, x); - maxp.y = max(maxp.y, y); + minp.x = min(minp.x, v.x); + minp.y = min(minp.y, v.y); + maxp.x = max(maxp.x, v.x); + maxp.y = max(maxp.y, v.y); } } @@ -193,24 +191,22 @@ void TrackType3D::build_part(const TrackPart &part, const Profile &profile, cons 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); + Transform trans = Transform::rotation(basep.dir, Vector(0, 0, 1)); for(unsigned j=0; j