From 97996a8b065d0c462b0a847fc9b7a301235666da Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Tue, 2 Mar 2010 21:25:21 +0000 Subject: [PATCH] Start getting the train to go uphill --- include/BezierCurve.hpp | 6 ++++++ src/CrossoverTrack.cpp | 2 +- src/CurvedTrack.cpp | 2 +- src/Points.cpp | 2 +- src/SlopeTrack.cpp | 30 ++++++++++++++++++++++-------- src/StraightTrack.cpp | 2 +- 6 files changed, 32 insertions(+), 12 deletions(-) diff --git a/include/BezierCurve.hpp b/include/BezierCurve.hpp index 004f48f..ff79f30 100644 --- a/include/BezierCurve.hpp +++ b/include/BezierCurve.hpp @@ -50,6 +50,12 @@ struct BezierCurve { } } + BezierCurve() + : length(0) + { + + } + Vector operator()(T t) const { return makeVector diff --git a/src/CrossoverTrack.cpp b/src/CrossoverTrack.cpp index cfff014..aa4fc4b 100644 --- a/src/CrossoverTrack.cpp +++ b/src/CrossoverTrack.cpp @@ -147,7 +147,7 @@ void CrossoverTrack::transform(const track::TravelToken& aToken, const double yTrans = dir == axis::Y ? aDelta : 0; glTranslated(static_cast(myX) + xTrans, - 0.0, + height, static_cast(myY) + yTrans); if (dir == axis::Y) diff --git a/src/CurvedTrack.cpp b/src/CurvedTrack.cpp index 80e4c52..5e23bb1 100644 --- a/src/CurvedTrack.cpp +++ b/src/CurvedTrack.cpp @@ -114,7 +114,7 @@ void CurvedTrack::transform(const track::TravelToken& aToken, double aDelta) con assert(aDelta < segmentLength(aToken)); glTranslated(static_cast(origin.x), - 0.0, + height, static_cast(origin.y)); transformToOrigin(baseRadius, startAngle); diff --git a/src/Points.cpp b/src/Points.cpp index 8ed8a32..41234e5 100644 --- a/src/Points.cpp +++ b/src/Points.cpp @@ -287,7 +287,7 @@ void Points::transform(const track::TravelToken& aToken, double aDelta) const : (myAxis == -axis::Y ? -aDelta : 0.0); glTranslatef(static_cast(myX) + xTrans, - 0.0, + height, static_cast(myY) + yTrans); if (myAxis == axis::Y || myAxis == -axis::Y) diff --git a/src/SlopeTrack.cpp b/src/SlopeTrack.cpp index 978f2cf..6ea5833 100644 --- a/src/SlopeTrack.cpp +++ b/src/SlopeTrack.cpp @@ -65,6 +65,7 @@ private: track::Direction axis; float length; bool flip; + BezierCurve curve; }; SlopeTrack::SlopeTrack(track::Direction axis, Vector slope, @@ -97,7 +98,7 @@ SlopeTrack::SlopeTrack(track::Direction axis, Vector slope, debug() << p1 << " " << p2 << " " << p3 << " " << p4; - BezierCurve curve = makeBezierCurve(p1, p2, p3, p4); + curve = makeBezierCurve(p1, p2, p3, p4); length = curve.length; // TODO: we should cache these @@ -185,17 +186,30 @@ track::TravelToken SlopeTrack::getTravelToken(track::Position pos, void SlopeTrack::transform(const track::TravelToken& token, double delta) const { - assert(delta < 1.0); + assert(delta < length); - if (token.direction == -axis) - delta = 1.0 - delta; + //if (token.direction == -axis) + // delta = length - delta; + + const float curveDelta = delta / length; + + const Vector curveValue = curve(curveDelta); - const double xTrans = axis == axis::X ? delta : 0; - const double yTrans = axis == axis::Y ? delta : 0; + // const double xTrans = axis == axis::X ? delta : 0; + // const double yTrans = axis == axis::Y ? delta : 0; + // const float along = + // token.direction == -axis ? 1.0f - curveValue.x : curveValue.x; + + const float along = curveValue.x; + + const float xTrans = axis == axis::X ? along : 0.0f; + const float yTrans = curveValue.y; + const float zTrans = axis == axis::Y ? along : 0.0f; + glTranslated(static_cast(origin.x) + xTrans, - 0.0, - static_cast(origin.y) + yTrans); + height + yTrans, + static_cast(origin.y) + zTrans); if (axis == axis::Y) glRotated(-90.0, 0.0, 1.0, 0.0); diff --git a/src/StraightTrack.cpp b/src/StraightTrack.cpp index 4081526..ec9acf6 100644 --- a/src/StraightTrack.cpp +++ b/src/StraightTrack.cpp @@ -114,7 +114,7 @@ void StraightTrack::transform(const track::TravelToken& aToken, const double yTrans = direction == axis::Y ? aDelta : 0; glTranslated(static_cast(origin.x) + xTrans, - 0.0, + height, static_cast(origin.y) + yTrans); if (direction == axis::Y) -- 2.39.2