X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibr2c2%2Ftrackpart.cpp;h=882a6772c7f6cba1b0e9c269ad8ff6a00e0fc8df;hb=2fb2e58685c521ea76aab9f6d7cffe1186c9814a;hp=b12ea7278da28ce984e1ad156fb0cb3064f8e1b7;hpb=bde934f7d5ba07a9442a305192e10024820d13ed;p=r2c2.git diff --git a/source/libr2c2/trackpart.cpp b/source/libr2c2/trackpart.cpp index b12ea72..882a677 100644 --- a/source/libr2c2/trackpart.cpp +++ b/source/libr2c2/trackpart.cpp @@ -37,35 +37,31 @@ float TrackPart::get_length() const return length; } -TrackPoint TrackPart::get_point(float d) const +OrientedPoint TrackPart::get_point(float d) const { - TrackPoint result; + OrientedPoint result; - Transform dir_trans = Transform::rotation(dir, Vector(0, 0, 1)); if(radius) { Angle a = Angle::from_radians(d/radius); - Vector r = dir_trans.transform(Vector(0, -radius, 0)); - result.pos = pos-r+Transform::rotation(a, Vector(0, 0, 1)).transform(r); - result.dir = dir+a; + result.position = transform.transform(Vector(sin(a)*radius, (1-cos(a))*radius, 0)); + result.rotation = dir+a; } else { - result.pos = pos+dir_trans.transform(Vector(d, 0, 0)); - result.dir = dir; + result.position = transform.transform(Vector(d, 0, 0)); + result.rotation = dir; } return result; } -TrackPoint TrackPart::get_nearest_point(const Vector &p) const +OrientedPoint TrackPart::get_nearest_point(const Vector &p) const { - TrackPoint tp; - Transform dir_trans = Transform::rotation(dir, Vector(0, 0, 1)); + OrientedPoint result; if(radius) { - Vector r = dir_trans.transform(Vector(0, -radius, 0)); - Vector v = p-pos+r; + Vector v = p-transform.transform(Vector(0, radius, 0)); Angle a = Geometry::atan2(v.y, v.x)+Angle::quarter_turn()-dir; if(radius<0) a = Angle::half_turn()-a; @@ -73,18 +69,18 @@ TrackPoint TrackPart::get_nearest_point(const Vector &p) const a = min(max(a, Angle::zero()), Angle::from_radians(length)); if(radius<0) a = -a; - tp.pos = pos-r+Transform::rotation(a, Vector(0, 0, 1)).transform(r); - tp.dir = dir+a; + result.position = transform.transform(Vector(sin(a)*radius, (1-cos(a))*radius, 0)); + result.rotation = dir+a; } else { Vector v = p-pos; - Vector dir_vec = dir_trans.transform(Vector(1, 0, 0)); + Vector dir_vec = transform.transform_linear(Vector(1, 0, 0)); float d = min(max(dot(dir_vec, v), 0.0f), length); - tp.pos = pos+dir_vec*d; - tp.dir = dir; + result.position = pos+dir_vec*d; + result.rotation = dir; } - return tp; + return result; } void TrackPart::check_link(TrackPart &other) @@ -93,14 +89,14 @@ void TrackPart::check_link(TrackPart &other) unsigned n_other_eps = (other.is_dead_end() ? 1 : 2); for(unsigned i=0; i(0, 0, 1)); if(radius) { Geometry::ExtrudedShape ring( @@ -147,14 +141,14 @@ void TrackPart::create_shape() shapes.push_back(&bounds); shape = new Geometry::TransformedShape( Geometry::Intersection::from_iterator_range(shapes.begin(), shapes.end()), - trans*Transform::translation(Vector(0, radius, 0.005))); + transform*Transform::translation(Vector(0, radius, 0.005))); } else { // TODO Get the track profile dimensions from somewhere shape = new Geometry::TransformedShape( Geometry::Box(length, 0.04, 0.01), - trans*Transform::translation(Vector(length/2, 0, 0.005))); + transform*Transform::translation(Vector(length/2, 0, 0.005))); } } @@ -180,6 +174,9 @@ void TrackPart::Loader::finish() obj.length /= 1000; obj.pos /= 1000; + + obj.transform = Transform::translation(obj.pos)* + Transform::rotation(obj.dir, Vector(0, 0, 1)); } void TrackPart::Loader::start(float x, float y, float d)