From 9210e2c6efeec77dbef8341d310d099d20ff5116 Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Sun, 21 Mar 2010 21:04:39 +0000 Subject: [PATCH] Basic rendering of S-bends --- src/SBend.cpp | 74 ++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 64 insertions(+), 10 deletions(-) diff --git a/src/SBend.cpp b/src/SBend.cpp index 079d73e..e199adc 100644 --- a/src/SBend.cpp +++ b/src/SBend.cpp @@ -20,8 +20,10 @@ #include "ILogger.hpp" #include "XMLBuilder.hpp" #include "BezierCurve.hpp" +#include "OpenGLHelper.hpp" #include +#include // Spline curves which start and finish in the same direction class SBend : public ITrackSegment { @@ -30,7 +32,7 @@ public: // ITrackSegment interface void render() const; - void setOrigin(int x, int y, float h) { x_ = x; y_ = y; height = h; } + void setOrigin(int x, int y, float h); float segmentLength(const track::TravelToken& token) const; bool isValidDirection(const track::Direction& dir) const; track::Connection nextPosition(const track::TravelToken& token) const; @@ -51,15 +53,17 @@ private: void transform(const track::TravelToken& token, float delta) const; void ensureValidDirection(track::Direction dir) const; - int x_, y_; + Point origin; int xOffset, yOffset; float height; track::Direction axis; + + BezierCurve curve; + IMeshPtr railMesh; }; SBend::SBend(track::Direction dir, int xoff, int yoff) - : x_(0), y_(0), - xOffset(xoff), yOffset(yoff), + : xOffset(xoff), yOffset(yoff), height(0.0f), axis(dir) { @@ -67,36 +71,81 @@ SBend::SBend(track::Direction dir, int xoff, int yoff) assert(yoff > 0); debug() << "SBend axis=" << axis << " xoff=" << xoff << " yoff=" << yoff; + + static const float PINCH = 1.0f; + const float pinchX = dir == axis::X ? PINCH : 0.0f; + const float pinchY = dir == axis::Y ? PINCH : 0.0f; + + const float xoffF = static_cast(xoff - (dir == axis::Y ? 1 : 0)); + const float yoffF = static_cast(yoff - (dir == axis::X ? 1 : 0)); + + Vector p1 = makeVector(0.0f, 0.0f, 0.0f); + Vector p2 = makeVector(pinchX, 0.0f, pinchY); + Vector p3 = makeVector(xoffF - pinchX, 0.0f, yoffF - pinchY); + Vector p4 = makeVector(xoffF, 0.0f, yoffF); + + curve = makeBezierCurve(p1, p2, p3, p4); + railMesh = makeBezierRailMesh(curve); + + debug() << "f(0) = " << curve(0.0f) + << " f(1) = " << curve(1.0f); } +void SBend::setOrigin(int x, int y, float h) +{ + origin = makePoint(x, y); + height = h; +} + void SBend::render() const { + glPushMatrix(); + glTranslatef(0.0f, height, 0.0f); + + renderRailMesh(railMesh); + + glPopMatrix(); } float SBend::segmentLength(const track::TravelToken& token) const { - assert(false); + return curve.length; } bool SBend::isValidDirection(const track::Direction& dir) const { - assert(false); + if (axis == axis::X) + return dir == axis::X || -dir == axis::X; + else + return dir == axis::Y || -dir == axis::Y; } track::Connection SBend::nextPosition(const track::TravelToken& token) const { - assert(false); + ensureValidDirection(token.direction); + + if (token.direction == axis::X) + return make_pair(makePoint(origin.x + 1, origin.y), axis::X); + else if (token.direction == -axis::X) + return make_pair(makePoint(origin.x - 1, origin.y), -axis::X); + else if (token.direction == axis::Y) + return make_pair(makePoint(origin.x, origin.y + 1), axis::Y); + else if (token.direction == -axis::Y) + return make_pair(makePoint(origin.x, origin.y - 1), -axis::Y); + else + assert(false); } void SBend::getEndpoints(vector >& output) const { - assert(false); + output.push_back(origin); + output.push_back(origin + makePoint(xOffset, yOffset)); } void SBend::getCovers(vector >& output) const { - assert(false); + // TODO } ITrackSegmentPtr SBend::mergeExit(Point where, track::Direction dir) @@ -117,7 +166,12 @@ void SBend::transform(const track::TravelToken& token, float delta) const void SBend::ensureValidDirection(track::Direction dir) const { - assert(false); + if (!isValidDirection(dir)) + throw runtime_error + ("Invalid direction on straight track: " + + boost::lexical_cast(dir) + + " (should be parallel to " + + boost::lexical_cast(axis) + ")"); } xml::element SBend::toXml() const -- 2.39.2