]> git.tdb.fi Git - r2c2.git/blobdiff - source/3d/tracktype.cpp
Make use of the mspmath library
[r2c2.git] / source / 3d / tracktype.cpp
index ab417cff171155a6c8bc4eea15b5903396b02503..a5e97cc55a09ad10e89c0a7babbfa119fad1467b 100644 (file)
@@ -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<vertices.size(); ++i)
                        {
                                const float *v = vertices[i]+vertex_offs;
-                               border.push_back(Vector(v[0], v[1]));
+                               border.push_back(Vector(v[0], v[1], 0));
                        }
                }
        }
@@ -109,14 +109,14 @@ TrackType3D::TrackType3D(Catalogue3D &cat3d, const TrackType &tt):
                unsigned index = 0;
                bld.texcoord(0.25, 0.5);
                for(vector<TrackPart>::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<TrackPart>::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<TrackPart>::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<TrackPart>::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<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<n_vertices; ++j)
                {
                        const Profile::Vertex &v = profile.get_vertex(mirror ? n_vertices-1-j : j);
-                       Vector p = v.pos;
+                       Vector p(0, -v.pos.x, v.pos.y);
                        if(mirror)
-                               p.x = -p.x;
-                       p.z = basep.pos.z+p.y+offset.y;
-                       p.y = basep.pos.y-c*(p.x+offset.x);
-                       p.x = basep.pos.x+s*(p.x+offset.x);
+                               p.y = -p.y;
+                       p = basep.pos+trans.transform(offset+p);
 
-                       Vector n = v.normal;
+                       Vector n(0, -v.normal.x, v.normal.y);
                        if(mirror)
-                               n.x = -n.x;
+                               n.y = -n.y;
+                       n = trans.transform(n);
 
-                       bld.normal(s*n.x, -c*n.x, n.y);
+                       bld.normal(n.x, n.y, n.z);
                        bld.vertex(p.x, p.y, p.z);
 
                        border.push_back(p);